From 1ee90f8852dda21931d38d9421234c6d508c7d63 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Fri, 19 Jul 2019 13:21:20 -0400 Subject: [PATCH] do lookup for RC to neighboor even if we have them in our DHT buckets so we get an updated RC in reply --- llarp/dht/context.cpp | 19 ++++++++++++------- llarp/dht/context.hpp | 3 +++ llarp/dht/messages/findrouter.cpp | 10 ++-------- llarp/dht/recursiverouterlookup.cpp | 9 +++++++-- test/dht/mock_context.hpp | 3 +++ 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/llarp/dht/context.cpp b/llarp/dht/context.cpp index 7d1aeb13d..576f684ac 100644 --- a/llarp/dht/context.cpp +++ b/llarp/dht/context.cpp @@ -41,6 +41,12 @@ namespace llarp util::StatusObject ExtractStatus() const override; + void + StoreRC(const RouterContact rc) const override + { + GetRouter()->nodedb()->InsertAsync(rc); + } + /// on behalf of whoasked request introset for target from dht router with /// key askpeer void @@ -430,9 +436,8 @@ namespace llarp { if(next == target) { - // we know it - replies.emplace_back(new GotRouterMessage( - requester, txid, {_nodes->nodes[target].rc}, false)); + // we know it, ask them directly for their own RC to keep it updated + LookupRouterRecursive(target.as_array(), requester, txid, next); } else if(recursive) // are we doing a recursive lookup? { @@ -671,8 +676,8 @@ namespace llarp const Key_t& askpeer) { - TXOwner peer(askpeer, ++ids); - TXOwner whoasked(OurKey(), txid); + const TXOwner peer(askpeer, ++ids); + const TXOwner whoasked(OurKey(), txid); _pendingRouterLookups.NewTX( peer, whoasked, target, new LocalRouterLookup(path, txid, target, this)); @@ -684,8 +689,8 @@ namespace llarp const Key_t& askpeer, RouterLookupHandler handler) { - TXOwner asker(whoasked, txid); - TXOwner peer(askpeer, ++ids); + const TXOwner asker(whoasked, txid); + const TXOwner peer(askpeer, ++ids); _pendingRouterLookups.NewTX( peer, asker, target, new RecursiveRouterLookup(asker, target, this, handler)); diff --git a/llarp/dht/context.hpp b/llarp/dht/context.hpp index 9ecea6ec4..431fe1005 100644 --- a/llarp/dht/context.hpp +++ b/llarp/dht/context.hpp @@ -175,6 +175,9 @@ namespace llarp virtual util::StatusObject ExtractStatus() const = 0; + + virtual void + StoreRC(const RouterContact rc) const = 0; }; std::unique_ptr< AbstractContext > diff --git a/llarp/dht/messages/findrouter.cpp b/llarp/dht/messages/findrouter.cpp index 2c2c31fde..8828a4e91 100644 --- a/llarp/dht/messages/findrouter.cpp +++ b/llarp/dht/messages/findrouter.cpp @@ -169,7 +169,7 @@ namespace llarp return false; } RouterContact found; - Key_t k{K}; + const Key_t k{K}; if(exploritory) return dht.HandleExploritoryRouterLookup(From, txid, K, replies); if(!dht.GetRouter()->ConnectionToRouterAllowed(K)) @@ -178,13 +178,7 @@ namespace llarp replies.emplace_back(new GotRouterMessage(k, txid, {}, false)); return true; } - if(dht.Nodes()->HasNode(k)) - { - found = dht.Nodes()->nodes[k].rc; - replies.emplace_back(new GotRouterMessage(k, txid, {found}, false)); - return true; - } - else if(dht.GetRCFromNodeDB(k, found)) + if(dht.GetRCFromNodeDB(k, found)) { replies.emplace_back(new GotRouterMessage(k, txid, {found}, false)); return true; diff --git a/llarp/dht/recursiverouterlookup.cpp b/llarp/dht/recursiverouterlookup.cpp index 40a6a9380..46407869a 100644 --- a/llarp/dht/recursiverouterlookup.cpp +++ b/llarp/dht/recursiverouterlookup.cpp @@ -70,11 +70,16 @@ namespace llarp { resultHandler(valuesFound); } - - if(whoasked.node != parent->OurKey()) + else if(whoasked.node != parent->OurKey()) + { parent->DHTSendTo( whoasked.node.as_array(), new GotRouterMessage({}, whoasked.txid, valuesFound, false), false); + + // store this in our nodedb for caching + if(valuesFound.size() > 0) + parent->StoreRC(valuesFound[0]); + } } } // namespace dht } // namespace llarp diff --git a/test/dht/mock_context.hpp b/test/dht/mock_context.hpp index 8f2861462..eaa8643f1 100644 --- a/test/dht/mock_context.hpp +++ b/test/dht/mock_context.hpp @@ -11,6 +11,9 @@ namespace llarp { struct MockContext final : public dht::AbstractContext { + + MOCK_CONST_METHOD1(StoreRC, void(const RouterContact)); + MOCK_METHOD2(LookupRouter, bool(const RouterID&, RouterLookupHandler)); MOCK_METHOD5(LookupRouterRecursive,