aboutsummaryrefslogtreecommitdiff
path: root/p2p/src/routing_table/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'p2p/src/routing_table/mod.rs')
-rw-r--r--p2p/src/routing_table/mod.rs12
1 files changed, 10 insertions, 2 deletions
diff --git a/p2p/src/routing_table/mod.rs b/p2p/src/routing_table/mod.rs
index abf9a08..35729da 100644
--- a/p2p/src/routing_table/mod.rs
+++ b/p2p/src/routing_table/mod.rs
@@ -1,8 +1,8 @@
mod bucket;
mod entry;
pub use bucket::{
- Bucket, BucketEntry, EntryStatusFlag, CONNECTED_ENTRY, DISCONNECTED_ENTRY, PENDING_ENTRY,
- UNREACHABLE_ENTRY, UNSTABLE_ENTRY,
+ Bucket, BucketEntry, EntryStatusFlag, CONNECTED_ENTRY, DISCONNECTED_ENTRY, INCOMPATIBLE_ENTRY,
+ PENDING_ENTRY, UNREACHABLE_ENTRY, UNSTABLE_ENTRY,
};
pub use entry::{xor_distance, Entry, Key};
@@ -82,6 +82,14 @@ impl RoutingTable {
return AddEntryResult::Added;
}
+ // Replace it with an incompatible entry if one exists.
+ let incompatible_entry = bucket.iter().find(|e| e.is_incompatible()).cloned();
+ if let Some(e) = incompatible_entry {
+ bucket.remove(&e.entry.key);
+ bucket.add(&entry);
+ return AddEntryResult::Added;
+ }
+
// If the bucket is full, the entry is ignored.
AddEntryResult::Ignored
}