Skip to content

Refactoring: derive nixlUcxThreadPoolEngine from nixlUcxThreadEngine - v1.4.0 - #2012

Merged
nv-nmailhot merged 2 commits into
ai-dynamo:release/1.4.0from
iyastreb:iyastreb/backport-1906-release-1.4.0
Aug 3, 2026
Merged

nv-nmailhot merged 2 commits into
ai-dynamo:release/1.4.0from
iyastreb:iyastreb/backport-1906-release-1.4.0

Conversation

@iyastreb

@iyastreb iyastreb commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

What?

Backport #1906 to v1.4.0

To unify the code and reuse the same functions
It's pre-requisite for completions API PR

Summary by CodeRabbit

  • New Features

    • Added configurable UCX shared and dedicated worker threading.
    • Added optional CUDA, Torch, Infinia DDN, and UCX plugin build configuration.
    • Added pre-built wheel-base image support for faster wheel builds.
    • Added container build verification coverage for multiple platforms.
    • Updated project and package version to 1.4.0.
  • Documentation

    • Updated CI workflow, wheel-building, caching, and image-tag documentation.
    • Added NVIDIA proprietary licensing attribution.
  • Chores

    • Added NVIDIA license information and updated third-party component notices.

@github-actions

Copy link
Copy Markdown

👋 Hi iyastreb! Thank you for contributing to ai-dynamo/nixl.

Your PR reviewers will review your contribution then trigger the CI to test your changes.

🚀

@iyastreb
iyastreb changed the base branch from main to release/1.4.0 July 30, 2026 08:42
@iyastreb

Copy link
Copy Markdown
Contributor Author

/build

@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4e89cf4e-3fdd-4bd0-8691-150920e8c8e4

📥 Commits

Reviewing files that changed from the base of the PR and between 53be1d4 and 0fb68cd.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • examples/rust/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (24)
  • .ci/cidemo-init.sh
  • .ci/docs/build-wheel-matrix-ci.md
  • .ci/docs/ci-overview.md
  • .ci/jenkins/lib/build-container-pr-matrix.yaml
  • .ci/jenkins/lib/build-matrix.yaml
  • .ci/jenkins/lib/build-wheel-matrix.yaml
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-dl-matrix.yaml
  • .ci/jenkins/lib/test-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml
  • .ci/jenkins/pipeline/Jenkinsfile.dispatcher
  • .ci/jenkins/pipeline/proj-jjb.yaml
  • .gitignore
  • ATTRIBUTIONS-Python.md
  • Cargo.toml
  • README.md
  • benchmark/nixlbench/meson.build
  • contrib/Dockerfile.manylinux
  • contrib/build-container.sh
  • licenses/NVIDIA-proprietary-LICENSE.txt
  • meson.build
  • pyproject.toml
  • src/plugins/ucx/ucx_backend.cpp
  • src/plugins/ucx/ucx_backend.h

📝 Walkthrough

Walkthrough

Changes

CI and container build workflows

Layer / File(s) Summary
CI image tag automation
.ci/cidemo-init.sh, .ci/jenkins/lib/*-matrix.yaml, .ci/docs/*
CI image tags are derived from CI file history or content and patched into matrix YAML placeholders.
Cached wheel-base build flow
contrib/Dockerfile.manylinux, contrib/build-container.sh, .ci/jenkins/lib/build-wheel-matrix.yaml, .ci/docs/build-wheel-matrix-ci.md
Wheel builds use a cached wheel_base image, targeted wheel builds, CUDA and Torch options, and optional Infinia and UCX plugin staging.
PR container verification pipeline
.ci/jenkins/lib/build-container-pr-matrix.yaml, .ci/jenkins/pipeline/*, .ci/docs/ci-overview.md
A new Jenkins job builds nixl and nixlbench images across two architectures without pushing them.

Release metadata and licensing

Layer / File(s) Summary
Version and license metadata
Cargo.toml, meson.build, benchmark/nixlbench/meson.build, pyproject.toml, licenses/*, README.md, ATTRIBUTIONS-Python.md
Project versions and attribution records move to 1.4.0, and NVIDIA proprietary licensing is added to package metadata and documentation.

UCX shared and dedicated workers

Layer / File(s) Summary
Worker access and thread contracts
src/plugins/ucx/ucx_backend.h
UCX worker access uses shared and dedicated spans, updated constructor contracts, and dedicated-thread storage.
Progress and dedicated thread initialization
src/plugins/ucx/ucx_backend.cpp
Shared progress threading becomes conditional, synchronous progress is supported, and thread-pool engines create dedicated worker threads.
Shared-worker transfer routing
src/plugins/ucx/ucx_backend.cpp
Connections, transfers, notifications, memory views, metadata, and progress use shared-worker selection.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Jenkins as Jenkins dispatcher
  participant WheelCI as Wheel matrix
  participant WheelBase as Cached wheel_base
  participant Build as build-container.sh
  participant ContainerCI as Container verification
  Jenkins->>WheelCI: Dispatch wheel build
  WheelCI->>WheelBase: Pull CI-managed base image
  WheelCI->>Build: Build targeted wheel stage
  Jenkins->>ContainerCI: Dispatch build-only verification
  ContainerCI->>Build: Build nixl or nixlbench image
  Build-->>ContainerCI: Return verification result
Loading

Possibly related PRs

Suggested reviewers: yosefe

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main refactor and matches the changeset.
Description check ✅ Passed The description covers what changed and why, and the optional How section is the only missing part.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
⚔️ Resolve merge conflicts 💡
  • Resolve merge conflict in branch iyastreb/backport-1906-release-1.4.0
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.ci/docs/build-wheel-matrix-ci.md (1)

439-456: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Two docs give opposite instructions for CI_IMAGE_TAG. build-wheel-matrix-ci.md's new Maintenance section tells contributors to manually bump CI_IMAGE_TAG, while ci-overview.md's new "CI_IMAGE_TAG management" section (added in the same PR) correctly states it is auto-derived and must never be hand-edited. Per the cidemo-init.sh contract, manually replacing the "CI_MANAGED" placeholder is exactly what triggers the script's hard failure ("CI_MANAGED placeholder missing"), so the Maintenance instruction would actively break CI for anyone who follows it.

  • .ci/docs/build-wheel-matrix-ci.md#L439-L456: remove/replace the "bump CI_IMAGE_TAG" and "rebuilding it only requires bumping CI_IMAGE_TAG" instructions with a note that the tag rebuilds automatically whenever contrib/Dockerfile.manylinux changes (it's in cidemo-init.sh's CI_FILES list) — no manual edit needed.
  • .ci/docs/ci-overview.md#L205-L233: no change needed; keep as the source of truth once the other file is corrected.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.ci/docs/build-wheel-matrix-ci.md around lines 439 - 456, The maintenance
guidance in .ci/docs/build-wheel-matrix-ci.md:439-456 must stop instructing
contributors to manually edit CI_IMAGE_TAG; replace both references with
guidance that the tag is automatically rebuilt when contrib/Dockerfile.manylinux
changes because it is included in cidemo-init.sh’s CI_FILES list, and no manual
edit is needed. .ci/docs/ci-overview.md:205-233 requires no direct change and
remains the source of truth.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.ci/docs/build-wheel-matrix-ci.md:
- Around line 129-137: Update the UCX SPCX plugin documentation to state that
--ucx-spcx-plugin-ref defaults to v0.1.0, matching the UCX_SPCX_PLUGIN_REF
default in build-container.sh; keep the existing description of the override
behavior unchanged.

In @.ci/jenkins/lib/build-container-pr-matrix.yaml:
- Around line 39-63: Restructure the job around the Setup docker step and
subsequent contrib/build-container.sh and nixlbench build execution so registry
authentication occurs only in a trusted preparation stage. Pull or otherwise
prepare all required base images before invoking any PR-controlled scripts, then
remove credentials and Podman/Docker authentication state and run the PR build
in an unauthenticated stage; ensure credentials are not exposed through
environment variables, mounts, or auth files during either build path.

In `@contrib/build-container.sh`:
- Around line 359-360: Update the EXIT cleanup setup in the
build-ucx-spcx-plugin and BUILD_INFINIA paths of the container build script so
registering cleanup for INFINIA_LIBS_DIR does not overwrite the existing
SPCX_SRC_DIR handler. Accumulate both directory removals in a single EXIT trap
or otherwise preserve both cleanup actions when both options are enabled.

In `@pyproject.toml`:
- Around line 25-29: Update the pyproject.toml license expression to include
LicenseRef-NvidiaProprietary alongside MIT and Apache-2.0, matching the NVIDIA
modules bundled in the Python wheels. If the license field does not cover wheel
contents, instead explicitly scope or document that exclusion.

In `@src/plugins/ucx/ucx_backend.cpp`:
- Around line 683-685: Update the split-transfer path around
nixlUcxCompositeBackendReqH construction to forward opt_args when selecting the
shared worker, matching the small-batch path. Ensure the worker used for the
composite request is selected consistently with the worker used to prepare the
memory view/rkey.

In `@src/plugins/ucx/ucx_backend.h`:
- Line 300: Rename the private member numSharedWorkers_ to num_shared_workers_
in ucx_backend and update every declaration and reference to use the snake_case
name consistently.

---

Outside diff comments:
In @.ci/docs/build-wheel-matrix-ci.md:
- Around line 439-456: The maintenance guidance in
.ci/docs/build-wheel-matrix-ci.md:439-456 must stop instructing contributors to
manually edit CI_IMAGE_TAG; replace both references with guidance that the tag
is automatically rebuilt when contrib/Dockerfile.manylinux changes because it is
included in cidemo-init.sh’s CI_FILES list, and no manual edit is needed.
.ci/docs/ci-overview.md:205-233 requires no direct change and remains the source
of truth.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4e89cf4e-3fdd-4bd0-8691-150920e8c8e4

📥 Commits

Reviewing files that changed from the base of the PR and between 53be1d4 and 0fb68cd.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • examples/rust/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (24)
  • .ci/cidemo-init.sh
  • .ci/docs/build-wheel-matrix-ci.md
  • .ci/docs/ci-overview.md
  • .ci/jenkins/lib/build-container-pr-matrix.yaml
  • .ci/jenkins/lib/build-matrix.yaml
  • .ci/jenkins/lib/build-wheel-matrix.yaml
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-dl-matrix.yaml
  • .ci/jenkins/lib/test-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml
  • .ci/jenkins/pipeline/Jenkinsfile.dispatcher
  • .ci/jenkins/pipeline/proj-jjb.yaml
  • .gitignore
  • ATTRIBUTIONS-Python.md
  • Cargo.toml
  • README.md
  • benchmark/nixlbench/meson.build
  • contrib/Dockerfile.manylinux
  • contrib/build-container.sh
  • licenses/NVIDIA-proprietary-LICENSE.txt
  • meson.build
  • pyproject.toml
  • src/plugins/ucx/ucx_backend.cpp
  • src/plugins/ucx/ucx_backend.h

Comment thread src/plugins/ucx/ucx_backend.cpp
Comment thread src/plugins/ucx/ucx_backend.h

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.ci/docs/build-wheel-matrix-ci.md (1)

439-456: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Two docs give opposite instructions for CI_IMAGE_TAG. build-wheel-matrix-ci.md's new Maintenance section tells contributors to manually bump CI_IMAGE_TAG, while ci-overview.md's new "CI_IMAGE_TAG management" section (added in the same PR) correctly states it is auto-derived and must never be hand-edited. Per the cidemo-init.sh contract, manually replacing the "CI_MANAGED" placeholder is exactly what triggers the script's hard failure ("CI_MANAGED placeholder missing"), so the Maintenance instruction would actively break CI for anyone who follows it.

  • .ci/docs/build-wheel-matrix-ci.md#L439-L456: remove/replace the "bump CI_IMAGE_TAG" and "rebuilding it only requires bumping CI_IMAGE_TAG" instructions with a note that the tag rebuilds automatically whenever contrib/Dockerfile.manylinux changes (it's in cidemo-init.sh's CI_FILES list) — no manual edit needed.
  • .ci/docs/ci-overview.md#L205-L233: no change needed; keep as the source of truth once the other file is corrected.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.ci/docs/build-wheel-matrix-ci.md around lines 439 - 456, The maintenance
guidance in .ci/docs/build-wheel-matrix-ci.md:439-456 must stop instructing
contributors to manually edit CI_IMAGE_TAG; replace both references with
guidance that the tag is automatically rebuilt when contrib/Dockerfile.manylinux
changes because it is included in cidemo-init.sh’s CI_FILES list, and no manual
edit is needed. .ci/docs/ci-overview.md:205-233 requires no direct change and
remains the source of truth.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.ci/docs/build-wheel-matrix-ci.md:
- Around line 129-137: Update the UCX SPCX plugin documentation to state that
--ucx-spcx-plugin-ref defaults to v0.1.0, matching the UCX_SPCX_PLUGIN_REF
default in build-container.sh; keep the existing description of the override
behavior unchanged.

In @.ci/jenkins/lib/build-container-pr-matrix.yaml:
- Around line 39-63: Restructure the job around the Setup docker step and
subsequent contrib/build-container.sh and nixlbench build execution so registry
authentication occurs only in a trusted preparation stage. Pull or otherwise
prepare all required base images before invoking any PR-controlled scripts, then
remove credentials and Podman/Docker authentication state and run the PR build
in an unauthenticated stage; ensure credentials are not exposed through
environment variables, mounts, or auth files during either build path.

In `@contrib/build-container.sh`:
- Around line 359-360: Update the EXIT cleanup setup in the
build-ucx-spcx-plugin and BUILD_INFINIA paths of the container build script so
registering cleanup for INFINIA_LIBS_DIR does not overwrite the existing
SPCX_SRC_DIR handler. Accumulate both directory removals in a single EXIT trap
or otherwise preserve both cleanup actions when both options are enabled.

In `@pyproject.toml`:
- Around line 25-29: Update the pyproject.toml license expression to include
LicenseRef-NvidiaProprietary alongside MIT and Apache-2.0, matching the NVIDIA
modules bundled in the Python wheels. If the license field does not cover wheel
contents, instead explicitly scope or document that exclusion.

In `@src/plugins/ucx/ucx_backend.cpp`:
- Around line 683-685: Update the split-transfer path around
nixlUcxCompositeBackendReqH construction to forward opt_args when selecting the
shared worker, matching the small-batch path. Ensure the worker used for the
composite request is selected consistently with the worker used to prepare the
memory view/rkey.

In `@src/plugins/ucx/ucx_backend.h`:
- Line 300: Rename the private member numSharedWorkers_ to num_shared_workers_
in ucx_backend and update every declaration and reference to use the snake_case
name consistently.

---

Outside diff comments:
In @.ci/docs/build-wheel-matrix-ci.md:
- Around line 439-456: The maintenance guidance in
.ci/docs/build-wheel-matrix-ci.md:439-456 must stop instructing contributors to
manually edit CI_IMAGE_TAG; replace both references with guidance that the tag
is automatically rebuilt when contrib/Dockerfile.manylinux changes because it is
included in cidemo-init.sh’s CI_FILES list, and no manual edit is needed.
.ci/docs/ci-overview.md:205-233 requires no direct change and remains the source
of truth.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 4e89cf4e-3fdd-4bd0-8691-150920e8c8e4

📥 Commits

Reviewing files that changed from the base of the PR and between 53be1d4 and 0fb68cd.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • examples/rust/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (24)
  • .ci/cidemo-init.sh
  • .ci/docs/build-wheel-matrix-ci.md
  • .ci/docs/ci-overview.md
  • .ci/jenkins/lib/build-container-pr-matrix.yaml
  • .ci/jenkins/lib/build-matrix.yaml
  • .ci/jenkins/lib/build-wheel-matrix.yaml
  • .ci/jenkins/lib/test-dl-ep-matrix.yaml
  • .ci/jenkins/lib/test-dl-matrix.yaml
  • .ci/jenkins/lib/test-matrix.yaml
  • .ci/jenkins/lib/test-sanitizer-matrix.yaml
  • .ci/jenkins/pipeline/Jenkinsfile.dispatcher
  • .ci/jenkins/pipeline/proj-jjb.yaml
  • .gitignore
  • ATTRIBUTIONS-Python.md
  • Cargo.toml
  • README.md
  • benchmark/nixlbench/meson.build
  • contrib/Dockerfile.manylinux
  • contrib/build-container.sh
  • licenses/NVIDIA-proprietary-LICENSE.txt
  • meson.build
  • pyproject.toml
  • src/plugins/ucx/ucx_backend.cpp
  • src/plugins/ucx/ucx_backend.h
🛑 Comments failed to post (4)
.ci/docs/build-wheel-matrix-ci.md (1)

129-137: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Stale default value: doc says main, code defaults to v0.1.0.

The plugin ref defaults to main and is selectable with --ucx-spcx-plugin-ref. contrib/build-container.sh actually sets UCX_SPCX_PLUGIN_REF="v0.1.0" as the default. Update the doc to match the real default.

🧰 Tools
🪛 markdownlint-cli2 (0.23.1)

[warning] 129-129: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below

(MD022, blanks-around-headings)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.ci/docs/build-wheel-matrix-ci.md around lines 129 - 137, Update the UCX
SPCX plugin documentation to state that --ucx-spcx-plugin-ref defaults to
v0.1.0, matching the UCX_SPCX_PLUGIN_REF default in build-container.sh; keep the
existing description of the override behavior unchanged.
.ci/jenkins/lib/build-container-pr-matrix.yaml (1)

39-63: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

Do not expose registry credentials to PR-controlled build code.

After logging in, this job executes contrib/build-container.sh and the nixlbench build script from the PR checkout. A modified script or Dockerfile can read the injected tokens or Podman auth file and exfiltrate them. Split authenticated image preparation into a trusted stage, then run the PR build without credentials/auth state.

Also applies to: 76-96

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.ci/jenkins/lib/build-container-pr-matrix.yaml around lines 39 - 63,
Restructure the job around the Setup docker step and subsequent
contrib/build-container.sh and nixlbench build execution so registry
authentication occurs only in a trusted preparation stage. Pull or otherwise
prepare all required base images before invoking any PR-controlled scripts, then
remove credentials and Podman/Docker authentication state and run the PR build
in an unauthenticated stage; ensure credentials are not exposed through
environment variables, mounts, or auth files during either build path.
contrib/build-container.sh (1)

359-360: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

EXIT trap for SPCX_SRC_DIR is silently overwritten when BUILD_INFINIA is also enabled.

trap ... EXIT set at line 359 for $SPCX_SRC_DIR gets replaced by the later trap ... EXIT at line 396 for $INFINIA_LIBS_DIR when both --build-ucx-spcx-plugin and --build-infinia are used together — bash only keeps the most recently registered EXIT handler. $SPCX_SRC_DIR is cleaned up again at the start of the next run (line 347), so this isn't a permanent leak, but it silently drops the intended cleanup-on-exit guarantee for one of the two directories.

🧹 Proposed fix: accumulate cleanup instead of overwriting the trap
-    trap 'rm -rf "$SPCX_SRC_DIR"' EXIT
+    trap 'rm -rf "$SPCX_SRC_DIR" "${INFINIA_LIBS_DIR:-}"' EXIT
     mkdir -p "$SPCX_SRC_DIR"
     rm -rf "$INFINIA_LIBS_DIR"
     mkdir -p "$INFINIA_LIBS_DIR"
-    trap 'rm -rf "$INFINIA_LIBS_DIR"' EXIT
+    trap 'rm -rf "$INFINIA_LIBS_DIR" "${SPCX_SRC_DIR:-}"' EXIT

Also applies to: 396-410

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@contrib/build-container.sh` around lines 359 - 360, Update the EXIT cleanup
setup in the build-ucx-spcx-plugin and BUILD_INFINIA paths of the container
build script so registering cleanup for INFINIA_LIBS_DIR does not overwrite the
existing SPCX_SRC_DIR handler. Accumulate both directory removals in a single
EXIT trap or otherwise preserve both cleanup actions when both options are
enabled.
pyproject.toml (1)

25-29: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== Files ==\n'
git ls-files pyproject.toml README.md licenses/NVIDIA-proprietary-LICENSE.txt || true

printf '\n== pyproject.toml (relevant lines) ==\n'
nl -ba pyproject.toml | sed -n '1,120p'

printf '\n== README.md mentions of wheels/modules/license ==\n'
rg -n -i 'wheel|nvidia|license|proprietary|bundl' README.md

printf '\n== LICENSE reference file ==\n'
nl -ba licenses/NVIDIA-proprietary-LICENSE.txt | sed -n '1,160p'

Repository: ai-dynamo/nixl

Length of output: 309


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== project metadata search ==\n'
rg -n -i 'license-files|license =|LicenseRef|NVIDIA-proprietary|Apache-2.0|MIT' pyproject.toml README.md .github -g '!**/.git/**'

Repository: ai-dynamo/nixl

Length of output: 1872


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
p = Path('pyproject.toml')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 1 <= i <= 120:
        print(f"{i:4d}: {line}")
PY

Repository: ai-dynamo/nixl

Length of output: 2181


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
p = Path('README.md')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 400 <= i <= 430:
        print(f"{i:4d}: {line}")
PY

Repository: ai-dynamo/nixl

Length of output: 1004


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
text = Path('pyproject.toml').read_text().splitlines()
for i, line in enumerate(text, 1):
    if i <= 80:
        print(f"{i:4d}: {line}")
PY

Repository: ai-dynamo/nixl

Length of output: 2181


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
p = Path('README.md')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 410 <= i <= 420:
        print(f"{i:4d}: {line}")
PY

Repository: ai-dynamo/nixl

Length of output: 617


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
p = Path('pyproject.toml')
for i, line in enumerate(p.read_text().splitlines(), 1):
    if 20 <= i <= 32:
        print(f"{i:4d}: {line}")
PY

Repository: ai-dynamo/nixl

Length of output: 545


🏁 Script executed:

#!/bin/bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
for path in ['pyproject.toml', 'README.md', 'LICENSE', 'licenses/NVIDIA-proprietary-LICENSE.txt']:
    p = Path(path)
    print(f"\n== {path} ==")
    if p.exists():
        for i, line in enumerate(p.read_text().splitlines(), 1):
            if path != 'README.md' or i <= 40 or 410 <= i <= 420:
                print(f"{i:4d}: {line}")
    else:
        print("missing")
PY

Repository: ai-dynamo/nixl

Length of output: 19059


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -i 'LicenseRef-NvidiaProprietary|license = |license-files|SPDX-License-Identifier|third-party component|bundle NVIDIA modules|wheel' . -g '!**/.git/**'

Repository: ai-dynamo/nixl

Length of output: 50370


Include LicenseRef-NvidiaProprietary in the wheel license expression. pyproject.toml still advertises only MIT AND Apache-2.0, while README.md says the Python wheels bundle NVIDIA modules under LicenseRef-NvidiaProprietary. If this field covers the wheel, add that SPDX reference; otherwise scope or document the exclusion.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pyproject.toml` around lines 25 - 29, Update the pyproject.toml license
expression to include LicenseRef-NvidiaProprietary alongside MIT and Apache-2.0,
matching the NVIDIA modules bundled in the Python wheels. If the license field
does not cover wheel contents, instead explicitly scope or document that
exclusion.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit dc2f97e3

TL;DR: Two CI jobs failed on PR #2012 (UCX thread-pool engine refactor). The CPP-tests stage hung for ~2h in the ucx_threadpool_no_pt/TestTransfer.* cases (each ~16 min vs. seconds in other variants) until SIGTERM, and the Nixlbench stage segfaulted (exit 139) on UCCL WRITE DRAM→DRAM; the hang is the primary regression from the refactor and should be fixed there.

Full analysis

Summary: nixl-ci-gpu #3006 failed in two stages: "Run CPP tests" (ABORTED, exit 143 after ~2h) and "Run Nixlbench tests" (FAILURE, exit 139/SIGSEGV).

Root cause:

  • CPP tests: A hang in the ucx_threadpool_no_pt transfer tests. gtest progressed normally (each test seconds to ~60s) through test 97, then tests 98–102 (ucx_threadpool_no_pt/TestTransfer.RandomSizes, remoteMDFromSocket, NotificationOnly, SelfNotification, EmptyNotificationPayload) each took ~980,000–1,010,000 ms (~16 min each) — roughly the entire runtime — before being killed by the wall-clock limit at 11:19 (Sending interrupt signal, exit code 143). The no_pt (no-progress-thread) thread-pool path is exactly what PR Refactoring: derive nixlUcxThreadPoolEngine from nixlUcxThreadEngine - v1.4.0 #2012 changes, so progress is not being driven and transfers stall/spin. This is a hang, not a genuinely-slow test.
  • Nixlbench: a hard SIGSEGV (exit 139) in ./bin/nixlbench ... --backend UCCL --op_type WRITE --initiator_seg_type DRAM --target_seg_type DRAM (srun: task 0: Exited with exit code 139).

Implicated commit: PR #2012 head [REDACTED:Hex High Entropy String] — "Refactoring: derive nixlUcxThreadPoolEngine from nixlUcxThreadEngine – v1.4.0" (Ilia Yastrebov; cf. related merged commit 209abbe / #1906). The CPP hang is attributable to this UCX thread-pool refactor.

File: src/plugins/ucx/ucx_backend.cpp / ucx_backend.h — the nixlUcxThreadPoolEngine (derived from nixlUcxThreadEngine) progress/completion path exercised by the ucx_threadpool_no_pt gtest variant (test/gtest UCX TestTransfer fixtures).

Suggested fix: Investigate the thread-pool engine's progress handling when no progress thread is enabled (no_pt). After the refactor deriving nixlUcxThreadPoolEngine from nixlUcxThreadEngine, the code path that drives UCX progress / signals transfer completion in the no-progress-thread configuration is not advancing, causing the transfer completion wait to spin indefinitely. Verify the overridden progress/checkXfer/worker-poll methods are actually invoked in the pooled+no_pt case, and add/restore the completion-signaling that the base thread-engine relied on. Do not raise the CPP-test time limit — the ~16-min-per-test gaps show a hang, not slow-but-progressing work. The UCCL DRAM→DRAM WRITE segfault should also be reproduced locally (run under gdb/ASan) to confirm whether it's the same regression or a separate issue.

Related: PR #2012 (#2012); prior refactor PR #1906 (commit 209abbe). Also see #1743 ("TEST/GTEST: Run in single process") and #1880 ("ucx: fix infinite loop dropping pending requests on dedicated-thread exit") as related UCX thread/progress-handling context.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id afe52fd7-345b-47c8-b5c6-2064dd975aa6 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit dc2f97e3

TL;DR: The "Run Nixlbench tests" stage was aborted after a ~47-minute hang (13:13:10 → 14:00:49 of total silence) in the UCCL ASIO-runtime benchmark loop; the fix is to disable/skip the UCCL ASIO tests (lines 95-103 of .gitlab/test_nixlbench.sh) just as the UCCL ETCD tests were already disabled in PR #2000.

Full analysis

Summary: Jenkins stage 356 "Run Nixlbench tests" (job nixl-ci-gpu #3008) was ABORTED because a nixlbench --backend UCCL transfer run hung indefinitely.

Root cause: A hang, not a timeout. The last application output was at 13:13:10.627Z ("Engine destroyed" / "Error/HUP on connection 1.1.101.1:40457") completing the UCCL WRITE, initiator VRAM → target DRAM iteration. The very next line is 14:00:49.812Z "Sending interrupt signal to process" — a ~47-minute gap of complete silence, i.e. the whole remaining runtime. The next loop iteration (UCCL WRITE, initiator DRAM → target VRAM) never emitted its Configuration block or benchmark row, so it hung during connection/transfer setup. This is the known UCCL nixlbench flakiness (issue #1999). PR #2000 disabled the UCCL ETCD-runtime loop (now commented out at lines 124-132) but left the UCCL ASIO-runtime loop (lines 95-103) enabled, so the flaky UCCL path is still exercised and still hangs.

Implicated commit: 7a244b980b47 — ovidiusm, "CI: Skip UCCL nixlbench tests (#2000)" — incomplete: it skipped only the ETCD UCCL loop, not the ASIO UCCL loop. (Underlying UCCL instability tracked in issue #1999.)

File: .gitlab/test_nixlbench.sh:95-103 (the if $HAS_GPU UCCL ASIO loop)

Suggested fix: Comment out / gate the UCCL ASIO-runtime loop (lines 95-103) the same way the UCCL ETCD loop was disabled in PR #2000, referencing issue #1999. Additionally, wrap nixlbench invocations (e.g. the parallel call in run_nixlbench_two_workers_asio) with a timeout so a stuck transfer fails fast with a diagnosable error instead of consuming the entire ~47-minute wall-clock budget and getting killed by Jenkins. Do NOT raise the stage time limit — the process was hung, not slow.

Related: PR #2000 (#2000), issue #1999 (referenced in the script), PR #1724 "UCCL crash Fix + GDB trap" (#1724).

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit dc2f97e3

TL;DR: The "Run Nixlbench tests" stage (node mizu02) was killed after a ~42-minute hang (exit 143 is the symptom); a UCCL-backend nixlbench worker deadlocked during engine teardown after the UCCL/ETCD READ DRAM→VRAM consistency run, so the next benchmark never launched. The fix is to address the UCCL engine shutdown/accept-thread deadlock (issue #1999), not to raise the CI time limit.

Full analysis

Summary: Stage 356 "Run Nixlbench tests" on host mizu02 was ABORTED (SIGTERM, exit 143) because a UCCL nixlbench process hung during teardown.

Root cause: After the --backend UCCL --op_type READ --initiator_seg_type DRAM --target_seg_type VRAM --check_consistency run over the ETCD runtime completed at 16:30:25 and printed "Engine destroyed" for only one worker (16:30:27.742), the process(es) never finished shutting down. The log then shows a continuous ~42-minute gap (16:30:27 → 17:12:47) with zero output before Jenkins sent the interrupt — i.e. a hang, not slow progress. The second worker's engine destroy / background-accept-thread teardown deadlocked, so parallel never returned and the next benchmark iteration (UCCL READ DRAM→DRAM) never even printed its startup banner. The parallel sibling stage 337 on mizu01 ran the identical UCCL suite to completion, confirming this is a nondeterministic UCCL shutdown deadlock rather than a code error in the test harness. The pin_thread_to_numa/selectNICs messages are pre-existing benign warnings, not the cause.

Implicated commit: unknown (hang is in the UCCL backend engine teardown, not introduced by a specific commit in the touched history; PR #2012's own diff was not implicated by the log). UCCL teardown code last touched in f8e2221 "Enable local xfer for UCCL backend" (Pravein Govindan Kannan) and 63c494e "UCCL: Simplify and Optimize for batch transfers."

File: UCCL backend engine shutdown path — src/plugins/uccl/ (engine Destroying Engine... / "Stop background accept..." teardown). Exact line not determinable from the log alone.

Suggested fix: Investigate and fix the UCCL engine-destroy deadlock (the accept/event_loop thread in rdma/epoll_client.h not joining on shutdown after the client-side Error/HUP). As a short-term CI mitigation, wrap each run_nixlbench_two_workers_* invocation in a per-benchmark timeout so a single hung UCCL worker fails fast instead of consuming the whole stage's wall-clock. Do not simply raise the stage time limit — the process was hung, not slow. Track under issue #1999.

Related: Issue #1999 "UCCL nixlbench test hangs" (directly matches); PR #1724 "UCCL crash Fix + GDB trap"; PR #1963 "Fix race condition with ASIO runtime on shutdown" (related shutdown race pattern).

@iyastreb

Copy link
Copy Markdown
Contributor Author

/build

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit bd7a07f6

TL;DR: The wheel_base Docker image build for x86_64 failed at STEP 37/61 because git clone of libxml2 from gitlab.gnome.org returned HTTP 503 (GNOME's GitLab/Gitaly server was down). This is a transient external-infrastructure outage, not a code bug — retry the build once GNOME GitLab is back, or make the clone resilient.

Full analysis

Summary: Stage "Setup Image x86_64/nixl-wheel-base-manylinux_2_28/1" (node 40) failed while building the manylinux wheel-base container image.

Root cause: During the image build, the step
RUN git clone --depth 1 https://gitlab.gnome.org/GNOME/libxml2.git --branch 2.15 && cd libxml2 && ./autogen.sh && make && make install
failed with:

remote: The git server, Gitaly, is not available at this time. Please contact your administrator.
fatal: unable to access 'https://gitlab.gnome.org/GNOME/libxml2.git/': The requested URL returned error: 503
subprocess exited with status 128
Error: building at STEP "RUN git clone ... libxml2.git ...": exit status 128

HTTP 503 from gitlab.gnome.org means GNOME's GitLab (Gitaly backend) was temporarily unavailable. The build was progressing continuously (AWS SDK compiled, gusli built) right up to this network operation — there was no hang; it failed fast on an external dependency. Nothing in the nixl codebase caused this.

Implicated commit: None (external outage). The libxml2-from-source step was introduced in the wheel_base/wheel Dockerfile split — 619f09e71cc6 (NirWolfer, "ci: split Dockerfile.manylinux into wheel_base/wheel stages to cache deps", #1870) — but that commit is not the cause of this run's failure.

File: The manylinux wheel-base Dockerfile under contrib/ (the RUN git clone ... gitlab.gnome.org/GNOME/libxml2.git --branch 2.15 ... step, STEP 37/61 in the build).

Suggested fix:

  1. Immediate: re-run build UTILS/UCX: Updated names according to UCX changes. #1254 — this is a transient 503 from gitlab.gnome.org and will most likely pass on retry.
  2. Durable: make the libxml2 fetch resilient so a GNOME GitLab outage can't break CI:
    • Add retry/backoff to the clone (e.g. for i in 1 2 3 4 5; do git clone ... && break || sleep 15; done), and/or
    • Fetch a pinned release tarball from a mirror (e.g. GNOME download server / an internal artifact cache) instead of cloning the live GitLab repo, and/or
    • Vendor/cache the libxml2 2.15 source in an internal registry so the image build doesn't depend on gitlab.gnome.org availability.

Related: none (no matching nixl issue/PR for this 503; #1648 from the search is unrelated).

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit bd7a07f6

TL;DR: The "Run Nixlbench tests" stage was killed by Jenkins (exit 143) after hanging for ~36 minutes; the hang is in the UCCL backend's engine/process teardown, matching known issue #1999, and is unrelated to PR #2012 (a UCX-only refactor). Retry/quarantine the UCCL nixlbench case rather than raising the time limit.

Full analysis

Summary: Jenkins stage "Run Nixlbench tests" (node 356) was ABORTED with exit code 143 (SIGTERM) after a wall-clock kill; the process was hung, not slow.

Root cause: After the UCCL WRITE / VRAM→VRAM ETCD benchmark printed its result and "Engine destroyed" at 13:53:58.011Z, only one of the two parallel nixlbench workers finished tearing down. The log then goes completely silent for ~36 minutes (13:53:5814:30:10), the single largest gap and essentially the rest of the runtime. The next test iteration never even printed its + run_nixlbench_two_workers_etcd command line, so GNU parallel --halt now,fail=1 was blocked waiting on a UCCL worker that never exited. This is a hang in the UCCL backend shutdown path (Engine destroy / connection teardown, e.g. epoll_client "Error/HUP on connection"), which is exactly the symptom tracked in open issue #1999 "UCCL nixlbench test hangs." It is not caused by PR #2012, which refactors nixlUcxThreadPoolEngine/nixlUcxThreadEngine (UCX only) and does not touch UCCL.

Implicated commit: Not the PR under test. The UCCL backend last changed in [REDACTED:Hex High Entropy String] (Colin Hirsch, "BACKENDS: Unified get param.") / [REDACTED:Hex High Entropy String] (Pravein Govindan Kannan, "UCCL: Simplify and Optimize for batch transfers"); the hang is a pre-existing UCCL teardown bug, not from bd7a07f/PR #2012.

File: src/plugins/uccl/uccl_backend.cpp (engine/connection teardown path; hang after "Engine destroyed"); test harness benchmark/nixlbench UCCL two-worker ETCD loop under parallel --halt now,fail=1.

Suggested fix: Treat this as infra/known-flake for PR #2012 — re-run the job; the PR is not the cause. For the real fix, track under issue #1999: add a hard timeout around each nixlbench UCCL invocation in the test script (e.g. wrap with timeout <N>s so a stuck worker fails fast instead of blocking parallel until the Jenkins kill), and investigate the UCCL engine-destroy / RDMA connection teardown in uccl_backend.cpp for the missing-exit condition. Do not raise the Jenkins time limit — that would only delay the same hang.

Related: Issue #1999 (UCCL nixlbench test hangs); PR #2012 (unrelated UCX refactor under test); UCCL history: #895, #1271, #1428, #1595.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 72219bf4-78c6-441c-9bdf-98df6fc5a3f6 in the triage console for the audit trail.

@svc-nixl

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit bd7a07f6

TL;DR: The Run Nixlbench tests stage (ucx-v1.22.x) was aborted with exit 143 after hanging ~48 minutes in the UCCL ASIO benchmark loop; this is the known UCCL hang (issue #1999), and the fix that was supposed to skip UCCL tests (#2000) only commented out the ETCD UCCL loop, leaving the ASIO UCCL loop still enabled.

Full analysis

Summary: Jenkins aborted stage 299 ("Run Nixlbench tests", ucx-v1.22.x variant) after a UCCL benchmark hung; exit code 143 (SIGTERM) is the symptom of the timeout kill.

Root cause: Not a slow test but a hang. Last application output was Engine destroyed at 15:57:51.962Z after the UCCL WRITE VRAM→VRAM test; the next iteration (UCCL WRITE VRAM→DRAM) never produced any output, and there was a ~48-minute gap of total silence until Jenkins sent SIGTERM at 16:45:45.600Z. One of the two parallel nixlbench --backend UCCL processes hung during UCCL engine setup/teardown, so parallel --halt now,fail=1 blocked indefinitely. This is the documented UCCL hang (issue #1999). Commit #2000 attempted to disable UCCL nixlbench tests but only commented out the ETCD UCCL loop (lines 124–132), leaving the ASIO UCCL loop (lines 95–103) active — which is exactly where this build hung. (The failure is unrelated to PR #2012's UCX refactoring.)

Implicated commit: 7a244b9 "CI: Skip UCCL nixlbench tests (#2000)" by ovidiusm — incomplete mitigation.

File: .gitlab/test_nixlbench.sh:95-103 (the ASIO UCCL for op_type … run_nixlbench_two_workers_asio --backend UCCL loop)

Suggested fix: Also disable/comment out the ASIO UCCL loop at lines 95–103 (same way lines 124–132 were commented out under the reference to issue #1999) until #1999 is resolved. As a defense-in-depth measure against future hangs, wrap the nixlbench invocations in run_nixlbench_two_workers_asio/_etcd with a timeout (e.g. timeout 300 …) so a hung worker fails the test in minutes instead of consuming the entire wall-clock budget. Do not raise the job time limit — the process was hung, not slow.

Related: Issue #1999 (UCCL nixlbench test hangs); PR #2000 (partial skip). Failure surfaced on PR #2012 but is unrelated to its changes.

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit bd7a07f6

TL;DR: The "Run Nixlbench tests" stage was killed (exit 143) after hanging ~40 minutes inside a UCCL-backend nixlbench WRITE test — a known bug (issue #1999), and this PR branch is missing the merged fix (#2000) that skips those tests. Rebase PR #2012 onto latest main to pick up the UCCL skip, or exclude the UCCL nixlbench cases.

Full analysis

Summary: Jenkins stage 356 "Run Nixlbench tests" (ucx-v1.22.x variant) was aborted with exit code 143 after a UCCL nixlbench transfer hung.

Root cause: Not a timeout-due-to-slowness. The last application log line is at 05:30:09.877Z ("Engine destroyed" after UCCL WRITE VRAM→DRAM), followed by ~40 minutes of complete silence until Jenkins sent the interrupt at 06:10:53.687Z. The next test (UCCL WRITE DRAM→VRAM, launched via parallel --halt now,fail=1) never printed its config banner and hung during UCCL engine connection/setup — one worker stuck at "Waiting to accept incoming connection..." This is the known UCCL nixlbench hang tracked in issue #1999. The offending build ran the UCCL cases because its branch predates the fix that disables them.

Implicated commit: The hang is a pre-existing UCCL backend bug (not introduced by PR #2012's UCX-engine refactor). The relevant missing fix is 7a244b980b47 — ovidiusm, "CI: Skip UCCL nixlbench tests (#2000)", 2026-07-28.

File: .gitlab/test_nixlbench.sh (the run_nixlbench_two_workers_* UCCL WRITE loop); underlying bug in the UCCL backend under src/plugins/uccl.

Suggested fix: Rebase/merge PR #2012 onto current main so it includes PR #2000, which skips the flaky UCCL nixlbench tests. Do not raise the stage time limit — that would only make the hang take longer to fail. Track the underlying UCCL connection-setup hang via issue #1999.

Related: Issue #1999 (UCCL nixlbench test hangs); PR #2000 (CI: Skip UCCL nixlbench tests); PR #1724 (UCCL crash fix + GDB trap); PR #2012 (the build under investigation).

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit bd7a07f6

TL;DR: The "Run Python tests" stage was killed (exit 143) after hanging ~9m52s with zero output at pip's Installing build dependencies: started — the isolated PEP-517 build environment stalled resolving/downloading the pinned torch==2.11.* build requirement. The fix is to make that build step non-isolated (or provide torch from the already-installed image) rather than raising the timeout.

Full analysis

Summary: Stage 280 (Run Python tests, CUDA 13.3 / pytorch base image) aborted after pip install --config-settings=compile-args=-j256 . hung during build-dependency setup.

Root cause: In stage 280's log, the last application line is Installing build dependencies: started at 07:43:15.425; the next line is Jenkins' Sending interrupt signal to process at 07:53:07.882 — a ~9m52s silent gap that is essentially the entire remaining wall time. This is a hang, not legitimate slowness. It occurs at .gitlab/test_python.sh:63 (python3 -m pip install --break-system-packages --config-settings=compile-args=-j256 .). Because pyproject.toml (line 17) pins the build requirement torch==2.11.*, pip creates an isolated build env that does not inherit the image's pre-installed torch and must fetch the very large torch==2.11.* wheel from the index; that download/resolution stalled (network/index hang). The parallel non-CUDA13 variant (stage 261) passed, so this is specific to the new pytorch/CUDA13.3 base image path.

Implicated commit: No single code commit broke it; the pinned build requirement torch==2.11.* in pyproject.toml (last touched by 5c662d9 "Wheel license files (#1972)", ovidiusm) combined with the base-image switch in PR #1869. Ultimately the hang is environmental (index/network stall while fetching torch).

File: .gitlab/test_python.sh:63 (pip build-isolation invocation); pyproject.toml:17 (torch==2.11.* build requirement).

Suggested fix: Avoid pulling torch into the isolated build env during the wheel build. Either add --no-build-isolation to the pip install at test_python.sh:63 (relying on the meson/pybind11/torch already present in the base image), or drop torch==2.11.* from [build-system].requires if it is not actually needed at build time. Also add a --timeout/retry to pip so an index stall fails fast instead of consuming the whole wall clock. Do not simply raise the Jenkins time limit — the process was hung, not making progress.

Related: PR #1869 (Switch CI base image to pytorch + CUDA 13.3); PR #1972 (wheel/build-requires changes). No existing issue tracks this specific hang.

@nv-nmailhot
nv-nmailhot merged commit 7c9bf54 into ai-dynamo:release/1.4.0 Aug 3, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants