Skip to content

Commit 7305234

Browse files
authored
fix(request-response): don't keep duplicate addresses
Resolves: #4699. Pull-Request: #4700.
1 parent 8b3d4e4 commit 7305234

File tree

2 files changed

+10
-4
lines changed

2 files changed

+10
-4
lines changed

protocols/request-response/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
- Remove `request_response::Config::set_connection_keep_alive` in favor of `SwarmBuilder::idle_connection_timeout`.
44
See [PR 4679](https://github.com/libp2p/rust-libp2p/pull/4679).
55

6+
- Keep peer addresses in `HashSet` instead of `SmallVec` to prevent adding duplicate addresses.
7+
See [PR 4700](https://github.com/libp2p/rust-libp2p/pull/4700).
8+
69
## 0.25.2
710

811
- Deprecate `request_response::Config::set_connection_keep_alive` in favor of `SwarmBuilder::idle_connection_timeout`.

protocols/request-response/src/lib.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ where
326326
/// reachable addresses, if any.
327327
connected: HashMap<PeerId, SmallVec<[Connection; 2]>>,
328328
/// Externally managed addresses via `add_address` and `remove_address`.
329-
addresses: HashMap<PeerId, SmallVec<[Multiaddr; 6]>>,
329+
addresses: HashMap<PeerId, HashSet<Multiaddr>>,
330330
/// Requests that have not yet been sent and are waiting for a connection
331331
/// to be established.
332332
pending_outbound_requests: HashMap<PeerId, SmallVec<[RequestProtocol<TCodec>; 10]>>,
@@ -437,8 +437,11 @@ where
437437
/// by [`NetworkBehaviour::handle_pending_outbound_connection`].
438438
///
439439
/// Addresses added in this way are only removed by `remove_address`.
440-
pub fn add_address(&mut self, peer: &PeerId, address: Multiaddr) {
441-
self.addresses.entry(*peer).or_default().push(address);
440+
///
441+
/// Returns true if the address was added, false otherwise (i.e. if the
442+
/// address is already in the list).
443+
pub fn add_address(&mut self, peer: &PeerId, address: Multiaddr) -> bool {
444+
self.addresses.entry(*peer).or_default().insert(address)
442445
}
443446

444447
/// Removes an address of a peer previously added via `add_address`.
@@ -731,7 +734,7 @@ where
731734
addresses.extend(connections.iter().filter_map(|c| c.remote_address.clone()))
732735
}
733736
if let Some(more) = self.addresses.get(&peer) {
734-
addresses.extend(more.into_iter().cloned());
737+
addresses.extend(more.iter().cloned());
735738
}
736739

737740
Ok(addresses)

0 commit comments

Comments
 (0)