0.3.74: adopt ciris-server v0.5.205 — the read pool, and the SHA pin becomes a tag - #85
Merged
Merged
Conversation
…becomes a tag The substrate moves hard and all of it transitively through the one pin: persist v42.1.0 -> v44.0.0 (across two majors), edge v21.1.0 -> v23.0.0 (two majors), verify v15.0.0 -> v15.1.0, leviculum v0.25.0+ciris.1 -> v0.26.0+ciris.1. THIS IS THE OTHER HALF OF OUR OWN MEASUREMENT. CIRISStatus#69 -> CIRISServer#575 is where this node reported GET /v1/identity going p50 1.1 ms -> 780 ms inside a burst at 6.9% duty with zero non-200s, and CIRISPersist#829 is where that bottomed out: every read ran inline-sync on the request-serving runtime behind ONE connection mutex, so two readers serialised no matter how their callers were phased. v0.5.204 (adopted in 0.3.70) de-phased the colliding loops — the part a scheduler fix can reach. persist v43.1.0, carried by v44, reaches the rest: one writer connection plus a pool of read-only WAL connections, every SQL call and the wait for its connection dispatched off the tokio worker onto the blocking pool. This node is the two-reader case by construction: the roster walks `list_scores` over its own corpus while the same runtime serves the status API. THE WORKER CAP FROM 0.3.73 IS RE-AIMED BY ITS OWN EVIDENCE. #578 capped worker threads; #577's own table shows `ciris-edge-tran` flat at 2/2 on both a 32-core and a 4-core host, so the 64 unnamed `tokio-rt-worker` threads it counted were never edge's workers. What was uncapped is `max_blocking_threads` — tokio's default 512 PER RUNTIME — and the read pool is what makes that pool load-bearing. `node_runtime` now caps it at 32 with a hard floor of 16, because `block_in_place` draws its replacement worker from that same pool: starve it and the runtime wedges rather than slows. We call `node_runtime::build` and inherit the cap and set no override, so DEPLOY.md §2 is intact — the tuning env var is an upstream escape hatch we do not use. Neither source break touches us: `register_observed_claim` now names what a claim PROVED (CIRISEdge#582) and `BlobChunkSource` changed shape; no call site here for either, and `AvDispatcherError::Congested` breaks no exhaustive match of ours. AND THE PIN IS A TAG AGAIN. 0.3.73 carried #576 + #578 by SHA because this is the node that measured the stalls they fix and waiting for a release meant the evidence going stale on the box that produced it. That debt is paid in the direction it was promised rather than inherited: `git merge-base --is-ancestor 2d9d9fa v0.5.205` confirms the same code arrives reproducibly, moves under `cargo update -p ciris-server`, and survives a force-push to main. Verified: cargo build --release --locked clean across both persist majors; 131 tests green; clippy --all-targets -D warnings clean; fmt clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhKY2YZNH2LzNTQVwgjnBh
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adopts ciris-server v0.5.205. Substrate, all transitive through the one pin: persist v42.1.0 → v44.0.0 (across two majors), edge v21.1.0 → v23.0.0 (two majors), verify v15.0.0 → v15.1.0, leviculum v0.25.0+ciris.1 → v0.26.0+ciris.1.
The other half of our own measurement
CIRISStatus#69 → CIRISServer#575 is where this node reported
GET /v1/identitygoing p50 1.1 ms → 780 ms inside a burst at 6.9% duty with zero non-200s. CIRISPersist#829 is where that bottomed out: every read ran inline-sync on the request-serving runtime behind one connection mutex, so two readers serialised no matter how their callers were phased.v0.5.204 (adopted in 0.3.70) de-phased the colliding loops — the part a scheduler fix can reach. persist v43.1.0, carried by v44, reaches the rest: one writer connection plus a pool of read-only WAL connections, every SQL call and the wait for its connection dispatched off the tokio worker onto the blocking pool.
This node is the two-reader case by construction — the roster walks
list_scoresover its own corpus while the same runtime serves the status API.The worker cap from 0.3.73 is re-aimed, by its own evidence
#578 capped worker threads. #577's own table shows
ciris-edge-tranflat at 2/2 on both a 32-core and a 4-core host, so the 64 unnamedtokio-rt-workerthreads it counted were never edge's workers. What was uncapped ismax_blocking_threads— tokio's default 512 per runtime — and the read pool is exactly what makes that pool load-bearing.node_runtimenow caps it at 32 with a hard floor of 16, becauseblock_in_placedraws its replacement worker from that same pool: starve it and the runtime wedges rather than slows.We call
node_runtime::buildand inherit the cap, setting no override. DEPLOY.md §2 is intact — the tuning env var is an upstream escape hatch we do not use, and the default applies unset.Breaking changes: neither touches us
register_observed_claimnow names what a claim PROVED (CIRISEdge#582 — signing a holding claim required holding nothing, so Sybils could vote honest copies into deletion) andBlobChunkSourcechanged shape. No call site here for either;AvDispatcherError::Congestedbreaks no exhaustive match of ours. Confirmed by grep and by the compiler.The SHA pin goes back to a tag
0.3.73 carried #576 + #578 by SHA because this is the node that measured the stalls they fix, and waiting for a release meant the evidence going stale on the box that produced it. That debt is paid in the direction it was promised rather than inherited:
Same code, now reproducible from a tag, movable by
cargo update -p ciris-server, and safe against a force-push to main.Verification
cargo build --release --locked— clean, across both persist majorscargo test --locked— 131 passed, 0 failedcargo clippy --all-targets --locked -- -D warnings— cleancargo fmt --check— clean🤖 Generated with Claude Code
https://claude.ai/code/session_01HhKY2YZNH2LzNTQVwgjnBh