Skip to content

fix(validation): pin celeris main dbbaaee and carry its two celeris#685 close-path counters to the artifacts (schema 5.18) - #454

Merged
FumingPower3925 merged 1 commit into
mainfrom
chore/repin-celeris-dbbaaee
Sep 28, 2026
Merged

FumingPower3925 merged 1 commit into
mainfrom
chore/repin-celeris-dbbaaee

Conversation

@FumingPower3925

@FumingPower3925 FumingPower3925 commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Pins celeris main dbbaaee (v1.5.12-0.20260928095652-dbbaaeebc86f, main at 09:56Z on 2026-09-28) in every probatorium module that requires celeris, and pins the observability refapp's celeris sub-modules middleware/metrics and middleware/otel at the same commit. The previous pin was 698bed6 (#439).

This pin includes #793 (3e7abba), the celeris#685 fix: io_uring close paths no longer release a descriptor number while an op can still resolve it. It carries the 16 PRs merged since 698bed6, in first-parent order: #765, #743, #747, #730, #748, #749, #745, #744, #746, #792, #774, #810, #773, #793, #768 and #766.

celeris push CI on dbbaaee is green: CI run 36406691708 passed all 13 jobs, including the 7 required contexts, and Coverage, Push on main and Scorecard passed too. It was the head of celeris main when this PR was pinned.

RULE 93: new EngineMetrics fields

engine.EngineMetrics goes from 70 to 72 fields. Only #793 adds any; the other 15 PRs add no field. Both new fields are carried through every hop the #389/#394 guards hold, following the #410 precedent:

field debugvars key kind series must-stay-zero
CloseFDDeferred celeris.engine_close_fd_deferred cumulative (a rate) no, tally-only no
CloseFDForced celeris.engine_close_fd_forced cumulative yes, appended column yes: recorded, not gated

For each field:

  • debugvars publishes it. TestDebugVarsPublishesEveryEngineMetricsField covers 72 of 72 fields.
  • The enginekeys manifest is regenerated with -update-engine-keys and grows from 70 to 72 keys.
  • ParseDebugVars reads it, and DebugVarsKeys lists it.
  • properties.Snapshot gets EngineCloseFDDeferred and EngineCloseFDForced.
  • The tally. Both keys are added to report.EngineCounters with the reasoning behind their Counts, Series and Why values, and recordEngineCounters records both.
  • The series. engine_close_fd_forced is appended as column 60. A nonzero reading is a defect. The backstop fires 5 s after the close it rescues, so the question is which close burst left an op owed. That means reading the column against the engine_close_count and adaptive_switches steps from 5 s earlier. engine_close_fd_deferred is a ratio of totals against engine_close_count, so it is tally-only.

How CloseFDForced is carried, and why it is not gated. The harness has two classes for this:

  • report.ZeroWitnessMeaning / engine_zero_witness is the gate: report.Gate fails a cell on any nonzero entry.
  • EngineCounter.MustStayZero records a counter's meaning without gating it.

#410 put every new must-stay-zero diagnostic counter in the second class, and probatorium#416 holds the decision to move them into the gate until a nightly has shown what normal looks like. engine_close_fd_forced follows that precedent. It is marked MustStayZero, listed in documentedMustStayZero, and checked by TestEveryDocumentedMustStayZeroCounterIsRecordedButNotGated (8 counters now). It should join #416's list when that gate is built.

Schema 5.17 → 5.18. Two keys are added to Tier1Summary.EngineCounters and one series column is appended. The change is additive: older readers ignore every new field.

RULE 48 applied by hand: SchemaVersion with its history entry, report/schema_test.go, mage_bench_sutenv_test.go and validation/runner_test.go. All three pins were first shown to fail with SchemaVersion at 5.18 and the pins still at 5.17. report/schema_v5.json has no version constant and does not model tier_1, so it is unchanged, as in #410.

One existing description updated. celeris rewrote the StaleRecvDataClosed doc in #793. Since celeris#685, a live client's request can no longer land in engine_stale_recv_data_closed. report.EngineCounters now says so, and says to read the counter with the old caveat on an older pin.

Changes

  • servers/celeris, the eight refapps and validation/refapp/internal/debugvars: go get github.com/goceleris/celeris@dbbaaeebc86f and go mod tidy. Only the celeris require line and its two go.sum lines change in each module.
  • validation/refapp/observability: middleware/metrics and middleware/otel are pinned at dbbaaeebc86f. Neither sub-module changed between 698bed6 and dbbaaee (empty git diff), but both are pinned so every celeris module in every graph is at one commit.
  • validation/refapp/internal/debugvars/debugvars.go: publishes the two keys.
  • validation/internal/enginekeys/engine_metrics_keys.txt: regenerated.
  • validation/checker/poll.go, validation/properties/snapshot.go, validation/checker/evaluator.go, report/engine_counter.go, validation/series.go: carry the two keys.
  • report/schema.go and the three hand pins: schema 5.18.
  • validation/checker/must_stay_zero_test.go, validation/series_test.go: the new counter and the new column.

Proof

  • One celeris commit everywhere, sub-modules included. The resolve script checks all 27 modules read-only. The 10 modules that have celeris in their graph all resolve v1.5.12-0.20260928095652-dbbaaeebc86f. The 2 sub-module requires, both in observability, resolve to the same commit.
  • Field diff. Between 698bed6 and dbbaaee, the only additions are CloseFDDeferred uint64 and CloseFDForced uint64, with no deprecations. A per-PR walk attributes both to #793. The same script reports 9f4d89b..698bed6 as identical, which matches deps: pin celeris main 698bed6, and record EngineMetrics.Throughput as deprecated #439.
  • The guards fail first.
    • Without the debugvars edit, TestDebugVarsPublishesEveryEngineMetricsField reports 70 of 72 fields published, with 2 missing.
    • With only the manifest regenerated, four root guards fail and each names both keys: TestParseDebugVarsReadsEveryPublishedEngineKey, TestEverySnapshotEngineFieldIsFedByAPublishedKey, TestEveryPublishedEngineKeyReachesTheTally and TestEveryPublishedEngineKeyHasAColumnOrADeclaration.
    • After the carry, all of them pass. TestSeriesWriterRecordsEveryColumn checks the new column by its own distinct value.

Test Plan

  • go vet ./..., gofmt -l . and golangci-lint run (v2.13.2) are clean on the root module, and golangci-lint reports 0 issues in the debugvars module.
  • Suites on head 4ff95a5, run in sequence with -p 1:
    • validation/refapp/internal/debugvars (-race): 30 PASS / 0 FAIL / 0 SKIP.
    • fieldguard: 30 / 0 / 0.
    • servers/celeris (-race): 4 / 0 / 0.
    • All 8 refapps build and vet on darwin, and servers/celeris, the 8 refapps and debugvars build and vet with GOOS=linux for amd64 and arm64.
    • The observability refapp builds and vets on darwin and linux amd64/arm64, and go list -m reports celeris, middleware/metrics and middleware/otel at dbbaaeebc86f.
  • Root module, go test -race -count=1 -p 1 ./...: 1364 PASS / 0 FAIL / 21 SKIP. With -tags mage: 1477 / 0 / 22. The skips are environmental on darwin: Linux-only tests, SSH, live targets, perf/PMU and the malformed skip-file case.
  • Cluster tiers: none before merge.

Heads-up for the first cluster run on this pin

  • engine_close_fd_forced is new and must stay 0. It is recorded and not gated, so a nonzero reading shows up in the tally and the series without failing a cell. The refapp log shows the same event as the WARN "releasing connState with kernel ops unaccounted for after backstop hold". celeris draft #813 (celeris#812) concerns a SEND_ZC buffer held past this backstop, and it is not in this pin.
  • engine_close_fd_deferred will be large on io_uring async-handler cells: celeris documents close to one per server-side close. That is the rule working.
  • engine_stale_recv_data_closed now counts only a closed connection's own late bytes (#793).
  • engine_transplant_double_claim: #765 (celeris#758) fixed the ~1-in-260 ordering flake that the deps: pin celeris main 698bed6, and record EngineMetrics.Throughput as deprecated #439 pin still carried, so the counter should read 0.
  • engine_transplant_residual_busy: #766 (celeris#711) retracts a parked loop's or worker's residue. The stale Busy gauge that nightly 36247560882 showed after a post-sweep close should be gone, so the tally peak can drop against 698bed6 runs.
  • Idle timeouts. #768 (celeris#713) makes io_uring read its clock on every CQE batch, as epoll does. A live connection is no longer timed out on a stale stamp, so io_uring timeout-driven closes can drop.
  • Kernel floor. #792 (celeris#682) refuses io_uring below Linux 5.19. The cluster runs 7.0.x and the GitHub runners 6.17, so io_uring cells are unaffected. engine_transplant_reap_unsupported is now 0 wherever io_uring runs.
  • Shutdown. #746 (#703) makes Server.Shutdown wait for the drain, bounded by its context. The refapps call Shutdown with a 10 s context from their signal handler, and StartWithListener now returns after that Shutdown. The refapps register no OnShutdown hooks. So the refapp still exits once the drain ends, and Tier 3's 5 s RefappStopGrace keeps its meaning.

…85 close-path counters to the artifacts (schema 5.18)

Pins celeris main dbbaaee in servers/celeris, the eight refapps and
validation/refapp/internal/debugvars, and the observability refapp's
middleware/metrics and middleware/otel sub-modules at the same commit. The
pin carries the 16 PRs merged after 698bed6, including #793 (3e7abba), the
celeris#685 fd-lifetime fix on the io_uring close paths.

#793 added two engine.EngineMetrics fields (72 now). Both are carried
through every hop the #389/#394 guards hold:
- the debugvars publish list;
- the enginekeys manifest (regenerated, 70 -> 72);
- ParseDebugVars and DebugVarsKeys;
- properties.Snapshot;
- the report.EngineCounters tally;
- the series: engine_close_fd_forced gets a column, appended;
  engine_close_fd_deferred is declared tally-only.

CloseFDDeferred is a rate of the rule working. CloseFDForced, the release
backstop closing a descriptor with an op still owed, is documented
must-stay-zero; it is marked EngineCounter.MustStayZero, recorded but NOT
gated, like the celeris#657 counters (probatorium#416 holds the gate
decision). The engine_stale_recv_data_closed description is updated for
#793.

The schema moves from 5.17 to 5.18; the three hand pins were re-pinned and
proven failing first.
@FumingPower3925 FumingPower3925 added the dependencies Pull requests that update a dependency file label Sep 28, 2026
@coderabbitai

coderabbitai Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: goceleris/probatorium/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 86b281e1-c860-4d7f-9610-dce6af4c3481

📥 Commits

Reviewing files that changed from the base of the PR and between 6ce66eb and 4ff95a5.

⛔ Files ignored due to path filters (11)
  • servers/celeris/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/internal/enginekeys/engine_metrics_keys.txt is excluded by !validation/internal/enginekeys/*.txt
  • validation/refapp/auth_jwt_csrf/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/auth_session_ratelimit/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/driver_memcached/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/driver_postgres/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/driver_redis/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/internal/debugvars/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/kitchen_sink/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/observability/go.sum is excluded by !**/*.sum, !**/go.sum
  • validation/refapp/static_swagger_proxy/go.sum is excluded by !**/*.sum, !**/go.sum
📒 Files selected for processing (22)
  • mage_bench_sutenv_test.go
  • report/engine_counter.go
  • report/schema.go
  • report/schema_test.go
  • servers/celeris/go.mod
  • validation/checker/evaluator.go
  • validation/checker/must_stay_zero_test.go
  • validation/checker/poll.go
  • validation/properties/snapshot.go
  • validation/refapp/auth_jwt_csrf/go.mod
  • validation/refapp/auth_session_ratelimit/go.mod
  • validation/refapp/driver_memcached/go.mod
  • validation/refapp/driver_postgres/go.mod
  • validation/refapp/driver_redis/go.mod
  • validation/refapp/internal/debugvars/debugvars.go
  • validation/refapp/internal/debugvars/go.mod
  • validation/refapp/kitchen_sink/go.mod
  • validation/refapp/observability/go.mod
  • validation/refapp/static_swagger_proxy/go.mod
  • validation/runner_test.go
  • validation/series.go
  • validation/series_test.go
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout. (15)
  • GitHub Check: CodeQL
  • GitHub Check: coverage (root module)
  • GitHub Check: servers/nbio
  • GitHub Check: go vet + golangci-lint + gofmt
  • GitHub Check: mage-tagged
  • GitHub Check: root module
  • GitHub Check: validation/refapp
  • GitHub Check: ansible loads every playbook and tasks file
  • GitHub Check: validation/properties/fieldguard
  • GitHub Check: govulncheck
  • GitHub Check: validation zombie guard (Linux /proc)
  • GitHub Check: Analyze (python)
  • GitHub Check: Analyze (actions)
  • GitHub Check: Analyze (javascript-typescript)
  • GitHub Check: Analyze (go)
🧰 Additional context used
📓 Path-based instructions (5)
This is the validation oracle.

⚙️ CodeRabbit configuration file

Files:

  • validation/runner_test.go
  • validation/refapp/static_swagger_proxy/go.mod
  • validation/checker/poll.go
  • validation/refapp/auth_session_ratelimit/go.mod
  • validation/refapp/driver_redis/go.mod
  • validation/refapp/internal/debugvars/debugvars.go
  • validation/refapp/driver_memcached/go.mod
  • validation/refapp/auth_jwt_csrf/go.mod
  • validation/refapp/internal/debugvars/go.mod
  • validation/refapp/driver_postgres/go.mod
  • validation/series.go
  • validation/properties/snapshot.go
  • validation/checker/must_stay_zero_test.go
  • validation/checker/evaluator.go
  • validation/series_test.go
  • validation/refapp/observability/go.mod
  • validation/refapp/kitchen_sink/go.mod
Magefiles carry //go:build mage: they are the bench driver, the release gate and the cluster orchestration, and `go test ./...`

⚙️ CodeRabbit configuration file

Files:

  • mage_bench_sutenv_test.go
Competitor adapters for the benchmark.

⚙️ CodeRabbit configuration file

Files:

  • servers/celeris/go.mod
The report package defines the published result schema and the release gate.

⚙️ CodeRabbit configuration file

Files:

  • report/schema_test.go
  • report/schema.go
  • report/engine_counter.go
Source excerpt: [ ] If the report schema changed: `SchemaVersion` is bumped and re-pinned in `report/schema_test.go`, `mage_bench_sutenv_test.go` and `validation/runner_test.go`

📄 CodeRabbit inference engine (.github/PULL_REQUEST_TEMPLATE.md)

Files:

  • mage_bench_sutenv_test.go
  • report/schema_test.go
  • validation/runner_test.go

📝 Summary

Summary by CodeRabbit

  • New Features
    • Added monitoring for deferred file-descriptor closes and closes forced while an operation is still outstanding, making close-path behavior more visible.
    • Added the forced-close counter to time-series results, where it is expected to remain zero.
  • Updates
    • Results now use schema version 5.18 to include the new counters and series data.

Walkthrough

The change adds deferred and forced io_uring descriptor-close counters to debug-variable collection, validation tallies, and series output. It documents the counters and advances the report schema to 5.18. Celeris dependency pins and schema-version test expectations are updated.

Changes

Close-path counter reporting

Layer / File(s) Summary
Counter fields and debug-variable source
validation/properties/snapshot.go, validation/refapp/internal/debugvars/debugvars.go, servers/celeris/go.mod, validation/refapp/*/go.mod
The snapshot adds fields for deferred and forced closes. The reference app publishes both debug variables, and Celeris dependency pins are updated.
Counter collection and series output
validation/checker/evaluator.go, validation/checker/poll.go, validation/checker/must_stay_zero_test.go, validation/series.go, validation/series_test.go
The checker parses and tallies both counters. The series writes the forced counter, and the must-stay-zero test includes it.
Counter registry and schema version
report/engine_counter.go, report/schema.go, report/schema_test.go, validation/runner_test.go, mage_bench_sutenv_test.go
The registry describes the close-path counters. The report schema advances to 5.18, and related tests expect the new version.

Priority: ⬇️ Low

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

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
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.
Negative Control For Changed Checks ✅ Passed The PR changes files under validation/, report/, and mage_bench_sutenv_test.go. The full description names negative controls: stale schema pins fail when SchemaVersion is 5.18 but pins remain …
Title check ✅ Passed The title follows the conventional-commit format and accurately states the dependency pin, counter propagation, and schema update.
Description check ✅ Passed The description directly explains the dependency pin, counter propagation, schema change, validation evidence, and test status.

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

@FumingPower3925
FumingPower3925 merged commit 38779a4 into main Sep 28, 2026
34 checks passed
@FumingPower3925
FumingPower3925 deleted the chore/repin-celeris-dbbaaee branch September 28, 2026 10:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant