Skip to content

Commit bec08cc

Browse files
authored
feat(kad): perform lazy cleanup for expired provider records
Pull-Request: #5980.
1 parent 0a12aac commit bec08cc

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

protocols/kad/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
See [PR 5715](https://github.com/libp2p/rust-libp2p/pull/5715).
1515
- Remove deprecated default constructor for `ProtocolConfig`.
1616
See [PR 5774](https://github.com/libp2p/rust-libp2p/pull/5774).
17+
- Add lazy cleanup for expired provider records in `Behavior::get_providers` and `Behavior::provider_peers`.
18+
See [PR 5980](https://github.com/libp2p/rust-libp2p/pull/5980)
1719

1820
<!-- Update to libp2p-core v0.43.0 -->
1921

protocols/kad/src/behaviour.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,14 @@ where
10531053
.store
10541054
.providers(&key)
10551055
.into_iter()
1056-
.filter(|p| !p.is_expired(Instant::now()))
1056+
.filter(|p| {
1057+
if p.is_expired(Instant::now()) {
1058+
self.store.remove_provider(&key, &p.provider);
1059+
false
1060+
} else {
1061+
true
1062+
}
1063+
})
10571064
.map(|p| p.provider)
10581065
.collect();
10591066

@@ -1220,19 +1227,19 @@ where
12201227

12211228
/// Collects all peers who are known to be providers of the value for a given `Multihash`.
12221229
fn provider_peers(&mut self, key: &record::Key, source: &PeerId) -> Vec<KadPeer> {
1223-
let kbuckets = &mut self.kbuckets;
1224-
let connected = &mut self.connected_peers;
1225-
let listen_addresses = &self.listen_addresses;
1226-
let external_addresses = &self.external_addresses;
1227-
12281230
self.store
12291231
.providers(key)
12301232
.into_iter()
1231-
.filter_map(move |p| {
1233+
.filter_map(|p| {
1234+
if p.is_expired(Instant::now()) {
1235+
self.store.remove_provider(key, &p.provider);
1236+
return None;
1237+
}
1238+
12321239
if &p.provider != source {
12331240
let node_id = p.provider;
12341241
let multiaddrs = p.addresses;
1235-
let connection_ty = if connected.contains(&node_id) {
1242+
let connection_ty = if self.connected_peers.contains(&node_id) {
12361243
ConnectionType::Connected
12371244
} else {
12381245
ConnectionType::NotConnected
@@ -1244,17 +1251,17 @@ where
12441251
// try to find addresses in the routing table, as was
12451252
// done before provider records were stored along with
12461253
// their addresses.
1247-
if &node_id == kbuckets.local_key().preimage() {
1254+
if &node_id == self.kbuckets.local_key().preimage() {
12481255
Some(
1249-
listen_addresses
1256+
self.listen_addresses
12501257
.iter()
1251-
.chain(external_addresses.iter())
1258+
.chain(self.external_addresses.iter())
12521259
.cloned()
12531260
.collect::<Vec<_>>(),
12541261
)
12551262
} else {
12561263
let key = kbucket::Key::from(node_id);
1257-
kbuckets
1264+
self.kbuckets
12581265
.entry(&key)
12591266
.as_mut()
12601267
.and_then(|e| e.view())

0 commit comments

Comments
 (0)