Skip to content

lnifinite loop in litep2p::transport-service when connection is terminated prematurely #463

@tdimitrov

Description

@tdimitrov

I ran into a strange issue while working on a litep2p traffic generator tool. In nutshell I wanted to create a lot of connections to a node and leave them in half complete state. Concretely - dial a node and poll litep2p until ConnectionClosed event is received. Then I break out from the loop and move on:

pub async fn do_connect(
	network: Networking,
	validator_multiaddr: Multiaddr,
	para_id: ParaId,
) {
	let Networking {
		mut identify_handle,
		mut block_announce_handle,
		mut collation_handle,
		mut req_collation_handle,
		instance: mut litep2p,
	} = network;

	let local_peer_id = litep2p.local_peer_id().clone();

	tracing::info!("peer id {:?}", local_peer_id);
	tracing::info!("Dialing {:?}", validator_multiaddr);

	litep2p.dial_address(validator_multiaddr).await.unwrap();

	tracing::info!("Waiting for connection to be established...");

	// Wait for connection:
	let validator_peer_id = loop {
		let event = litep2p.next_event().await.unwrap();
		tracing::info!("Event litep2p (waiting for connection): {:?}", event);
		if let Litep2pEvent::ConnectionEstablished { peer, .. } = event {
			break peer;
		}
	};

	tracing::info!("Connection established");

	// Litep2p needs to be polled to drive internal state.
	loop {
		let event = litep2p.next_event().await.unwrap();
		if let Litep2pEvent::ConnectionClosed { .. } = event {
			tracing::info!("Connection closed");
			break;
		} else {
			tracing::info!("Event litep2p: {:?}", event);
		}
	}
	tracing::info!("after loop");
}

The code is called in a loop:

loop {
	let n = networking::Networking::new(&genesis_hash);
	tracing::info!("before do_connect");
	do_connection_spam(n, validator_multiaddr.clone(), para_id).await;
	tracing::info!("after do_connect");
}

The output from this code is:

2025-10-31T10:00:22.546793Z  INFO malus_collator::networking: peer id PeerId("12D3KooWBcsj7ELhW861fTciFfweUxsXjSK1vm8dwApgFmSTyaL3")
2025-10-31T10:00:22.546867Z  INFO malus_collator::networking: Dialing "/ip4/127.0.0.1/tcp/55120/ws/p2p/12D3KooWQxLRH6mMorYJEL1ohnqx1uMDd3Z7HytYhGXwr9W7EoNj"
2025-10-31T10:00:22.547072Z  INFO malus_collator::networking: Waiting for connection to be established...
2025-10-31T10:00:22.551572Z  INFO malus_collator::networking: Event litep2p (waiting for connection): ConnectionEstablished { peer: PeerId("12D3KooWQxLRH6mMorYJEL1ohnqx1uMDd3Z7HytYhGXwr9W7EoNj"), endpoint: Dialer { address: "/ip4/127.0.0.1/tcp/55120/ws/p2p/12D3KooWQxLRH6mMorYJEL1ohnqx1uMDd3Z7HytYhGXwr9W7EoNj", connection_id: ConnectionId(0) } }
2025-10-31T10:00:22.551616Z  INFO malus_collator::networking: Connection established
2025-10-31T10:00:27.555192Z  INFO malus_collator::networking: Connection closed
2025-10-31T10:00:27.555317Z  INFO malus_collator::networking: after loop
2025-10-31T10:00:27.555924Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.555903Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556009Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556053Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556075Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556092Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556095Z  WARN litep2p::ipfs::identify: transport service stream ended, terminating identify event loop
2025-10-31T10:00:27.556110Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556224Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556334Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556374Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556392Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556409Z  WARN litep2p::transport-service: transport service closed
2025-10-31T10:00:27.556425Z  WARN litep2p::transport-service: transport service closed

Where WARN litep2p::transport-service: transport service closed is logged indefinitely. Also I noteed that "after loop" is logged but "after do_connect" is never logged.

For sure what I do is incorrect but probably shouldn't end up in a infinite loop?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions