diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp index 9ec7fdd252acbfafef49e96ca4a33e818523780f..1c35a8980dc882716c0383e43292095426aa693a 100644 --- a/src/jamidht/namedirectory.cpp +++ b/src/jamidht/namedirectory.cpp @@ -168,14 +168,9 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) request->add_on_done_callback( [this, cb = std::move(cb), addr](const dht::http::Response& response) { if (response.status_code >= 400 && response.status_code < 500) { - std::string regName, regAddr; - { - std::lock_guard l(cacheLock_); - regName = registeredName_; - regAddr = registeredAddr_; - } - if (not regAddr.empty() and addr == regAddr) - cb(regName, Response::found); + std::string cacheResult = nameCache(addr); + if (not cacheResult.empty()) + cb(cacheResult, Response::found); else cb("", Response::notFound); } else if (response.status_code != 200) { @@ -367,11 +362,11 @@ NameDirectory::registerName(const std::string& addr, } { std::lock_guard l(cacheLock_); - if (isRegisteringName_) { + if (not pendingRegistrations_.emplace(addr, name).second) { + JAMI_WARN("RegisterName: already registering name", addr.c_str(), name.c_str()); cb(RegistrationResponse::error, name); return; } - isRegisteringName_ = true; } std::string body = fmt::format("{{\"addr\":\"{}\",\"owner\":\"{}\",\"signature\":\"{}\",\"publickey\":\"{}\"}}", addr, @@ -392,7 +387,7 @@ NameDirectory::registerName(const std::string& addr, [this, name, addr, cb = std::move(cb)](const dht::http::Response& response) { { std::lock_guard l(cacheLock_); - isRegisteringName_ = false; + pendingRegistrations_.erase(name); } if (response.status_code == 400) { cb(RegistrationResponse::incompleteRequest, name); @@ -432,8 +427,6 @@ NameDirectory::registerName(const std::string& addr, success ? "success" : "failure"); if (success) { std::lock_guard l(cacheLock_); - registeredAddr_ = addr; - registeredName_ = name; addrCache_.emplace(name, addr); nameCache_.emplace(addr, name); } @@ -451,6 +444,10 @@ NameDirectory::registerName(const std::string& addr, } catch (const std::exception& e) { JAMI_ERR("Error when performing name registration: %s", e.what()); cb(RegistrationResponse::error, name); + { + std::lock_guard l(cacheLock_); + pendingRegistrations_.erase(name); + } std::lock_guard lk(requestsMtx_); if (request) requests_.erase(request); diff --git a/src/jamidht/namedirectory.h b/src/jamidht/namedirectory.h index a20c6b95a5a478e52455755fa6636444312c643e..f435bc0478643554d7900a63dc74143cf9e65289 100644 --- a/src/jamidht/namedirectory.h +++ b/src/jamidht/namedirectory.h @@ -117,9 +117,7 @@ private: std::mutex requestsMtx_ {}; std::set<std::shared_ptr<dht::http::Request>> requests_; - bool isRegisteringName_ {false}; - std::string registeredAddr_ {}; - std::string registeredName_ {}; + std::map<std::string, std::string> pendingRegistrations_ {}; std::map<std::string, std::string> nameCache_ {}; std::map<std::string, std::string> addrCache_ {};