fix up dht

pull/1/head
Jeff Becker 6 years ago
parent 6e5ebd62bf
commit d645c07290
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -10,6 +10,7 @@
#include <array> #include <array>
#include <functional> #include <functional>
#include <map> #include <map>
#include <set>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@ -77,11 +78,11 @@ namespace llarp
bool bool
IsExpired(llarp_time_t now) const; IsExpired(llarp_time_t now) const;
private: llarp_router_lookup_job* job = nullptr;
llarp_time_t started; llarp_time_t started;
Key_t requestor; Key_t requestor;
Key_t target; Key_t target;
llarp_router_lookup_job* job; std::set< Key_t > exclude;
}; };
struct XorMetric struct XorMetric
@ -136,7 +137,7 @@ namespace llarp
bool bool
FindCloseExcluding(const Key_t& target, Key_t& result, FindCloseExcluding(const Key_t& target, Key_t& result,
const Key_t& exclude) const; const std::set< Key_t >& exclude) const;
void void
PutNode(const Node& val); PutNode(const Node& val);

@ -129,7 +129,22 @@ namespace llarp
if(R.size()) if(R.size())
pending->Completed(&R[0]); pending->Completed(&R[0]);
else else
pending->Completed(nullptr); {
// iterate to next closest peer
Key_t nextPeer;
pending->exclude.insert(From);
if(dht.nodes->FindCloseExcluding(pending->target, nextPeer,
pending->exclude))
{
llarp::Info(pending->target, "was not found via ", From,
" iterating to next peer");
dht.LookupRouter(pending->target, pending->requestor, nextPeer,
pending->job);
return true;
}
else
pending->Completed(nullptr);
}
dht.RemovePendingLookup(From, txid); dht.RemovePendingLookup(From, txid);
return true; return true;
@ -335,7 +350,7 @@ namespace llarp
SearchJob::SearchJob(const Key_t &asker, const Key_t &key, SearchJob::SearchJob(const Key_t &asker, const Key_t &key,
llarp_router_lookup_job *j) llarp_router_lookup_job *j)
: started(llarp_time_now_ms()), requestor(asker), target(key), job(j) : job(j), started(llarp_time_now_ms()), requestor(asker), target(key)
{ {
} }
@ -378,7 +393,7 @@ namespace llarp
bool bool
Bucket::FindCloseExcluding(const Key_t &target, Key_t &result, Bucket::FindCloseExcluding(const Key_t &target, Key_t &result,
const Key_t &exclude) const const std::set< Key_t > &exclude) const
{ {
Key_t maxdist; Key_t maxdist;
maxdist.Fill(0xff); maxdist.Fill(0xff);
@ -386,7 +401,7 @@ namespace llarp
mindist.Fill(0xff); mindist.Fill(0xff);
for(const auto &item : nodes) for(const auto &item : nodes)
{ {
if(item.first == exclude) if(exclude.find(item.first) != exclude.end())
continue; continue;
auto curDist = item.first ^ target; auto curDist = item.first ^ target;
if(curDist < mindist) if(curDist < mindist)
@ -504,15 +519,6 @@ namespace llarp
{ {
pendingTX[e].Completed(nullptr, true); pendingTX[e].Completed(nullptr, true);
RemovePendingLookup(e.requester, e.txid); RemovePendingLookup(e.requester, e.txid);
if(e.requester != ourKey && allowTransit)
{
// inform not found
llarp::DHTImmeidateMessage msg(e.requester);
msg.msgs.push_back(
new GotRouterMessage(e.requester, e.txid, nullptr));
llarp::Info("DHT reply to ", e.requester);
router->SendTo(e.requester, &msg);
}
} }
ScheduleCleanupTimer(); ScheduleCleanupTimer();
@ -557,7 +563,7 @@ namespace llarp
Context::LookupRouterViaJob(llarp_router_lookup_job *job) Context::LookupRouterViaJob(llarp_router_lookup_job *job)
{ {
Key_t peer; Key_t peer;
if(nodes->FindCloseExcluding(job->target, peer, ourKey)) if(nodes->FindClosest(job->target, peer))
LookupRouter(job->target, ourKey, peer, job); LookupRouter(job->target, ourKey, peer, job);
else if(job->hook) else if(job->hook)
{ {

@ -111,6 +111,7 @@ llarp_router::HandleAsyncLoadRCForSendTo(llarp_async_load_rc *job)
lookup->hook = &HandleDHTLookupForSendTo; lookup->hook = &HandleDHTLookupForSendTo;
llarp_dht_lookup_router(router->dht, lookup); llarp_dht_lookup_router(router->dht, lookup);
} }
delete job;
} }
void void

Loading…
Cancel
Save