Skip to content

fix(scheduler): count shared DRA GPU device once per node - #1931

Merged
enoodle merged 2 commits into
kai-scheduler:mainfrom
TensorRaya:fix/dra-shared-claim-double-count
Aug 6, 2026
Merged

fix(scheduler): count shared DRA GPU device once per node#1931
enoodle merged 2 commits into
kai-scheduler:mainfrom
TensorRaya:fix/dra-shared-claim-double-count

Conversation

@TensorRaya

@TensorRaya TensorRaya commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Description

addTaskResources adds each task's DRA GPU count — taken from its allocated
ResourceClaimInfo — to the node UsedVector. When several pods share one
physical GPU through a single ResourceClaim (its status.reservedFor lists
more than one consumer, as in DRA time-slicing or MPS), each consuming pod
carries the same allocated device, so the device is counted once per pod. On a
node whose shared device pushes the counted usage above the node's physical GPU
count, IdleVector goes negative and the node is rejected for every task —
including GPU-less ones — via MaxNodeResourcesPredicate, surfacing as a
misleading "didn't have enough resources: GPUs" message (e.g. on a 1-GPU node
shared by two pods: used: 2, capacity: 1, idle -1).

Fix: track a per-device reference count on the node, keyed by the allocated
device's driver/pool/device tuple. addTaskResources subtracts from the
tracked GPU vector any device already referenced by another pod on the node, so
a shared physical device contributes to UsedVector exactly once;
removeTaskResources mirrors this, keeping the device counted while any consumer
remains and releasing it only when the last one leaves. The reference count
lives on GpuSharingNodeInfo (cloned with the rest of the node's sharing state).
Only NVIDIA GPU DRA devices (driver == gpu.nvidia.com) are tracked; other DRA
devices are untouched.

Non-DRA and single-consumer DRA GPU accounting is unchanged: the dedup only ever
skips a device that a prior pod on the same node already contributed.

Tests (pkg/scheduler/api/node_info/dra_shared_device_info_test.go), exercising
the real AddTask/RemoveTask accounting path:

  • Two pods sharing one claim on a 1-GPU node → used GPUs 1, idle 0 (not
    2/-1).
  • Add/remove symmetry: used stays 1 while any consumer of the shared device
    remains, returns to 0 when the last leaves.
  • Two pods on two distinct physical GPUs (own claim each) → both counted (2),
    guarding against over-dedup.

Verified the shared-claim tests fail without the fix (reproducing used: 2,
idle -1) and pass with it; the distinct-devices test stays green either way.
Full ./pkg/scheduler/... suite passes.

Related Issues

Fixes #1930

Checklist

  • Self-reviewed
  • Added/updated tests (if needed)
  • Updated documentation (if needed)

Breaking Changes

None. Accounting changes only in the previously-broken case of a physical DRA
device shared by more than one pod on a node; exclusive claims and non-DRA GPUs
are counted exactly as before.

Additional Notes

CHANGELOG.md updated under [Unreleased] > Fixed.

Validated with:
go test ./pkg/scheduler/api/node_info/ ./pkg/common/resources/ and the full
go test ./pkg/scheduler/... suite (77 packages ok). gofmt and go vet clean
on all touched files.

Summary by CodeRabbit

  • Bug Fixes
    • Corrected GPU resource accounting when multiple pods share the same physical GPU through a single resource claim.
    • Prevented shared GPUs from being counted multiple times, which could incorrectly make nodes appear unschedulable.
    • Improved GPU usage tracking as shared GPU consumers are added and removed.
  • Changelog
    • Added release notes documenting the GPU accounting fix and recent version updates.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: e9f55df8-17f7-4adf-b3b1-57b2eee753e8

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds reference-counted NVIDIA DRA GPU accounting so a physical device shared by multiple pods contributes to node usage once, with symmetric removal behavior and regression tests.

Changes

Shared DRA GPU accounting

Layer / File(s) Summary
Device reference-count state
pkg/scheduler/api/node_info/gpu_sharing_node_info.go
GpuSharingNodeInfo stores shared DRA device reference counts, initializes the map, and copies it during cloning.
Shared-device accounting
pkg/common/constants/constants.go, pkg/scheduler/api/node_info/dra_shared_device_info.go, pkg/scheduler/api/node_info/node_info.go
Identifies NVIDIA DRA GPU devices, deduplicates shared-device usage during task addition, and releases usage only after the final consumer is removed.
Shared-device accounting validation
pkg/scheduler/api/node_info/dra_shared_device_info_test.go, CHANGELOG.md
Tests shared claims, removal symmetry, and distinct-device counting; documents the accounting fix and release entries.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers: siormeir

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main fix: counting shared DRA GPU devices once per node.
Description check ✅ Passed The description covers the problem, fix, tests, related issue, breaking changes, and additional notes.
Linked Issues check ✅ Passed The changes implement per-device deduplication for shared NVIDIA DRA GPUs and preserve add/remove symmetry, matching #1930.
Out of Scope Changes check ✅ Passed The touched files are all relevant to the scheduler accounting fix, tests, and changelog update.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@TensorRaya
TensorRaya force-pushed the fix/dra-shared-claim-double-count branch from 0565d00 to c79f723 Compare July 16, 2026 09:17
@TensorRaya

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

🤖 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 `@CHANGELOG.md`:
- Line 28: Correct the changelog entry’s spelling by changing “ine” to “in” and
“then” to “than”; also make the issue link’s displayed number match the
referenced issue URL, using the correct issue number consistently.

In `@pkg/scheduler/api/node_info/dra_shared_device_info.go`:
- Around line 58-100: Update dedupSharedDRAGpus to read the GPU value before
incrementing DRASharedDeviceRefCount, return immediately when current GPU usage
is zero or less, and cap alreadyCounted so the deduction cannot exceed current.
This prevents reservation tasks from registering DRA devices or producing
negative resourcesToTrack values while preserving normal deduplication for
GPU-contributing tasks.
🪄 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: CHILL

Plan: Pro

Run ID: fa8f5d74-ec03-455d-81cf-f12eb06a355b

📥 Commits

Reviewing files that changed from the base of the PR and between f23d1e4 and c79f723.

📒 Files selected for processing (6)
  • CHANGELOG.md
  • pkg/common/constants/constants.go
  • pkg/scheduler/api/node_info/dra_shared_device_info.go
  • pkg/scheduler/api/node_info/dra_shared_device_info_test.go
  • pkg/scheduler/api/node_info/gpu_sharing_node_info.go
  • pkg/scheduler/api/node_info/node_info.go

Comment thread CHANGELOG.md Outdated
Comment thread pkg/scheduler/api/node_info/dra_shared_device_info.go
@TensorRaya
TensorRaya force-pushed the fix/dra-shared-claim-double-count branch 2 times, most recently from c18422b to b7767da Compare July 16, 2026 10:16

@enoodle enoodle left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I created 2 allocate action tests to verify this PR. one of them fails because of the mismatch between the test GPU driver name and the one tested here (see comment) But I suspect that the one where one of the pods sharing the DRA claims is still pending will fail after your PR is fixed. Can you take a look at this after you fix the gpu driver detection ?
The tests for reference: main...enoodle:KAI-Scheduler:review-1931-test-cases

Comment thread .changes/unreleased/0029-fixed.yaml Outdated
Comment thread pkg/scheduler/api/node_info/dra_shared_device_info.go Outdated
Comment thread pkg/scheduler/api/node_info/dra_shared_device_info.go Outdated
@TensorRaya
TensorRaya force-pushed the fix/dra-shared-claim-double-count branch from b7767da to 00e3d38 Compare July 17, 2026 23:37
@TensorRaya

Copy link
Copy Markdown
Contributor Author

Thanks for writing the test cases, that was a big help. I cherry-picked your commit into the branch (kept your authorship) and addressed everything:

  • GPU driver detection: dropped the hardcoded constant and switched to the existing resources.IsGPUDeviceClass, so the detection matches the rest of the codebase. Your first test passes now.
  • Pending pod sharing an allocated device: you were right, it failed after the driver fix. The accounting fix alone wasn't enough — a later pod sharing an already-counted device still requested a full GPU against an idle count of 0 and was rejected by lessEqualTaskToNodeResources. Added sharedDRAGpuDiscount: devices already referenced on the node are discounted from the task's GPU requirement during the fit check. Both of your tests pass, and I verified they go red with the fix neutralized.
  • Removed the issue-description comment block from the code.
  • Regenerated the changelog fragment via make changelog (timestamped filename).

make validate-equivalent ran clean locally (gofmt, go vet, golangci-lint, full ./pkg/scheduler/... test suite).

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

Total coverage: 54.3% -> 54.0% (delta -0.30%)

Merging this branch will increase overall coverage

Impacted Packages Coverage Δ 🤖
github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions/integration_tests/allocate 0.00% (ø)
github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api/node_info 77.02% (+0.26%) 👍

Coverage by file

Changed files (no unit tests)

Changed File Coverage Δ Total Covered Missed 🤖
github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api/node_info/dra_shared_device_info.go 85.71% (+85.71%) 42 (+42) 36 (+36) 6 (+6) 🌟
github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api/node_info/gpu_sharing_node_info.go 67.33% (-0.91%) 150 (+2) 101 49 (+2) 👎
github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api/node_info/node_info.go 75.00% (-0.16%) 312 (+6) 234 (+4) 78 (+2) 👎

Please note that the "Total", "Covered", and "Missed" counts above refer to code statements instead of lines of code. The value in brackets refers to the test coverage of that file in the old version of the code.

Changed unit test files

  • github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions/integration_tests/allocate/allocate_shared_dra_test.go
  • github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/api/node_info/dra_shared_device_info_test.go

@github-actions

github-actions Bot commented Jul 19, 2026

Copy link
Copy Markdown

📊 Performance Benchmark Results

Comparing PR (fix/dra-shared-claim-double-count) vs main branch — click to expand
goos: linux
goarch: amd64
pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions
cpu: AMD EPYC 9V74 80-Core Processor                
                                    │ main-bench.txt │           pr-bench.txt            │
                                    │     sec/op     │   sec/op     vs base              │
AllocateAction_SmallCluster-4            107.2m ± 0%   106.9m ± 8%       ~ (p=0.093 n=6)
AllocateAction_MediumCluster-4           128.0m ± 1%   127.5m ± 0%  -0.35% (p=0.041 n=6)
AllocateAction_LargeCluster-4            188.5m ± 1%   189.5m ± 2%       ~ (p=0.818 n=6)
ReclaimAction_SmallCluster-4             103.6m ± 0%   103.4m ± 0%       ~ (p=0.310 n=6)
ReclaimAction_MediumCluster-4            107.2m ± 0%   106.8m ± 0%  -0.40% (p=0.041 n=6)
PreemptAction_SmallCluster-4             104.6m ± 0%   104.6m ± 0%       ~ (p=0.937 n=6)
PreemptAction_MediumCluster-4            115.4m ± 1%   115.1m ± 1%       ~ (p=0.699 n=6)
ConsolidationAction_SmallCluster-4       120.8m ± 0%   120.3m ± 1%  -0.37% (p=0.026 n=6)
ConsolidationAction_MediumCluster-4      254.8m ± 2%   251.3m ± 1%  -1.35% (p=0.041 n=6)
FullSchedulingCycle_SmallCluster-4       105.8m ± 0%   105.8m ± 0%       ~ (p=0.485 n=6)
FullSchedulingCycle_MediumCluster-4      117.2m ± 0%   116.8m ± 1%       ~ (p=0.485 n=6)
FullSchedulingCycle_LargeCluster-4       152.3m ± 2%   152.1m ± 3%       ~ (p=0.699 n=6)
ManyQueues_MediumCluster-4               132.3m ± 2%   130.8m ± 2%       ~ (p=0.093 n=6)
GangScheduling_MediumCluster-4           145.7m ± 2%   148.1m ± 2%       ~ (p=0.093 n=6)
geomean                                  129.9m        129.6m       -0.19%

                                    │ main-bench.txt │            pr-bench.txt            │
                                    │      B/op      │     B/op      vs base              │
AllocateAction_SmallCluster-4           2.073Mi ± 1%   2.075Mi ± 1%       ~ (p=0.485 n=6)
AllocateAction_MediumCluster-4          9.898Mi ± 0%   9.904Mi ± 0%       ~ (p=0.065 n=6)
AllocateAction_LargeCluster-4           31.26Mi ± 0%   31.26Mi ± 0%       ~ (p=0.065 n=6)
ReclaimAction_SmallCluster-4            950.7Ki ± 0%   955.5Ki ± 0%  +0.51% (p=0.015 n=6)
ReclaimAction_MediumCluster-4           3.101Mi ± 0%   3.106Mi ± 0%  +0.18% (p=0.009 n=6)
PreemptAction_SmallCluster-4            1.346Mi ± 1%   1.346Mi ± 1%  +0.05% (p=0.026 n=6)
PreemptAction_MediumCluster-4           5.928Mi ± 0%   5.934Mi ± 0%  +0.10% (p=0.026 n=6)
ConsolidationAction_SmallCluster-4      8.206Mi ± 0%   8.203Mi ± 0%       ~ (p=0.818 n=6)
ConsolidationAction_MediumCluster-4     67.76Mi ± 0%   67.76Mi ± 0%       ~ (p=0.589 n=6)
FullSchedulingCycle_SmallCluster-4      1.404Mi ± 1%   1.408Mi ± 1%       ~ (p=0.310 n=6)
FullSchedulingCycle_MediumCluster-4     6.136Mi ± 0%   6.140Mi ± 0%  +0.07% (p=0.002 n=6)
FullSchedulingCycle_LargeCluster-4      18.35Mi ± 0%   18.35Mi ± 0%       ~ (p=0.065 n=6)
ManyQueues_MediumCluster-4              13.13Mi ± 0%   13.13Mi ± 0%  +0.02% (p=0.002 n=6)
GangScheduling_MediumCluster-4          15.33Mi ± 0%   15.33Mi ± 0%       ~ (p=0.310 n=6)
geomean                                 6.537Mi        6.544Mi       +0.10%

                                    │ main-bench.txt │           pr-bench.txt            │
                                    │   allocs/op    │  allocs/op   vs base              │
AllocateAction_SmallCluster-4            31.48k ± 0%   31.49k ± 0%  +0.04% (p=0.009 n=6)
AllocateAction_MediumCluster-4           245.7k ± 0%   245.8k ± 0%  +0.03% (p=0.002 n=6)
AllocateAction_LargeCluster-4            1.007M ± 0%   1.007M ± 0%  +0.01% (p=0.002 n=6)
ReclaimAction_SmallCluster-4             8.927k ± 0%   8.938k ± 0%  +0.12% (p=0.002 n=6)
ReclaimAction_MediumCluster-4            28.07k ± 0%   28.12k ± 0%  +0.18% (p=0.002 n=6)
PreemptAction_SmallCluster-4             15.26k ± 0%   15.27k ± 0%  +0.06% (p=0.002 n=6)
PreemptAction_MediumCluster-4            55.24k ± 0%   55.29k ± 0%  +0.09% (p=0.002 n=6)
ConsolidationAction_SmallCluster-4       109.7k ± 0%   109.7k ± 0%       ~ (p=0.556 n=6)
ConsolidationAction_MediumCluster-4      1.020M ± 0%   1.020M ± 0%       ~ (p=0.093 n=6)
FullSchedulingCycle_SmallCluster-4       19.62k ± 0%   19.63k ± 0%  +0.03% (p=0.015 n=6)
FullSchedulingCycle_MediumCluster-4      136.2k ± 0%   136.3k ± 0%  +0.03% (p=0.002 n=6)
FullSchedulingCycle_LargeCluster-4       537.6k ± 0%   537.7k ± 0%  +0.02% (p=0.002 n=6)
ManyQueues_MediumCluster-4               274.0k ± 0%   274.1k ± 0%  +0.02% (p=0.004 n=6)
GangScheduling_MediumCluster-4           455.3k ± 0%   455.4k ± 0%  +0.01% (p=0.039 n=6)
geomean                                  108.9k        109.0k       +0.05%

pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions/integration_tests/reclaim
                                                          │ main-bench.txt │            pr-bench.txt            │
                                                          │     sec/op     │    sec/op     vs base              │
ReclaimLargeJobs_10Node-4                                     135.5m ±  1%   134.8m ±  1%       ~ (p=0.132 n=6)
ReclaimLargeJobs_50Node-4                                     312.6m ±  1%   307.3m ±  1%  -1.69% (p=0.002 n=6)
ReclaimLargeJobs_100Node-4                                    625.3m ±  6%   612.2m ±  6%       ~ (p=0.132 n=6)
ReclaimLargeJobs_200Node-4                                     1.569 ±  1%    1.547 ±  2%       ~ (p=0.132 n=6)
ReclaimLargeJobs_500Node-4                                     7.070 ±  2%    7.061 ±  1%       ~ (p=1.000 n=6)
ReclaimLargeJobs_1000Node-4                                    31.05 ±  1%    31.00 ±  1%       ~ (p=0.699 n=6)
ReclaimManySingleGPUJobsFullCycle_10Node-4                    153.8m ±  1%   153.6m ±  0%       ~ (p=0.937 n=6)
ReclaimManySingleGPUJobsFullCycle_50Node-4                    966.0m ±  0%   951.0m ±  0%  -1.55% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_100Node-4                    3.495 ±  1%    3.405 ±  2%  -2.58% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_200Node-4                    15.21 ±  3%    13.99 ±  1%  -8.00% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_500Node-4                    108.6 ± 34%    113.2 ±  5%       ~ (p=0.065 n=6)
ReclaimManySingleGPUJobsFullCycleWithMinRuntime_500Node-4      97.96 ± 10%   113.08 ± 17%       ~ (p=0.180 n=6)
geomean                                                        3.093          3.092        -0.02%

                                                          │ main-bench.txt │            pr-bench.txt            │
                                                          │      B/op      │     B/op      vs base              │
ReclaimLargeJobs_10Node-4                                     17.23Mi ± 0%   17.22Mi ± 1%       ~ (p=1.000 n=6)
ReclaimLargeJobs_50Node-4                                     91.89Mi ± 0%   91.85Mi ± 0%       ~ (p=0.180 n=6)
ReclaimLargeJobs_100Node-4                                    204.3Mi ± 0%   204.3Mi ± 0%       ~ (p=0.589 n=6)
ReclaimLargeJobs_200Node-4                                    486.2Mi ± 0%   486.2Mi ± 0%       ~ (p=0.699 n=6)
ReclaimLargeJobs_500Node-4                                    1.698Gi ± 0%   1.698Gi ± 0%       ~ (p=0.394 n=6)
ReclaimLargeJobs_1000Node-4                                   5.141Gi ± 0%   5.141Gi ± 0%       ~ (p=0.485 n=6)
ReclaimManySingleGPUJobsFullCycle_10Node-4                    14.81Mi ± 0%   14.81Mi ± 0%       ~ (p=0.937 n=6)
ReclaimManySingleGPUJobsFullCycle_50Node-4                    145.0Mi ± 0%   145.0Mi ± 0%       ~ (p=0.818 n=6)
ReclaimManySingleGPUJobsFullCycle_100Node-4                   470.6Mi ± 0%   470.5Mi ± 0%       ~ (p=0.240 n=6)
ReclaimManySingleGPUJobsFullCycle_200Node-4                   1.629Gi ± 0%   1.629Gi ± 0%       ~ (p=0.589 n=6)
ReclaimManySingleGPUJobsFullCycle_500Node-4                   10.34Gi ± 0%   10.34Gi ± 0%       ~ (p=0.937 n=6)
ReclaimManySingleGPUJobsFullCycleWithMinRuntime_500Node-4     10.34Gi ± 0%   10.34Gi ± 0%       ~ (p=0.699 n=6)
geomean                                                       504.6Mi        504.5Mi       -0.01%

                                                          │ main-bench.txt │           pr-bench.txt            │
                                                          │   allocs/op    │  allocs/op   vs base              │
ReclaimLargeJobs_10Node-4                                      242.0k ± 0%   242.0k ± 0%       ~ (p=0.089 n=6)
ReclaimLargeJobs_50Node-4                                      1.482M ± 0%   1.482M ± 0%  +0.00% (p=0.017 n=6)
ReclaimLargeJobs_100Node-4                                     3.741M ± 0%   3.741M ± 0%  +0.00% (p=0.002 n=6)
ReclaimLargeJobs_200Node-4                                     10.52M ± 0%   10.52M ± 0%  +0.00% (p=0.004 n=6)
ReclaimLargeJobs_500Node-4                                     45.58M ± 0%   45.58M ± 0%  +0.00% (p=0.002 n=6)
ReclaimLargeJobs_1000Node-4                                    159.5M ± 0%   159.5M ± 0%  +0.00% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_10Node-4                     279.9k ± 0%   279.9k ± 0%  +0.00% (p=0.048 n=6)
ReclaimManySingleGPUJobsFullCycle_50Node-4                     3.741M ± 0%   3.741M ± 0%  +0.00% (p=0.026 n=6)
ReclaimManySingleGPUJobsFullCycle_100Node-4                    13.33M ± 0%   13.33M ± 0%  +0.00% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_200Node-4                    50.07M ± 0%   50.07M ± 0%  +0.00% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycle_500Node-4                    300.6M ± 0%   300.6M ± 0%  +0.00% (p=0.002 n=6)
ReclaimManySingleGPUJobsFullCycleWithMinRuntime_500Node-4      300.6M ± 0%   300.6M ± 0%  +0.00% (p=0.004 n=6)
geomean                                                        11.69M        11.69M       +0.00%

                                                          │ main-bench.txt │              pr-bench.txt              │
                                                          │ full_cycles/op │ full_cycles/op  vs base                │
ReclaimManySingleGPUJobsFullCycle_10Node-4                      1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimManySingleGPUJobsFullCycle_50Node-4                      1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimManySingleGPUJobsFullCycle_100Node-4                     1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimManySingleGPUJobsFullCycle_200Node-4                     1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimManySingleGPUJobsFullCycle_500Node-4                     1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimManySingleGPUJobsFullCycleWithMinRuntime_500Node-4       1.000 ± 0%       1.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                         1.000            1.000       +0.00%
¹ all samples are equal

                                            │          main-bench.txt           │                     pr-bench.txt                     │
                                            │ fit_error_tasks_after_allocate/op │ fit_error_tasks_after_allocate/op  vs base           │
ReclaimManySingleGPUJobsFullCycle_500Node-4                         4.000k ± 0%                         4.000k ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                                            │          main-bench.txt           │                    pr-bench.txt                    │
                                            │ heap_live_after_allocate_bytes/op │ heap_live_after_allocate_bytes/op  vs base         │
ReclaimManySingleGPUJobsFullCycle_500Node-4                        41.51M ± 76%                        41.55M ± 76%  ~ (p=0.180 n=6)

                                            │         main-bench.txt         │                  pr-bench.txt                   │
                                            │ heap_live_after_cycle_bytes/op │ heap_live_after_cycle_bytes/op  vs base         │
ReclaimManySingleGPUJobsFullCycle_500Node-4                     56.12M ± 56%                     56.18M ± 56%  ~ (p=0.589 n=6)

pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions/preempt
                                  │ main-bench.txt │         pr-bench.txt         │
                                  │     sec/op     │   sec/op     vs base         │
OrderedVictimsQueueConstruction-4      711.3µ ± 8%   716.5µ ± 6%  ~ (p=1.000 n=6)

                                  │ main-bench.txt │          pr-bench.txt           │
                                  │      B/op      │     B/op      vs base           │
OrderedVictimsQueueConstruction-4     114.9Ki ± 0%   114.9Ki ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

                                  │ main-bench.txt │          pr-bench.txt          │
                                  │   allocs/op    │  allocs/op   vs base           │
OrderedVictimsQueueConstruction-4      4.033k ± 0%   4.033k ± 0%  ~ (p=1.000 n=6) ¹
¹ all samples are equal

pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions/reclaim
                                                         │ main-bench.txt │            pr-bench.txt             │
                                                         │     sec/op     │   sec/op     vs base                │
ReclaimUnschedulableDistributedJob_10Node-4                   145.1m ± 1%   145.9m ± 1%       ~ (p=0.132 n=6)
ReclaimUnschedulableDistributedJob_50Node-4                    3.253 ± 2%    3.286 ± 2%       ~ (p=0.132 n=6)
ReclaimUnschedulableDistributedJob_100Node-4                   15.68 ± 1%    16.40 ± 1%  +4.61% (p=0.002 n=6)
ReclaimUnschedulableDistributedJob_AntiAffinity100Node-4       14.42 ± 1%
ReclaimWithMissingPVCJobs-4                                   2.554m ± 3%   2.625m ± 4%       ~ (p=0.240 n=6)
geomean                                                       771.1m        379.0m       +2.23%               ¹
¹ benchmark set differs from baseline; geomeans may not be comparable

                                                         │ main-bench.txt │             pr-bench.txt             │
                                                         │      B/op      │     B/op      vs base                │
ReclaimUnschedulableDistributedJob_10Node-4                  20.91Mi ± 3%   20.96Mi ± 3%       ~ (p=0.260 n=6)
ReclaimUnschedulableDistributedJob_50Node-4                  1.154Gi ± 0%   1.154Gi ± 0%       ~ (p=0.818 n=6)
ReclaimUnschedulableDistributedJob_100Node-4                 5.559Gi ± 0%   5.560Gi ± 0%       ~ (p=0.310 n=6)
ReclaimUnschedulableDistributedJob_AntiAffinity100Node-4     5.159Gi ± 0%
ReclaimWithMissingPVCJobs-4                                  9.055Ki ± 2%   9.164Ki ± 3%       ~ (p=0.303 n=6)
geomean                                                      91.95Mi        33.52Mi       +0.36%               ¹
¹ benchmark set differs from baseline; geomeans may not be comparable

                                                         │ main-bench.txt │            pr-bench.txt             │
                                                         │   allocs/op    │  allocs/op   vs base                │
ReclaimUnschedulableDistributedJob_10Node-4                   306.1k ± 3%   306.1k ± 3%       ~ (p=0.485 n=6)
ReclaimUnschedulableDistributedJob_50Node-4                   27.77M ± 0%   27.77M ± 0%       ~ (p=0.589 n=6)
ReclaimUnschedulableDistributedJob_100Node-4                  169.0M ± 0%   169.0M ± 0%       ~ (p=0.937 n=6)
ReclaimUnschedulableDistributedJob_AntiAffinity100Node-4      146.8M ± 0%
ReclaimWithMissingPVCJobs-4                                    170.0 ± 1%    170.5 ± 1%       ~ (p=0.472 n=6)
geomean                                                       2.046M        703.5k       +0.07%               ¹
¹ benchmark set differs from baseline; geomeans may not be comparable

                                                         │ main-bench.txt │              pr-bench.txt              │
                                                         │  duplicate/op  │ duplicate/op  vs base                  │
ReclaimUnschedulableDistributedJob_10Node-4                  0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_50Node-4                  366.0 ± 0%       366.0 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_100Node-4                1.020k ± 0%      1.020k ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_AntiAffinity100Node-4    1.020k ± 0%
geomean                                                                 ²                 +0.00%               ³ ²
¹ all samples are equal
² summaries must be >0 to compute geomean
³ benchmark set differs from baseline; geomeans may not be comparable

                                                         │ main-bench.txt │             pr-bench.txt             │
                                                         │  simulated/op  │ simulated/op  vs base                │
ReclaimUnschedulableDistributedJob_10Node-4                    18.00 ± 0%     18.00 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_50Node-4                    178.0 ± 0%     178.0 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_100Node-4                   378.0 ± 0%     378.0 ± 0%       ~ (p=1.000 n=6) ¹
ReclaimUnschedulableDistributedJob_AntiAffinity100Node-4       378.0 ± 0%
geomean                                                        146.3          106.6       +0.00%               ²
¹ all samples are equal
² benchmark set differs from baseline; geomeans may not be comparable

Legend

  • 📉 Negative delta = Performance improvement (faster)
  • 📈 Positive delta = Performance regression (slower)
  • p-value < 0.05 indicates statistically significant change
Raw benchmark data

PR branch:

goos: linux
goarch: amd64
pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions
cpu: AMD EPYC 9V74 80-Core Processor                
BenchmarkAllocateAction_SmallCluster-4         	       9	 115256263 ns/op	 2198747 B/op	   31505 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 106843845 ns/op	 2176521 B/op	   31488 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 106909306 ns/op	 2174675 B/op	   31483 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 106909876 ns/op	 2179497 B/op	   31487 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 107163536 ns/op	 2172295 B/op	   31484 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 106921857 ns/op	 2173169 B/op	   31493 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127447234 ns/op	10396605 B/op	  245783 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127760414 ns/op	10385039 B/op	  245798 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127493548 ns/op	10384655 B/op	  245803 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       9	 127151343 ns/op	10385160 B/op	  245799 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       9	 127599489 ns/op	10383201 B/op	  245780 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       9	 127605306 ns/op	10385371 B/op	  245772 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 190261481 ns/op	32773005 B/op	 1007188 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 188740111 ns/op	32784742 B/op	 1007229 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 186862745 ns/op	32780777 B/op	 1007211 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 190341648 ns/op	32781393 B/op	 1007213 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 191605513 ns/op	32794494 B/op	 1007185 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 185522035 ns/op	32773066 B/op	 1007181 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103380308 ns/op	  973660 B/op	    8935 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103743859 ns/op	  981834 B/op	    8937 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103623156 ns/op	  978491 B/op	    8938 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103473606 ns/op	  978628 B/op	    8939 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103289527 ns/op	  974664 B/op	    8937 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103381740 ns/op	  978471 B/op	    8938 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106881614 ns/op	 3261816 B/op	   28120 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106668672 ns/op	 3253080 B/op	   28119 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107215529 ns/op	 3256959 B/op	   28120 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106682060 ns/op	 3253747 B/op	   28119 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106827656 ns/op	 3256850 B/op	   28120 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106433474 ns/op	 3257045 B/op	   28118 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104513939 ns/op	 1403900 B/op	   15266 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104662148 ns/op	 1411772 B/op	   15269 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104688962 ns/op	 1411672 B/op	   15269 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104314548 ns/op	 1411292 B/op	   15266 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104568031 ns/op	 1411594 B/op	   15268 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104575887 ns/op	 1418354 B/op	   15269 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 114317487 ns/op	 6219249 B/op	   55288 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 113458539 ns/op	 6224155 B/op	   55292 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115372114 ns/op	 6223984 B/op	   55292 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 114814805 ns/op	 6219830 B/op	   55291 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115949634 ns/op	 6220377 B/op	   55294 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115585956 ns/op	 6223872 B/op	   55291 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120368065 ns/op	 8601327 B/op	  109649 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120466635 ns/op	 8602474 B/op	  109672 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120297132 ns/op	 8603474 B/op	  109672 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120312020 ns/op	 8601288 B/op	  109655 allocs/op

Main branch:

goos: linux
goarch: amd64
pkg: github.com/kai-scheduler/KAI-scheduler/pkg/scheduler/actions
cpu: AMD EPYC 9V74 80-Core Processor                
BenchmarkAllocateAction_SmallCluster-4         	      10	 107353085 ns/op	 2184078 B/op	   31485 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 107176565 ns/op	 2170784 B/op	   31468 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 107171492 ns/op	 2176155 B/op	   31482 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 107532210 ns/op	 2186261 B/op	   31475 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 107220846 ns/op	 2171488 B/op	   31470 allocs/op
BenchmarkAllocateAction_SmallCluster-4         	      10	 106932228 ns/op	 2172124 B/op	   31477 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127320564 ns/op	10397464 B/op	  245697 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 128096060 ns/op	10377522 B/op	  245692 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127908369 ns/op	10381292 B/op	  245753 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 128468807 ns/op	10376864 B/op	  245721 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 127971868 ns/op	10378118 B/op	  245721 allocs/op
BenchmarkAllocateAction_MediumCluster-4        	       8	 128021440 ns/op	10380278 B/op	  245718 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 189683123 ns/op	32772700 B/op	 1007088 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 187950624 ns/op	32774600 B/op	 1007092 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 189001543 ns/op	32768930 B/op	 1007096 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 187109739 ns/op	32775236 B/op	 1007070 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 190556006 ns/op	32780706 B/op	 1007062 allocs/op
BenchmarkAllocateAction_LargeCluster-4         	       6	 186098683 ns/op	32768428 B/op	 1007028 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103657720 ns/op	  972213 B/op	    8922 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103554320 ns/op	  973410 B/op	    8926 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103560886 ns/op	  977472 B/op	    8927 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103455225 ns/op	  970266 B/op	    8927 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103684842 ns/op	  973868 B/op	    8928 allocs/op
BenchmarkReclaimAction_SmallCluster-4          	      10	 103609750 ns/op	  973527 B/op	    8925 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107008213 ns/op	 3253238 B/op	   28069 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107298225 ns/op	 3245592 B/op	   28069 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107473764 ns/op	 3248987 B/op	   28068 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107569038 ns/op	 3253052 B/op	   28071 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 107066249 ns/op	 3253457 B/op	   28068 allocs/op
BenchmarkReclaimAction_MediumCluster-4         	      10	 106719252 ns/op	 3249188 B/op	   28069 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104509379 ns/op	 1410952 B/op	   15260 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104578340 ns/op	 1403245 B/op	   15256 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104635999 ns/op	 1410823 B/op	   15259 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104246805 ns/op	 1403450 B/op	   15255 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104705008 ns/op	 1410964 B/op	   15259 allocs/op
BenchmarkPreemptAction_SmallCluster-4          	      10	 104546853 ns/op	 1410973 B/op	   15260 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115177979 ns/op	 6211599 B/op	   55241 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 114233394 ns/op	 6215828 B/op	   55240 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115670309 ns/op	 6216144 B/op	   55243 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 116930804 ns/op	 6211577 B/op	   55240 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 114227382 ns/op	 6220185 B/op	   55243 allocs/op
BenchmarkPreemptAction_MediumCluster-4         	       9	 115699377 ns/op	 6220233 B/op	   55243 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120996341 ns/op	 8604473 B/op	  109669 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120856163 ns/op	 8604990 B/op	  109682 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120863159 ns/op	 8598230 B/op	  109626 allocs/op
BenchmarkConsolidationAction_SmallCluster-4    	       9	 120642272 ns/op	 8610681 B/op	  109664 allocs/op

@enoodle

enoodle commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Hi @TensorRaya sorry for the delay,
I want to merge it now but it has a minor conflict (I think should just be both with the dedup first). Do you want to fix it of should I ?

Raya Solano and others added 2 commits July 29, 2026 07:34
When one physical GPU is shared by several pods through a single
ResourceClaim (status.reservedFor lists more than one consumer, as with
MPS or time-slicing), every consuming pod carries the same allocated
device. The node accounting added that device to the used vector once
per pod, so a 1-GPU node shared by two pods reported used: 2, capacity:
1. IdleVector then went negative and MaxNodeResourcesPredicate rejected
the node for every task, even ones requesting no GPU at all, which
showed up as a confusing "didn't have enough resources: GPUs" on a node
that clearly had one.

Keep a per-device reference count on the node, keyed by
driver/pool/device from the allocation result, and skip a device that
another pod on the node already contributed. Removal mirrors this: the
device stays counted until the last consumer leaves. Exclusive claims
and non-DRA GPUs are untouched.

Reservation pods are a special case worth calling out: addTaskResources
zeroes their GPU index before the dedup runs, so counting their shared
devices would subtract from zero and drive the used count negative.
Both the dedup and release paths now leave a zero-GPU task's accounting
alone.

Signed-off-by: Raya Solano <raya@mbinf.de>
Signed-off-by: Erez Freiberger <enoodle@gmail.com>
Signed-off-by: Raya Solano <raya.solano@mbinf.de>
@TensorRaya
TensorRaya force-pushed the fix/dra-shared-claim-double-count branch from 00e3d38 to 4e9cf1e Compare July 29, 2026 12:40
@TensorRaya

Copy link
Copy Markdown
Contributor Author

I did it — rebased on current main, PR is mergeable again.

The conflict was in addTaskResources/removeTaskResources, against the new DRA-backed extended resources work (#1943). Resolved with the dedup first, then the allocatable-zeroing loop, as you suggested: dedupSharedDRAGpus needs the real per-device counts to decide whether another pod on the node already contributed the device — running it after the zeroing would hand it a vector where DRA resources are already 0. removeTaskResources mirrors the same order.

Since #1943 touches the same accounting path, I re-ran the counter-proof instead of trusting a green suite: with dedupSharedDRAGpus/releaseSharedDRAGpus neutralized, TestAddTask_SharedDRAClaimCountedOnce, TestAddRemoveTask_SharedDRAClaimSymmetry and your two allocate-action tests all fail; restored, all pass. So the fix still does work on top of main, it isn't subsumed by the extended-resources change.

Gates run locally against main: go build ./pkg/scheduler/..., go vet, gofmt, golangci-lint 2.11.3 (0 issues), and the node_info + allocate integration suites. Your test commit is untouched and still attributed to you.

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

LGTM. Thanks!

@enoodle
enoodle enabled auto-merge August 6, 2026 12:36
@enoodle
enoodle added this pull request to the merge queue Aug 6, 2026
Merged via the queue into kai-scheduler:main with commit c8968ae Aug 6, 2026
15 of 19 checks passed
@KaiPilotBot

Copy link
Copy Markdown
Collaborator

📝 Changelog fragment recorded

Thanks! This PR added the changelog fragment(s) below. Pending fragments are folded into CHANGELOG.md at release time, so it was intentionally not modified by this PR — your entry will appear in the next release:

@KaiPilotBot

Copy link
Copy Markdown
Collaborator

Backport failed for v0.16, because it was unable to cherry-pick the commit(s).

Please cherry-pick the changes locally and resolve any conflicts.

git fetch origin v0.16
git worktree add -d .worktree/backport-1931-to-v0.16 origin/v0.16
cd .worktree/backport-1931-to-v0.16
git switch --create backport-1931-to-v0.16
git cherry-pick -x 8dc2871286de9c1ba4b0511a6b018a594ded9895 4e9cf1e3cbe1916955f50857bfffc18c55e53fed

@KaiPilotBot

Copy link
Copy Markdown
Collaborator

Successfully created backport PR for v0.17:

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.

shared DRA ResourceClaim double-counted per pod makes node unschedulable

4 participants