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