MXS-2196: Track listener state

The listener now tracks its own the state instead of using the session
state.
This commit is contained in:
Markus Mäkelä
2018-11-30 13:07:22 +02:00
parent ccc91df0c7
commit 5a79dbfb53
2 changed files with 33 additions and 19 deletions

View File

@ -178,7 +178,17 @@ public:
void set_users(struct users* u); void set_users(struct users* u);
private: private:
enum State
{
CREATED,
STARTED,
STOPPED,
FAILED,
DESTROYED
};
std::string m_name; /**< Name of the listener */ std::string m_name; /**< Name of the listener */
State m_state; /**< Listener state */
std::string m_protocol; /**< Protocol module to load */ std::string m_protocol; /**< Protocol module to load */
uint16_t m_port; /**< Port to listen on */ uint16_t m_port; /**< Port to listen on */
std::string m_address; /**< Address to listen with */ std::string m_address; /**< Address to listen with */

View File

@ -47,6 +47,7 @@ Listener::Listener(SERVICE* service, const std::string& name, const std::string&
uint16_t port, const std::string& protocol, const std::string& authenticator, uint16_t port, const std::string& protocol, const std::string& authenticator,
const std::string& auth_opts, void* auth_instance, SSL_LISTENER* ssl) const std::string& auth_opts, void* auth_instance, SSL_LISTENER* ssl)
: m_name(name) : m_name(name)
, m_state(CREATED)
, m_protocol(protocol) , m_protocol(protocol)
, m_port(port) , m_port(port)
, m_address(address) , m_address(address)
@ -133,6 +134,7 @@ void Listener::destroy(const SListener& listener)
// thread-safe as the listener is freed on the same thread that closes the socket. // thread-safe as the listener is freed on the same thread that closes the socket.
::close(listener->m_listener->fd); ::close(listener->m_listener->fd);
listener->m_listener->fd = -1; listener->m_listener->fd = -1;
listener->m_state = DESTROYED;
std::lock_guard<std::mutex> guard(listener_lock); std::lock_guard<std::mutex> guard(listener_lock);
all_listeners.remove(listener); all_listeners.remove(listener);
@ -140,13 +142,12 @@ void Listener::destroy(const SListener& listener)
bool Listener::stop() bool Listener::stop()
{ {
bool rval = false; bool rval = (m_state == STOPPED);
mxb_assert(m_listener); mxb_assert(m_listener);
if (m_listener->session->state == SESSION_STATE_LISTENER if (m_state == STARTED && poll_remove_dcb(m_listener) == 0)
&& poll_remove_dcb(m_listener) == 0)
{ {
m_listener->session->state = SESSION_STATE_LISTENER_STOPPED; m_state = STOPPED;
rval = true; rval = true;
} }
@ -155,13 +156,12 @@ bool Listener::stop()
bool Listener::start() bool Listener::start()
{ {
bool rval = true; bool rval = (m_state == STARTED);
mxb_assert(m_listener); mxb_assert(m_listener);
if (m_listener->session->state == SESSION_STATE_LISTENER_STOPPED if (m_state == STOPPED && poll_add_dcb(m_listener) == 0)
&& poll_add_dcb(m_listener) == 0)
{ {
m_listener->session->state = SESSION_STATE_LISTENER; m_state = STARTED;
rval = true; rval = true;
} }
@ -673,24 +673,26 @@ SSL_LISTENER* Listener::ssl() const
const char* Listener::state() const const char* Listener::state() const
{ {
if (m_listener && m_listener->session) switch (m_state)
{ {
switch (m_listener->session->state) case CREATED:
{ return "Created";
case SESSION_STATE_LISTENER_STOPPED:
case STARTED:
return "Running";
case STOPPED:
return "Stopped"; return "Stopped";
case SESSION_STATE_LISTENER: case FAILED:
return "Running"; return "Failed";
case DESTROYED:
return "Destroyed";
default: default:
mxb_assert(!true); mxb_assert(!true);
return "Unknown"; return "Unknown";
}
}
else
{
return "Failed";
} }
} }
@ -731,6 +733,7 @@ void Listener::set_users(struct users* u)
bool Listener::listen() bool Listener::listen()
{ {
m_state = FAILED;
m_listener = dcb_alloc(DCB_ROLE_SERVICE_LISTENER, this, m_service); m_listener = dcb_alloc(DCB_ROLE_SERVICE_LISTENER, this, m_service);
if (!m_listener) if (!m_listener)
@ -779,6 +782,7 @@ bool Listener::listen()
if (m_listener->session != NULL) if (m_listener->session != NULL)
{ {
m_listener->session->state = SESSION_STATE_LISTENER; m_listener->session->state = SESSION_STATE_LISTENER;
m_state = STARTED;
rval = true; rval = true;
} }
else else