From cff6bc1c8d976d253124ffedc6e83aabc68b0bbf Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 7 Feb 2019 07:23:02 -0500 Subject: [PATCH 1/4] don't hang --- llarp/nodedb.cpp | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index 7cc5538cb..477930317 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -429,30 +429,37 @@ llarp_nodedb::select_random_hop(const llarp::RouterContact &prev, return false; size_t tries = 5; llarp_time_t now = llarp::time_now_ms(); - if(N) + if(!N) + return false; + + auto itr = entries.begin(); + size_t pos = llarp::randint() % sz; + std::advance(itr, pos); + auto start = itr; + while(itr == entries.end()) { - do + if(prev.pubkey != itr->second.pubkey) { - auto itr = entries.begin(); - std::advance(itr, llarp::randint() % sz); - if(itr == entries.end()) - { - --tries; - continue; - } - if(prev.pubkey == itr->second.pubkey) + if(itr->second.addrs.size() && !itr->second.IsExpired(now)) { - --tries; - continue; + result = itr->second; + return true; } + } + itr++; + } + itr = entries.begin(); + while(itr != start) + { + if(prev.pubkey != itr->second.pubkey) + { if(itr->second.addrs.size() && !itr->second.IsExpired(now)) { result = itr->second; return true; } - } while(tries--); - return false; + } + ++itr; } - else - return false; + return false; } From d5caec719f7220b5f6213bae95d6b36c37ba7213 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 7 Feb 2019 07:25:22 -0500 Subject: [PATCH 2/4] make it compile --- llarp/nodedb.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index 477930317..fd1aa6102 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -427,10 +427,9 @@ llarp_nodedb::select_random_hop(const llarp::RouterContact &prev, size_t sz = entries.size(); if(sz < 3) return false; - size_t tries = 5; - llarp_time_t now = llarp::time_now_ms(); if(!N) return false; + llarp_time_t now = llarp::time_now_ms(); auto itr = entries.begin(); size_t pos = llarp::randint() % sz; From fae2b1a444b650d41416b3fa150157105af8116e Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 7 Feb 2019 07:31:14 -0500 Subject: [PATCH 3/4] make it compile on debian and ubuntu --- llarp/util/bits.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/llarp/util/bits.hpp b/llarp/util/bits.hpp index c2b5991f4..876e9e79b 100644 --- a/llarp/util/bits.hpp +++ b/llarp/util/bits.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace llarp { From 10f9d6444d59ab1c9a151855084f204a17ff586d Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Thu, 7 Feb 2019 07:40:44 -0500 Subject: [PATCH 4/4] actually insert entries when they exist --- llarp/nodedb.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index fd1aa6102..5bb09bb6a 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -106,6 +106,9 @@ llarp_nodedb::Insert(const llarp::RouterContact &rc) llarp_buffer_t buf(tmp); { llarp::util::Lock lock(access); + auto itr = entries.find(rc.pubkey.as_array()); + if(itr != entries.end()) + entries.erase(itr); entries.emplace(rc.pubkey.as_array(), rc); } if(!rc.BEncode(&buf)) @@ -388,6 +391,7 @@ llarp_nodedb::num_loaded() const bool llarp_nodedb::select_random_exit(llarp::RouterContact &result) { + llarp::util::Lock lock(access); const auto sz = entries.size(); auto itr = entries.begin(); if(sz < 3) @@ -422,6 +426,7 @@ bool llarp_nodedb::select_random_hop(const llarp::RouterContact &prev, llarp::RouterContact &result, size_t N) { + llarp::util::Lock lock(access); /// checking for "guard" status for N = 0 is done by caller inside of /// pathbuilder's scope size_t sz = entries.size();