Remove LocalClient fd from poll set

The file descriptor registered for the LocalClient instances need to be
removed from the worker it was added to when the object is destroyed.
This commit is contained in:
Markus Mäkelä 2017-09-28 10:34:47 +03:00
parent 5b0b1666cc
commit c2283bbff1
2 changed files with 21 additions and 4 deletions

View File

@ -44,7 +44,7 @@ LocalClient::~LocalClient()
{
if (m_state != VC_ERROR)
{
close(m_sock);
close();
}
}
@ -65,10 +65,21 @@ bool LocalClient::queue_query(GWBUF* buffer)
return my_buf != NULL;
}
void LocalClient::close()
{
mxs::Worker* worker = mxs::Worker::get_current();
ss_dassert(worker);
worker->remove_fd(m_sock);
::close(m_sock);
}
void LocalClient::error()
{
close(m_sock);
m_state = VC_ERROR;
if (m_state != VC_ERROR)
{
close();
m_state = VC_ERROR;
}
}
void LocalClient::process(uint32_t events)
@ -228,7 +239,7 @@ LocalClient* LocalClient::create(MXS_SESSION* session, SERVICE* service)
int fd = open_network_socket(MXS_SOCKET_NETWORK, &addr, "127.0.0.1",
service->ports->port);
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0 || errno == EINPROGRESS)
if (fd > 0 && (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0 || errno == EINPROGRESS))
{
LocalClient* relay = new (std::nothrow) LocalClient(session, fd);
@ -242,12 +253,17 @@ LocalClient* LocalClient::create(MXS_SESSION* session, SERVICE* service)
}
else
{
relay->m_state = VC_ERROR;
delete rval;
rval = NULL;
}
}
}
if (rval == NULL && fd > 0)
{
::close(fd);
}
break;
}
}

View File

@ -55,6 +55,7 @@ private:
GWBUF* read_complete_packet();
void drain_queue();
void error();
void close();
/** Client states */
enum vc_state