Avoid holding the lockPendingWrite for too long and deadlocking due to lock inversion

Former-commit-id: a4b49fbec60e2333a4407d24383ae204d5d2b413
This commit is contained in:
John Sully 2021-06-25 02:31:17 +00:00
parent 815ebe1e6b
commit e6a82692b7

View File

@ -2018,7 +2018,6 @@ void ProcessPendingAsyncWrites()
* need to use a syscall in order to install the writable event handler, * need to use a syscall in order to install the writable event handler,
* get it called, and so forth. */ * get it called, and so forth. */
int handleClientsWithPendingWrites(int iel, int aof_state) { int handleClientsWithPendingWrites(int iel, int aof_state) {
std::unique_lock<fastlock> lockf(g_pserver->rgthreadvar[iel].lockPendingWrite);
int processed = 0; int processed = 0;
serverAssert(iel == (serverTL - g_pserver->rgthreadvar)); serverAssert(iel == (serverTL - g_pserver->rgthreadvar));
@ -2041,7 +2040,9 @@ int handleClientsWithPendingWrites(int iel, int aof_state) {
ae_flags |= AE_BARRIER; ae_flags |= AE_BARRIER;
} }
std::unique_lock<fastlock> lockf(g_pserver->rgthreadvar[iel].lockPendingWrite);
auto vec = std::move(g_pserver->rgthreadvar[iel].clients_pending_write); auto vec = std::move(g_pserver->rgthreadvar[iel].clients_pending_write);
lockf.unlock();
processed += (int)vec.size(); processed += (int)vec.size();
for (client *c : vec) { for (client *c : vec) {