Skip to content

Paths continually opened/abandoned. #4393

Description

@NfNitLoop

Describe the bug

Iroh continues to try to open extra paths for a connection, though the application keeps abandoning them.

Original report from Discord:

Playing around with Iroh and reading debug logs. I'm wondering what might be causing this in debug logs. It seems to be using Path(1), but keeps trying to open to more paths (one v4, one v6) and they get abandoned with messages like this:

iroh::_events::path::abandoned: remote=... conn_id=... path_id=... network_path=Ip(...) reason=ApplicationClosed { error_code: 62 }

[...]
(Connections seem to be working fine, this is just me trying to understand multipath and learn more.)
[...]
FWIW I’m seeing the behavior when I’m running behind a NAT, connecting to another service behind the [same] NAT. No UPnP support.
Using only n0 discovery. (Plan to add mdns support but haven’t enabled yet.)

Relevant Logs

client.txt

server.txt

Expected behavior

I'm running a custom ping command that sends 10 pings, waiting 1 second between each. The pings all happen on the same Connection, so I'd expect paths to stabilize and get re-used. (I only open a new bidi stream for each ping.)

Plus, @flub on Discord said this might be a bug and asked me to submit these traces. :)

Iroh

Version:

iroh v1.0.0
├── iroh feature "default"
│   └── st v0.1.0 (/home/codyc/code/iroh/st/crates/st)
│       └── st feature "default" (command-line)
├── iroh feature "fast-apple-datapath"
│   └── iroh feature "default" (*)
├── iroh feature "metrics"
│   └── iroh feature "default" (*)
├── iroh feature "portmapper"
│   └── iroh feature "default" (*)
└── iroh feature "tls-ring"
    └── iroh feature "default" (*)

Endpoint configuration:

Server:

    let ep = Endpoint::builder(presets::N0)
        .secret_key(conf.secret_key)
        .alpns(
            vec![
                " ", "_", "h3",
            ]
            .into_iter()
            .map(|it| it.to_owned().into_bytes())
            .collect(),
        )
        .bind()
        .await?;

Client:

    let ep = Endpoint::builder(presets::N0)
        .secret_key(secret_key)
        .bind()
        .await?;

Platform(s)
Desktop: Linux ludilo 7.0.14-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 27 Jun 2026 16:15:10 +0000 x86_64 GNU/Linux

  • This issue was created by a human that thought critically about
    the issue being reported and wrote this as concisely and clearly
    as they could. Taking full responsibility for the issue being
    accurate.
  • This issue isn't slop, and is backed up by evidence.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingnoqA bug or feature in the QUIC stack

Type

Projects

Status
🚑 Needs Triage

Relationships

None yet

Development

No branches or pull requests

Issue actions