libp2p / libp2p/rust-libp2p

Test function `with_memory_addr_external` is flaky

Open
#6,062 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
5.6k
Forks
1.3k
Avg merge
8h 47m
Merged PRs (30d)
19

Description

Summary

I'm running libp2p tests where I create multiple swarms and connect them together with the in-memory connector. These tests are flaky.

Here is the relevant part of the test

#[tokio::test(flavor = "multi_thread")]
pub async fn test_reject_oversized_file() {
    let (keypair, peer_id, mut swarm) = get_local_network_swarm();
    let (_, _, mut swarm2) = get_local_network_swarm();
    let temp_dir = TempDir::new().expect("failed to create tempdir");
    let out_dir = temp_dir.path().to_path_buf();
    let (brain_sender, mut brain_receiver) = mpsc::channel(10);
    swarm.listen().with_memory_addr_external().await;
    // ...
}

fn get_local_network_swarm() -> (Keypair, PeerId, Swarm<LocalNetworkBehaviour>) {
    let mut maybe_kp = None;
    let swarm = Swarm::new_ephemeral_tokio(|kp| {
        maybe_kp = Some(kp.clone());
        LocalNetworkBehaviour::new(&kp)
    });
    let peer_id = *swarm.local_peer_id();
    (maybe_kp.unwrap(), peer_id, swarm)
}

I realize this isn't something that can be immediately used to reproduce the issue, but maybe it is enough to point to it. If you need more information, please let me know

Expected behavior

Setting up a test harness like this should work reliable, unexpected events should be fine to ignore, no?!

Actual behavior

Sometimes it works, sometimes it doesn't.

Relevant log output
thread 'library::p2p_node::tests::check_file_size::test_reject_oversized_file' panicked at /myproject/rust_libp2p/swarm-test/src/lib.rs:465:25:
Unexpected event while waiting for `NewListenAddr`: Behaviour(LocalNetworkBehaviourEvent: Discovered([(PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/192.168.56.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/172.20.0.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/172.18.0.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/172.23.0.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/172.17.0.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/172.19.0.1/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2), (PeerId("12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2"), /ip4/10.10.42.90/tcp/32813/p2p/12D3KooWAgQc8rmiACPVTxcjf3kiLsMeQ85AJ4RdvgYA2GrA1La2)]))
stack backtrace:
   0: rust_begin_unwind
             at /rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/std/src/panicking.rs:695:5
   1: core::panicking::panic_fmt
             at /rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/core/src/panicking.rs:75:14
   2: <libp2p_swarm_test::ListenFuture<&mut libp2p_swarm::Swarm<B>> as core::future::into_future::IntoFuture>::into_future::{{closure}}::{{closure}}
             at ./rust_libp2p/swarm-test/src/lib.rs:465:25
   3: <libp2p_swarm::Swarm<B> as libp2p_swarm_test::SwarmExt>::wait::{{closure}}
             at ./rust_libp2p/swarm-test/src/lib.rs:350:30
   4: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /nix/store/xvfdmy4ra4f140gglsjfwdlc1cni85l0-rust-default-1.86.0/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
   5: <libp2p_swarm_test::ListenFuture<&mut libp2p_swarm::Swarm<B>> as core::future::into_future::IntoFuture>::into_future::{{closure}}
             at ./rust_libp2p/swarm-test/src/lib.rs:468:18
   6: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /nix/store/xvfdmy4ra4f140gglsjfwdlc1cni85l0-rust-default-1.86.0/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
   7: filerequest_be_rust::library::p2p_node::tests::check_file_size::test_reject_oversized_file::{{closure}}
             at ./src/library/p2p_node/tests/check_file_size.rs:68:48
   8: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /nix/store/xvfdmy4ra4f140gglsjfwdlc1cni85l0-rust-default-1.86.0/lib/rustlib/src/rust/library/core/src/future/future.rs:124:9
   9: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/park.rs:284:63
  10: tokio::runtime::coop::with_budget
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/coop.rs:107:5
  11: tokio::runtime::coop::budget
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/coop.rs:73:5
  12: tokio::runtime::park::CachedParkThread::block_on
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/park.rs:284:31
  13: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/context/blocking.rs:66:9
  14: tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/scheduler/multi_thread/mod.rs:87:13
  15: tokio::runtime::context::runtime::enter_runtime
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/context/runtime.rs:65:16
  16: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/scheduler/multi_thread/mod.rs:86:9
  17: tokio::runtime::runtime::Runtime::block_on_inner
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/runtime.rs:370:45
  18: tokio::runtime::runtime::Runtime::block_on
             at /home/me/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.43.0/src/runtime/runtime.rs:342:13
  19: filerequest_be_rust::library::p2p_node::tests::check_file_size::test_reject_oversized_file
             at ./src/library/p2p_node/tests/check_file_size.rs:159:5
  20: filerequest_be_rust::library::p2p_node::tests::check_file_size::test_reject_oversized_file::{{closure}}
             at ./src/library/p2p_node/tests/check_file_size.rs:61:42
  21: core::ops::function::FnOnce::call_once
             at /nix/store/xvfdmy4ra4f140gglsjfwdlc1cni85l0-rust-default-1.86.0/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
  22: core::ops::function::FnOnce::call_once
             at /rustc/05f9846f893b09a1be1fc8560e33fc3c815cfecb/library/core/src/ops/function.rs:250:5
Possible Solution

Ignore unexpected events

Version

0.55.0

Would you like to work on fixing this bug?

No

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with swarm-test/src/lib.rs around lines 350, 465, and 468, then inspect the failing test at src/library/p2p_node/tests/check_file_size.rs:68. Run test_reject_oversized_file repeatedly to observe the unexpected Discovered event while waiting for NewListenAddr. Done means the test harness no longer flakes or panics when unrelated events arrive.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
networking, testing-qa
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.