diff options
author | Suhas Daftuar <sdaftuar@gmail.com> | 2019-02-26 16:34:26 -0500 |
---|---|---|
committer | Suhas Daftuar <sdaftuar@gmail.com> | 2019-02-27 16:53:44 -0500 |
commit | f71fdda3bc2e7acd2a8b74e882364866b8b0f55b (patch) | |
tree | e022ff5d8909a1aac79dc30346450961cd7f07a6 | |
parent | 4991e3c813c9848d3b3957ea3ad433f02fca9e81 (diff) |
[addrman] Ensure collisions eventually get resolved
After 40 minutes, time out a test-before-evict entry and just evict without
testing. Otherwise, if we were unable to test an entry for some reason, we
might break using feelers altogether.
-rw-r--r-- | src/addrman.cpp | 7 | ||||
-rw-r--r-- | src/addrman.h | 3 |
2 files changed, 10 insertions, 0 deletions
diff --git a/src/addrman.cpp b/src/addrman.cpp index 468618095c..45b686e1de 100644 --- a/src/addrman.cpp +++ b/src/addrman.cpp @@ -569,6 +569,13 @@ void CAddrMan::ResolveCollisions_() Good_(info_new, false, GetAdjustedTime()); erase_collision = true; } + } else if (GetAdjustedTime() - info_new.nLastSuccess > ADDRMAN_TEST_WINDOW) { + // If the collision hasn't resolved in some reasonable amount of time, + // just evict the old entry -- we must not be able to + // connect to it for some reason. + LogPrint(BCLog::ADDRMAN, "Unable to test; swapping %s for %s in tried table anyway\n", info_new.ToString(), info_old.ToString()); + Good_(info_new, false, GetAdjustedTime()); + erase_collision = true; } } else { // Collision is not actually a collision anymore Good_(info_new, false, GetAdjustedTime()); diff --git a/src/addrman.h b/src/addrman.h index 003bd059f8..e54184ce35 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -166,6 +166,9 @@ public: //! the maximum number of tried addr collisions to store #define ADDRMAN_SET_TRIED_COLLISION_SIZE 10 +//! the maximum time we'll spend trying to resolve a tried table collision, in seconds +static const int64_t ADDRMAN_TEST_WINDOW = 40*60; // 40 minutes + /** * Stochastical (IP) address manager */ |