From d57883bf6443b679d22b6942b05af49dab188d22 Mon Sep 17 00:00:00 2001 From: John Sully Date: Fri, 15 Oct 2021 16:22:42 +0000 Subject: [PATCH 1/5] Permit prefetch for FLASH scenarios in single thread mode Former-commit-id: 6d0b90ed43cc9d1196903ddbc7d50cd40e439e42 --- src/networking.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/networking.cpp b/src/networking.cpp index d8b3e9a5d..1638328c0 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -2547,7 +2547,7 @@ void parseClientCommandBuffer(client *c) { } /* Prefetch outside the lock for better perf */ - if (g_pserver->prefetch_enabled && cserver.cthreads > 1 && cqueriesStart < c->vecqueuedcmd.size() && + if (g_pserver->prefetch_enabled && (cserver.cthreads > 1 || g_pserver->m_pstorageFactory) && cqueriesStart < c->vecqueuedcmd.size() && (g_pserver->m_pstorageFactory || aeLockContested(cserver.cthreads/2) || cserver.cthreads == 1) && !GlobalLocksAcquired()) { auto &query = c->vecqueuedcmd.back(); if (query.argc > 0 && query.argc == query.argcMax) { From 43a62493f872874e965b3edbbfaba199c292d675 Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 20 Oct 2021 03:13:36 +0000 Subject: [PATCH 2/5] Additional change to ensure FLASH storage goes through the multithread path Former-commit-id: 422ea0723f0b8718f28ef9c1cc4d5f56d374af46 --- src/networking.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/networking.cpp b/src/networking.cpp index 1638328c0..72b2ec59e 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -2694,7 +2694,7 @@ void readQueryFromClient(connection *conn) { return; } - if (cserver.cthreads > 1) { + if (cserver.cthreads > 1 || g_pserver->m_pstorageFactory) { parseClientCommandBuffer(c); serverTL->vecclientsProcess.push_back(c); } else { From 7b3337d244bf718f0fb15b0db8a194a3ed9dd974 Mon Sep 17 00:00:00 2001 From: John Sully Date: Thu, 21 Oct 2021 22:46:17 +0000 Subject: [PATCH 3/5] Ensure async rehash completes before we start a new time. Degrad to sync hash if necessary to ensure this Former-commit-id: 0f830facc7c6bc6668af9bb2e10b6e13a13227aa --- src/server.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index ef1039cea..f257883e0 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2112,12 +2112,11 @@ void databasesCron(bool fMainThread) { if (g_pserver->activerehashing) { for (j = 0; j < dbs_per_call; j++) { if (serverTL->rehashCtl != nullptr) { - if (dictRehashSomeAsync(serverTL->rehashCtl, 5)) { + if (dictRehashSomeAsync(serverTL->rehashCtl, rehashes_per_ms)) { break; - } else { - dictCompleteRehashAsync(serverTL->rehashCtl, true /*fFree*/); - serverTL->rehashCtl = nullptr; - } + } + dictCompleteRehashAsync(serverTL->rehashCtl, true /*fFree*/); + serverTL->rehashCtl = nullptr; } serverAssert(serverTL->rehashCtl == nullptr); From 3f089054080d98e8a87d8bdbf2c5f4deba1595a1 Mon Sep 17 00:00:00 2001 From: John Sully Date: Thu, 21 Oct 2021 23:45:46 +0000 Subject: [PATCH 4/5] Do not dereference a nullptr if there are too many files open Former-commit-id: 4674eb29a261e8b046953398c94354fc3e550c2a --- src/server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index f257883e0..1794f51e8 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3793,8 +3793,6 @@ static void initServerThread(struct redisServerThreadVars *pvar, int fMain) pvar->in_eval = 0; pvar->in_exec = 0; pvar->el = aeCreateEventLoop(g_pserver->maxclients+CONFIG_FDSET_INCR); - aeSetBeforeSleepProc(pvar->el, beforeSleep, AE_SLEEP_THREADSAFE); - aeSetAfterSleepProc(pvar->el, afterSleep, AE_SLEEP_THREADSAFE); pvar->current_client = nullptr; pvar->fRetrySetAofEvent = false; if (pvar->el == NULL) { @@ -3803,6 +3801,8 @@ static void initServerThread(struct redisServerThreadVars *pvar, int fMain) strerror(errno)); exit(1); } + aeSetBeforeSleepProc(pvar->el, beforeSleep, AE_SLEEP_THREADSAFE); + aeSetAfterSleepProc(pvar->el, afterSleep, AE_SLEEP_THREADSAFE); fastlock_init(&pvar->lockPendingWrite, "lockPendingWrite"); From fbe9ff66804cc8d48e3919ab1e18bea9949b6327 Mon Sep 17 00:00:00 2001 From: malavan Date: Thu, 21 Oct 2021 23:50:50 +0000 Subject: [PATCH 5/5] null check for delete override Former-commit-id: f5f2f5e200a5ff1b0306998624b758d5a4c10825 --- src/new.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/new.cpp b/src/new.cpp index 4775e207a..4e6b07dfd 100644 --- a/src/new.cpp +++ b/src/new.cpp @@ -27,14 +27,17 @@ void *operator new(std::size_t size, const std::nothrow_t &) noexcept return zmalloc(size, MALLOC_LOCAL); } +//need to do null checks for delete since the compiler can optimize out null checks in zfree void operator delete(void * p) noexcept { - zfree(p); + if (p != nullptr) + zfree(p); } void operator delete(void *p, std::size_t) noexcept { - zfree(p); + if (p != nullptr) + zfree(p); } #endif