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
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));

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

@ -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;

@ -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

@ -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,

Loading…
Cancel
Save