MXS-1951: Clean up listener creation
The old values that were encoded into a string wasn't necessary as the data is already present in a processed form in the member variables.
This commit is contained in:
@ -238,13 +238,10 @@ private:
|
|||||||
/**
|
/**
|
||||||
* Listen on a file descriptor shared between all workers
|
* Listen on a file descriptor shared between all workers
|
||||||
*
|
*
|
||||||
* @param config_bind The bind configuration consisting of an address and a port separated by the pipe
|
|
||||||
* character. For UNIX domain sockets, the address is the socket path and the port
|
|
||||||
* is always zero.
|
|
||||||
*
|
*
|
||||||
* @return True if the listening was started successfully
|
* @return True if the listening was started successfully
|
||||||
*/
|
*/
|
||||||
bool listen_shared(std::string config_bind);
|
bool listen_shared();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accept a single client connection
|
* Accept a single client connection
|
||||||
|
@ -773,39 +773,27 @@ static int create_unix_socket(const char* path)
|
|||||||
*
|
*
|
||||||
* @return New socket or -1 on error
|
* @return New socket or -1 on error
|
||||||
*/
|
*/
|
||||||
int start_listening(const char* config)
|
int start_listening(const std::string& host, uint16_t port)
|
||||||
{
|
{
|
||||||
char host[strlen(config) + 1];
|
mxb_assert(host[0] == '/' || port != 0);
|
||||||
strcpy(host, config);
|
|
||||||
char* port_str = strrchr(host, '|');
|
|
||||||
uint16_t port = 0;
|
|
||||||
|
|
||||||
if (port_str)
|
|
||||||
{
|
|
||||||
*port_str++ = 0;
|
|
||||||
port = atoi(port_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
mxb_assert(strchr(host, '/') || port > 0);
|
|
||||||
|
|
||||||
int listener_socket = -1;
|
int listener_socket = -1;
|
||||||
|
|
||||||
if (strchr(host, '/'))
|
if (host[0] == '/')
|
||||||
{
|
{
|
||||||
listener_socket = create_unix_socket(host);
|
listener_socket = create_unix_socket(host.c_str());
|
||||||
}
|
}
|
||||||
else if (port > 0)
|
else if (port > 0)
|
||||||
{
|
{
|
||||||
struct sockaddr_storage server_address = {};
|
struct sockaddr_storage server_address = {};
|
||||||
listener_socket = open_network_socket(MXS_SOCKET_LISTENER, &server_address, host, port);
|
listener_socket = open_network_socket(MXS_SOCKET_LISTENER, &server_address, host.c_str(), port);
|
||||||
|
|
||||||
if (listener_socket == -1 && strcmp(host, "::") == 0)
|
if (listener_socket == -1 && host == "::")
|
||||||
{
|
{
|
||||||
/** Attempt to bind to the IPv4 if the default IPv6 one is used */
|
/** Attempt to bind to the IPv4 if the default IPv6 one is used */
|
||||||
MXS_WARNING("Failed to bind on default IPv6 host '::', attempting "
|
MXS_WARNING("Failed to bind on default IPv6 host '::', attempting "
|
||||||
"to bind on IPv4 version '0.0.0.0'");
|
"to bind on IPv4 version '0.0.0.0'");
|
||||||
strcpy(host, "0.0.0.0");
|
listener_socket = open_network_socket(MXS_SOCKET_LISTENER, &server_address, "0.0.0.0", port);
|
||||||
listener_socket = open_network_socket(MXS_SOCKET_LISTENER, &server_address, host, port);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,7 +808,8 @@ int start_listening(const char* config)
|
|||||||
*/
|
*/
|
||||||
if (listen(listener_socket, INT_MAX) != 0)
|
if (listen(listener_socket, INT_MAX) != 0)
|
||||||
{
|
{
|
||||||
MXS_ERROR("Failed to start listening on [%s]:%u: %d, %s", host, port, errno, mxs_strerror(errno));
|
MXS_ERROR("Failed to start listening on [%s]:%u: %d, %s", host.c_str(), port, errno,
|
||||||
|
mxs_strerror(errno));
|
||||||
close(listener_socket);
|
close(listener_socket);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -951,10 +940,10 @@ DCB* Listener::accept_one_dcb()
|
|||||||
return client_dcb;
|
return client_dcb;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Listener::listen_shared(std::string config_bind)
|
bool Listener::listen_shared()
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
int fd = start_listening(config_bind.data());
|
int fd = start_listening(m_address.c_str(), m_port);
|
||||||
|
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
{
|
{
|
||||||
@ -971,7 +960,7 @@ bool Listener::listen_shared(std::string config_bind)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_ERROR("[%s] Failed to listen on %s", m_service->name(), config_bind.c_str());
|
MXS_ERROR("[%s] Failed to listen on [%s]:%u", m_service->name(), m_address.c_str(), m_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
@ -1002,14 +991,12 @@ bool Listener::listen()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
std::stringstream ss;
|
|
||||||
ss << m_address << "|" << m_port;
|
|
||||||
|
|
||||||
// TODO: Detect the need for SO_REUSEPORT here
|
rval = listen_shared();
|
||||||
rval = listen_shared(ss.str());
|
|
||||||
|
|
||||||
if (rval)
|
if (rval)
|
||||||
{
|
{
|
||||||
|
m_state = STARTED;
|
||||||
MXS_NOTICE("Listening for connections at [%s]:%u", m_address.c_str(), m_port);
|
MXS_NOTICE("Listening for connections at [%s]:%u", m_address.c_str(), m_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user