diff --git a/src/db.cpp b/src/db.cpp index 48c06e479..29067c975 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -2301,6 +2301,9 @@ void redisDbPersistentData::commitChanges(const changelist &vec) redisDbPersistentData::~redisDbPersistentData() { + if (m_pdbSnapshotASYNC) + endSnapshot(m_pdbSnapshotASYNC); + serverAssert(m_spdbSnapshotHOLDER == nullptr); //serverAssert(m_pdbSnapshot == nullptr); serverAssert(m_refCount == 0); diff --git a/src/rdb.cpp b/src/rdb.cpp index 65d455416..3179e6e2d 100644 --- a/src/rdb.cpp +++ b/src/rdb.cpp @@ -2644,14 +2644,23 @@ void backgroundSaveDoneHandler(int exitcode, bool fCancelled) { } /* Kill the RDB saving child using SIGUSR1 (so that the parent will know - * the child did not exit for an error, but because we wanted), and performs + * the child did not exit for sn error, but because we wanted), and performs * the cleanup needed. */ -void killRDBChild(void) { +void killRDBChild(bool fSynchronous) { serverAssert(GlobalLocksAcquired()); g_pserver->rdbThreadVars.fRdbThreadCancel = true; rdbRemoveTempFile(g_pserver->rdbThreadVars.tmpfileNum); closeChildInfoPipe(); updateDictResizePolicy(); + if (fSynchronous) + { + aeReleaseLock(); + serverAssert(!GlobalLocksAcquired()); + void *result; + pthread_join(g_pserver->rdbThreadVars.rdb_child_thread, &result); + g_pserver->rdbThreadVars.fRdbThreadCancel = false; + aeAcquireLock(); + } } struct rdbSaveSocketThreadArgs diff --git a/src/server.cpp b/src/server.cpp index f48d10d8f..5c6a2873f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3960,7 +3960,7 @@ int prepareForShutdown(int flags) { overwrite the synchronous saving did by SHUTDOWN. */ if (g_pserver->FRdbSaveInProgress()) { serverLog(LL_WARNING,"There is a child saving an .rdb. Killing it!"); - killRDBChild(); + killRDBChild(true); } /* Kill module child if there is one. */ diff --git a/src/server.h b/src/server.h index d58e69228..d85a84235 100644 --- a/src/server.h +++ b/src/server.h @@ -2767,7 +2767,7 @@ int writeCommandsDeniedByDiskError(void); /* RDB persistence */ #include "rdb.h" -void killRDBChild(void); +void killRDBChild(bool fSynchronous = false); /* AOF persistence */ void flushAppendOnlyFile(int force);