From b5ab1d64e2b03276fc9d9e455e23ac4bae3928da Mon Sep 17 00:00:00 2001 From: Malavan Sotheeswaran Date: Thu, 9 Feb 2023 10:28:22 -0800 Subject: [PATCH] need child specific release that doesn't trigger cv --- src/ae.cpp | 5 +++++ src/ae.h | 1 + src/readwritelock.h | 14 ++++++++++++++ src/server.cpp | 1 + 4 files changed, 21 insertions(+) diff --git a/src/ae.cpp b/src/ae.cpp index 9d8c945d5..af4bd1369 100644 --- a/src/ae.cpp +++ b/src/ae.cpp @@ -859,6 +859,11 @@ void aeReleaseForkLock() g_forkLock.downgradeWrite(); } +void aeReleaseForkLockChild() +{ + g_forkLock.downgradeWriteChild(); +} + int aeThreadOwnsLock() { return fOwnLockOverride || g_lock.fOwnLock(); diff --git a/src/ae.h b/src/ae.h index cd513f652..384aaaa2b 100644 --- a/src/ae.h +++ b/src/ae.h @@ -171,6 +171,7 @@ int aeTryAcquireLock(int fWeak); void aeThreadOffline(); void aeReleaseLock(); void aeReleaseForkLock(); +void aeReleaseForkLockChild(); int aeThreadOwnsLock(); void aeSetThreadOwnsLockOverride(int fOverride); int aeLockContested(int threshold); diff --git a/src/readwritelock.h b/src/readwritelock.h index a7318a29f..4cc839991 100644 --- a/src/readwritelock.h +++ b/src/readwritelock.h @@ -77,11 +77,25 @@ public: 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; + } + void downgradeWrite(bool exclusive = true) { releaseWrite(exclusive); acquireRead(); } + void downgradeWriteChild(bool exclusive = true) { + releaseWriteChild(exclusive); + acquireRead(); + } + bool hasReader() { return m_readCount > 0; } diff --git a/src/server.cpp b/src/server.cpp index ac1f17d3a..d3e641d18 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -6888,6 +6888,7 @@ int redisFork(int purpose) { latencyAddSampleIfNeeded("fork-lock",(ustime()-startWriteLock)/1000); if ((childpid = fork()) == 0) { /* Child */ + aeReleaseForkLockChild(); g_pserver->in_fork_child = purpose; setOOMScoreAdj(CONFIG_OOM_BGCHILD); setupChildSignalHandlers();