From efdfbe5e1871ef9f0149967d2a8e22d3974ce5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sun, 6 Jan 2019 13:15:45 -0500 Subject: [PATCH] namedirectory: lock cache during lookup Change-Id: If92032d68a6429695cb698ca6fc497b1b095f3a5 --- src/ringdht/namedirectory.cpp | 18 +++++++++--------- src/ringdht/namedirectory.h | 14 +++++++++++++- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/ringdht/namedirectory.cpp b/src/ringdht/namedirectory.cpp index 2c4d5a7776..d093c2dbac 100644 --- a/src/ringdht/namedirectory.cpp +++ b/src/ringdht/namedirectory.cpp @@ -105,9 +105,9 @@ size_t getContentLength(restbed::Response& reply) void NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) { try { - auto cacheRes = nameCache_.find(addr); - if (cacheRes != nameCache_.end()) { - cb(cacheRes->second, Response::found); + std::string cacheResult = nameCache(addr); + if (not cacheResult.empty()) { + cb(cacheResult, Response::found); return; } @@ -179,9 +179,9 @@ void NameDirectory::lookupName(const std::string& n, LookupCallback cb) } toLower(name); - auto cacheRes = addrCache_.find(name); - if (cacheRes != addrCache_.end()) { - cb(cacheRes->second, Response::found); + std::string cacheResult = addrCache(name); + if (not cacheResult.empty()) { + cb(cacheResult, Response::found); return; } @@ -260,9 +260,9 @@ void NameDirectory::registerName(const std::string& addr, const std::string& n, } toLower(name); - auto cacheRes = addrCache_.find(name); - if (cacheRes != addrCache_.end()) { - if (cacheRes->second == addr) + auto cacheResult = addrCache(name); + if (not cacheResult.empty()) { + if (cacheResult == addr) cb(RegistrationResponse::success); else cb(RegistrationResponse::alreadyTaken); diff --git a/src/ringdht/namedirectory.h b/src/ringdht/namedirectory.h index 1590c47361..62049ef4fb 100644 --- a/src/ringdht/namedirectory.h +++ b/src/ringdht/namedirectory.h @@ -58,12 +58,24 @@ private: NameDirectory(NameDirectory&&) = delete; constexpr static const char* const DEFAULT_SERVER_HOST = "ns.jami.net"; + std::mutex lock_ {}; + const std::string serverHost_ {DEFAULT_SERVER_HOST}; const std::string cachePath_; std::map<std::string, std::string> nameCache_ {}; std::map<std::string, std::string> addrCache_ {}; - std::mutex lock_ {}; + + std::string nameCache(const std::string& addr) { + std::lock_guard<std::mutex> l(lock_); + auto cacheRes = nameCache_.find(addr); + return cacheRes != nameCache_.end() ? cacheRes->second : std::string{}; + } + std::string addrCache(const std::string& name) { + std::lock_guard<std::mutex> l(lock_); + auto cacheRes = addrCache_.find(name); + return cacheRes != addrCache_.end() ? cacheRes->second : std::string{}; + } bool validateName(const std::string& name) const; -- GitLab