Router spinlock wasn't used to protect routing. As a consequence router could have been closed in thread #1 while thread #2 was in a middle of execution of router code. Solved by holding router lock so that it covered whole routing operation.

This commit is contained in:
VilhoRaatikka
2014-05-28 18:29:02 +03:00
parent a73c9c8076
commit 1a2b8e5475
2 changed files with 26 additions and 18 deletions

View File

@ -585,7 +585,8 @@ gw_MySQLWrite_backend(DCB *dcb, GWBUF *queue)
snprintf(str, len+1, "%s", startpoint); snprintf(str, len+1, "%s", startpoint);
LOGIF(LE, (skygw_log_write_flush( LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR, LOGFILE_ERROR,
"Error : Authentication to backend failed."))); "Error : Unable to write to backend due to "
"authentication failure.")));
/** Consume query buffer */ /** Consume query buffer */
while ((queue = gwbuf_consume( while ((queue = gwbuf_consume(
queue, queue,

View File

@ -1015,16 +1015,16 @@ static int routeQuery(
router_cli_ses->rses_id))); router_cli_ses->rses_id)));
ss_dassert(QUERY_IS_TYPE(qtype, QUERY_TYPE_READ)); ss_dassert(QUERY_IS_TYPE(qtype, QUERY_TYPE_READ));
/** Lock router session */
if (!rses_begin_locked_router_action(router_cli_ses))
{
goto return_ret;
}
succp = get_dcb(&slave_dcb, router_cli_ses, BE_SLAVE); succp = get_dcb(&slave_dcb, router_cli_ses, BE_SLAVE);
if (succp) if (succp)
{ {
/** Lock router session */
if (!rses_begin_locked_router_action(router_cli_ses))
{
goto return_ret;
}
if ((ret = slave_dcb->func.write(slave_dcb, querybuf)) == 1) if ((ret = slave_dcb->func.write(slave_dcb, querybuf)) == 1)
{ {
atomic_add(&inst->stats.n_slave, 1); atomic_add(&inst->stats.n_slave, 1);
@ -1036,8 +1036,9 @@ static int routeQuery(
"Error : Routing query \"%s\" failed.", "Error : Routing query \"%s\" failed.",
querystr))); querystr)));
} }
rses_end_locked_router_action(router_cli_ses);
} }
rses_end_locked_router_action(router_cli_ses);
ss_dassert(succp); ss_dassert(succp);
goto return_ret; goto return_ret;
} }
@ -1061,6 +1062,11 @@ static int routeQuery(
"routing to Master."))); "routing to Master.")));
} }
} }
/** Lock router session */
if (!rses_begin_locked_router_action(router_cli_ses))
{
goto return_ret;
}
if (master_dcb == NULL) if (master_dcb == NULL)
{ {
@ -1068,21 +1074,22 @@ static int routeQuery(
} }
if (succp) if (succp)
{ {
/** Lock router session */
if (!rses_begin_locked_router_action(router_cli_ses))
{
goto return_ret;
}
if ((ret = master_dcb->func.write(master_dcb, querybuf)) == 1) if ((ret = master_dcb->func.write(master_dcb, querybuf)) == 1)
{ {
atomic_add(&inst->stats.n_master, 1); atomic_add(&inst->stats.n_master, 1);
} }
rses_end_locked_router_action(router_cli_ses); }
} rses_end_locked_router_action(router_cli_ses);
ss_dassert(succp); ss_dassert(succp);
ss_dassert(ret == 1);
goto return_ret; if (ret == 0)
{
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"Error : Routing to master failed.")));
}
} }
return_ret: return_ret:
if (plainsqlbuf != NULL) if (plainsqlbuf != NULL)