Add to or take from persistent pool only if server is running; add conditions to DCB close in read-write handleError to check backend reference was in use.
This commit is contained in:
@ -1881,6 +1881,7 @@ dcb_maybe_add_persistent(DCB *dcb)
|
|||||||
&& strlen(dcb->user)
|
&& strlen(dcb->user)
|
||||||
&& dcb->server
|
&& dcb->server
|
||||||
&& dcb->server->persistpoolmax
|
&& dcb->server->persistpoolmax
|
||||||
|
&& (dcb->server->status & SERVER_RUNNING)
|
||||||
&& !dcb->dcb_errhandle_called
|
&& !dcb->dcb_errhandle_called
|
||||||
&& !(dcb->flags & DCBF_HUNG)
|
&& !(dcb->flags & DCBF_HUNG)
|
||||||
&& (poolcount = dcb_persistent_clean_count(dcb, false)) < dcb->server->persistpoolmax)
|
&& (poolcount = dcb_persistent_clean_count(dcb, false)) < dcb->server->persistpoolmax)
|
||||||
@ -2815,6 +2816,8 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall)
|
|||||||
if (cleanall
|
if (cleanall
|
||||||
|| persistentdcb-> dcb_errhandle_called
|
|| persistentdcb-> dcb_errhandle_called
|
||||||
|| count >= server->persistpoolmax
|
|| count >= server->persistpoolmax
|
||||||
|
|| persistentdcb->server == NULL
|
||||||
|
|| !(persistentdcb->server->status & SERVER_RUNNING)
|
||||||
|| (time(NULL) - persistentdcb->persistentstart) > server->persistmaxtime)
|
|| (time(NULL) - persistentdcb->persistentstart) > server->persistmaxtime)
|
||||||
{
|
{
|
||||||
/* Remove from persistent pool */
|
/* Remove from persistent pool */
|
||||||
|
|||||||
@ -4875,9 +4875,11 @@ static void handleError (
|
|||||||
bref = get_bref_from_dcb(rses, backend_dcb);
|
bref = get_bref_from_dcb(rses, backend_dcb);
|
||||||
if (bref != NULL)
|
if (bref != NULL)
|
||||||
{
|
{
|
||||||
|
bool bref_was_in_use = BREF_IS_IN_USE(bref);
|
||||||
CHK_BACKEND_REF(bref);
|
CHK_BACKEND_REF(bref);
|
||||||
bref_clear_state(bref, BREF_IN_USE);
|
bref_clear_state(bref, BREF_IN_USE);
|
||||||
bref_set_state(bref, BREF_CLOSED);
|
bref_set_state(bref, BREF_CLOSED);
|
||||||
|
if (bref_was_in_use)
|
||||||
dcb_close(backend_dcb);
|
dcb_close(backend_dcb);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -4958,11 +4960,15 @@ static void handle_error_reply_client(
|
|||||||
*/
|
*/
|
||||||
if ((bref = get_bref_from_dcb(rses, backend_dcb)) != NULL)
|
if ((bref = get_bref_from_dcb(rses, backend_dcb)) != NULL)
|
||||||
{
|
{
|
||||||
|
bool bref_was_in_use = BREF_IS_IN_USE(bref);
|
||||||
CHK_BACKEND_REF(bref);
|
CHK_BACKEND_REF(bref);
|
||||||
bref_clear_state(bref, BREF_IN_USE);
|
bref_clear_state(bref, BREF_IN_USE);
|
||||||
bref_set_state(bref, BREF_CLOSED);
|
bref_set_state(bref, BREF_CLOSED);
|
||||||
|
if (bref_was_in_use)
|
||||||
|
{
|
||||||
dcb_close(backend_dcb);
|
dcb_close(backend_dcb);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (sesstate == SESSION_STATE_ROUTER_READY)
|
if (sesstate == SESSION_STATE_ROUTER_READY)
|
||||||
{
|
{
|
||||||
@ -4998,6 +5004,7 @@ static bool handle_error_new_connection(
|
|||||||
int max_slave_rlag;
|
int max_slave_rlag;
|
||||||
backend_ref_t* bref;
|
backend_ref_t* bref;
|
||||||
bool succp;
|
bool succp;
|
||||||
|
bool bref_was_in_use;
|
||||||
|
|
||||||
myrses = *rses;
|
myrses = *rses;
|
||||||
ss_dassert(SPINLOCK_IS_LOCKED(&myrses->rses_lock));
|
ss_dassert(SPINLOCK_IS_LOCKED(&myrses->rses_lock));
|
||||||
@ -5014,6 +5021,7 @@ static bool handle_error_new_connection(
|
|||||||
goto return_succp;
|
goto return_succp;
|
||||||
}
|
}
|
||||||
CHK_BACKEND_REF(bref);
|
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
|
* If query was sent through the bref and it is waiting for reply from
|
||||||
@ -5049,8 +5057,10 @@ static bool handle_error_new_connection(
|
|||||||
DCB_REASON_NOT_RESPONDING,
|
DCB_REASON_NOT_RESPONDING,
|
||||||
&router_handle_state_switch,
|
&router_handle_state_switch,
|
||||||
(void *)bref);
|
(void *)bref);
|
||||||
|
if (bref_was_in_use)
|
||||||
|
{
|
||||||
dcb_close(backend_dcb);
|
dcb_close(backend_dcb);
|
||||||
|
}
|
||||||
router_nservers = router_get_servercount(inst);
|
router_nservers = router_get_servercount(inst);
|
||||||
max_nslaves = rses_get_max_slavecount(myrses, router_nservers);
|
max_nslaves = rses_get_max_slavecount(myrses, router_nservers);
|
||||||
max_slave_rlag = rses_get_max_replication_lag(myrses);
|
max_slave_rlag = rses_get_max_replication_lag(myrses);
|
||||||
|
|||||||
Reference in New Issue
Block a user