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