diff --git a/examples/roundrobinrouter.cpp b/examples/roundrobinrouter.cpp index 2ded3888e..ee2e589e2 100644 --- a/examples/roundrobinrouter.cpp +++ b/examples/roundrobinrouter.cpp @@ -356,18 +356,6 @@ void RRRouter::handle_error(RRRouterSession* rses, mxs_error_action_t action, bool* succp) { - /* Don't handle same error twice on same DCB */ - if (problem_dcb->dcb_errhandle_called) - { - /* Assume that previous call succeed. */ - *succp = true; - return; - } - else - { - problem_dcb->dcb_errhandle_called = true; - } - MXS_SESSION* session = problem_dcb->session; DCB* client_dcb = session->client_dcb; mxs_session_state_t sesstate = session->state; diff --git a/include/maxscale/dcb.hh b/include/maxscale/dcb.hh index 475fafd75..291deabcb 100644 --- a/include/maxscale/dcb.hh +++ b/include/maxscale/dcb.hh @@ -182,11 +182,9 @@ struct DCB : public MXB_POLL_DATA int fd = DCBFD_CLOSED; /**< The descriptor */ dcb_state_t state = DCB_STATE_ALLOC; /**< Current descriptor state */ SSL_STATE ssl_state = SSL_HANDSHAKE_UNKNOWN; /**< Current state of SSL if in use */ - int flags = 0; /**< DCB flags */ char* remote = nullptr; /**< Address of remote end */ char* user = nullptr; /**< User name for connection */ struct sockaddr_storage ip; /**< remote IPv4/IPv6 address */ - char* protoname = nullptr; /**< Name of the protocol */ void* protocol = nullptr; /**< The protocol specific state */ size_t protocol_packet_length = 0; /**< protocol packet length */ size_t protocol_bytes_processed = 0; /**< How many bytes have been read */ diff --git a/server/core/dcb.cc b/server/core/dcb.cc index 960bdb132..5edd1b45b 100644 --- a/server/core/dcb.cc +++ b/server/core/dcb.cc @@ -195,7 +195,6 @@ DCB::~DCB() SSL_free(ssl); } - MXS_FREE(protoname); MXS_FREE(remote); MXS_FREE(user); MXS_FREE(path); @@ -371,7 +370,6 @@ DCB* dcb_connect(SERVER* server, MXS_SESSION* session, const char* protocol) return NULL; } memcpy(&(dcb->func), funcs, sizeof(MXS_PROTOCOL)); - dcb->protoname = MXS_STRDUP_A(protocol); if (session->client_dcb->remote) { @@ -1252,7 +1250,6 @@ static bool dcb_maybe_add_persistent(DCB* dcb) && dcb->server->persistpoolmax && (dcb->server->status & SERVER_RUNNING) && !dcb->dcb_errhandle_called - && !(dcb->flags & DCBF_HUNG) && dcb_persistent_clean_count(dcb, owner->id(), false) < dcb->server->persistpoolmax && mxb::atomic::load(&dcb->server->stats.n_persistent) < dcb->server->persistpoolmax) { @@ -1295,19 +1292,7 @@ static bool dcb_maybe_add_persistent(DCB* dcb) mxb::atomic::add(&dcb->server->stats.n_current, -1, mxb::atomic::RELAXED); return true; } - else if (dcb->dcb_role == DCB_ROLE_BACKEND_HANDLER && dcb->server) - { - MXS_DEBUG("Not adding DCB %p to persistent pool, " - "user %s, max for pool %ld, error handle called %s, hung flag %s, " - "server status %lu, pool count %d.", - dcb, - dcb->user ? dcb->user : "", - dcb->server->persistpoolmax, - dcb->dcb_errhandle_called ? "true" : "false", - (dcb->flags & DCBF_HUNG) ? "true" : "false", - dcb->server->status, - dcb->server->stats.n_persistent); - } + return false; } @@ -1329,9 +1314,9 @@ void printDCB(DCB* dcb) { printf("\tUsername: %s\n", dcb->user); } - if (dcb->protoname) + if (dcb->listener) { - printf("\tProtocol: %s\n", dcb->protoname); + printf("\tProtocol: %s\n", dcb->listener->protocol()); } if (dcb->writeq) { @@ -1437,11 +1422,9 @@ void dprintOneDCB(DCB* pdcb, DCB* dcb) "\tUsername: %s\n", dcb->user); } - if (dcb->protoname) + if (dcb->listener) { - dcb_printf(pdcb, - "\tProtocol: %s\n", - dcb->protoname); + dcb_printf(pdcb, "\tProtocol: %s\n", dcb->listener->protocol()); } if (dcb->writeq) { @@ -1595,11 +1578,9 @@ void dprintDCB(DCB* pdcb, DCB* dcb) "\tUsername: %s\n", dcb->user); } - if (dcb->protoname) + if (dcb->listener) { - dcb_printf(pdcb, - "\tProtocol: %s\n", - dcb->protoname); + dcb_printf(pdcb, "\tProtocol: %s\n", dcb->listener->protocol()); } if (dcb->session && dcb->session->state != SESSION_STATE_DUMMY) @@ -1982,10 +1963,9 @@ static void dcb_hangup_foreach_worker(MXB_WORKER* worker, struct server* server) for (DCB* dcb = this_unit.all_dcbs[id]; dcb; dcb = dcb->thread.next) { - if (dcb->state == DCB_STATE_POLLING && dcb->server - && dcb->server == server) + if (dcb->state == DCB_STATE_POLLING && dcb->server && dcb->server == server) { - dcb->flags |= DCBF_HUNG; + dcb->dcb_errhandle_called = true; dcb->func.hangup(dcb); } } @@ -3084,9 +3064,10 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events) eno, strerror_r(eno, errbuf, sizeof(errbuf))); rc |= MXB_POLL_HUP; - if ((dcb->flags & DCBF_HUNG) == 0) + + if (!dcb->dcb_errhandle_called) { - dcb->flags |= DCBF_HUNG; + dcb->dcb_errhandle_called = true; if (dcb_session_check(dcb, "hangup EPOLLHUP")) { @@ -3111,9 +3092,9 @@ static uint32_t dcb_process_poll_events(DCB* dcb, uint32_t events) strerror_r(eno, errbuf, sizeof(errbuf))); rc |= MXB_POLL_HUP; - if ((dcb->flags & DCBF_HUNG) == 0) + if (!dcb->dcb_errhandle_called) { - dcb->flags |= DCBF_HUNG; + dcb->dcb_errhandle_called = true; if (dcb_session_check(dcb, "hangup EPOLLRDHUP")) { diff --git a/server/core/server.cc b/server/core/server.cc index c3a507ee4..1a597b327 100644 --- a/server/core/server.cc +++ b/server/core/server.cc @@ -265,14 +265,12 @@ DCB* server_get_persistent(SERVER* server, const char* user, const char* ip, con while (dcb) { if (dcb->user - && dcb->protoname && dcb->remote && ip && !dcb->dcb_errhandle_called - && !(dcb->flags & DCBF_HUNG) && 0 == strcmp(dcb->user, user) && 0 == strcmp(dcb->remote, ip) - && 0 == strcmp(dcb->protoname, protocol)) + && 0 == strcmp(dcb->listener->protocol(), protocol)) { if (NULL == previous) { @@ -288,20 +286,7 @@ DCB* server_get_persistent(SERVER* server, const char* user, const char* ip, con mxb::atomic::add(&server->stats.n_current, 1, mxb::atomic::RELAXED); return dcb; } - else - { - MXS_DEBUG("%lu [server_get_persistent] Rejected dcb " - "%p from pool, user %s looking for %s, protocol %s " - "looking for %s, hung flag %s, error handle called %s.", - pthread_self(), - dcb, - dcb->user ? dcb->user : "NULL", - user, - dcb->protoname ? dcb->protoname : "NULL", - protocol, - (dcb->flags & DCBF_HUNG) ? "true" : "false", - dcb->dcb_errhandle_called ? "true" : "false"); - } + previous = dcb; dcb = dcb->nextpersistent; } diff --git a/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc b/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc index e65475fd7..4bbbf3c18 100644 --- a/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc +++ b/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc @@ -482,7 +482,7 @@ static int gw_read_backend_event(DCB* dcb) { /** If a DCB gets a read event when it's in the persistent pool, it is * treated as if it were an error. */ - dcb->dcb_errhandle_called = true; + poll_fake_hangup_event(dcb); return 0; } @@ -603,7 +603,6 @@ static void do_handle_error(DCB* dcb, mxs_error_action_t action, const char* err &succp); gwbuf_free(errbuf); - dcb->dcb_errhandle_called = true; } /** * If error handler fails it means that routing session can't continue @@ -1352,27 +1351,26 @@ static int gw_backend_hangup(DCB* dcb) { MXS_SESSION* session = dcb->session; - if (dcb->persistentstart) + if (!dcb->persistentstart) { - dcb->dcb_errhandle_called = true; - } - else if (session->state != SESSION_STATE_ROUTER_READY) - { - int error; - int len = sizeof(error); - if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*) &len) == 0) + if (session->state != SESSION_STATE_ROUTER_READY) { - if (error != 0 && session->state != SESSION_STATE_STOPPING) + int error; + int len = sizeof(error); + if (getsockopt(dcb->fd, SOL_SOCKET, SO_ERROR, &error, (socklen_t*) &len) == 0) { - MXS_ERROR("Hangup in session that is not ready for routing, " - "Error reported is '%s'.", - mxs_strerror(errno)); + if (error != 0 && session->state != SESSION_STATE_STOPPING) + { + MXS_ERROR("Hangup in session that is not ready for routing, " + "Error reported is '%s'.", + mxs_strerror(errno)); + } } } - } - else - { - do_handle_error(dcb, ERRACT_NEW_CONNECTION, "Lost connection to backend server."); + else + { + do_handle_error(dcb, ERRACT_NEW_CONNECTION, "Lost connection to backend server."); + } } return 1; diff --git a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc index 23ffe3261..05328fb46 100644 --- a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc +++ b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc @@ -1194,9 +1194,6 @@ static int gw_read_finish_processing(DCB* dcb, GWBUF* read_buffer, uint64_t capa MySQLProtocol* proto = (MySQLProtocol*)dcb->protocol; int return_code = 0; - /** Reset error handler when routing of the new query begins */ - dcb->dcb_errhandle_called = false; - if (rcap_type_required(capabilities, RCAP_TYPE_STMT_INPUT) || proto->current_command == MXS_COM_CHANGE_USER) {