MXS-1267: Iterate over available listeners
The tee filter iterates over the available ports and finds the first available network listener and tries to connect. This allows the use of UNIX domain sockets with services that are targeted by the tee filter.
This commit is contained in:
@ -216,31 +216,39 @@ uint32_t LocalClient::poll_handler(struct mxs_poll_data* data, int wid, uint32_t
|
|||||||
LocalClient* LocalClient::create(MXS_SESSION* session, SERVICE* service)
|
LocalClient* LocalClient::create(MXS_SESSION* session, SERVICE* service)
|
||||||
{
|
{
|
||||||
LocalClient* rval = NULL;
|
LocalClient* rval = NULL;
|
||||||
|
LISTENER_ITERATOR iter;
|
||||||
|
|
||||||
if (service->ports && service->ports->port > 0)
|
for (SERV_LISTENER* listener = listener_iterator_init(service, &iter);
|
||||||
|
listener; listener = listener_iterator_next(&iter))
|
||||||
{
|
{
|
||||||
sockaddr_storage addr;
|
if (listener->port > 0)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
LocalClient* relay = new (std::nothrow) LocalClient(session, fd);
|
/** Pick the first network listener */
|
||||||
|
sockaddr_storage addr;
|
||||||
|
int fd = open_network_socket(MXS_SOCKET_NETWORK, &addr, "127.0.0.1",
|
||||||
|
service->ports->port);
|
||||||
|
|
||||||
if (relay)
|
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0 || errno == EINPROGRESS)
|
||||||
{
|
{
|
||||||
mxs::Worker* worker = mxs::Worker::get_current();
|
LocalClient* relay = new (std::nothrow) LocalClient(session, fd);
|
||||||
|
|
||||||
if (worker->add_fd(fd, poll_events, (MXS_POLL_DATA*)relay))
|
if (relay)
|
||||||
{
|
{
|
||||||
rval = relay;
|
mxs::Worker* worker = mxs::Worker::get_current();
|
||||||
}
|
|
||||||
else
|
if (worker->add_fd(fd, poll_events, (MXS_POLL_DATA*)relay))
|
||||||
{
|
{
|
||||||
delete rval;
|
rval = relay;
|
||||||
rval = NULL;
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete rval;
|
||||||
|
rval = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user