MXS-2196: Remove redundant DCB member variables

The variables held duplicate information already present in other parts of
the system.
This commit is contained in:
Markus Mäkelä 2018-11-30 17:17:34 +02:00
parent 694d4a4003
commit 7a87ff9ce1
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19
6 changed files with 32 additions and 85 deletions

View File

@ -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;

View File

@ -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 */

View File

@ -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"))
{

View File

@ -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;
}

View File

@ -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;

View File

@ -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)
{