From 69b550d91a8f4e864fa98d22a3bcd6158b2f6962 Mon Sep 17 00:00:00 2001 From: John Sully Date: Sun, 24 May 2020 17:11:56 -0400 Subject: [PATCH] Fix crash on shutdown with snapshots pending Former-commit-id: 124e79a81d6995ea7d5ba39d1830b591b705acbf --- src/db.cpp | 4 ++-- src/evict.cpp | 2 +- src/server.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 7fde78da1..fdb167dec 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -2463,8 +2463,8 @@ void redisDbPersistentData::commitChanges() redisDbPersistentData::~redisDbPersistentData() { - if (m_pdbSnapshotASYNC) - endSnapshot(m_pdbSnapshotASYNC); + if (m_spdbSnapshotHOLDER != nullptr) + endSnapshot(m_spdbSnapshotHOLDER.get()); //serverAssert(m_pdbSnapshot == nullptr); serverAssert(m_refCount == 0); diff --git a/src/evict.cpp b/src/evict.cpp index e15ddb6cc..8429ea3db 100644 --- a/src/evict.cpp +++ b/src/evict.cpp @@ -721,6 +721,6 @@ cant_free: * */ int freeMemoryIfNeededAndSafe(bool fPreSnapshot) { - if (g_pserver->lua_timedout || g_pserver->loading) return C_OK; + if (g_pserver->shutdown_asap || g_pserver->lua_timedout || g_pserver->loading) return C_OK; return freeMemoryIfNeeded(fPreSnapshot); } diff --git a/src/server.cpp b/src/server.cpp index 55eb41828..5c53d7157 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -5926,10 +5926,16 @@ int main(int argc, char **argv) { pthread_join(rgthread[iel], &pvRet); /* free our databases */ + bool fLockAcquired = aeTryAcquireLock(false); + g_pserver->shutdown_asap = true; // flag that we're in shutdown + if (!fLockAcquired) + g_fInCrash = true; // We don't actually crash right away, because we want to sync any storage providers for (int idb = 0; idb < cserver.dbnum; ++idb) { delete g_pserver->db[idb]; g_pserver->db[idb] = nullptr; } + // If we couldn't acquire the global lock it means something wasn't shutdown and we'll probably deadlock + serverAssert(fLockAcquired); g_pserver->garbageCollector.shutdown(); delete g_pserver->m_pstorageFactory;