From 1adce8b227a0031e2d3aabc48a1f0276bdbd73f6 Mon Sep 17 00:00:00 2001
From: Victor Shyba <victor1984@riseup.net>
Date: Mon, 1 Oct 2018 13:57:39 -0300
Subject: [PATCH 1/2] reduce routing table ping flood

---
 lbrynet/dht/contact.py      |  2 +-
 lbrynet/dht/routingtable.py | 11 +++++++++--
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/lbrynet/dht/contact.py b/lbrynet/dht/contact.py
index bc25fc5d5..99c84532b 100644
--- a/lbrynet/dht/contact.py
+++ b/lbrynet/dht/contact.py
@@ -67,7 +67,7 @@ class _Contact:
 
     @property
     def lastFailed(self):
-        return self._contactManager._rpc_failures.get((self.address, self.port), [None])[-1]
+        return (self.failures or [None])[-1]
 
     @property
     def failures(self):
diff --git a/lbrynet/dht/routingtable.py b/lbrynet/dht/routingtable.py
index 0d5deaa0a..9498b33be 100644
--- a/lbrynet/dht/routingtable.py
+++ b/lbrynet/dht/routingtable.py
@@ -48,6 +48,7 @@ class TreeRoutingTable:
             from twisted.internet import reactor
             getTime = reactor.seconds
         self._getTime = getTime
+        self._ongoing_replacements = set()
 
     def get_contacts(self):
         contacts = []
@@ -134,8 +135,14 @@ class TreeRoutingTable:
                     to_replace = not_good_contacts[0]
                 else:
                     to_replace = self._buckets[bucketIndex]._contacts[0]
-                df = to_replace.ping()
-                df.addErrback(replaceContact, to_replace)
+                if to_replace not in self._ongoing_replacements:
+                    log.debug("pinging %s:%s", to_replace.address, to_replace.port)
+                    self._ongoing_replacements.add(to_replace)
+                    df = to_replace.ping()
+                    df.addErrback(replaceContact, to_replace)
+                    df.addBoth(lambda _: self._ongoing_replacements.remove(to_replace))
+                else:
+                    df = defer.succeed(None)
                 return df
         else:
             self.touchKBucketByIndex(bucketIndex)

From 463cbde4b13be1e75703248aef365e127d66570d Mon Sep 17 00:00:00 2001
From: Victor Shyba <victor1984@riseup.net>
Date: Mon, 1 Oct 2018 15:23:50 -0300
Subject: [PATCH 2/2] cast dict_keys to list before using as shortlist

---
 lbrynet/dht/node.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lbrynet/dht/node.py b/lbrynet/dht/node.py
index fb6c22fb6..33ba7e021 100644
--- a/lbrynet/dht/node.py
+++ b/lbrynet/dht/node.py
@@ -220,7 +220,7 @@ class Node(MockKademliaHelper):
             if not bootstrap_contacts:
                 log.warning("no bootstrap contacts to ping")
             ping_result = yield _ping_contacts(bootstrap_contacts)
-            shortlist = ping_result.keys()
+            shortlist = list(ping_result.keys())
             if not shortlist:
                 log.warning("failed to ping %i bootstrap contacts", len(bootstrap_contacts))
                 defer.returnValue(None)