From c43bb8e8b5d447a936d7e14bc835f579beb0aee6 Mon Sep 17 00:00:00 2001 From: John Sully Date: Fri, 12 Feb 2021 19:38:57 +0000 Subject: [PATCH] Fix deadlock in storage prefetch Former-commit-id: 9e6162de08248f7726b97b73aee2f23808ff4e7b --- src/db.cpp | 6 +++--- src/networking.cpp | 2 +- src/server.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/db.cpp b/src/db.cpp index 14c292b6f..ee79536d6 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -2959,7 +2959,7 @@ int dbnumFromDb(redisDb *db) serverPanic("invalid database pointer"); } -void redisDbPersistentData::prefetchKeysAsync(parsed_command &command) +void redisDbPersistentData::prefetchKeysAsync(client *c, parsed_command &command) { if (m_spstorage == nullptr) return; @@ -2967,7 +2967,7 @@ void redisDbPersistentData::prefetchKeysAsync(parsed_command &command) AeLocker lock; std::vector veckeys; - lock.arm(nullptr); + lock.arm(c); getKeysResult result = GETKEYS_RESULT_INIT; auto cmd = lookupCommand(szFromObj(command.argv[0])); int numkeys = getKeysFromCommand(cmd, command.argv, command.argc, &result); @@ -3000,7 +3000,7 @@ void redisDbPersistentData::prefetchKeysAsync(parsed_command &command) vecInserts.emplace_back(sharedKey, o, std::move(spexpire)); } - lock.arm(nullptr); + lock.arm(c); for (auto &tuple : vecInserts) { sds sharedKey = std::get<0>(tuple); diff --git a/src/networking.cpp b/src/networking.cpp index be50373c9..15aa6f43a 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -2362,7 +2362,7 @@ void parseClientCommandBuffer(client *c) { if (cqueries < c->vecqueuedcmd.size() && g_pserver->m_pstorageFactory != nullptr && !GlobalLocksAcquired()) { auto &query = c->vecqueuedcmd.back(); if (query.argc > 0 && query.argc == query.argcMax) { - c->db->prefetchKeysAsync(query); + c->db->prefetchKeysAsync(c, query); } } c->reqtype = 0; diff --git a/src/server.h b/src/server.h index 7d2611c37..941770450 100644 --- a/src/server.h +++ b/src/server.h @@ -1136,7 +1136,7 @@ public: bool removeCachedValue(const char *key); void removeAllCachedValues(); - void prefetchKeysAsync(struct parsed_command &command); + void prefetchKeysAsync(client *c, struct parsed_command &command); bool FSnapshot() const { return m_spdbSnapshotHOLDER != nullptr; }