Fix to tee child session being in a bad state and the filter session still being active.

This commit is contained in:
Markus Makela 2015-02-25 20:22:17 +02:00
parent eb9d191437
commit c93a7bede5

View File

@ -778,11 +778,14 @@ int length, rval, residual = 0;
GWBUF *clone = NULL;
unsigned char command = *((unsigned char*)queue->start + 4);
spinlock_acquire(&my_session->tee_lock);
if(!my_session->active)
{
skygw_log_write(LOGFILE_TRACE, "Tee: Received a reply when the session was closed.");
gwbuf_free(queue);
return 0;
rval = 0;
goto retblock;
}
if (my_session->branch_session &&
@ -821,10 +824,11 @@ if(!my_session->active)
clone = gwbuf_clone_all(queue);
}
}
spinlock_release(&my_session->tee_lock);
/* Pass the query downstream */
ss_dassert(my_session->tee_replybuf == NULL);
switch(command)
{
case 0x03:
@ -858,6 +862,15 @@ if(!my_session->active)
}
spinlock_release(&debug_lock);
#endif
spinlock_acquire(&my_session->tee_lock);
if(my_session->branch_session == NULL ||
my_session->branch_session->state != SESSION_STATE_ROUTER_READY)
{
rval = 0;
my_session->active = 0;
goto retblock;
}
rval = my_session->down.routeQuery(my_session->down.instance,
my_session->down.session,
queue);
@ -873,9 +886,10 @@ if(!my_session->active)
{
/** Close tee session */
my_session->active = 0;
rval = 0;
LOGIF(LT, (skygw_log_write(
LOGFILE_TRACE,
"Closed tee filter session.")));
"Closed tee filter session: Child session in invalid state.")));
gwbuf_free(clone);
}
}
@ -885,12 +899,14 @@ if(!my_session->active)
{
LOGIF(LT, (skygw_log_write(
LOGFILE_TRACE,
"Closed tee filter session.")));
"Closed tee filter session: Child session is NULL.")));
my_session->active = 0;
rval = 0;
}
my_session->n_rejected++;
}
retblock:
spinlock_release(&my_session->tee_lock);
return rval;
}
@ -920,6 +936,14 @@ clientReply (FILTER* instance, void *session, GWBUF *reply)
{
gwbuf_free(reply);
rc = 0;
if(my_session->waiting[PARENT])
{
GWBUF* errbuf = modutil_create_mysql_err_msg(1,0,1,"0000","Session closed.");
my_session->waiting[PARENT] = false;
my_session->up.clientReply (my_session->up.instance,
my_session->up.session,
errbuf);
}
goto retblock;
}