do lookup for RC to neighboor even if we have them in our DHT buckets so we get an updated RC in reply

pull/721/head
Jeff Becker 5 years ago
parent 7a3c8e5ca0
commit 1ee90f8852
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -41,6 +41,12 @@ namespace llarp
util::StatusObject util::StatusObject
ExtractStatus() const override; 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 /// on behalf of whoasked request introset for target from dht router with
/// key askpeer /// key askpeer
void void
@ -430,9 +436,8 @@ namespace llarp
{ {
if(next == target) if(next == target)
{ {
// we know it // we know it, ask them directly for their own RC to keep it updated
replies.emplace_back(new GotRouterMessage( LookupRouterRecursive(target.as_array(), requester, txid, next);
requester, txid, {_nodes->nodes[target].rc}, false));
} }
else if(recursive) // are we doing a recursive lookup? else if(recursive) // are we doing a recursive lookup?
{ {
@ -671,8 +676,8 @@ namespace llarp
const Key_t& askpeer) const Key_t& askpeer)
{ {
TXOwner peer(askpeer, ++ids); const TXOwner peer(askpeer, ++ids);
TXOwner whoasked(OurKey(), txid); const TXOwner whoasked(OurKey(), txid);
_pendingRouterLookups.NewTX( _pendingRouterLookups.NewTX(
peer, whoasked, target, peer, whoasked, target,
new LocalRouterLookup(path, txid, target, this)); new LocalRouterLookup(path, txid, target, this));
@ -684,8 +689,8 @@ namespace llarp
const Key_t& askpeer, const Key_t& askpeer,
RouterLookupHandler handler) RouterLookupHandler handler)
{ {
TXOwner asker(whoasked, txid); const TXOwner asker(whoasked, txid);
TXOwner peer(askpeer, ++ids); const TXOwner peer(askpeer, ++ids);
_pendingRouterLookups.NewTX( _pendingRouterLookups.NewTX(
peer, asker, target, peer, asker, target,
new RecursiveRouterLookup(asker, target, this, handler)); new RecursiveRouterLookup(asker, target, this, handler));

@ -175,6 +175,9 @@ namespace llarp
virtual util::StatusObject virtual util::StatusObject
ExtractStatus() const = 0; ExtractStatus() const = 0;
virtual void
StoreRC(const RouterContact rc) const = 0;
}; };
std::unique_ptr< AbstractContext > std::unique_ptr< AbstractContext >

@ -169,7 +169,7 @@ namespace llarp
return false; return false;
} }
RouterContact found; RouterContact found;
Key_t k{K}; const Key_t k{K};
if(exploritory) if(exploritory)
return dht.HandleExploritoryRouterLookup(From, txid, K, replies); return dht.HandleExploritoryRouterLookup(From, txid, K, replies);
if(!dht.GetRouter()->ConnectionToRouterAllowed(K)) if(!dht.GetRouter()->ConnectionToRouterAllowed(K))
@ -178,13 +178,7 @@ namespace llarp
replies.emplace_back(new GotRouterMessage(k, txid, {}, false)); replies.emplace_back(new GotRouterMessage(k, txid, {}, false));
return true; return true;
} }
if(dht.Nodes()->HasNode(k)) if(dht.GetRCFromNodeDB(k, found))
{
found = dht.Nodes()->nodes[k].rc;
replies.emplace_back(new GotRouterMessage(k, txid, {found}, false));
return true;
}
else if(dht.GetRCFromNodeDB(k, found))
{ {
replies.emplace_back(new GotRouterMessage(k, txid, {found}, false)); replies.emplace_back(new GotRouterMessage(k, txid, {found}, false));
return true; return true;

@ -70,11 +70,16 @@ namespace llarp
{ {
resultHandler(valuesFound); resultHandler(valuesFound);
} }
else if(whoasked.node != parent->OurKey())
if(whoasked.node != parent->OurKey()) {
parent->DHTSendTo( parent->DHTSendTo(
whoasked.node.as_array(), whoasked.node.as_array(),
new GotRouterMessage({}, whoasked.txid, valuesFound, false), false); 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 dht
} // namespace llarp } // namespace llarp

@ -11,6 +11,9 @@ namespace llarp
{ {
struct MockContext final : public dht::AbstractContext struct MockContext final : public dht::AbstractContext
{ {
MOCK_CONST_METHOD1(StoreRC, void(const RouterContact));
MOCK_METHOD2(LookupRouter, bool(const RouterID&, RouterLookupHandler)); MOCK_METHOD2(LookupRouter, bool(const RouterID&, RouterLookupHandler));
MOCK_METHOD5(LookupRouterRecursive, MOCK_METHOD5(LookupRouterRecursive,

Loading…
Cancel
Save