Skip to content

Commit 02d8715

Browse files
authored
feat(mdns): change mdns::Event to hold Vec
In previous PR #3606 we've made `mdns::Event` `Clone`, but cloning single-use iterators doesn't sound right. Also you have to create an iterator from the actual data returned before putting it into events. So in this PR the iterators are replaced by `Vec`, as it's the type the data originally come from. Related #3612. Pull-Request: #3621.
1 parent 996b5c8 commit 02d8715

File tree

4 files changed

+29
-84
lines changed

4 files changed

+29
-84
lines changed

protocols/mdns/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
## 0.44.0 - unreleased
22

3+
- Change `mdns::Event` to hold `Vec` and remove `DiscoveredAddrsIter` and `ExpiredAddrsIter`.
4+
See [PR 3621].
5+
36
- Raise MSRV to 1.65.
47
See [PR 3715].
58

9+
[PR 3621]: https://github.com/libp2p/rust-libp2p/pull/3621
610
[PR 3715]: https://github.com/libp2p/rust-libp2p/pull/3715
711

812
## 0.43.1
913

1014
- Derive `Clone` for `mdns::Event`. See [PR 3606].
1115

1216
[PR 3606]: https://github.com/libp2p/rust-libp2p/pull/3606
17+
1318
## 0.43.0
1419

1520
- Update to `libp2p-core` `v0.39.0`.

protocols/mdns/src/behaviour.rs

Lines changed: 6 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ where
285285
}
286286
}
287287
// Emit discovered event.
288-
let mut discovered = SmallVec::<[(PeerId, Multiaddr); 4]>::new();
288+
let mut discovered = Vec::new();
289289
for iface_state in self.iface_states.values_mut() {
290290
while let Poll::Ready((peer, addr, expiration)) =
291291
iface_state.poll(cx, &self.listen_addresses)
@@ -304,15 +304,13 @@ where
304304
}
305305
}
306306
if !discovered.is_empty() {
307-
let event = Event::Discovered(DiscoveredAddrsIter {
308-
inner: discovered.into_iter(),
309-
});
307+
let event = Event::Discovered(discovered);
310308
return Poll::Ready(ToSwarm::GenerateEvent(event));
311309
}
312310
// Emit expired event.
313311
let now = Instant::now();
314312
let mut closest_expiration = None;
315-
let mut expired = SmallVec::<[(PeerId, Multiaddr); 4]>::new();
313+
let mut expired = Vec::new();
316314
self.discovered_nodes.retain(|(peer, addr, expiration)| {
317315
if *expiration <= now {
318316
log::info!("expired: {} {}", peer, addr);
@@ -323,9 +321,7 @@ where
323321
true
324322
});
325323
if !expired.is_empty() {
326-
let event = Event::Expired(ExpiredAddrsIter {
327-
inner: expired.into_iter(),
328-
});
324+
let event = Event::Expired(expired);
329325
return Poll::Ready(ToSwarm::GenerateEvent(event));
330326
}
331327
if let Some(closest_expiration) = closest_expiration {
@@ -342,67 +338,11 @@ where
342338
#[derive(Debug, Clone)]
343339
pub enum Event {
344340
/// Discovered nodes through mDNS.
345-
Discovered(DiscoveredAddrsIter),
341+
Discovered(Vec<(PeerId, Multiaddr)>),
346342

347343
/// The given combinations of `PeerId` and `Multiaddr` have expired.
348344
///
349345
/// Each discovered record has a time-to-live. When this TTL expires and the address hasn't
350346
/// been refreshed, we remove it from the list and emit it as an `Expired` event.
351-
Expired(ExpiredAddrsIter),
352-
}
353-
354-
/// Iterator that produces the list of addresses that have been discovered.
355-
#[derive(Clone)]
356-
pub struct DiscoveredAddrsIter {
357-
inner: smallvec::IntoIter<[(PeerId, Multiaddr); 4]>,
358-
}
359-
360-
impl Iterator for DiscoveredAddrsIter {
361-
type Item = (PeerId, Multiaddr);
362-
363-
#[inline]
364-
fn next(&mut self) -> Option<Self::Item> {
365-
self.inner.next()
366-
}
367-
368-
#[inline]
369-
fn size_hint(&self) -> (usize, Option<usize>) {
370-
self.inner.size_hint()
371-
}
372-
}
373-
374-
impl ExactSizeIterator for DiscoveredAddrsIter {}
375-
376-
impl fmt::Debug for DiscoveredAddrsIter {
377-
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
378-
fmt.debug_struct("DiscoveredAddrsIter").finish()
379-
}
380-
}
381-
382-
/// Iterator that produces the list of addresses that have expired.
383-
#[derive(Clone)]
384-
pub struct ExpiredAddrsIter {
385-
inner: smallvec::IntoIter<[(PeerId, Multiaddr); 4]>,
386-
}
387-
388-
impl Iterator for ExpiredAddrsIter {
389-
type Item = (PeerId, Multiaddr);
390-
391-
#[inline]
392-
fn next(&mut self) -> Option<Self::Item> {
393-
self.inner.next()
394-
}
395-
396-
#[inline]
397-
fn size_hint(&self) -> (usize, Option<usize>) {
398-
self.inner.size_hint()
399-
}
400-
}
401-
402-
impl ExactSizeIterator for ExpiredAddrsIter {}
403-
404-
impl fmt::Debug for ExpiredAddrsIter {
405-
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
406-
fmt.debug_struct("ExpiredAddrsIter").finish()
407-
}
347+
Expired(Vec<(PeerId, Multiaddr)>),
408348
}

protocols/mdns/tests/use-async-std.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ async fn test_expired_async_std() {
6161

6262
loop {
6363
match futures::future::select(a.next_behaviour_event(), b.next_behaviour_event()).await {
64-
Either::Left((Event::Expired(mut peers), _)) => {
65-
if peers.any(|(p, _)| p == b_peer_id) {
64+
Either::Left((Event::Expired(peers), _)) => {
65+
if peers.into_iter().any(|(p, _)| p == b_peer_id) {
6666
return;
6767
}
6868
}
69-
Either::Right((Event::Expired(mut peers), _)) => {
70-
if peers.any(|(p, _)| p == a_peer_id) {
69+
Either::Right((Event::Expired(peers), _)) => {
70+
if peers.into_iter().any(|(p, _)| p == a_peer_id) {
7171
return;
7272
}
7373
}
@@ -93,8 +93,8 @@ async fn test_no_expiration_on_close_async_std() {
9393

9494
// 1. Connect via address from mDNS event
9595
loop {
96-
if let Event::Discovered(mut peers) = a.next_behaviour_event().await {
97-
if let Some((_, addr)) = peers.find(|(p, _)| p == &b_peer_id) {
96+
if let Event::Discovered(peers) = a.next_behaviour_event().await {
97+
if let Some((_, addr)) = peers.into_iter().find(|(p, _)| p == &b_peer_id) {
9898
a.dial_and_wait(addr).await;
9999
break;
100100
}
@@ -130,13 +130,13 @@ async fn run_discovery_test(config: Config) {
130130

131131
while !discovered_a && !discovered_b {
132132
match futures::future::select(a.next_behaviour_event(), b.next_behaviour_event()).await {
133-
Either::Left((Event::Discovered(mut peers), _)) => {
134-
if peers.any(|(p, _)| p == b_peer_id) {
133+
Either::Left((Event::Discovered(peers), _)) => {
134+
if peers.into_iter().any(|(p, _)| p == b_peer_id) {
135135
discovered_b = true;
136136
}
137137
}
138-
Either::Right((Event::Discovered(mut peers), _)) => {
139-
if peers.any(|(p, _)| p == a_peer_id) {
138+
Either::Right((Event::Discovered(peers), _)) => {
139+
if peers.into_iter().any(|(p, _)| p == a_peer_id) {
140140
discovered_a = true;
141141
}
142142
}

protocols/mdns/tests/use-tokio.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ async fn test_expired_tokio() {
5959

6060
loop {
6161
match futures::future::select(a.next_behaviour_event(), b.next_behaviour_event()).await {
62-
Either::Left((Event::Expired(mut peers), _)) => {
63-
if peers.any(|(p, _)| p == b_peer_id) {
62+
Either::Left((Event::Expired(peers), _)) => {
63+
if peers.into_iter().any(|(p, _)| p == b_peer_id) {
6464
return;
6565
}
6666
}
67-
Either::Right((Event::Expired(mut peers), _)) => {
68-
if peers.any(|(p, _)| p == a_peer_id) {
67+
Either::Right((Event::Expired(peers), _)) => {
68+
if peers.into_iter().any(|(p, _)| p == a_peer_id) {
6969
return;
7070
}
7171
}
@@ -86,13 +86,13 @@ async fn run_discovery_test(config: Config) {
8686

8787
while !discovered_a && !discovered_b {
8888
match futures::future::select(a.next_behaviour_event(), b.next_behaviour_event()).await {
89-
Either::Left((Event::Discovered(mut peers), _)) => {
90-
if peers.any(|(p, _)| p == b_peer_id) {
89+
Either::Left((Event::Discovered(peers), _)) => {
90+
if peers.into_iter().any(|(p, _)| p == b_peer_id) {
9191
discovered_b = true;
9292
}
9393
}
94-
Either::Right((Event::Discovered(mut peers), _)) => {
95-
if peers.any(|(p, _)| p == a_peer_id) {
94+
Either::Right((Event::Discovered(peers), _)) => {
95+
if peers.into_iter().any(|(p, _)| p == a_peer_id) {
9696
discovered_a = true;
9797
}
9898
}

0 commit comments

Comments
 (0)