From f6b9c13c54b2278f6a43e54d45eceb62484235c3 Mon Sep 17 00:00:00 2001 From: John Sully Date: Mon, 8 Feb 2021 19:02:01 +0000 Subject: [PATCH] Fix deadlock with disconnecting client and storage provider Former-commit-id: 0831745323e425f463322e8c0dc27fc25854868e --- src/server.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 137976437..5e566f957 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2592,6 +2592,18 @@ void beforeSleep(struct aeEventLoop *eventLoop) { int aof_state = g_pserver->aof_state; + mstime_t commit_latency; + latencyStartMonitor(commit_latency); + if (g_pserver->m_pstorageFactory != nullptr) + { + locker.disarm(); + for (redisDb *db : vecdb) + db->commitChanges(); + locker.arm(); + } + latencyEndMonitor(commit_latency); + latencyAddSampleIfNeeded("storage-commit", commit_latency); + /* We try to handle writes at the end so we don't have to reacquire the lock, but if there is a pending async close we need to ensure the writes happen first so perform it here */ @@ -2602,16 +2614,6 @@ void beforeSleep(struct aeEventLoop *eventLoop) { locker.arm(); fSentReplies = true; } - - mstime_t commit_latency; - latencyStartMonitor(commit_latency); - if (g_pserver->m_pstorageFactory != nullptr) - { - for (redisDb *db : vecdb) - db->commitChanges(); - } - latencyEndMonitor(commit_latency); - latencyAddSampleIfNeeded("storage-commit", commit_latency); if (!serverTL->gcEpoch.isReset()) g_pserver->garbageCollector.endEpoch(serverTL->gcEpoch, true /*fNoFree*/);