Never exceed persistent connection limits

By doing the persistent connection count incrementation with CAS, value
can be guaranteed to never exceed the configured limit.
This commit is contained in:
Markus Mäkelä
2019-05-09 14:43:57 +03:00
parent 034dc6a67e
commit 37bfe1cd67
2 changed files with 56 additions and 3 deletions

View File

@ -1319,9 +1319,13 @@ static bool dcb_maybe_add_persistent(DCB* dcb)
&& (dcb->server->status & SERVER_RUNNING)
&& !dcb->dcb_errhandle_called
&& !(dcb->flags & DCBF_HUNG)
&& dcb_persistent_clean_count(dcb, owner->id(), false) < dcb->server->persistpoolmax
&& mxb::atomic::load(&dcb->server->stats.n_persistent) < dcb->server->persistpoolmax)
&& dcb_persistent_clean_count(dcb, owner->id(), false) < dcb->server->persistpoolmax)
{
if (!mxb::atomic::add_limited(&dcb->server->stats.n_persistent, 1, (int)dcb->server->persistpoolmax))
{
return false;
}
DCB_CALLBACK* loopcallback;
MXS_DEBUG("Adding DCB to persistent pool, user %s.", dcb->user);
dcb->was_persistent = false;
@ -1357,7 +1361,6 @@ static bool dcb_maybe_add_persistent(DCB* dcb)
dcb->nextpersistent = dcb->server->persistent[owner->id()];
dcb->server->persistent[owner->id()] = dcb;
mxb::atomic::add(&dcb->server->stats.n_persistent, 1);
MXB_AT_DEBUG(int rc = ) mxb::atomic::add(&dcb->server->stats.n_current, -1, mxb::atomic::RELAXED);
mxb_assert(rc > 0);
return true;