NVIDIA / NVIDIA/TensorRT-LLM

[RFC]: Deterministic fault-injection harness for disaggregated serving

Open
#18,450 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Disaggregated serving Testing
Dominant language
Python
Stars
14.7k
Forks
2.8k
Avg merge
2d 23h
Merged PRs (30d)
489

Description

Motivation

TensorRT-LLM's disaggregated serving path now spans several asynchronous reliability boundaries: context/generation orchestration, KV-cache transfer, completion notifications, cancellation/timeouts, cluster storage, and worker lifecycle. The repository has good focused regression tests for individual failures, but each new failure mode currently tends to require a bespoke test harness.

I would like to propose a reusable, deterministic fault-injection harness for disaggregated serving so reliability behavior can be exercised systematically rather than one incident at a time.

I searched the current docs/issues for an equivalent fault-injection or chaos-testing framework and did not find one. Existing tests such as bounded transceiver polling and in-flight cancellation cover specific cases, but not a shared failure-model layer.

Proposed Change

Add an opt-in testing framework that can inject failures at defined disaggregated-serving boundaries while keeping normal production behavior unchanged.

A first version could support scripted faults such as:

  • delay or drop KV-transfer completion notifications;
  • force transfer timeout/cancellation at a chosen lifecycle point;
  • fail a transfer before start, while in flight, or after data movement but before acknowledgement;
  • return stale, expired, missing, or delayed cluster-storage state;
  • inject duplicate/out-of-order watch events;
  • simulate context or generation worker disconnects;
  • cancel a request while transfer/storage work is outstanding.

Conceptually, tests could define a deterministic scenario rather than custom mocks for every case:

scenario = DisaggFaultScenario([
    drop("kv_transfer_complete", request="r1"),
    advance_time(ms=5000),
])

with disagg_faults(scenario) as faults:
    result = run_test_request(...)

faults.assert_consumed()

The harness should record a compact lifecycle trace so tests can assert invariants such as:

  • bounded completion or bounded failure;
  • no leaked transfer/request state;
  • cancellation releases owned resources;
  • stale cluster-storage data is not surfaced as live;
  • retries/reconciliation do not duplicate completion;
  • unaffected requests continue progressing.

I would start with a CPU-only deterministic layer around the existing Python disaggregation/transceiver/storage boundaries, using fake time and fake transports where possible. A later phase could add a small loopback/integration matrix for real NIXL/UCX-capable environments without making GPU/fabric tests a prerequisite for the core harness.

The intent is test infrastructure, not a production chaos-injection API. Production code would only gain narrowly scoped injection seams where the current architecture does not already expose a testable boundary.

If maintainers agree with the direction, I can prepare the implementation as several small PRs rather than one large change: core scenario/fault API, transceiver integration, storage/watch integration, then representative disaggregated regression migrations.

Feedback Period

1-2 weeks would be ideal before implementation.

Any Other Things

This proposal is motivated by the same reliability area where recent regressions have appeared around KV-transfer timeout/cancellation and cluster-storage semantics. The goal is to make future fixes easier to prove across a consistent failure matrix, not to change the serving contract itself.

Before submitting a new issue...
  • Searched relevant issues, documentation, and existing disaggregated-serving tests.

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 by reading the existing Python disaggregation, transceiver, storage, cancellation, and timeout tests mentioned in the issue, then trace the current testable boundaries. The proposed work is a reusable CPU-only deterministic fault-injection harness with fake time or transports and lifecycle traces. Done means representative failure scenarios can assert bounded completion, cleanup, cancellation, stale-state handling, and unaffected-request progress.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
distributed-systems, testing-qa
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.