Fix candidate to bug #615

Mark backend reference closed in handleError
This commit is contained in:
VilhoRaatikka
2014-11-14 15:20:15 +02:00
parent 89713f8bcb
commit 81009e7d19

View File

@ -267,7 +267,11 @@ static bool handle_error_new_connection(
ROUTER_CLIENT_SES* rses, ROUTER_CLIENT_SES* rses,
DCB* backend_dcb, DCB* backend_dcb,
GWBUF* errmsg); GWBUF* errmsg);
static void handle_error_reply_client(SESSION* ses, GWBUF* errmsg); static void handle_error_reply_client(
SESSION* ses,
ROUTER_CLIENT_SES* rses,
DCB* backend_dcb,
GWBUF* errmsg);
static backend_ref_t* get_root_master_bref(ROUTER_CLIENT_SES* rses); static backend_ref_t* get_root_master_bref(ROUTER_CLIENT_SES* rses);
@ -4116,7 +4120,7 @@ static void handleError (
switch (action) { switch (action) {
case ERRACT_NEW_CONNECTION: case ERRACT_NEW_CONNECTION:
{ {
if (!rses_begin_locked_router_action(rses)) if (!rses_begin_locked_router_action(rses))
{ {
*succp = false; *succp = false;
@ -4134,7 +4138,6 @@ static void handleError (
*succp = false; *succp = false;
rses_end_locked_router_action(rses); rses_end_locked_router_action(rses);
return;
} }
/** /**
* This is called in hope of getting replacement for * This is called in hope of getting replacement for
@ -4150,7 +4153,10 @@ static void handleError (
case ERRACT_REPLY_CLIENT: case ERRACT_REPLY_CLIENT:
{ {
handle_error_reply_client(session, errmsgbuf); handle_error_reply_client(session,
rses,
backend_dcb,
errmsgbuf);
*succp = false; /*< no new backend servers were made available */ *succp = false; /*< no new backend servers were made available */
break; break;
} }
@ -4163,16 +4169,29 @@ static void handleError (
static void handle_error_reply_client( static void handle_error_reply_client(
SESSION* ses, SESSION* ses,
GWBUF* errmsg) ROUTER_CLIENT_SES* rses,
DCB* backend_dcb,
GWBUF* errmsg)
{ {
session_state_t sesstate; session_state_t sesstate;
DCB* client_dcb; DCB* client_dcb;
backend_ref_t* bref;
spinlock_acquire(&ses->ses_lock); spinlock_acquire(&ses->ses_lock);
sesstate = ses->state; sesstate = ses->state;
client_dcb = ses->client; client_dcb = ses->client;
spinlock_release(&ses->ses_lock); spinlock_release(&ses->ses_lock);
/**
* If bref exists, mark it closed
*/
if ((bref = get_bref_from_dcb(rses, backend_dcb)) != NULL)
{
CHK_BACKEND_REF(bref);
bref_clear_state(bref, BREF_IN_USE);
bref_set_state(bref, BREF_CLOSED);
}
if (sesstate == SESSION_STATE_ROUTER_READY) if (sesstate == SESSION_STATE_ROUTER_READY)
{ {