Skip to content

Commit

Permalink
protocols/identify: Fix race condition in discover_peer_after_disconn…
Browse files Browse the repository at this point in the history
…ect (#2744)

**Summary** of the plot of the `discover_peer_after_disconnect` test:

1. `swarm2` connects to `swarm1`.
2. `swarm2` requests an identify response from `swarm1`.
3. `swarm1` sends the response to `swarm2`.
4. `swarm2` disconnects from `swarm1`.
5. `swarm2` tries to disconnect.

**Problem**

`libp2p-identify` sets `KeepAlive::No` when it identified the remote. Thus `swarm1` might
identify` `swarm2` before `swarm2` identified `swarm1`. `swarm1` then sets `KeepAlive::No` and thus closes the
connection to `swarm2` before `swarm2` identified `swarm1`. In such case the unit test
`discover_peer_after_disconnect hangs indefinitely.

**Solution**

Add an initial delay to `swarm1` requesting an identification from `swarm2`, thus ensuring `swarm2`
is always able to identify `swarm1`.
  • Loading branch information
mxinden committed Jul 4, 2022
1 parent 6db5712 commit b28cdb3
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion protocols/identify/src/identify.rs
Expand Up @@ -518,6 +518,7 @@ mod tests {
use libp2p::tcp::TcpConfig;
use libp2p_core::{identity, muxing::StreamMuxerBox, transport, upgrade, PeerId, Transport};
use libp2p_swarm::{Swarm, SwarmEvent};
use std::time::Duration;

fn transport() -> (
identity::PublicKey,
Expand Down Expand Up @@ -700,7 +701,14 @@ mod tests {

let mut swarm1 = {
let (pubkey, transport) = transport();
let protocol = Identify::new(IdentifyConfig::new("a".to_string(), pubkey.clone()));
let protocol = Identify::new(
IdentifyConfig::new("a".to_string(), pubkey.clone())
// `swarm1` will set `KeepAlive::No` once it identified `swarm2` and thus
// closes the connection. At this point in time `swarm2` might not yet have
// identified `swarm1`. To give `swarm2` enough time, set an initial delay on
// `swarm1`.
.with_initial_delay(Duration::from_secs(10)),
);

Swarm::new(transport, protocol, pubkey.to_peer_id())
};
Expand Down

0 comments on commit b28cdb3

Please sign in to comment.