From f435218ed92435a7fcd8473933e5651ac2c89a85 Mon Sep 17 00:00:00 2001 From: John Sully Date: Fri, 25 Aug 2023 16:44:10 +0000 Subject: [PATCH] Fix memory leaks --- src/db.cpp | 5 ----- src/expire.h | 4 ++++ src/modules/keydb_modstatsd/Makefile | 2 +- src/object.cpp | 2 ++ src/replication.cpp | 2 ++ src/server.h | 1 + 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 9bc67a396..d351fde58 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -2703,11 +2703,6 @@ void redisDbPersistentData::prepOverwriteForSnapshot(char *key) auto itr = m_pdbSnapshot->find_cached_threadsafe(key); if (itr.key() != nullptr) { - if (itr.val()->FExpires()) { - // Note: I'm sure we could handle this, but its too risky at the moment. - // There are known bugs doing this with expires - return; - } sds keyNew = sdsdupshared(itr.key()); if (dictAdd(m_pdictTombstone, keyNew, (void*)dictHashKey(m_pdict, key)) != DICT_OK) sdsfree(keyNew); diff --git a/src/expire.h b/src/expire.h index 2211fb160..5cdfbc702 100644 --- a/src/expire.h +++ b/src/expire.h @@ -160,6 +160,8 @@ public: expireEntry &operator=(expireEntry &&e) { + if (FFat()) + delete pfatentry(); s = e.s; e.s.m_whenAndPtrUnion = 0; e.s.fFat = false; @@ -167,6 +169,8 @@ public: } expireEntry &operator=(expireEntry &e) { + if (FFat()) + delete pfatentry(); if (e.FFat()) { s.m_whenAndPtrUnion = reinterpret_cast(new expireEntryFat(*e.pfatentry())); s.fFat = true; diff --git a/src/modules/keydb_modstatsd/Makefile b/src/modules/keydb_modstatsd/Makefile index bcb1d0617..f0ccea39f 100644 --- a/src/modules/keydb_modstatsd/Makefile +++ b/src/modules/keydb_modstatsd/Makefile @@ -4,7 +4,7 @@ OBJECT_FILES := modmain.o MODSNAP_CXX_FLAGS := -std=gnu++14 %.o: %.cpp - $(CXX) -o $@ -c $< $(MODULE_FLAGS) -I../../../deps/cpp-statsd-client/include $(MODSNAP_CXX_FLAGS) + $(CXX) -o $@ -c $< $(MODULE_FLAGS) -I../../../deps/cpp-statsd-client/include $(MODSNAP_CXX_FLAGS) -g modstatsd.so: $(OBJECT_FILES) $(CXX) -shared $(OBJECT_FILES) -o modstatsd.so diff --git a/src/object.cpp b/src/object.cpp index 82a492b51..fe7b04dfc 100644 --- a/src/object.cpp +++ b/src/object.cpp @@ -46,6 +46,7 @@ robj *createObject(int type, void *ptr) { char *oB = (char*)zcalloc(sizeof(robj)+mvccExtraBytes, MALLOC_SHARED); robj *o = reinterpret_cast(oB + mvccExtraBytes); + new (o) redisObject; o->type = type; o->encoding = OBJ_ENCODING_RAW; o->m_ptr = ptr; @@ -418,6 +419,7 @@ void decrRefCount(robj_roptr o) { case OBJ_NESTEDHASH: freeNestedHashObject(o); break; default: serverPanic("Unknown object type"); break; } + o->~redisObject(); if (g_pserver->fActiveReplica) { zfree(reinterpret_cast(o.unsafe_robjcast())-1); } else { diff --git a/src/replication.cpp b/src/replication.cpp index 23fe54883..3e861e30b 100644 --- a/src/replication.cpp +++ b/src/replication.cpp @@ -188,6 +188,8 @@ int bg_unlink(const char *filename) { /* ---------------------------------- MASTER -------------------------------- */ bool createDiskBacklog() { + if (g_pserver->repl_backlog_disk != nullptr) + return true; // already exists // Lets create some disk backed pages and add them here std::string path = "./repl-backlog-temp" + std::to_string(gettid()); #if (defined __APPLE__ || defined __FreeBSD__) diff --git a/src/server.h b/src/server.h index cd612626e..a77b3aa87 100644 --- a/src/server.h +++ b/src/server.h @@ -966,6 +966,7 @@ struct redisObjectExtended { typedef struct redisObject { friend redisObject *createEmbeddedStringObject(const char *ptr, size_t len); + friend redisObject *createObject(int type, void *ptr); protected: redisObject() {}