From 6036ccdbaacc3ff9fd780ff64e6fa5a8f5d63d65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Fri, 28 Oct 2016 15:46:27 -0400
Subject: [PATCH] dht: try inserting new nodes smarter (#150)

Attempt closest search and nearby searches
until we are too far instead of trying every
search.
---
 src/dht.cpp | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/src/dht.cpp b/src/dht.cpp
index 0ea8af14..afc03f82 100644
--- a/src/dht.cpp
+++ b/src/dht.cpp
@@ -815,15 +815,31 @@ Dht::trySearchInsert(const std::shared_ptr<Node>& node)
     const auto& now = scheduler.time();
     if (not node) return false;
 
-    bool inserted = false;
-    auto family = node->getFamily();
-    auto& srs = family == AF_INET ? searches4 : searches6;
-    for (auto& srp : srs) {
-        auto& s = *srp.second;
+    auto& srs = searches(node->getFamily());
+    auto closest = srs.lower_bound(node->id);
+    bool inserted {false};
+
+    // insert forward
+    auto it = closest;
+    while (it != srs.end()) {
+        auto& s = *it->second;
         if (s.insertNode(node, now)) {
             inserted = true;
             scheduler.edit(s.nextSearchStep, s.getNextStepTime(now));
-        }
+        } else
+            break;
+        ++it;
+    }
+    // insert backward
+    it = closest;
+    while (it != srs.begin()) {
+        --it;
+        auto& s = *it->second;
+        if (s.insertNode(node, now)) {
+            inserted = true;
+            scheduler.edit(s.nextSearchStep, s.getNextStepTime(now));
+        } else
+            break;
     }
     return inserted;
 }
-- 
GitLab