Run DCB close separately from spinlocked removal from pool.

This commit is contained in:
counterpoint
2015-06-10 15:43:43 +01:00
parent 267e702dcd
commit 50cc290bc4

View File

@ -2281,6 +2281,7 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall)
SERVER *server = dcb->server; SERVER *server = dcb->server;
DCB *previousdcb = NULL; DCB *previousdcb = NULL;
DCB *persistentdcb = server->persistent; DCB *persistentdcb = server->persistent;
DCB *disposals = NULL;
CHK_SERVER(server); CHK_SERVER(server);
spinlock_acquire(&server->persistlock); spinlock_acquire(&server->persistlock);
@ -2295,8 +2296,8 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall)
{ {
server->persistent = persistentdcb->nextpersistent; server->persistent = persistentdcb->nextpersistent;
} }
/** Call possible callback for this DCB in case of close */ persistentdcb->nextpersistent = disposals;
dcb_close_finish(persistentdcb); disposals = persistentdcb;
} }
else else
{ {
@ -2306,6 +2307,12 @@ dcb_persistent_clean_count(DCB *dcb, bool cleanall)
persistentdcb = persistentdcb->nextpersistent; persistentdcb = persistentdcb->nextpersistent;
} }
spinlock_release(&server->persistlock); spinlock_release(&server->persistlock);
/** Call possible callback for this DCB in case of close */
while (persistentdcb = disposals)
{
dcb_close_finish(persistentdcb);
disposals = disposals->nextpersistent;
}
} }
return count; return count;
} }