Skip to content

Forward-merge release/26.08 into main - #23382

Merged
jameslamb merged 7 commits into
NVIDIA:mainfrom
bdice:main-merge-release/26.08
Jul 21, 2026
Merged

Forward-merge release/26.08 into main#23382
jameslamb merged 7 commits into
NVIDIA:mainfrom
bdice:main-merge-release/26.08

Conversation

@bdice

@bdice bdice commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Manual forward merge from release/26.08 to main. This PR should not be squashed.

paul-aiyedun and others added 7 commits July 21, 2026 15:46
* Split the JAR build into three composable stages (static libcudf build, per-classifier JAR packaging, and Maven-repo gather) so each stage is independently runnable in CI and locally.

* Link against a static libcudf built from source per CUDA version rather than a conda shared libcudf.

* Emit the Maven classifier based on the host architecture the build runs on, introducing a new `-arm64` suffix to distinguish aarch64 JARs from their x86_64 counterparts.

* Add `test_java_build_local.sh` as a one-command local reproducer of the full CI matrix for the host arch, with per-step timings and GPU compute-capability auto-detection.

Contributes to NVIDIA#22204

Authors:
  - https://github.com/paul-aiyedun

Approvers:
  - Mike Sarahan (https://github.com/msarahan)
  - Tim Liu (https://github.com/NvTimLiu)

URL: NVIDIA#23261
…imeout (NVIDIA#23332)

## Description
Timing out an individual test is actually not useful since it is not
safe
to cancel a test at an arbitrary point in execution: that might leave a
collective dangling.

Moreover, many of the Polars tests run quite close to the, arbitrarily
chosen, timeout limit on CI runners if they are heavily loaded.

Since the signal we actually want is the state of a hanging process,
instead just add a test-suite level timeout with a utility to print the
state of the hanging processes.

closes NVIDIA#22948

## Checklist
- [x] I am familiar with the [Contributing
Guidelines](https://github.com/rapidsai/cudf/blob/HEAD/CONTRIBUTING.md).
- [x] New or existing tests cover these changes.
- [x] The documentation is up to date with these changes.
…sts (NVIDIA#23364)

Split out of NVIDIA#23255 (1/6).

`NumericalColumn.as_numerical_column` short-circuits casts between equivalent dtypes (same pylibcudf type, e.g. `float64` → `Float64`), but implemented the shortcut by assigning the target dtype onto `self._dtype` in place. The column object is shared with the caller's Series/DataFrame, so the *source* object silently changed dtype as a side effect of the cast. This returns a fresh column over the same pylibcudf data instead (`nans_to_nulls` first for float → masked casts), and adds a classic regression test.

Fixes 5 pandas-tests (`test_stack_nullable_dtype[*]`, `test_loc_set_nan_in_categorical_series[Float64]`, `test_assert_series_equal_extension_dtype_mismatch`, `test_assert_frame_equal_extension_dtype_mismatch`); their xfail entries are removed. Attribution verified by running the node ids against an isolated build containing only this fix (they pass) and a clean build (they fail).

Independent of the other NVIDIA#23255 split PRs; can merge in any order.

Authors:
  - GALI PREM SAGAR (https://github.com/galipremsagar)

Approvers:
  - Vyas Ramasubramani (https://github.com/vyasr)

URL: NVIDIA#23364
…IA#23001)

Split out of NVIDIA#22927 per review.

## Problem

A class-level attribute write on a cudf.pandas proxy type — e.g. `monkeypatch.setattr(pd.ExcelFile, "parse", fn)` — was only applied to the proxy class. Code that runs under `disable_module_accelerator()` (such as the pandas fallback path of `pd.read_excel`) resolves attributes from the *real* class, so a patch applied only to the proxy was invisible to it.

## Fix

Add `_FastSlowProxyMeta.__setattr__`/`__delattr__` to mirror runtime class-level patches onto the underlying "slow" (real) type:

- `__setattr__` mirrors the assignment after translating the assigned value into "slow" space. A plain value is forwarded as-is. Re-assigning the proxy's *pristine* attribute for a name (which is exactly what `monkeypatch.setattr` / `mock.patch.object` save and re-assign on undo) translates to the slow type's pristine attribute for that name — restored if the slow type had one of its own, or removed if it didn't (leaving any inherited implementation visible). Proxy machinery (e.g. a saved `pd.ExcelFile.parse`, a `_MethodProxy`) unwraps to the slow object it delegates to.
- `__delattr__` mirrors a deletion as a deletion. Nothing is restored on delete.

The pristine state is a per-type map `name -> (pristine proxy attribute, pristine slow class-dict entry)` snapshotted once, when `make_*_proxy_type` finishes building the type (the same point mirroring is enabled via `_fsproxy_mirror_slow_overrides`). It is a fixed translation table, not runtime patch tracking: there is no stash of "what to put back", and undo works for any code that follows the standard save/patch/re-assign pattern (pytest `monkeypatch`, `unittest.mock.patch.object`, manual saves) because the saved value itself identifies the pristine state. The translation is what makes mirroring safe at all — the values readable off a proxy type live in proxy space, and forwarding e.g. the saved `columns` property or `eval`/`query` functions verbatim onto `pandas.DataFrame` would install cudf machinery on the real class (for `columns` this infinitely recurses on the fallback path).

cudf.pandas's own custom methods (`DataFrame.eval`/`query`) are installed via the new `_setattr_fsproxy_no_mirror` helper, which registers them as part of the proxy's pristine state without forwarding them to pandas.

## Tests

Adds unit tests in `cudf_pandas_tests/test_fast_slow_proxy.py` covering: set/delete mirroring, monkeypatch round-trips (new attr, existing attr, nested, `delattr`), `mock.patch.object` (which saves the raw descriptor without resolving it), properties, plain data attributes, `staticmethod`/`classmethod` descriptor preservation, methods the slow type only inherits, and the no-mirror helper; plus an end-to-end test in `test_cudf_pandas.py` that patches/unpatches `DataFrame.columns`/`eval` and `Series.str` and checks real pandas is restored and functional.

Removes 14 now-passing xfails from the pandas-tests plugin (13× `read_excel` engine-selection tests that monkeypatch the engine, plus a monkeypatch-registered custom accessor). The attribution of these 14 to the proxy fix (vs the Excel-reader fixes remaining in NVIDIA#22927) was verified locally by running each removed xfail with the proxy fix in isolation.

Authors:
  - GALI PREM SAGAR (https://github.com/galipremsagar)
  - Vyas Ramasubramani (https://github.com/vyasr)

Approvers:
  - Vyas Ramasubramani (https://github.com/vyasr)

URL: NVIDIA#23001
This is an empty commit to trigger a build. This is needed after the RMM
ABI break in rapidsai/rmm#2462.
…23373)

Fixes build error introduced by an RMM change. The forward declaration in types.hpp is not actually needed and removing it fixes the build errors.

Authors:
  - David Wendt (https://github.com/davidwendt)
  - James Lamb (https://github.com/jameslamb)

Approvers:
  - Robert Maynard (https://github.com/robertmaynard)
  - Bradley Dice (https://github.com/bdice)
  - Vyas Ramasubramani (https://github.com/vyasr)

URL: NVIDIA#23373
@bdice
bdice requested a review from a team as a code owner July 21, 2026 21:47
@bdice bdice added improvement Improvement / enhancement to an existing function non-breaking Non-breaking change labels Jul 21, 2026
@bdice
bdice requested review from a team as code owners July 21, 2026 21:47
@bdice bdice added improvement Improvement / enhancement to an existing function non-breaking Non-breaking change labels Jul 21, 2026
@bdice
bdice requested review from jameslamb, rjzamora, vuule and wence- July 21, 2026 21:47
@github-actions github-actions Bot added libcudf Affects libcudf (C++/CUDA) code. Python Affects Python cuDF API. Java Affects Java cuDF API. cudf.pandas Issues specific to cudf.pandas cudf-polars Issues specific to cudf-polars labels Jul 21, 2026
@GPUtester GPUtester moved this to In Progress in cuDF Python Jul 21, 2026

@jameslamb jameslamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Looks perfect.

Closes #23372

I'll no-squash merge this.

@jameslamb
jameslamb merged commit 7b12746 into NVIDIA:main Jul 21, 2026
47 of 63 checks passed
@github-project-automation github-project-automation Bot moved this from In Progress to Done in cuDF Python Jul 21, 2026
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 25dfaa92-6733-40fc-bca5-b0e14e016fac

📥 Commits

Reviewing files that changed from the base of the PR and between a83fa9d and 9ea91f8.

📒 Files selected for processing (32)
  • .github/workflows/build.yaml
  • ci/run_cudf_polars_polars_tests.sh
  • ci/run_cudf_polars_pytests.sh
  • ci/test_wheel_cudf_polars.sh
  • ci/timeout_with_stack.py
  • conda/environments/all_cuda-129_arch-aarch64.yaml
  • conda/environments/all_cuda-129_arch-x86_64.yaml
  • conda/environments/all_cuda-133_arch-aarch64.yaml
  • conda/environments/all_cuda-133_arch-x86_64.yaml
  • cpp/include/cudf/types.hpp
  • dependencies.yaml
  • java/ci/README.md
  • java/ci/argparse.sh
  • java/ci/assemble_maven_repo.sh
  • java/ci/build_cudf_java_jar.sh
  • java/ci/build_cudf_java_jar_in_container.sh
  • java/ci/build_static_libcudf.sh
  • java/ci/build_static_libcudf_in_container.sh
  • java/ci/test_java_build_local.sh
  • java/pom.xml
  • python/cudf/cudf/core/column/numerical.py
  • python/cudf/cudf/pandas/_wrappers/pandas.py
  • python/cudf/cudf/pandas/fast_slow_proxy.py
  • python/cudf/cudf/pandas/scripts/pandas-testing-plugin.py
  • python/cudf/cudf/tests/series/methods/test_astype.py
  • python/cudf/cudf_pandas_tests/test_cudf_pandas.py
  • python/cudf/cudf_pandas_tests/test_fast_slow_proxy.py
  • python/cudf_polars/pyproject.toml
  • python/cudf_polars/tests/conftest.py
  • python/cudf_polars/tests/expressions/test_rolling.py
  • python/cudf_polars/tests/streaming/test_scan.py
  • python/cudf_polars/tests/streaming/test_sort.py

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added automated packaging for cuDF Java artifacts across CUDA versions and CPU architectures.
    • Added tooling to assemble a complete Maven repository for Java releases.
    • Added local end-to-end verification for the Java build workflow.
  • Bug Fixes

    • Improved cudf.pandas compatibility by preserving pandas methods and correctly restoring class patches.
    • Prevented equivalent dtype conversions from mutating the original Series or column.
  • CI Improvements

    • Added fail-fast test execution, extended timeouts, and stack-trace capture for stalled tests.

Walkthrough

Changes

Java artifact build pipeline

Layer / File(s) Summary
Java build contracts and dependencies
dependencies.yaml, java/ci/argparse.sh, java/pom.xml, java/ci/README.md
Adds Java build dependencies, shared argument validation, architecture-specific Maven classifiers, and documented self-contained build steps.
Static libcudf build
java/ci/build_static_libcudf*
Builds and validates static libcudf install trees through Docker and generated conda environments.
Classifier JAR packaging
java/ci/build_cudf_java_jar*
Packages and validates CUDA/architecture-specific JAR and POM artifacts using isolated Maven targets.
Maven assembly and CI orchestration
java/ci/assemble_maven_repo.sh, java/ci/test_java_build_local.sh, .github/workflows/build.yaml
Assembles classifier outputs into a Maven repository and adds local and matrix-based CI build/gather workflows.

Timeout diagnostics for cuDF Polars CI

Layer / File(s) Summary
Process-tree timeout utility
ci/timeout_with_stack.py
Adds timeout execution, stack capture, signal handling, process-tree termination, and a command-line interface.
CI timeout integration and dependencies
ci/run_cudf_polars_*.sh, ci/test_wheel_cudf_polars.sh, conda/environments/*, python/cudf_polars/*
Routes Polars tests through the new timeout utility, enables fail-fast behavior, and replaces pytest-timeout dependencies and markers with psutil/GDB support.

cuDF dtype and pandas proxy fixes

Layer / File(s) Summary
Masked dtype conversion
python/cudf/cudf/core/column/numerical.py, python/cudf/cudf/tests/series/methods/test_astype.py, cpp/include/cudf/types.hpp, python/cudf/cudf/pandas/scripts/pandas-testing-plugin.py
Avoids mutating source numerical column dtypes during equivalent masked casts, adds regression coverage, updates expectations, and removes the RMM forward declaration.
Fast-slow proxy mirroring
python/cudf/cudf/pandas/fast_slow_proxy.py, python/cudf/cudf/pandas/_wrappers/pandas.py, python/cudf/cudf_pandas_tests/*
Adds controlled mirroring and restoration of proxy class attributes while installing internal pandas overrides without mirroring them.

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

Possibly related PRs

Suggested labels: ci, bug

Suggested reviewers: jameslamb, vyasr, mroeschke

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cudf.pandas Issues specific to cudf.pandas cudf-polars Issues specific to cudf-polars improvement Improvement / enhancement to an existing function Java Affects Java cuDF API. libcudf Affects libcudf (C++/CUDA) code. non-breaking Non-breaking change Python Affects Python cuDF API.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

8 participants