Fix to tee child session being in a bad state and the filter session still being active.
This commit is contained in:
@ -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,9 +824,10 @@ if(!my_session->active)
|
|||||||
clone = gwbuf_clone_all(queue);
|
clone = gwbuf_clone_all(queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Pass the query downstream */
|
|
||||||
|
|
||||||
ss_dassert(my_session->tee_replybuf == NULL);
|
spinlock_release(&my_session->tee_lock);
|
||||||
|
|
||||||
|
/* Pass the query downstream */
|
||||||
|
|
||||||
switch(command)
|
switch(command)
|
||||||
{
|
{
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user