Skip to content

ci: build python bindings without pip build isolation - #2036

Merged
NirWolfer merged 2 commits into
ai-dynamo:mainfrom
NirWolfer:fix/pip-no-build-isolation
Aug 10, 2026
Merged

NirWolfer merged 2 commits into
ai-dynamo:mainfrom
NirWolfer:fix/pip-no-build-isolation

Conversation

@NirWolfer

@NirWolfer NirWolfer commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

pip provisions [build-system].requires into a fresh PEP 517 build environment on every run. The pinned torch==2.11.* can never be satisfied by the torch already in the CI images (an NVIDIA nightly, e.g. 2.13.0a0+8145d630e8.nv26.6), so pip re-downloaded torch plus its CUDA dependency closure - several GB - on each invocation.

That step normally completes in ~2 min, but stalls for 10-30 min when the index or network degrades, tripping the stage timeout and aborting with exit 143. It caused 10 CI failures between Jul 1 and Aug 3 across nixl-ci-gpu, nixl-ci-non-gpu and nixl-ci-dl-gpu.

CI does not need an isolated build environment, so this builds with --no-build-isolation and provisions the build dependencies explicitly. [build-system].requires is left untouched, so the isolated-build contract for consumers building from source - including nixl_ep's torch requirement - is unchanged.

Changes

.gitlab/test_python.sh only:

  • add --no-build-isolation to the pip install . invocation
  • install the build dependencies with --upgrade, in a single branch

Why --upgrade matters

Without it pip treats an already-present version as satisfying the requirement and leaves it in place. The images ship meson 1.3.2, and that is what the failing runs actually used:

Version: 1.3.2
meson setup ... --native-file=.../meson-python-native-file.ini
meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.so'

contrib/Dockerfile already installs these same packages with --upgrade, so this brings the CI script in line with it.

The two branches previously diverged - the venv branch installed the full set while the system-python branch installed only tomlkit and relied on the image for the rest. Both now install the same set, so the build no longer depends on image contents.

Verification

bash -n passes. The stall is environment-dependent and not locally reproducible, so confirmation is a green CI run - specifically that the isolated build environment is no longer provisioned, and that with an upgraded meson the wheel builds without the {prefix}/lib mapping error.

Summary by CodeRabbit

  • Build and Installation
    • Build dependencies are now fully installed and upgraded consistently.
    • Package builds use preinstalled build dependencies for more predictable results.

@NirWolfer
NirWolfer requested a review from a team as a code owner August 3, 2026 15:53
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

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

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

🚀

@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The Python test script now installs and upgrades the complete build dependency set. Package installation uses --no-build-isolation while retaining parallel compilation.

Changes

Python build

Layer / File(s) Summary
Build dependency setup and package installation
.gitlab/test_python.sh
The script unconditionally upgrades the full build dependency set and installs the package with --no-build-isolation.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Suggested reviewers: mkhazraee, dpressle

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
Title check ✅ Passed The title clearly describes the primary CI change: building Python bindings without pip build isolation.
Description check ✅ Passed The description explains what changed, why it changed, how it works, and how it will be verified.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit 44f8644f

TL;DR: The "Run DL Python tests" stage failed at pip install (not a hang — build reached 159/159 then errored). PR #2036's --no-build-isolation flag makes pip use the container's older meson-python (1.3.2), which can't map the prometheus-cpp subproject's {prefix}/lib/libcore.so into the wheel — fix by preventing the CMake subproject shared libs from being installed/packaged or by installing pinned build deps before building non-isolated.

Full analysis

Summary: python3 -m pip install --no-build-isolation . fails during metadata generation with meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.so' in both the ucx-master and ucx-v1.22.x DL Python test stages (nodes 272 and 284).

Root cause: PR #2036 adds --no-build-isolation to the pip build. Without isolation, pip uses the container's installed meson-python/meson (1.3.2) instead of the versions pinned in pyproject.toml's [build-system].requires. The prometheus-cpp CMake subproject (built with BUILD_SHARED_LIBS=ON and CMake install() rules) installs libcore.so/libpull.so into a bare {prefix}/lib, and this meson-python version cannot map that path into a wheel directory, aborting metadata generation. The C++ build itself completed successfully (159/159 targets), so this is purely a packaging/build-frontend regression from the flag change, not a hang or a code bug.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #2036, "ci: build python bindings without pip build isolation"). The committed .gitlab/test_python.sh in the base repo does not contain --no-build-isolation; the running log does, confirming the PR introduces it.

File: .gitlab/test_python.sh:63 (the pip install invocation gaining --no-build-isolation); the packaging failure surfaces via src/plugins/telemetry/prometheus/meson.build:44-59 (prometheus-cpp CMake subproject shared libs landing in {prefix}/lib).

Suggested fix: Before building with --no-build-isolation, install the pinned build backend into the environment first (e.g. $pip3 install --break-system-packages -r the [build-system].requires, or explicitly meson-python meson ninja pybind11) so the same meson-python used under isolation is present — this is what the isolated build previously guaranteed. Alternatively/additionally, stop the prometheus-cpp subproject libraries from being packaged into the wheel: build them as a static/install: false dependency, or set a proper install_dir (arch-specific lib/<triple>) so meson-python can map them. Quickest path: add the build-backend install step for the non-isolation case in test_python.sh.

Related: PR #2036 (#2036); prometheus plugin origin PR #1091, cmake build fix PR #1196.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 4cbccaf3-8c53-463c-968d-5b635da41978 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 44f8644f

TL;DR: The "Run Python tests" stages fail because pip install . (meson-python) aborts with Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.so' — the prometheus-cpp CMake subproject's shared libs (libcore.so/libpull.so) are being installed into a bare {prefix}/lib path that meson-python can't map into a wheel. Fix by either not installing those subproject .sos (link them into the plugin) or installing them under a wheel-mappable directory.

Full analysis

Summary: Python wheel build (meson-python metadata generation) fails after a fully successful compile; C++ build/tests pass, only pip install . fails.

Root cause: meson-python cannot map an install target at {prefix}/lib/libcore.so (the prometheus-cpp subproject shared library, built with BUILD_SHARED_LIBS=ON) to any wheel directory. Plain meson install (used by the CPP Docker/test stages) tolerates this path, but the pip install ./meson-python path in .gitlab/test_python.sh is stricter and errors out. This is a packaging/install-path regression, not a timeout or test-logic failure (both stages fail deterministically at the same step within ~70s).

Implicated commit: unknown — triggered by PR #2036 (commit [REDACTED:Hex High Entropy String]); the diff was not retrievable with available tools. The install rule creating {prefix}/lib/libcore.so / {prefix}/lib/libpull.so is the culprit.

File: src/plugins/telemetry/prometheus/meson.build (prometheus-cpp CMake subproject integration, BUILD_SHARED_LIBS=ON at lines 29/36–41) and the meson-python config in pyproject.toml.

Suggested fix: Prevent the prometheus-cpp subproject .sos from getting a bare {prefix}/lib install rule in the wheel build. Options: (1) build prometheus-cpp with BUILD_SHARED_LIBS=OFF so libcore/libpull are statically linked into libtelemetry_exporter_prometheus.so; (2) if they must be shared, set their install_dir to the wheel-mappable plugin dir (plugin_install_dir, i.e. lib/<arch>/plugins) rather than {prefix}/lib; or (3) add a [tool.meson-python.args] / exclusion in pyproject.toml so meson-python excludes lib/libcore.so and lib/libpull.so from the wheel. Reproduce locally with python3 -m pip install --no-build-isolation . to confirm before merging PR #2036.

Related: none found (issue/PR search returned no matches for the error signature).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id f75fad2c-eca4-4900-86f4-735410ff07a1 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit 44f8644f

TL;DR: The "Test Python" stage fails because pip install . (now run with --no-build-isolation per PR #2036) triggers meson-python to package the build, and the prometheus-cpp CMake subproject installs libcore.so/libpull.so into a bare {prefix}/lib/ that meson-python can't map into a wheel. Fix: stop installing the prometheus-cpp shared libs into the meson prefix (bundle them into the plugin dir / arch libdir or mark them non-installed), or exclude that path from the wheel.

Full analysis

Summary: python3 -m pip install . fails during metadata/wheel generation with meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.so' on all images that build the Prometheus telemetry exporter plugin.

Root cause: meson-python requires every file with install: true to map to a known wheel scheme directory (platlib/purelib, or an arch-qualified libdir like lib/x86_64-linux-gnu). The prometheus-cpp CMake subproject is configured with BUILD_SHARED_LIBS=ON and its default CMake install rules place libcore.so/libpull.so directly in {prefix}/lib/, an unqualified path meson-python cannot map. Under the previous flow this wasn't fatal, but PR #2036 changed the Python build step, so meson-python now enforces the wheel mapping and errors out. Images that don't build the Prometheus plugin (the plain 13.0.1 builds) pass.

Implicated commit: PR #2036 "ci: build python bindings without pip build isolation" (head commit [REDACTED:Hex High Entropy String]). The problematic subproject install originates in src/plugins/telemetry/prometheus/meson.build (last touched by [REDACTED:Hex High Entropy String] / #1914, e-eygin; originally [REDACTED:Hex High Entropy String] / #1091).

File: src/plugins/telemetry/prometheus/meson.build:36 (CMake subproject with BUILD_SHARED_LIBS: ON whose libcore.so/libpull.so install to {prefix}/lib/); error surfaces at meson-python wheel packaging.

Suggested fix: Prevent the prometheus-cpp shared libraries from landing in an unmapped {prefix}/lib/ when packaged as a wheel. Options: (a) build prometheus-cpp as static (BUILD_SHARED_LIBS: OFF) so no .sos are installed and the symbols are linked into the plugin; or (b) keep it shared but ensure those libs are installed into the arch-qualified plugin/lib directory (e.g. under plugin_install_dir / lib/<arch>-linux-gnu) so meson-python can map them; or (c) in pyproject.toml add a meson-python override/exclude for {prefix}/lib/libcore.so and libpull.so. Given they are dependencies of the plugin only, building prometheus-cpp static is the cleanest fix.

Related: PR #2036 (#2036); prometheus plugin origin PR #1091; histogram change #1914.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id d526fbe2-1794-4e10-bb1e-872128d34f71 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 44f8644f

TL;DR: The build compiled and pushed the Docker image successfully; the failure is in the "Allocate DL EP Environment" stage where salloc on the GB200 SLURM cluster could not obtain a node and timed out after the 1-hour --immediate=3600 window. This is a cluster resource-availability/queue issue, not a code defect.

Full analysis

Summary: Stage 252 "Allocate DL EP Environment" failed because a SLURM salloc request for a gb200nvl72_cx8 node never got scheduled and timed out.

Root cause: The job was submitted at 16:53:07 (salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 ... --account=blackwell). SLURM accepted it (Pending job allocation 1736640, queued and waiting for resources), but no node freed up within the --immediate=3600 (3600 s = 1 h) window. At 17:53:16 — exactly ~60 min later, with continuous "queued/waiting" state and no application hang — salloc exited with error: Unable to allocate resources: Connection timed out, giving exit code 1. This is a resource/queue-contention issue on the blackwell/gb200nvl72_cx8 partition, not a hang in nixl code. (Stage 177 shows the same tail because it shares the allocation step; its build, ninja compile, install, and podman push all succeeded.)

Implicated commit: none — commit 44f8644 did not cause this; the failure is in CI infrastructure/cluster capacity.

File: Jenkins pipeline SLURM allocation step (slurm.allocation in the swx-jenkins-lib shared library); no repo source file involved.

Suggested fix: Retry the build — this is a transient cluster-capacity failure. To harden the pipeline: (1) add automatic retry/backoff around the salloc allocation step, and/or (2) raise immediateTimeout (currently 3600 s) or switch from --immediate to a bounded queued wait so transient contention on the gb200nvl72_cx8 partition doesn't fail the whole build. Also verify the blackwell account has sufficient GB200 quota/priority. Do not treat this as a code regression.

Related: none

@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

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

TL;DR: The wheel build compiles fully but meson-python aborts packaging with Could not map installation path to an equivalent wheel directory: '{libdir_static}/libcore.a' — the prometheus-cpp CMake subproject is built as static libs (libcore.a/libpull.a) that are marked install: true, and meson-python cannot place {libdir_static} artifacts in a wheel. Stop installing those static libs (or build prometheus-cpp shared) so nothing lands in {libdir_static}.

Full analysis

Summary: Build Wheel stage fails for all three parallel jobs (manylinux/x86_64, build_helper_vllm, build_helper_sglang) during meson-python wheel assembly after a successful 330/330 ninja build.

Root cause: meson-python errors: Could not map installation path to an equivalent wheel directory: '{libdir_static}/libcore.a'. The prometheus-cpp subproject is being built as static libraries (the CMake trace shows -DBUILD_SHARED_LIBS=OFF and ninja logs Linking static target subprojects/prometheus-cpp/libcore.a / libpull.a), and these .a files are installed with the {libdir_static} install tag. meson-python has no wheel directory mapping for {libdir_static}, so it fails packaging even though compilation succeeded. A plain meson install to /usr/local/nixl succeeds (seen earlier in the log), which is why this only surfaces on the wheel-build path introduced/exercised by PR #2036 ("build python bindings without pip build isolation").

Implicated commit: Configuration mismatch, not a single code line. Relevant: src/plugins/telemetry/prometheus/meson.build ([REDACTED:Hex High Entropy String] / #1914 e-eygin) declares BUILD_SHARED_LIBS: 'ON' yet the effective build produced static libs; and PR #2036 (c17f15d) which switched the wheel build to the no-isolation meson-python path that enforces wheel-directory mapping. Author of trigger PR #2036: unknown from logs.

File: src/plugins/telemetry/prometheus/meson.build:36-42 (prometheus-cpp subproject deps that get installed) and the CMake defines producing libcore.a/libpull.a.

Suggested fix: Ensure the prometheus-cpp static archives are never install: true in the meson-python wheel build. Concretely: (a) force the subproject to actually build shared (the CMake trace shows BUILD_SHARED_LIBS=OFF despite meson.build asking ON — reconcile this so libcore.so/libpull.so are produced), or (b) link libcore.a/libpull.a statically into libtelemetry_exporter_prometheus.so and mark them non-installed, or (c) add a meson-python tool.meson-python install-path override / exclude so {libdir_static} artifacts are dropped from the wheel. Verify no other .a (abseil, prometheus) carries install: true.

Related: PR #2036 (#2036); prometheus meson history #1914, #1091.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id e60d0f58-dfe3-49fb-8299-c15eb42c14c8 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-container-pr · commit c17f15d2

TL;DR: All "Build image" stages failed because uv pip install . (a meson-python wheel build newly exercised by PR #2036's --no-build-isolation change) errored with meson-python: error: Could not map installation path to an equivalent wheel directory: '{libdir_static}/libcore.a' — the prometheus-cpp CMake subproject produced static libs (libcore.a/libpull.a) that meson-python cannot place in a wheel. Fix: stop installing the prometheus-cpp static libs into the wheel (mark them install: false / build prometheus as shared in the meson-python path, or exclude {libdir_static} from the wheel).

Full analysis

Summary: The Dockerfile's final uv pip install --system [--no-build-isolation] . step failed while meson-python built the nixl wheel, because prometheus-cpp static archives are being installed to a location meson-python can't map into a wheel.

Root cause: In the meson-python wheel build the prometheus-cpp CMake subproject is configured with -DBUILD_SHARED_LIBS=OFF (visible in the log), so it emits static libraries libcore.a and libpull.a with an install rule whose destination resolves to meson's {libdir_static} placeholder. meson-python cannot map {libdir_static}/libcore.a to a wheel directory and aborts (Could not map installation path to an equivalent wheel directory: '{libdir_static}/libcore.a'). This install-into-wheel path was newly exercised by PR #2036 ("ci: build python bindings without pip build isolation"), which switched the container's Python-binding install to build the wheel directly from source via meson-python instead of the previously isolated/installed path — so the pre-existing static-lib install rule now breaks the build. (Note the non-wheel ninja install earlier in the same log succeeds because it isn't subject to meson-python's wheel-directory mapping.)

Implicated commit: PR #2036 (build c17f15d…) — "ci: build python bindings without pip build isolation." Author not shown in the fetched logs.

File: src/plugins/telemetry/prometheus/meson.build (prometheus-cpp static libs libcore.a/libpull.a installed) combined with the Dockerfile step RUN CUDA_MAJOR=… && ./contrib/tomlutil.py … && uv pip install --system [--no-build-isolation] . …. Failure emitted at meson-python wheel-mapping of {libdir_static}/libcore.a.

Suggested fix: Prevent the prometheus-cpp static archives from being installed into the wheel. Concretely, either:

  • ensure the prometheus-cpp subproject builds as shared (it already sets BUILD_SHARED_LIBS: 'ON' in src/plugins/telemetry/prometheus/meson.build, but the wheel build is getting OFF — force it consistently and confirm meson-python isn't overriding it), or
  • mark the prometheus static libraries install: false in the wheel build so they aren't emitted to {libdir_static} (they only need to be linked into libtelemetry_exporter_prometheus.so, not shipped), or
  • add a meson-python wheel exclusion for {libdir_static} in [tool.meson-python.args].

Since only the wheel path breaks, gating the static-lib install on whether meson-python is driving the build (or simply not installing prometheus .a files) is the safest fix.

Related: PR #2036#2036

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit c17f15d2

TL;DR: The "Run DL Python tests" stage failed because pip install --no-build-isolation . triggered meson-python to abort with Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.a'. The prometheus-cpp CMake subproject builds/installs static archives (libcore.a/libpull.a) into {prefix}/lib, which meson-python cannot place in a wheel; fix by preventing those static libs from being installed (or forcing shared libs to actually build).

Full analysis

Summary: pip install of the nixl wheel fails during metadata/wheel generation with meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.a' in the "Run DL Python tests" stage (node 265).

Root cause: PR #2036 makes the CI install the Python bindings with --no-build-isolation (log line: pip3 install ... --no-build-isolation --config-settings=compile-args=-j144 .). Without build isolation, meson-python performs its wheel install-path mapping against the full meson install set and encounters the prometheus-cpp subproject's static libraries. The CMake subproject was configured with -DBUILD_SHARED_LIBS=OFF (visible in the CMake invocation line, despite meson.build requesting 'BUILD_SHARED_LIBS': 'ON' — meson's cmake module didn't propagate it), so it produced libcore.a/libpull.a (confirmed: [79/157] Linking static target subprojects/prometheus-cpp/libpull.a, [88/157] Linking static target .../libcore.a) and marked them installable to {prefix}/lib. meson-python cannot map a .a file into a wheel directory, so it aborts with metadata-generation-failed. The C++ compile of all 157 targets succeeded; this is purely a packaging/install-mapping failure, not a hang or timeout.

Implicated commit: [REDACTED:Hex High Entropy String] (PR #2036, "ci: build python bindings without pip build isolation"). The underlying installable-static-lib behavior comes from src/plugins/telemetry/prometheus/meson.build (prometheus-cpp CMake subproject), last touched by e-eygin (#1919/#1914) with the original added in #1091 (alexanderbilk).

File: .gitlab/test_python.sh:63 (the --no-build-isolation install) and src/plugins/telemetry/prometheus/meson.build:22-42 (CMake subproject producing installable libcore.a/libpull.a).

Suggested fix: Prevent the prometheus-cpp static archives from being included in the meson install/wheel set. Concrete options:

  • In src/plugins/telemetry/prometheus/meson.build, consume the prometheus core/pull targets without installing them — e.g. link them statically into the plugin and ensure the CMake subproject targets are not marked install: true, or pass CMake defines that disable installation of the archives (e.g. set install to the plugin dir only, not {prefix}/lib).
  • Ensure BUILD_SHARED_LIBS=ON actually propagates to the CMake subproject (the log shows it was overridden to OFF), so prometheus produces shared libs that meson-python can map — or better, keep them static but non-installed.
  • As a targeted workaround for ci: build python bindings without pip build isolation #2036, exclude *.a from the wheel via meson-python's tool.meson-python exclusion settings in pyproject.toml, or add -Dinstall_headers=false-style install gating for subproject archives.

Related: PR #2036 (#2036); prometheus plugin origin PR #1091, build fix #1196.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id f9184445-9cd1-4f0c-8948-dd0b3aec8f74 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit c17f15d2

TL;DR: All 6 "Test Python" stages failed deterministically with meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.a'; PR #2036 switched python-binding installs to --no-build-isolation, causing meson-python to build the wheel in-tree and choke on the prometheus-cpp subproject's installed static libs. Fix: mark the prometheus-cpp static libraries (libcore.a, libpull.a, libcivetweb.a) as install: false so they aren't part of the wheel install manifest.

Full analysis

Summary: The "Test Python" pipeline stage fails during pip install --no-build-isolation . because meson-python cannot map the prometheus-cpp {prefix}/lib/libcore.a install path into a wheel directory.

Root cause: The prometheus-cpp subproject builds static libraries (libcore.a, libpull.a, libcivetweb.a) that are declared for installation to {prefix}/lib/. When PR #2036 changed the CI/build to install the Python bindings with --no-build-isolation (meson-python building the wheel directly), meson-python inspects the meson install plan and fails on any installed file it cannot place inside the wheel layout — a .a under {prefix}/lib has no valid wheel target, so it aborts with metadata-generation-failed. The C++ build completes all 156 targets successfully; this is strictly a wheel-packaging/install-manifest error, not a compile or runtime failure, and not a timeout/hang.

Implicated commit: PR #2036 "ci: build python bindings without pip build isolation" (head commit [REDACTED:Hex High Entropy String]). The offending install declaration lives in the vendored prometheus-cpp subproject's generated meson build.

File: subprojects/prometheus-cpp/meson.build (the install-enabled static-library targets libcore.a/libpull.a/libcivetweb.a); triggered via the pip invocation in the Test Python stage script (pip install --break-system-packages --no-build-isolation .).

Suggested fix: Ensure the prometheus-cpp static libraries are not part of the install manifest that meson-python consumes. Concretely, set install: false on the prometheus-cpp static_library() targets (or exclude {prefix}/lib/*.a from the wheel), since these are statically linked into the exporter plugin and don't belong in the Python wheel. Alternatively, configure the subproject with -Dinstall=false/default_library=static without install, or add a meson-python [tool.meson-python] mapping/exclude for {prefix}/lib/*.a. This lets the --no-build-isolation wheel build succeed. (The separate ucx_tracing_no_pt/TestTransferTracing.NvtxNotifications/0 failure in Test CPP stage 427 is an unrelated flaky notification-timeout test and should be triaged separately.)

Related: PR #2036 (#2036)

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id b84a941d-af51-442e-9829-5a854d494970 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit c17f15d2

TL;DR: The "Run Python tests" stages failed during pip install . because meson-python aborted with Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.a'; PR #2036 built the prometheus-cpp subproject with BUILD_SHARED_LIBS=OFF, so its static libcore.a/libpull.a archives got an install rule that meson-python can't place in a wheel. Fix: build prometheus-cpp as shared (BUILD_SHARED_LIBS=ON) or exclude the static archives from installation.

Full analysis

Summary: Both Run Python tests stages (ucx-master #281 and ucx-v1.22.x #261) failed at the pip install . metadata/wheel step, not in any actual test.

Root cause: meson-python failed with meson-python: error: Could not map installation path to an equivalent wheel directory: '{prefix}/lib/libcore.a'. The prometheus-cpp CMake subproject was configured with -DBUILD_SHARED_LIBS=OFF (visible in the build log's CMake invocation line), so it produced static archives libcore.a and libpull.a with an install target under {prefix}/lib. meson-python cannot map a static .a install path into a wheel directory layout, so it aborts wheel generation. The C++ compile itself succeeded fully (targets 1–157 built) — this is a deterministic packaging error, not a hang or timeout.

Implicated commit: PR #2036, head commit [REDACTED:Hex High Entropy String]. The committed src/plugins/telemetry/prometheus/meson.build on the base branch specifies 'BUILD_SHARED_LIBS': 'ON', but the build for this PR ran CMake with -DBUILD_SHARED_LIBS=OFF, indicating this PR changed that setting (author of PR #2036).

File: src/plugins/telemetry/prometheus/meson.build:29 (the BUILD_SHARED_LIBS cmake define passed to the prometheus-cpp subproject).

Suggested fix: Keep prometheus-cpp built as shared libraries by setting 'BUILD_SHARED_LIBS': 'ON' in the cmake_opts.add_cmake_defines(...) block, matching the base branch. If static linkage of prometheus-cpp is intentionally required, then the static libcore.a/libpull.a targets must be prevented from being installed (link them privately into libtelemetry_exporter_prometheus.so and mark the subproject deps as non-installed / install: false) so meson-python never sees a {prefix}/lib/*.a install path.

Related: none found (issue/PR search for the meson-python wheel-mapping error returned no matches).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 8eb0c7cf-ce31-46ae-8384-113d972fcc86 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit c17f15d2

TL;DR: The build compiled cleanly; the job failed in the "Allocate DL EP Environment" stage because a Slurm salloc on the gb200nvl72_cx8 partition waited its full 1-hour --immediate=3600 window for a compute node, none became available, and it exited with "Unable to allocate resources: Connection timed out." This is a cluster-capacity/infra issue, not a PR defect — retry when the partition has free nodes.

Full analysis

Summary: DL EP GPU test failed at cluster resource allocation, not in build or tests.

Root cause: In stage 200 (Allocate DL EP Environment), the SSH salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 ... --account=blackwell was issued at 08:42:18 and the job (1743749) sat "queued and waiting for resources." After exactly ~3600s (the --immediate budget) it returned salloc: error: Unable to allocate resources: Connection timed out at 09:42:27 and the shell step exited code 1. The gb200nvl72_cx8 GB200 partition had no free node within the immediate window. This is genuine waiting (not a hung process): the single large log gap is salloc legitimately blocking on the Slurm scheduler queue, which is exactly what --immediate governs. Stage 125's FAILURE is collateral — the parallel pipeline was stopped after its sibling; the v1.22.x build itself completed successfully in stage 162.

Implicated commit: unknown — not caused by commit c17f15d/PR #2036; the failure is external Slurm capacity.

File: Jenkins pipeline Slurm allocation step (slurm.allocation / salloc invocation, job nixl-ci-dl-gpu-ep-v1.22.x-598) — not a repo source file.

Suggested fix: Re-run the job when the gb200nvl72_cx8 partition has capacity. If this recurs, (1) raise immediateTimeout/--immediate or drop --immediate so the job queues normally, (2) add automatic retry/backoff around the salloc step, and (3) alert the cluster team about GB200 partition availability under the blackwell account. Do not treat this as a code change to NIXL.

Related: none

@NirWolfer
NirWolfer force-pushed the fix/pip-no-build-isolation branch from 11ce17f to 5b5c514 Compare August 4, 2026 11:19
@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@NirWolfer NirWolfer changed the title ci: build python bindings without pip build isolation build: drop the torch build requirement from [build-system].requires Aug 4, 2026

@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: 1

🤖 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 `@pyproject.toml`:
- Line 17: Update the pyproject.toml build-system requirements to provide a
compatible Torch dependency for isolated builds when build_nixl_ep is enabled,
or explicitly reject isolated EP builds with a clear configuration check.
Preserve the existing default build behavior and do not rely on the
--no-build-isolation wheel path to satisfy the isolated PEP 517 contract.
🪄 Autofix

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: 4fc578b9-b993-4a1f-b361-86b4f18ce6cc

📥 Commits

Reviewing files that changed from the base of the PR and between 11ce17f and 5b5c514.

📒 Files selected for processing (1)
  • pyproject.toml

Comment thread pyproject.toml Outdated
@NirWolfer
NirWolfer requested a review from dpressle August 4, 2026 12:38

@ovidiusm ovidiusm 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.

This is incorrect, please do not merge

@ovidiusm

ovidiusm commented Aug 4, 2026

Copy link
Copy Markdown
Contributor
# Install build dependencies
    if [ -n "$VIRTUAL_ENV" ] ; then
        # Install full build dependencies in venv
        $pip3 install --break-system-packages meson meson-python pybind11 patchelf pyYAML click tabulate auditwheel tomlkit 'setuptools>=80.9.0'
    else
        # Install minimal build dependencies in system python
        $pip3 install --break-system-packages tomlkit
    fi

To make the build work without build isolation in CI, you need to install manually the build deps so modify $pip3 install --break-system-packages tomlkit

I don't remember exactly why this command is different from the one above, but keep in mind that we need to make both CI pass this and the verification team scripts pass the run @Bohatchuk

@NirWolfer
NirWolfer force-pushed the fix/pip-no-build-isolation branch from 5b5c514 to 533d770 Compare August 5, 2026 07:56
@pull-request-size pull-request-size Bot added size/S and removed size/XS labels Aug 5, 2026
@svc-nixl

svc-nixl commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 10ccfaa8

TL;DR: The "Run Nixlbench tests" stage crashed with SIGSEGV (exit 139) in the UCCL backend during the UCCL WRITE VRAM→VRAM benchmark teardown; this is the known-flaky UCCL nixlbench problem (issue #1999) that commit #2000 only partially disabled. Fix: also skip/gate the ASIO UCCL loop in .gitlab/test_nixlbench.sh until #1999 is resolved.

Full analysis

Summary: Jenkins stage 427 "Run Nixlbench tests" (ucx-master image variant) failed when nixlbench --backend UCCL --op_type WRITE --initiator_seg_type VRAM --target_seg_type VRAM exited with code 139 (segfault) during engine destruction.

Root cause: The UCCL backend crashes on teardown (the benchmark row printed and both processes logged "Destroying Engine…/Engine destroyed", then task 0 segfaulted — a race/crash in UCCL engine cleanup, not a hang or timeout). This is the known-flaky UCCL nixlbench issue #1999. Commit #2000 attempted to mitigate it but only commented out the ETCD-based UCCL loop (test_nixlbench.sh lines 122-132); the ASIO-based UCCL loop (lines 95-103) remained active and is what ran and crashed. The pairwise ucx-v1.22.x variant (stage 351) passed, confirming the failure is a nondeterministic UCCL crash. (The extensive pin_thread_to_numa/selectNICs ERROR/WARN lines are benign noise from the CI node's NUMA topology, not the cause.)

Implicated commit: 7a244b9 "CI: Skip UCCL nixlbench tests (#2000)" by ovidiusm — incomplete skip. Underlying crash is in the UCCL backend introduced/optimized in [REDACTED:Hex High Entropy String] (#1271) / [REDACTED:Hex High Entropy String] (#895) by Pravein Govindan Kannan.

File: .gitlab/test_nixlbench.sh:95-103 (the still-active ASIO UCCL loop)

Suggested fix: Comment out or gate the ASIO UCCL loop (lines 95-103) the same way the ETCD UCCL loop (lines 122-132) was disabled, referencing issue #1999, so no UCCL nixlbench transfer tests run until the segfault is fixed. Longer term, root-cause the UCCL engine teardown crash in the UCCL plugin (destroy/engine cleanup path). Note this is a code crash, not a wall-clock issue — do not raise any timeout.

Related: Issue #1999 (UCCL nixlbench test hangs); PR #2000 (partial skip); UCCL PRs #1271, #895, #1428.

Side note: stage 176 build_helper/x86_64/ucx-master/1 is also marked FAILURE but was retried successfully (stage 212 build_helper/x86_64/ucx-master/1 SUCCEEDED), so the pipeline's determinative failure is the Nixlbench UCCL segfault above.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id cb1c7073-6d90-4193-9530-a2a3a05080c7 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit 10ccfaa8

TL;DR: The "Run Python tests" stages failed instantly with a containerd.sock: no such file or directory streaming error from scctl/pyxis — a Jenkins-agent/container-runtime infrastructure fault, not a code or test regression. Retry the build; if it persists, the CI node's containerd/Kubernetes runtime needs repair.

Full analysis

Summary: Both parallel "Run Python tests" stages (node 267 master, node 270 v1.22.x) of nixl-ci-gpu #3068 failed before running any test.

Root cause: scctl --raw-errors client connect -- srun ... could not stream the command into the container: unable to upgrade connection: ... dial unix /var/run/containerd/containerd.sock: connect: no such file or directory. The containerd socket on the Jenkins/Kubernetes executor was missing/unavailable, so the srun session could not be established. This is an environmental failure of the CI runner — evidenced by (a) the immediate ~2s failure with no application output, (b) the identical error at the same instant in two independent parallel branches, and (c) the C++ tests on the same allocation having completed successfully just before. The PR commit 10ccfaa is not implicated; .gitlab/test_python.sh never executed.

Implicated commit: none — infrastructure failure, not code. (PR commit 10ccfaa is not responsible.)

File: N/A (failure originates in the Jenkins/pyxis runtime layer, not repo source). Invocation line: .gitlab/test_python.sh /opt/nixl via scctl client connect.

Suggested fix: Re-run the build — this is almost certainly a transient runner fault. If it recurs: investigate the CI executor node (swx-k8s-mec04 / target mizu02) for a dead or restarting containerd service (/var/run/containerd/containerd.sock missing), verify the Kubernetes kubelet/containerd health, and consider adding a retry/health-check around the scctl client connect step in the pipeline library so a missing containerd socket triggers an automatic retry or a clear "infrastructure error" rather than a stage FAILURE that looks like a test failure.

Related: none found.

@svc-nixl

svc-nixl commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 10ccfaa8

TL;DR: All three parallel "Build Wheel" stages were killed by a pipeline timeout (exit 143) because the docker build FROM step hung for ~4.5 minutes while pulling the nixl-wheel-base-manylinux_2_28:[REDACTED:Hex High Entropy String] base image from Artifactory — a registry/network stall, not a code bug. Retry the build and, if it recurs, add pull retry/timeout logic and investigate Artifactory connectivity from the CI nodes.

Full analysis

Summary: nixl-ci-build-wheel #1291 failed when all three Build Wheel stages (x86_64, aarch64-vllm, aarch64-sglang) were SIGTERM'd at the same instant (~15:54:36Z) after the wheel-base image pull stalled.

Root cause: In every failing stage the last application output is Copying blob … during [3/3] STEP 1/24: FROM artifactory.nvidia.com/.../nixl-wheel-base-manylinux_2_28:[REDACTED:Hex High Entropy String]. Output stops at ~15:50:14 (x86_64) / 15:50:13 (aarch64) and there is no further activity until the process is killed at 15:54:36 — a ~4m22s gap of total silence that is most of the stage's runtime. This is a hang, not slow progress: the podman/docker pull of the wheel-base image from Artifactory stalled mid-transfer. The simultaneous kill of all three stages indicates a pipeline/stage wall-clock timeout firing on the stuck pulls. The base image itself is valid (the upstream "Setup Image" stages that produced tag 31609ceb all succeeded), so the fault is in the registry/network transfer, not the image content or the build scripts.

Implicated commit: none — this is an infrastructure/registry hang, not a source regression. (contrib/build-container.sh last meaningfully changed in [REDACTED:Hex High Entropy String], Alexey Rivkin, but is unrelated to the pull stall.)

File: contrib/build-container.sh:425 (the docker build whose FROM pulls the wheel-base image) — the stall is in the registry pull invoked here, not in the script logic.

Suggested fix: Retry the build first — a transient Artifactory/network stall is the most likely cause. To make this class of failure non-fatal and diagnosable going forward: (1) pre-pull the wheel-base image with an explicit timeout and bounded retries (e.g. wrap the pull in timeout 300 ... || retry) before the docker build, so a stalled pull fails fast with a clear error instead of consuming the whole stage budget; (2) have CI check Artifactory reachability/throughput from the build nodes around the failure window. Do not simply raise the stage time limit — the process was hung, not legitimately slow.

Related: none found.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 67928f63-f618-40fb-a10f-85a8d189de6e in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-build-wheel · commit 10ccfaa8

TL;DR: The build_helper_vllm aarch64 image build failed because apt update fetched from the unreliable public ports.ubuntu.com mirror, which returned a corrupt package index ("File has unexpected size … Mirror sync in progress"). The fix is to build against a tree that includes the internal-mirror switch (commit 029a854) so apt no longer uses ports.ubuntu.com.

Full analysis

Summary: Stage Setup Image aarch64/build_helper_vllm/1 failed at docker build STEP 12/19 (apt update) with exit status 100.

Root cause: The apt update in the Dockerfile hit the public Ubuntu ports mirror and got a mismatched index: E: Failed to fetch http://ports.ubuntu.com/ubuntu-ports/dists/noble-updates/main/binary-arm64/Packages.gz File has unexpected size (1508842 != 1509181). Mirror sync in progress? — a transient/corrupt public-mirror sync, which is exactly the flakiness the internal-mirror change was meant to eliminate. Notably, the current tip of Dockerfile.build_helper already rewrites apt sources to the internal urm.nvidia.com/artifactory/ubuntu-public mirror (lines 27–37), but this build was still pulling from ports.ubuntu.com, indicating PR #2036's base does not include commit 029a854 (authored the same day). This is an infrastructure/mirror problem, not a hang and not a defect in the PR's own code.

Implicated commit: [REDACTED:Hex High Entropy String] — Alexey Rivkin, "CI: Switch to the NVIDIA internal Ubuntu mirror (#1961)" (the fix that should prevent this). The failure itself is external/environmental, not caused by commit 10ccfaa.

File: .ci/dockerfiles/Dockerfile.build_helper:39 (the RUN apt update && apt install … step that failed); mitigation lives at lines 27–37.

Suggested fix: Rebase PR #2036 onto a main that includes commit 029a854 so the internal urm.nvidia.com mirror is used instead of ports.ubuntu.com. If the branch already contains it, ensure the sources-rewrite RUN (lines 27–37) executes before the failing apt update and that no later step re-adds the public mirror. As an immediate unblock, simply re-run the build — the ports.ubuntu.com "Mirror sync in progress" error is transient.

Related: PR #1961 (internal-mirror switch); PR #2036 (this build).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 0c8e4510-53ac-493a-84ab-29690c91010d in the triage console for the audit trail.

@NirWolfer
NirWolfer requested a review from ovidiusm August 6, 2026 07:36
Comment thread src/plugins/telemetry/prometheus/meson.build
Comment thread src/plugins/telemetry/prometheus/meson.build Outdated
Comment thread .gitlab/test_python.sh Outdated
pip provisions [build-system].requires into a fresh PEP 517 build env on
every run. The pinned torch==2.11.* can never be satisfied by the image's
torch (an NVIDIA nightly, e.g. 2.13.0a0), so pip re-downloaded torch plus
its CUDA dependency closure -- several GB -- on each invocation. That
normally takes ~2 min but stalls for 10-30 min when the index or network
degrades, tripping the stage timeout with exit 143; it caused 10 CI
failures between Jul 1 and Aug 3.

CI does not need an isolated build environment, so build with
--no-build-isolation and provision the build dependencies explicitly.
[build-system].requires is left untouched, so the isolated-build contract
for consumers building from source, including torch for nixl_ep, is
unchanged.

Install those dependencies with --upgrade. Without it pip treats an
already-present version as satisfying the requirement and leaves it in
place: the images ship meson 1.3.2, which is what the failing runs used.
The system-python branch also installed only tomlkit and relied on the
image for the rest, so both branches now install the same set.

Signed-off-by: NirWolfer <nwolfer@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@svc-nixl

svc-nixl commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-non-gpu · commit aff30faf

TL;DR: The "Test Python" stages failed because pip install --upgrade ... pyYAML ... tries to uninstall the OS/Debian-installed PyYAML 6.0.1, which has no RECORD file, and newer pip (on the Python 3.12 cuda12.9/pytorch images) treats this as a fatal uninstall-no-record-file error. Remove pyYAML from the upgrade list (or drop --upgrade/add --ignore-installed for PyYAML) in the PR's version of .gitlab/test_python.sh.

Full analysis

Summary: All "Test Python" stages on the Python-3.12 images (cuda12.9-ubuntu24.04 and pytorch26.06, both x86_64 and aarch64) failed during build-dependency installation; the ubuntu22.04/Python-3.10 images passed.

Root cause: python3 -m pip install --break-system-packages --upgrade meson meson-python pybind11 patchelf pyYAML click tabulate auditwheel tomlkit 'setuptools>=80.9.0' forces an upgrade of pyYAML. The images carry a Debian-packaged PyYAML 6.0.1 with no pip RECORD file. Older pip warned and continued; the newer pip on the Python 3.12 images errors out with error: uninstall-no-record-file / "Cannot uninstall PyYAML 6.0.1, RECORD file not found", aborting the step before any tests run. Note the failing command in the log includes --upgrade, which is what triggers the uninstall attempt.

Implicated commit: PR #2036 ("ci: build python bindings without pip build isolation") — the branch version of .gitlab/test_python.sh under test; author of PR #2036. (The repo's current head version of line 50 already omits --upgrade, but the tested branch still contains it.)

File: .gitlab/test_python.sh:50 (the pip3 install --break-system-packages --upgrade ... pyYAML ... line)

Suggested fix: In the PR's test_python.sh, stop force-upgrading the Debian-managed PyYAML. Simplest options: (a) drop --upgrade, or (b) drop pyYAML from that pip list since a compatible PyYAML is already present, or (c) add --ignore-installed pyYAML (equivalently --force-reinstall --no-deps) so pip doesn't try to uninstall the RECORD-less system package. The head-of-repo line 50 (no --upgrade) already reflects the correct form — align the PR branch to it.

Related: #2036

@svc-nixl

svc-nixl commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu · commit aff30faf

TL;DR: The "Run DL Python tests" stage failed at the build-dependency pip install step because PR #2036 added --upgrade/pyYAML to the system-Python install, and pip cannot upgrade the Debian-packaged PyYAML 6.0.1 (no RECORD file). Add --ignore-installed PyYAML (or drop --upgrade/pyYAML from the system install) to fix it.

Full analysis

Summary: pip install --break-system-packages --upgrade ... pyYAML ... failed with error: uninstall-no-record-file / "Cannot uninstall PyYAML 6.0.1", aborting the srun test script (exit code 1) before any tests ran.

Root cause: The base Docker image ships PyYAML 6.0.1 installed via Debian's apt (no pip RECORD file). PR #2036 changed the build-dependency install to run --upgrade including pyYAML in the system Python; because a newer PyYAML (6.0.3) is available, pip tries to uninstall the existing 6.0.1 to upgrade it and fails since it can't determine the Debian package's file list. With set -e, the script aborts. (This is a hard install error, not a hang — the log shows continuous activity right up to the failure, ~2.5s from install start to error.)

Implicated commit: PR #2036 head, [REDACTED:Hex High Entropy String] ("ci: build python bindings without pip build isolation"). The current main version of .gitlab/test_python.sh only installs pyYAML inside a venv and without --upgrade, so the offending change is introduced by this PR.

File: .gitlab/test_python.sh — the build-dependency install (the modified line corresponding to line ~50/53 on main); the failing command is python3 -m pip install --break-system-packages --upgrade meson meson-python pybind11 patchelf pyYAML click tabulate auditwheel tomlkit 'setuptools>=80.9.0'.

Suggested fix: In the system-Python install path, avoid forcing an upgrade over the apt-managed PyYAML. Options:

  • Add --ignore-installed PyYAML to the pip command, or
  • Drop pyYAML from the system install (build it inside a venv as main does), or
  • Remove the unconditional --upgrade so pip keeps the already-satisfied PyYAML 6.0.1.
    Verify against the diff introduced by PR ci: build python bindings without pip build isolation #2036 and re-run the DL Python tests stage.

Related: #2036

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 774f4ad2-b2fe-4d13-bdd2-4183022b0003 in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage AgentAWS NIXL Validation · commit dca0298d

TL;DR: The AWS Batch job failed during the "EFA Python Tests" setup because pip install --upgrade ... pyYAML ... tried to upgrade the Debian-managed PyYAML 6.0.1 (no RECORD file, uninstallable) to 6.0.3 and errored out under set -e; fix by not upgrading PyYAML via pip (or add --ignore-installed/drop it from the upgrade list). This is a CI environment issue, not a defect in PR #2036.

Full analysis

Summary: The "EFA Python Tests" step aborted when a pip install --break-system-packages --upgrade ... pyYAML ... command failed while trying to uninstall the system (Debian) PyYAML, causing the AWS Batch job to report FAILED and the GHA wait_for_status SUCCEEDED to return exit code 1.

Root cause: Log line ERROR: Cannot uninstall PyYAML 6.0.1, RECORD file not found. Hint: The package was installed by debian. pip needs to remove the existing PyYAML 6.0.1 (in /usr/lib/python3/dist-packages, installed by apt) to satisfy the requested upgrade to 6.0.3, but Debian-installed packages ship no RECORD file, so pip cannot uninstall them and exits non-zero. The setup script runs under set -e (bash -e {0}), so this aborts the whole job. All C++ tests (test_cpp.sh), the storage/GUSLI/UCX/gtest/azure suites, and the transfer tests passed beforehand — the failure is purely in Python dependency provisioning, independent of PR #2036's code.

Implicated commit: unknown (the failing pip install --upgrade ... pyYAML ... originates from the AWS Batch EFA-test entrypoint/workflow, not from a commit surfaced in the fetched history; the native GHA pipeline was introduced in [REDACTED:Hex High Entropy String] by Nate Mailhot, #1803).

File: the EFA Python Tests setup command in the AWS-batch test wrapper / GHA workflow that runs python3 -m pip install --break-system-packages --upgrade meson meson-python pybind11 patchelf pyYAML click tabulate auditwheel tomlkit 'setuptools>=80.9.0' (log lines ~2026-08-06T10:22:54.6810:22:56.90). Note .gitlab/test_python.sh:50 installs a similar list but without --upgrade, so it is not the exact offender.

Suggested fix: Make the PyYAML dependency install robust against the Debian-managed package. Options, in order of preference:

  • Drop pyYAML from the --upgrade list if the pinned version isn't required, or
  • Add --ignore-installed PyYAML (or --ignore-installed) so pip installs the wheel into the pip-managed location without trying to uninstall the apt copy, or
  • Pre-remove it with apt-get remove -y python3-yaml before the pip upgrade, or
  • Constrain to allow the existing 6.0.1 (don't force --upgrade).
    Since this is environment provisioning and PR ci: build python bindings without pip build isolation #2036's code passed all compiled tests, re-running after the fix should make CI green.

Related: none found (no matching issues/PRs).

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 89158ea1-5d3b-41aa-9397-74f85857964d in the triage console for the audit trail.

@svc-nixl

svc-nixl commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-gpu · commit aff30faf

TL;DR: The "Run Python tests" stage failed during the build-dependency pip install step — PR #2036 added --upgrade, which forced pip to uninstall the Debian-managed system PyYAML 6.0.1 (no RECORD file), aborting the install. Drop --upgrade or add --ignore-installed PyYAML so pip installs alongside the system package instead of trying to uninstall it.

Full analysis

Summary: .gitlab/test_python.sh aborts immediately with exit code 1 while installing build dependencies, before any test runs.

Root cause: The install command executed was python3 -m pip install --break-system-packages --upgrade meson meson-python pybind11 patchelf pyYAML click tabulate auditwheel tomlkit 'setuptools>=80.9.0'. The --upgrade flag makes pip try to uninstall the existing distro-provided PyYAML 6.0.1, which was installed by Debian and has no RECORD file, so pip errors out: error: uninstall-no-record-file … Cannot uninstall PyYAML 6.0.1 … no RECORD file was found. With set -e, the script exits 1 and the stage fails. Note the checked-in source does not contain --upgrade, so the flag was introduced by the PR under test.

Implicated commit: PR #2036 ("ci: build python bindings without pip build isolation") — the change adds --upgrade to the build-dependency install in .gitlab/test_python.sh. Exact SHA not in the fetched history; the branch HEAD is [REDACTED:Hex High Entropy String].

File: .gitlab/test_python.sh:48 (the $pip3 install --break-system-packages ... pyYAML ... 'setuptools>=80.9.0' line, run in the log with an added --upgrade).

Suggested fix: Remove the --upgrade flag from that install line, or make it tolerant of distro-managed packages — e.g. add --ignore-installed PyYAML (or drop pyYAML from the list since 6.0.1 is already present), so pip installs its own copy without attempting to uninstall the Debian package. If the intent is to build without isolation, pair --no-build-isolation with pre-installed build deps rather than force-upgrading system packages.

Related: #2036

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 324354d6-402f-485d-bd1c-ddd0c119fbee in the triage console for the audit trail.

--upgrade alone fails on the Python 3.12 images: they carry a Debian
packaged PyYAML 6.0.1 with no pip RECORD, and the newer pip there treats
the uninstall as fatal rather than warning:

    ERROR: Cannot uninstall PyYAML 6.0.1, RECORD file not found.
    error: uninstall-no-record-file

--ignore-installed skips the uninstall path entirely and installs into
dist-packages, which precedes the distro location on sys.path. meson is
exposed the same way -- Ubuntu 24.04 ships the 1.3.2 that the failing
runs used -- so restricting the flag to PyYAML would only move the
failure one package along.

Signed-off-by: NirWolfer <nwolfer@nvidia.com>
@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

2 similar comments
@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@NirWolfer

Copy link
Copy Markdown
Contributor Author

/build

@svc-nixl

svc-nixl commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

🤖 CI Triage Agentnixl-ci-dl-gpu-ep · commit 9e6b6221

TL;DR: The build itself succeeded; the "Allocate DL EP Environment" stage failed because a Slurm salloc for the gb200nvl72_cx8 partition sat queued for the full 1-hour --immediate=3600 window and never got a node ("Unable to allocate resources: Connection timed out"). This is a cluster-capacity/infra issue, not a code defect in PR #2036.

Full analysis

Summary: Slurm node allocation on partition gb200nvl72_cx8 timed out after ~60 minutes waiting for resources; the DL EP tests never ran.

Root cause: In stage 156, salloc -N 1 -p gb200nvl72_cx8 --immediate=3600 --time=01:30:00 --no-shell --account=blackwell was submitted at 11:31:22 and remained queued and waiting for resources until 12:31:31, when the immediate timeout (3600s) elapsed and Slurm returned error: Unable to allocate resources: Connection timed out. The GB200 partition had no free node within the wait window — a resource/queueing problem, not a hang in NIXL. Note the build/compile stages (141, and the parallel build) all passed and the test Docker image was pushed successfully, so the PR code built fine.

Implicated commit: none — failure is unrelated to commit [REDACTED:Hex High Entropy String]; it is an environment allocation timeout.

File: N/A (Jenkins pipeline slurm.allocation step / swx-jenkins-lib), not a repo source file.

Suggested fix: Re-run the build — this is a transient cluster-capacity failure. If GB200 (gb200nvl72_cx8) contention is recurring, consider: (1) raising immediateTimeout beyond 3600s so the job can queue longer, (2) adding a retry/backoff around the slurm.allocation step, or (3) checking partition/account (blackwell) quota and node availability with the cluster admins. Do not treat this as a NIXL code regression.

Related: none found.

Note: the salloc SSH command line in the log uses -i **** (the private key path is masked by Jenkins). No secret needs rotation from what's shown, but confirm the credential svc-nixl-ssh_key remains masked in any raw console output.

🛡️ This comment had 1 potential secret(s) redacted (Hex High Entropy String). See request_id 373272db-1e72-4422-a295-5d2bad1de450 in the triage console for the audit trail.

@NirWolfer
NirWolfer requested a review from ovidiusm August 9, 2026 10:12
@NirWolfer
NirWolfer merged commit 54a015f into ai-dynamo:main Aug 10, 2026
19 checks passed
@NirWolfer
NirWolfer deleted the fix/pip-no-build-isolation branch August 10, 2026 08:27
svc-nixl referenced this pull request Sep 2, 2026
Expose the UUID utility's byte generator so trace and span IDs no longer require temporary UUID objects.

Signed-off-by: Efraim Eygin <eeygin@nvidia.com>
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.

3 participants