From c93a7bede53b9ee0e35f4db3442f615e4f8d23b8 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Wed, 25 Feb 2015 20:22:17 +0200 Subject: [PATCH] Fix to tee child session being in a bad state and the filter session still being active. --- server/modules/filter/tee.c | 38 ++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/server/modules/filter/tee.c b/server/modules/filter/tee.c index 08d88d5e7..9ce8a4dd3 100644 --- a/server/modules/filter/tee.c +++ b/server/modules/filter/tee.c @@ -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; }