MXS-2196: Pass Listener into dcb_accept

Modified the functions to use a listener instead of a DCB in the accepting
process. This removes some of the dependenices that the listeners have on
the DCB system.
This commit is contained in:
Markus Mäkelä
2018-11-30 12:56:18 +02:00
parent 9c679edea6
commit ccc91df0c7
8 changed files with 26 additions and 25 deletions

View File

@ -260,7 +260,7 @@ typedef enum
void dcb_global_init(); void dcb_global_init();
int dcb_write(DCB*, GWBUF*); int dcb_write(DCB*, GWBUF*);
DCB* dcb_accept(DCB* listener); DCB* dcb_accept(Listener* listener);
DCB* dcb_alloc(dcb_role_t, Listener*, SERVICE* service); DCB* dcb_alloc(dcb_role_t, Listener*, SERVICE* service);
DCB* dcb_connect(struct server*, struct session*, const char*); DCB* dcb_connect(struct server*, struct session*, const char*);
int dcb_read(DCB*, GWBUF**, int); int dcb_read(DCB*, GWBUF**, int);

View File

@ -209,6 +209,8 @@ private:
Listener(SERVICE* service, const std::string& name, const std::string& address, uint16_t port, Listener(SERVICE* service, const std::string& name, const std::string& address, uint16_t port,
const std::string& protocol, const std::string& authenticator, 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);
friend DCB* dcb_accept(Listener* listener);
}; };
/** /**

View File

@ -105,7 +105,7 @@ static void dcb_log_write_failure(DCB* dcb, GWBUF* queue, int eno);
static int gw_write(DCB* dcb, GWBUF* writeq, bool* stop_writing); static int gw_write(DCB* dcb, GWBUF* writeq, bool* stop_writing);
static int gw_write_SSL(DCB* dcb, GWBUF* writeq, bool* stop_writing); static int gw_write_SSL(DCB* dcb, GWBUF* writeq, bool* stop_writing);
static int dcb_log_errors_SSL(DCB* dcb, int ret); static int dcb_log_errors_SSL(DCB* dcb, int ret);
static int dcb_accept_one_connection(DCB* dcb, struct sockaddr* client_conn); static int dcb_accept_one_connection(int fd, struct sockaddr* client_conn);
static int dcb_listen_create_socket_inet(const char* host, uint16_t port); static int dcb_listen_create_socket_inet(const char* host, uint16_t port);
static int dcb_listen_create_socket_unix(const char* path); static int dcb_listen_create_socket_unix(const char* path);
static int dcb_set_socket_option(int sockfd, int level, int optname, void* optval, socklen_t optlen); static int dcb_set_socket_option(int sockfd, int level, int optname, void* optval, socklen_t optlen);
@ -2384,22 +2384,21 @@ int dcb_connect_SSL(DCB* dcb)
* are set before returning the new DCB to the caller, or returning NULL if * are set before returning the new DCB to the caller, or returning NULL if
* no new connection could be achieved. * no new connection could be achieved.
* *
* @param dcb Listener DCB that has detected new connection request * @param listener Listener that has a new connection request
*
* @return DCB - The new client DCB for the new connection, or NULL if failed * @return DCB - The new client DCB for the new connection, or NULL if failed
*/ */
DCB* dcb_accept(DCB* dcb) DCB* dcb_accept(Listener* listener)
{ {
DCB* client_dcb = NULL; DCB* client_dcb = NULL;
int c_sock; int c_sock;
struct sockaddr_storage client_conn; struct sockaddr_storage client_conn;
if ((c_sock = dcb_accept_one_connection(dcb, (struct sockaddr*)&client_conn)) >= 0) if ((c_sock = dcb_accept_one_connection(listener->m_listener->fd, (struct sockaddr*)&client_conn)) >= 0)
{ {
dcb->stats.n_accepts++;
configure_network_socket(c_sock, client_conn.ss_family); configure_network_socket(c_sock, client_conn.ss_family);
client_dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, dcb->listener, dcb->listener->service()); client_dcb = dcb_alloc(DCB_ROLE_CLIENT_HANDLER, listener, listener->service());
if (client_dcb == NULL) if (client_dcb == NULL)
{ {
@ -2408,7 +2407,7 @@ DCB* dcb_accept(DCB* dcb)
} }
else else
{ {
client_dcb->service = dcb->listener->service(); client_dcb->service = listener->service();
client_dcb->session = session_set_dummy(client_dcb); client_dcb->session = session_set_dummy(client_dcb);
client_dcb->fd = c_sock; client_dcb->fd = c_sock;
@ -2418,7 +2417,7 @@ DCB* dcb_accept(DCB* dcb)
// client address // client address
client_dcb->ip.ss_family = AF_UNIX; client_dcb->ip.ss_family = AF_UNIX;
client_dcb->remote = MXS_STRDUP_A("localhost"); client_dcb->remote = MXS_STRDUP_A("localhost");
client_dcb->path = MXS_STRDUP_A(dcb->path); client_dcb->path = MXS_STRDUP_A(listener->address());
} }
else else
{ {
@ -2446,8 +2445,8 @@ DCB* dcb_accept(DCB* dcb)
} }
} }
client_dcb->func = dcb->listener->protocol_func(); client_dcb->func = listener->protocol_func();
client_dcb->authfunc = dcb->listener->auth_func(); client_dcb->authfunc = listener->auth_func();
/** Allocate DCB specific authentication data */ /** Allocate DCB specific authentication data */
if (client_dcb->authfunc.create if (client_dcb->authfunc.create
@ -2460,7 +2459,7 @@ DCB* dcb_accept(DCB* dcb)
} }
/* Register downstream throttling callbacks */ /* Register downstream throttling callbacks */
if (DCB_THROTTLING_ENABLED(dcb)) if (DCB_THROTTLING_ENABLED(client_dcb))
{ {
dcb_add_callback(client_dcb, DCB_REASON_HIGH_WATER, downstream_throttle_callback, NULL); dcb_add_callback(client_dcb, DCB_REASON_HIGH_WATER, downstream_throttle_callback, NULL);
dcb_add_callback(client_dcb, DCB_REASON_LOW_WATER, downstream_throttle_callback, NULL); dcb_add_callback(client_dcb, DCB_REASON_LOW_WATER, downstream_throttle_callback, NULL);
@ -2475,7 +2474,7 @@ DCB* dcb_accept(DCB* dcb)
{ {
client_dcb->func.connlimit(client_dcb, client_dcb->service->max_connections); client_dcb->func.connlimit(client_dcb, client_dcb->service->max_connections);
} }
dcb->session->close_reason = SESSION_CLOSE_TOO_MANY_CONNECTIONS; client_dcb->session->close_reason = SESSION_CLOSE_TOO_MANY_CONNECTIONS;
dcb_close(client_dcb); dcb_close(client_dcb);
client_dcb = NULL; client_dcb = NULL;
} }
@ -2493,14 +2492,16 @@ DCB* dcb_accept(DCB* dcb)
/** /**
* @brief Accept a new client connection, given listener, return file descriptor * @brief Accept a new client connection, given listener, return file descriptor
* *
* Up to 10 retries will be attempted in case of non-permanent errors. Calls * Up to 10 retries will be attempted in case of non-permanent errors. Calls
* the accept function and analyses the return, logging any errors and making * the accept function and analyses the return, logging any errors and making
* an appropriate return. * an appropriate return.
* *
* @param dcb Listener DCB that has detected new connection request * @param fd File descriptor to accept from
* @param client_conn Output where connection information is stored
*
* @return -1 for failure, or a file descriptor for the new connection * @return -1 for failure, or a file descriptor for the new connection
*/ */
static int dcb_accept_one_connection(DCB* dcb, struct sockaddr* client_conn) static int dcb_accept_one_connection(int fd, struct sockaddr* client_conn)
{ {
int c_sock; int c_sock;
@ -2511,9 +2512,7 @@ static int dcb_accept_one_connection(DCB* dcb, struct sockaddr* client_conn)
int eno = 0; int eno = 0;
/* new connection from client */ /* new connection from client */
c_sock = accept(dcb->fd, c_sock = accept(fd, client_conn, &client_len);
client_conn,
&client_len);
eno = errno; eno = errno;
errno = 0; errno = 0;

View File

@ -285,7 +285,7 @@ static int cdc_accept(DCB* listener)
int n_connect = 0; int n_connect = 0;
DCB* client_dcb; DCB* client_dcb;
while ((client_dcb = dcb_accept(listener)) != NULL) while ((client_dcb = dcb_accept(listener->listener)) != NULL)
{ {
CDC_session* client_data = NULL; CDC_session* client_data = NULL;
CDC_protocol* protocol = NULL; CDC_protocol* protocol = NULL;

View File

@ -363,7 +363,7 @@ static int httpd_accept(DCB* listener)
int n_connect = 0; int n_connect = 0;
DCB* client_dcb; DCB* client_dcb;
while ((client_dcb = dcb_accept(listener)) != NULL) while ((client_dcb = dcb_accept(listener->listener)) != NULL)
{ {
HTTPD_session* client_data = NULL; HTTPD_session* client_data = NULL;

View File

@ -1397,7 +1397,7 @@ int gw_MySQLAccept(DCB* listener)
{ {
DCB* client_dcb; DCB* client_dcb;
while ((client_dcb = dcb_accept(listener)) != NULL) while ((client_dcb = dcb_accept(listener->listener)) != NULL)
{ {
gw_process_one_new_client(client_dcb); gw_process_one_new_client(client_dcb);
} /**< while client_dcb != NULL */ } /**< while client_dcb != NULL */

View File

@ -352,7 +352,7 @@ static int maxscaled_accept(DCB* listener)
socklen_t len = sizeof(struct ucred); socklen_t len = sizeof(struct ucred);
struct ucred ucred; struct ucred ucred;
while ((client_dcb = dcb_accept(listener)) != NULL) while ((client_dcb = dcb_accept(listener->listener)) != NULL)
{ {
MAXSCALED* maxscaled_protocol = (MAXSCALED*)calloc(1, sizeof(MAXSCALED)); MAXSCALED* maxscaled_protocol = (MAXSCALED*)calloc(1, sizeof(MAXSCALED));

View File

@ -281,7 +281,7 @@ static int telnetd_accept(DCB* listener)
int n_connect = 0; int n_connect = 0;
DCB* client_dcb; DCB* client_dcb;
while ((client_dcb = dcb_accept(listener)) != NULL) while ((client_dcb = dcb_accept(listener->listener)) != NULL)
{ {
TELNETD* telnetd_protocol = NULL; TELNETD* telnetd_protocol = NULL;