Skip to content

Panic: Unwrapping send on closed report channel causes ReceiveClosed in worker tasks under load #883

@Victor1890

Description

@Victor1890

Summary

When running oha with high concurrency (e.g. -n 5000 -c 1000) and especially with --latency-correction enabled, worker tasks can panic with:

panic at src/client.rs:1254:49: called `Result::unwrap()` on an `Err` value: ReceiveClosed

Reproduction

Run:

oha 'http://localhost:9000/api/requests/' -n 5000 -c 1000 -m POST --latency-correction -H 'Content-Type: application/json' -d '{"email":"test+999@mail.com"}'

The panic is much more likely at high concurrency or when early shutdown occurs. It is triggered when the result receiver closes before all worker tasks finish.

Root cause

Code at src/client.rs:1245-1250:

while counter.fetch_add(1, Ordering::Relaxed) < n_tasks {
    let res = client.work_http1(&mut client_state).await;
    let is_cancel = is_cancel_error(&res);
    report_tx.send(res).unwrap();
    if is_cancel { break; }
}

When the receiver is closed (for example, when test duration or parent task completes), further sends panic workers via .unwrap().

Impact

This is a race between result reporting and the receiver's lifetime. In normal or high-pressure use, fast termination of the receiver (parent) leaves workers panicking on .unwrap() if they race to send results after closed.

Possible solutions

  • Change all report_tx.send(...).unwrap(); sites to handle channel closure gracefully, e.g.:
    if report_tx.send(res).is_err() { break; }
  • Prefer ok() and silent exit when the receiver is gone, since there's nothing further the worker can do.
  • Audit all other worker/reporting codepaths for send(...).unwrap() (other than in tests) and apply similar fix.

Let me know if you need details or logs would be useful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions