diff --git a/server/core/dcb.c b/server/core/dcb.c index 4c643de53..01717667c 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -2574,11 +2574,6 @@ dcb_call_callback(DCB *dcb, DCB_REASON reason) { DCB_CALLBACK *cb, *nextcb; - if (NULL == dcb->session->router_session) - { - dcb_close(dcb); - return; - } spinlock_acquire(&dcb->cb_lock); cb = dcb->callbacks; while (cb) diff --git a/server/modules/routing/binlog/blr_slave.c b/server/modules/routing/binlog/blr_slave.c index e92beb277..a2a9ebb2a 100644 --- a/server/modules/routing/binlog/blr_slave.c +++ b/server/modules/routing/binlog/blr_slave.c @@ -38,6 +38,7 @@ * 19/03/2015 Massimiliano Pinto Addition of basic MariaDB 10 compatibility support * 07/05/2015 Massimiliano Pinto Added MariaDB 10 Compatibility * 11/05/2015 Massimiliano Pinto Only MariaDB 10 Slaves can register to binlog router with a MariaDB 10 Master + * 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB * * @endverbatim */ @@ -1606,6 +1607,15 @@ blr_slave_callback(DCB *dcb, DCB_REASON reason, void *data) ROUTER_SLAVE *slave = (ROUTER_SLAVE *)data; ROUTER_INSTANCE *router = slave->router; + if (NULL == dcb->session->router_session) + { + /* + * The following processing will fail if there is no router session, + * because the "data" parameter will not contain meaningful data, + * so we have no choice but to stop here. + */ + return; + } if (reason == DCB_REASON_DRAINED) { if (slave->state == BLRS_DUMPING) diff --git a/server/modules/routing/readconnroute.c b/server/modules/routing/readconnroute.c index ceeb0a627..2f7faba4f 100644 --- a/server/modules/routing/readconnroute.c +++ b/server/modules/routing/readconnroute.c @@ -69,6 +69,7 @@ * 27/06/2014 Mark Riddoch Addition of server weighting * 11/06/2015 Martin Brampton Remove decrement n_current (moved to dcb.c) * 09/09/2015 Martin Brampton Modify error handler + * 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB * * @endverbatim */ @@ -1010,6 +1011,14 @@ static int handle_state_switch(DCB* dcb,DCB_REASON reason, void * routersession) SERVICE* service = session->service; ROUTER* router = (ROUTER *)service->router; + if (NULL == dcb->session->router_session && DCB_REASON_ERROR != reason) + { + /* + * We cannot handle a DCB that does not have a router session, + * except in the case where error processing is invoked. + */ + return; + } switch(reason) { case DCB_REASON_CLOSE: diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index e40031d24..074b40475 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -71,6 +71,7 @@ extern __thread log_info_t tls_log_info; * 17/07/2014 Massimiliano Pinto Server connection counter is updated in closeSession * * 09/09/2015 Martin Brampton Modify error handler + * 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB * * @endverbatim */ @@ -5308,6 +5309,15 @@ static int router_handle_state_switch( int rc = 1; SERVER* srv; CHK_DCB(dcb); + if (NULL == dcb->session->router_session) + { + /* + * The following processing will fail if there is no router session, + * because the "data" parameter will not contain meaningful data, + * so we have no choice but to stop here. + */ + return; + } bref = (backend_ref_t *)data; CHK_BACKEND_REF(bref); diff --git a/server/modules/routing/schemarouter/schemarouter.c b/server/modules/routing/schemarouter/schemarouter.c index b2d1d9eb5..ed29d95e2 100644 --- a/server/modules/routing/schemarouter/schemarouter.c +++ b/server/modules/routing/schemarouter/schemarouter.c @@ -59,6 +59,7 @@ extern __thread log_info_t tls_log_info; * Date Who Description * 01/12/2014 Vilho Raatikka/Markus Mäkelä Initial implementation * 09/09/2015 Martin Brampton Modify error handler + * 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB * * @endverbatim */ @@ -4404,6 +4405,15 @@ router_handle_state_switch( SERVER* srv; CHK_DCB(dcb); + if (NULL == dcb->session->router_session) + { + /* + * The following processing will fail if there is no router session, + * because the "data" parameter will not contain meaningful data, + * so we have no choice but to stop here. + */ + return; + } bref = (backend_ref_t *) data; CHK_BACKEND_REF(bref);