From 0cba0ed30be1c0f70abd5c6ba958d1b869280164 Mon Sep 17 00:00:00 2001 From: Malavan Sotheeswaran Date: Thu, 9 Feb 2023 12:06:27 -0800 Subject: [PATCH] refactor aeReleaseForkLockChild to capture releaseRead case --- src/ae.cpp | 4 ++-- src/ae.h | 2 +- src/readwritelock.h | 21 +++++++-------------- src/server.cpp | 3 ++- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/ae.cpp b/src/ae.cpp index af4bd1369..99093daa8 100644 --- a/src/ae.cpp +++ b/src/ae.cpp @@ -859,9 +859,9 @@ void aeReleaseForkLock() g_forkLock.downgradeWrite(); } -void aeReleaseForkLockChild() +void aeForkLockInChild() { - g_forkLock.downgradeWriteChild(); + g_forkLock.setNotify(false); } int aeThreadOwnsLock() diff --git a/src/ae.h b/src/ae.h index 384aaaa2b..3868db4a0 100644 --- a/src/ae.h +++ b/src/ae.h @@ -171,7 +171,7 @@ int aeTryAcquireLock(int fWeak); void aeThreadOffline(); void aeReleaseLock(); void aeReleaseForkLock(); -void aeReleaseForkLockChild(); +void aeForkLockInChild(); int aeThreadOwnsLock(); void aeSetThreadOwnsLockOverride(int fOverride); int aeLockContested(int threshold); diff --git a/src/readwritelock.h b/src/readwritelock.h index 4cc839991..79f0ac710 100644 --- a/src/readwritelock.h +++ b/src/readwritelock.h @@ -8,6 +8,7 @@ class readWriteLock { int m_readCount = 0; int m_writeCount = 0; bool m_writeWaiting = false; + bool m_notify = true; public: readWriteLock(const char *name) : m_readLock(name), m_writeLock(name) {} @@ -65,7 +66,8 @@ public: void releaseRead() { std::unique_lock rm(m_readLock); m_readCount--; - m_cv.notify_all(); + if (m_notify) + m_cv.notify_all(); } void releaseWrite(bool exclusive = true) { @@ -74,16 +76,8 @@ public: if (exclusive) m_writeLock.unlock(); m_writeCount--; - m_cv.notify_all(); - } - - void releaseWriteChild(bool exclusive = true) { - std::unique_lock rm(m_readLock); - serverAssert(m_writeCount > 0); - if (exclusive) - m_writeLock.unlock(); - m_writeCount--; - m_writeWaiting = false; + if (m_notify) + m_cv.notify_all(); } void downgradeWrite(bool exclusive = true) { @@ -91,9 +85,8 @@ public: acquireRead(); } - void downgradeWriteChild(bool exclusive = true) { - releaseWriteChild(exclusive); - acquireRead(); + void setNotify(bool notify) { + m_notify = notify; } bool hasReader() { diff --git a/src/server.cpp b/src/server.cpp index d3e641d18..9b983585e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -6888,7 +6888,8 @@ int redisFork(int purpose) { latencyAddSampleIfNeeded("fork-lock",(ustime()-startWriteLock)/1000); if ((childpid = fork()) == 0) { /* Child */ - aeReleaseForkLockChild(); + aeForkLockInChild(); + aeReleaseForkLock(); g_pserver->in_fork_child = purpose; setOOMScoreAdj(CONFIG_OOM_BGCHILD); setupChildSignalHandlers();