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:
@ -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,
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user