diff --git a/server/core/dcb.c b/server/core/dcb.c index 1654aec3c..ddbdf19ca 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -1838,6 +1838,15 @@ dcb_close(DCB *dcb) dcb_final_free(dcb); return; } + + /* + * If DCB is in persistent pool, mark it as an error and exit + */ + if (dcb->persistentstart) + { + dcb->dcb_errhandle_called = true; + return; + } spinlock_acquire(&zombiespin); if (!dcb->dcb_is_zombie) @@ -1879,6 +1888,8 @@ dcb_maybe_add_persistent(DCB *dcb) int poolcount = -1; if (dcb->user != NULL && strlen(dcb->user) + && dcb->session->state != SESSION_STATE_STOPPING + && dcb->session->state != SESSION_STATE_TO_BE_FREED && dcb->server && dcb->server->persistpoolmax && (dcb->server->status & SERVER_RUNNING) @@ -2817,6 +2828,8 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall) || persistentdcb-> dcb_errhandle_called || count >= server->persistpoolmax || persistentdcb->server == NULL + || persistentdcb->session->state == SESSION_STATE_STOPPING + || persistentdcb->session->state == SESSION_STATE_TO_BE_FREED || !(persistentdcb->server->status & SERVER_RUNNING) || (time(NULL) - persistentdcb->persistentstart) > server->persistmaxtime) { @@ -2846,6 +2859,7 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall) while (disposals) { nextdcb = disposals->nextpersistent; + disposals->persistentstart = 0; dcb_close_finish(disposals); dcb_close(disposals); disposals = nextdcb; diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index 46fce6cee..d8d8033f0 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -4875,7 +4875,6 @@ static void handleError ( bref = get_bref_from_dcb(rses, backend_dcb); if (bref != NULL) { - bool bref_was_in_use = BREF_IS_IN_USE(bref); CHK_BACKEND_REF(bref); bref_clear_state(bref, BREF_IN_USE); bref_set_state(bref, BREF_CLOSED); @@ -4960,7 +4959,6 @@ static void handle_error_reply_client( */ if ((bref = get_bref_from_dcb(rses, backend_dcb)) != NULL) { - bool bref_was_in_use = BREF_IS_IN_USE(bref); CHK_BACKEND_REF(bref); bref_clear_state(bref, BREF_IN_USE); bref_set_state(bref, BREF_CLOSED); @@ -5000,7 +4998,6 @@ static bool handle_error_new_connection( int max_slave_rlag; backend_ref_t* bref; bool succp; - bool bref_was_in_use; myrses = *rses; ss_dassert(SPINLOCK_IS_LOCKED(&myrses->rses_lock)); @@ -5017,7 +5014,6 @@ static bool handle_error_new_connection( goto return_succp; } CHK_BACKEND_REF(bref); - bref_was_in_use = BREF_IS_IN_USE(bref); /** * If query was sent through the bref and it is waiting for reply from