Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
326 commits
Select commit Hold shift + click to select a range
e039029
docs(raft): qualify registered commands and record next CG gaps
forhappy Oct 30, 2026
7a79511
feat(raft): dispatch registered queries with exact cell observations
forhappy Oct 30, 2026
fa609dc
docs(raft): record registered query qualification and next CG gap
forhappy Oct 30, 2026
8723db2
feat(raft): route registered cell queries through catalog sessions
forhappy Oct 30, 2026
9f48a66
docs(raft): qualify catalog-routed queries and prioritize command dis…
forhappy Oct 30, 2026
f93c690
feat(raft): retain routed command producers through exact settlement
forhappy Oct 30, 2026
7d5e01d
fix(raft): bound routed command error return size
forhappy Oct 30, 2026
1f014f4
test(raft): use domain-aware command cancellation polling
forhappy Oct 30, 2026
f8f0951
docs(raft): qualify routed commands and prioritize controller integra…
forhappy Oct 30, 2026
eb99a24
feat(raft): replicate physical cell groups over shared TLS transport
forhappy Oct 30, 2026
8b70fa9
docs(raft): qualify physical group transport and prioritize command o…
forhappy Oct 30, 2026
61aa775
feat: drive shared cell-group events with a node controller
forhappy Oct 30, 2026
ee684c3
test: reuse the shared physical apply fault fixture
forhappy Oct 30, 2026
4e9063e
docs: record the CG-04 event controller checkpoint
forhappy Oct 30, 2026
8c615ac
feat: retain shared commands beyond caller response lifetime
forhappy Oct 30, 2026
1061734
docs: record qualified CG-04 command ownership checkpoint
forhappy Oct 30, 2026
bd3069d
feat: enroll cells through the shared node controller
forhappy Oct 30, 2026
f77d0d9
style: remove redundant enrollment retry expression
forhappy Oct 30, 2026
0ab9cee
docs: record qualified shared enrollment checkpoint
forhappy Oct 30, 2026
3c297a0
feat: route shared cell queries over bounded TLS lanes
forhappy Oct 30, 2026
201ffaf
fix: fence query admission when host registration drops
forhappy Oct 30, 2026
da79a69
fix: assign query sequences in peer send order
forhappy Oct 30, 2026
02f7291
docs: record qualified shared query RPC checkpoint
forhappy Oct 30, 2026
c25f0d9
feat: route nonmember cell queries with revocable read grants
forhappy Oct 30, 2026
e0be9f5
docs: record qualified nonmember query checkpoint
forhappy Oct 30, 2026
c41d856
feat: share bounded cell-group route hints across dispatch
forhappy Oct 30, 2026
06652e3
test: use execution-domain timeout for route cache fixture
forhappy Oct 30, 2026
40aa18b
docs: record qualified bounded route-cache checkpoint
forhappy Oct 30, 2026
5fd4443
feat: route shared commands with explicit write authority
forhappy Oct 30, 2026
8852b70
docs: record qualified remote command checkpoint
forhappy Oct 30, 2026
0fe665d
feat: route enrollment through shared write ownership
forhappy Oct 30, 2026
3056c4b
docs: record qualified remote enrollment checkpoint
forhappy Oct 30, 2026
fbc1505
feat: inspect shared-cell receipts without replaying commands
forhappy Oct 30, 2026
7e09e79
docs: record qualified shared receipt lookup and next CG gaps
forhappy Oct 30, 2026
4326421
feat: register shared Raft groups under controller ownership
forhappy Oct 30, 2026
d847a7b
docs: record qualified dynamic group registration and next CG gaps
forhappy Oct 30, 2026
9fff8cb
feat: quarantine failed cell groups without stopping healthy groups
forhappy Oct 30, 2026
41121a7
test: await group quarantine at the runtime authority boundary
forhappy Oct 30, 2026
acb3ee4
docs: qualify group quarantine and prioritize bounded provisioning
forhappy Oct 30, 2026
9d8cb9b
feat: provision assigned cell groups under joined bounded ownership
forhappy Oct 30, 2026
69e41e8
fix: bound provisioning cache paths and reuse fault fixtures
forhappy Oct 30, 2026
2e8dd8e
docs: complete CG-04 scoped execution qualification
forhappy Oct 30, 2026
b15da41
feat: capture and stream complete cell-group checkpoint sources
forhappy Oct 30, 2026
b675f01
docs: record CG-05 checkpoint source qualification
forhappy Oct 30, 2026
394be03
feat: verify and atomically install cell-group checkpoints
forhappy Oct 30, 2026
cb164e0
fix: reverify cached checkpoint destination images
forhappy Oct 30, 2026
7e4f54b
docs: record CG-05 checkpoint receiver qualification
forhappy Oct 30, 2026
096cfb1
feat: bind group checkpoint restore to Raft Ready persistence
forhappy Oct 30, 2026
d174d4e
docs: record CG-05 Raft snapshot owner qualification
forhappy Oct 30, 2026
742b1e6
feat: publish retained group checkpoints without discarding log suffixes
forhappy Oct 30, 2026
1c05a18
docs: record CG-05 local checkpoint and native catch-up qualification
forhappy Oct 30, 2026
ceb7ed3
feat: stream authenticated cell-group checkpoints over TLS
forhappy Oct 30, 2026
4c098ef
docs: qualify CG-05 checkpoint transport and record next gaps
forhappy Oct 31, 2026
c27dfb4
feat: checkpoint active cell groups at controller apply boundaries
forhappy Oct 31, 2026
70d5244
docs: record CG-05 checkpoint policy evidence and remaining gaps
forhappy Oct 31, 2026
1814b27
feat: persist whole-group membership and fence leadership handoff
forhappy Oct 31, 2026
efb00dd
docs: qualify group membership and prioritize fresh learner recovery
forhappy Oct 31, 2026
0c3769e
feat: authorize whole-group learner seeds with fresh quorum
forhappy Oct 31, 2026
9185e8c
docs: qualify learner seed sources and prioritize destination bootstrap
forhappy Oct 31, 2026
ab2a308
feat: install authenticated cell-group learner seeds
forhappy Oct 31, 2026
06dda48
docs: qualify learner replacement and prioritize failure gates
forhappy Oct 31, 2026
de552f6
test: qualify cell-group seed refusal and voter reconnection
forhappy Oct 31, 2026
7eb32ff
docs: record cell-group seed fault and reconnect qualification
forhappy Oct 31, 2026
3db498e
fix: end checkpoint streams when physical verification fails
forhappy Oct 31, 2026
150df15
docs: record cell-group receiver fault qualification
forhappy Oct 31, 2026
374f981
test: qualify cell-group seed persistence and revocation
forhappy Oct 31, 2026
3ea90fb
test: report seed persistence cuts through native output
forhappy Oct 31, 2026
b80c807
docs: record seed persistence recovery qualification
forhappy Oct 31, 2026
b997a48
test: recover cell-group seeds after process kills
forhappy Oct 31, 2026
035449f
docs: record cell-group seed process crash qualification
forhappy Oct 31, 2026
5f30cc6
test: resume explicit joint consensus after process loss
forhappy Oct 31, 2026
ef100f0
docs: record explicit joint-consensus restart qualification
forhappy Oct 31, 2026
a2036e5
test: bound shared-group checkpoint pressure and reader retention
forhappy Oct 31, 2026
646bebf
docs: record bounded checkpoint pressure qualification
forhappy Oct 31, 2026
6e56f21
test: fence interrupted shared-group seed dependencies
forhappy Oct 31, 2026
04c8f9c
docs: record interrupted seed transfer qualification
forhappy Oct 31, 2026
f076731
test: add exact cell-group snapshot acceptance cases
forhappy Oct 31, 2026
997a53b
docs: record cell-group snapshot acceptance gate
forhappy Oct 31, 2026
0847930
test: qualify controller checkpoint shutdown ownership
forhappy Oct 31, 2026
370dcf3
test: keep checkpoint sync selection in its fixture
forhappy Oct 31, 2026
84f032b
docs: record controller checkpoint shutdown qualification
forhappy Oct 31, 2026
5cfa9fb
feat: reclaim node orphans for cell-group seed retry
forhappy Oct 31, 2026
76dcfc2
docs: qualify cell-group orphan retry
forhappy Oct 31, 2026
bad0387
fix: schedule checkpoints while SQL apply is full
forhappy Oct 31, 2026
6d2e0c3
docs: qualify checkpoint scheduling under SQL load
forhappy Oct 31, 2026
e0550ac
fix: preserve mixed-size completion admission
forhappy Oct 31, 2026
3888678
docs: close CG-05 native snapshot qualification
forhappy Oct 31, 2026
650fc63
feat: archive complete cell-group checkpoints
forhappy Oct 31, 2026
9b23bce
docs: record group archive checkpoint gate
forhappy Oct 31, 2026
7a29c2a
feat: replay committed cell-group archive tails
forhappy Oct 31, 2026
e774ee4
docs: record committed-tail recovery gate
forhappy Oct 31, 2026
14955f2
feat: isolate cell-group archive recovery stores
forhappy Oct 31, 2026
af0b61e
docs: record isolated archive recovery gate
forhappy Oct 31, 2026
a5d506a
feat: protect cell-group archive publication
forhappy Oct 31, 2026
8734847
fix: unwrap reconciled archive hold
forhappy Oct 31, 2026
6e9e05b
docs: record protected archive publication gate
forhappy Oct 31, 2026
df0ba1f
feat: bind archive identity and capture stable cuts
forhappy Oct 31, 2026
8bfd5b7
docs: record archive binding qualification
forhappy Oct 31, 2026
0247fb8
feat: own cell-group archive publication
forhappy Oct 31, 2026
a4f3754
test: load archive fixture once
forhappy Oct 31, 2026
7914177
fix: keep checkpoint source refusals strict
forhappy Oct 31, 2026
b8b1c7c
docs: record controller archive qualification
forhappy Oct 31, 2026
08d5a10
test: qualify cell-group archives with RustFS
forhappy Oct 31, 2026
3158dc5
fix: hash evidence with system Python
forhappy Oct 31, 2026
d739bf7
test: scope shared S3 fixture lint allowance
forhappy Oct 31, 2026
261ccaf
docs: record local RustFS qualification
forhappy Oct 31, 2026
dba41bd
feat: prove local command S3 durability
forhappy Oct 31, 2026
2b524f2
fix: box retained S3 response proofs
forhappy Oct 31, 2026
db78d77
fix: share S3 route authority retention
forhappy Oct 31, 2026
2e04d75
test: enforce namespace S3 response minimums
forhappy Oct 31, 2026
2bf0dd2
test: pass namespace policy through fixtures
forhappy Oct 31, 2026
3d564f3
style: format namespace archive fixture
forhappy Oct 31, 2026
ab1f022
docs: record S3 command qualification
forhappy Oct 31, 2026
cc7171d
feat: prove S3 enrollment durability
forhappy Oct 31, 2026
c2801b6
test: avoid enrollment fixture allocations
forhappy Oct 31, 2026
f335320
docs: record S3 enrollment qualification
forhappy Oct 31, 2026
7e1d93a
feat: prove S3 receipt lookup results
forhappy Oct 31, 2026
214a1a1
fix: scope receipt proof catalog checks
forhappy Oct 31, 2026
59619e0
fix: bound S3 proof checks by caller deadline
forhappy Oct 31, 2026
cde0eea
test: observe queued S3 lookup cancellation
forhappy Oct 31, 2026
f540dd3
docs: record S3 receipt qualification
forhappy Oct 31, 2026
9eb958e
feat: retain remote S3 output proofs
forhappy Oct 31, 2026
000e737
fix: scope retained reply ownership
forhappy Nov 1, 2026
7d433bd
fix: resolve remote fixture router
forhappy Nov 1, 2026
566e2e0
fix: encode the probe operation length
forhappy Nov 1, 2026
79d6d1a
test: observe TLS reader buffering
forhappy Nov 1, 2026
32bdcd2
test: hold TLS reads during physical writes
forhappy Nov 1, 2026
7b69250
test: measure partial reply observations
forhappy Nov 1, 2026
25938fd
test: fill the physical reply socket window
forhappy Nov 1, 2026
debdc30
test: account for archive readiness gauges
forhappy Nov 1, 2026
ff216de
docs: record remote S3 delivery qualification
forhappy Nov 1, 2026
66aa95e
feat: gate local compaction on archive coverage
forhappy Nov 1, 2026
ea99531
fix: bind archive policy and capture exact roots
forhappy Nov 1, 2026
93b5106
fix: drain checkpoint admission before archive policy
forhappy Nov 1, 2026
a86f29e
test: report archive publication wait status
forhappy Nov 1, 2026
8dfe9ff
fix: use valid archive policy operation
forhappy Nov 1, 2026
20d30c0
docs: record archive compaction qualification
forhappy Nov 1, 2026
7932360
test: close checkpoint admission during activation
forhappy Nov 1, 2026
ab0abf2
fix: own archive activation through storage
forhappy Nov 1, 2026
4bd5eb5
docs: record archive activation qualification
forhappy Nov 1, 2026
c2759d7
feat: admit retained group logs before callbacks
forhappy Nov 1, 2026
2df640c
fix: use Raft configuration accessors
forhappy Nov 1, 2026
e090757
fix: read borrowed Raft configuration flag
forhappy Nov 1, 2026
1a89708
refactor: keep group storage handles compact
forhappy Nov 1, 2026
b36ab33
fix: revoke authority before log bookkeeping
forhappy Nov 1, 2026
4e05c21
test: prove log lease and joint progress ownership
forhappy Nov 1, 2026
5238b9a
test: isolate lease and byte admission boundaries
forhappy Nov 1, 2026
462db26
test: await exact checkpoints on followers
forhappy Nov 1, 2026
ad73f03
test: construct snapshot futures off poll frame
forhappy Nov 1, 2026
a6e8017
docs: record retained-log qualification
forhappy Nov 1, 2026
0ecd34d
test: exercise physical group log reclamation
forhappy Nov 1, 2026
2d9be1b
test: cover serving after retained log recovery
forhappy Nov 1, 2026
fae2f9e
test: read retained images in bounded chunks
forhappy Nov 1, 2026
51a846b
test: preserve live checkpoint rollback refusal
forhappy Nov 1, 2026
58d6559
test: release completed archive verification
forhappy Nov 1, 2026
9e7246b
fix: parse interleaved reclamation observations
forhappy Nov 1, 2026
ea2717b
test: use project reclamation diagnostics
forhappy Nov 1, 2026
37f3def
test: share archive store fixture modules
forhappy Nov 1, 2026
ea2f802
test: scope reclamation to archive harness
forhappy Nov 1, 2026
7741e40
test: expose archive scenario to target
forhappy Nov 1, 2026
8ffc843
docs: qualify physical group log reclamation
forhappy Nov 1, 2026
dc0ad3c
test: enforce complete group S3 dependencies
forhappy Nov 1, 2026
60170a7
docs: qualify whole-group archive dependencies
forhappy Nov 1, 2026
cfbeaab
test: bound quorum during full S3 outages
forhappy Nov 1, 2026
b0e2dba
test: count the registered log inventory
forhappy Nov 1, 2026
1159e93
test: await S3 data readiness after restart
forhappy Nov 1, 2026
8e5ca2f
docs: qualify bounded quorum during S3 outage
forhappy Nov 1, 2026
6266212
feat: fence exact cell-group recovery intents
forhappy Nov 1, 2026
65c5176
perf: box rare directory recovery locks
forhappy Nov 1, 2026
9f3b5b8
docs: qualify group recovery fencing barrier
forhappy Nov 1, 2026
7052d21
feat: prepare fresh-history group recovery
forhappy Nov 1, 2026
973cad3
docs: qualify fresh group recovery preparation
forhappy Nov 1, 2026
12944b7
feat: activate recovered cell-group quorums
forhappy Nov 1, 2026
2c4326d
fix: retry stale receipt observations
forhappy Nov 1, 2026
e6e9072
test: recover registered cell-group receipts
forhappy Nov 2, 2026
f11e281
Merge remote-tracking branch 'origin/main' into codex/shared-cell-groups
forhappy Nov 2, 2026
820fa95
test: restore receipts from archived LTX tails
forhappy Nov 2, 2026
9a0bad9
test: reuse shared transport fixture directly
forhappy Nov 2, 2026
1e45709
docs: record recovered receipt qualification
forhappy Nov 2, 2026
131b4e6
test: add shared-group Docker recovery drill
forhappy Nov 2, 2026
c5231b6
fix: bind drill voters to advertised addresses
forhappy Nov 2, 2026
503abd3
fix: snapshot Docker drill configuration via API
forhappy Nov 2, 2026
f8aacd0
test: verify current recovered receipt versions
forhappy Nov 2, 2026
e32115a
docs: record Docker-fenced group recovery
forhappy Nov 2, 2026
b29fb32
docs: close cell-group archive and recovery gate
forhappy Nov 2, 2026
783c270
feat: index due cell effects in group roots
forhappy Nov 2, 2026
dfdeb98
feat: run effects on shared cell groups
forhappy Nov 2, 2026
e490183
test: qualify shared effects on RustFS
forhappy Nov 2, 2026
e8edfd1
test: preserve outcomes on cache cleanup failure
forhappy Nov 2, 2026
8a4c5ae
test: preserve lane heads in apply fixtures
forhappy Nov 2, 2026
4ea70e4
fix: retain committed outputs during S3 fencing
forhappy Nov 2, 2026
3ce0a93
docs: close shared effects qualification
forhappy Nov 2, 2026
05efe65
feat: capture shared commands before polling
forhappy Nov 2, 2026
5e7aadb
feat: bind cells through shared namespace host
forhappy Nov 2, 2026
51d136f
fix: release manifest pins on engine close
forhappy Nov 2, 2026
110b7a4
docs: review closed-log pin release baseline
forhappy Nov 2, 2026
66d5ea6
feat: page physical group directory inventory
forhappy Nov 2, 2026
c54307c
docs: review group inventory source baseline
forhappy Nov 2, 2026
f50b99a
feat(raft)!: advance shared-group cutover
forhappy Nov 3, 2026
fc4a8d3
feat(raft)!: route shared cell queries
forhappy Nov 3, 2026
41ab8b4
feat(raft)!: port counter to shared groups
forhappy Nov 3, 2026
9df1389
chore: merge origin/main into shared groups
forhappy Nov 3, 2026
2e40013
docs(raft): record merged-source qualification
forhappy Nov 3, 2026
e1454a9
fix(raft): fence shared membership delivery
forhappy Nov 3, 2026
15e6da1
feat(raft): own managed shared startup
forhappy Nov 3, 2026
b9be4de
docs(raft): scope remaining group MVP gates
forhappy Nov 3, 2026
ddf19de
feat(raft): bootstrap managed shared groups
forhappy Nov 3, 2026
e8f9352
docs(raft): qualify cold managed startup
forhappy Nov 3, 2026
004d105
fix(raft): reconcile uncertain group settlement
forhappy Nov 3, 2026
824e0a2
fix(raft): own managed maintenance proofs
forhappy Nov 4, 2026
5e48446
feat(raft): expose guarded group controls
forhappy Nov 4, 2026
f644d9d
feat(raft): own recovered node startup
forhappy Nov 4, 2026
4bdb6c5
docs: record public recovery qualification
forhappy Nov 4, 2026
d04471d
feat: port perf runners to cell groups
forhappy Nov 4, 2026
3dc6e25
feat(raft): own live extent collection
forhappy Nov 4, 2026
d268cf0
fix(raft): bound warm archive reuse
forhappy Nov 4, 2026
8c0a42f
perf(raft): reuse owned workspace barriers
forhappy Nov 4, 2026
41a6784
feat(raft): archive dynamically attached groups
forhappy Nov 4, 2026
acd56a9
feat(raft): seed managed learners through S3
forhappy Nov 4, 2026
9070eb1
feat(raft): retire abandoned seed uploads
forhappy Nov 4, 2026
29f277d
fix(raft): recover quarantined group voters
forhappy Nov 4, 2026
6b70a53
fix(raft): own managed recovery replay
forhappy Nov 5, 2026
3ccc3e5
fix(raft): bound member observation waits
forhappy Nov 5, 2026
3226640
feat(raft)!: route SDK commands to leaders
forhappy Nov 5, 2026
e25384d
fix(raft): retry movement leader observation
forhappy Nov 5, 2026
1b3eac2
fix(raft): reduce shared-host lint failures
forhappy Nov 5, 2026
a235627
ci: report dead code as warnings
forhappy Nov 5, 2026
2f92a2c
feat(raft)!: route ingress without a replica
forhappy Nov 5, 2026
e593315
feat(raft)!: route SDK cell enrollment
forhappy Nov 5, 2026
8c7e1d4
fix(raft): refresh managed ingress routes
forhappy Nov 5, 2026
5e2171c
feat(raft): provision managed namespace standby
forhappy Nov 5, 2026
9b98d84
feat(raft): provision the first managed group
forhappy Nov 5, 2026
b75452f
feat(raft): provision managed group archives
forhappy Nov 5, 2026
31d9d09
feat(raft): qualify managed daemon startup
forhappy Nov 5, 2026
6bcf55f
test(raft): qualify daemon voters on RustFS
forhappy Nov 5, 2026
6f52a8d
feat(raft): expose first group provisioning
forhappy Nov 5, 2026
a2cce6e
feat(raft): root first group archive intent
forhappy Nov 5, 2026
557ec10
feat(raft): gate first group startup on quorum
forhappy Nov 5, 2026
9d3edc5
feat(raft): wait for rooted first group archive
forhappy Nov 5, 2026
725214b
fix(raft): refuse quorum reads on retired voters
forhappy Nov 5, 2026
5a97e85
fix(raft): allow explicit recovery subnet
forhappy Nov 5, 2026
66d6bf4
test(raft): verify managed ingress authority
forhappy Nov 5, 2026
5caaebb
docs(raft): record ingress and recovery checks
forhappy Nov 5, 2026
c4e0698
feat(raft): verify shared occupancy and S3 writes
forhappy Nov 5, 2026
7634ac0
test(raft): qualify public ingress authority
forhappy Nov 5, 2026
e8ec7f8
test(raft): qualify feature-off Fleet durability
forhappy Nov 5, 2026
b2a411f
feat(raft): provision managed SQL namespaces
forhappy Nov 5, 2026
314fa2e
test(raft): qualify public managed lifecycle
forhappy Nov 5, 2026
d93302f
docs(raft): show receipt-backed SQL reads
forhappy Nov 5, 2026
ac1c65b
feat(raft): bootstrap SQL namespaces from native CLI
forhappy Nov 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 2 additions & 1 deletion .github/workflows/javascript-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,8 @@ jobs:
- name: Quality and engine boundaries
if: matrix.profile == 'adapters'
run: |
cargo clippy --locked -p cellar-container -p cellar-guest -p cellar-javascript --features cellar-javascript/embed,cellar-javascript/node --all-targets -- -D warnings
# Keep dead code visible during the cell-group cutover.
cargo clippy --locked -p cellar-container -p cellar-guest -p cellar-javascript --features cellar-javascript/embed,cellar-javascript/node --all-targets -- -D warnings --force-warn dead_code
cargo format --check
cargo check-layout
python3 tools/check_native_dependencies.py
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/native-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,8 @@ jobs:
- name: Doctests and Clippy
run: |
cargo test --workspace --exclude cellar-javascript --exclude cellar-rpc-qualification --all-features --doc --locked
cargo clippy --workspace --exclude cellar-javascript --exclude cellar-rpc-qualification --all-targets --all-features --locked -- -D warnings
# Keep dead code visible during the cell-group cutover.
cargo clippy --workspace --exclude cellar-javascript --exclude cellar-rpc-qualification --all-targets --all-features --locked -- -D warnings --force-warn dead_code
- name: Qualify dense filesystem writes and cold recovery
env:
# Match the native campaign while retaining its correctness checks.
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/typed-rpc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ jobs:
cargo test --locked -p cellar-rpc-codegen -- --test-threads=1
python3 tools/python/test_bridge_report.py
python3 -m unittest discover -s tools/perf -p test_python_fleet.py
cargo clippy --locked -p cellar-rpc-qualification --all-targets --features full -- -D warnings
# Keep dead code visible during the cell-group cutover.
cargo clippy --locked -p cellar-rpc-qualification --all-targets --features full -- -D warnings --force-warn dead_code
cargo test --locked -p cellar-rpc-qualification --features full -- --test-threads=1
- name: Finish build writeback before live qualification
run: |
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ console-audit.sqlite*

# Keep new local multi-Raft benchmark evidence out of commits.
/docs/design/multi-raft/evidence/
# Retain historical local evidence at its source-bound paths.
/plans/multi-raft/evidence/

# Reproducible streaming example builds.
/examples/streaming/app.bundle.js*
Expand Down
26 changes: 18 additions & 8 deletions crates/cellar-admin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,14 @@ For an existing managed fleet, add `raft` to its private dashboard configuration
"catalog_prefix": "raft/",
"scope": "bucket",
"managed": true,
"image_storage": "Materialized"
"image_storage": "Materialized",
"group_directory": {
"max_groups": 1000000,
"max_mutations": 1000000,
"max_cached_pages": 64,
"max_cache_bytes": 4194304,
"operation_timeout_ms": 5000
}
}
]
}
Expand Down Expand Up @@ -145,13 +152,16 @@ Graceful node departure adds independent `fleet_evacuate`, `fleet_remove` and
then exclude it, prepare the complete-inventory finalization fence, explicitly
request the exact process stop, and consume its signed joined closure in terminal
removal. The embedding server must additionally configure
`RaftFleetControl::with_removal_verifier` with its private bounded replay store;
extent namespaces additionally require `ArchiveVerifier::with_extent_store`
with a separate exclusively owned, initially empty `NodeExtentStore`. Never
supply a live node's inventory. Each proof freshly downloads and seals the exact
remote extent closure in this scratch owner. Entered physical work retains the
owner after cancellation; a subsequent attempt reconciles scratch only after that
work exits. Physical inventory quarantine still refuses verification.
`RaftFleetControl::with_removal_verifier` with a `FleetGroupArchiveVerifier`.
Its explicit replay options supply private bounded materialized/extent inventories,
page limits and node-shared archive, checkpoint, tail and scratch pools. Never
supply a live node's inventory. Each proof downloads the complete group checkpoint
and replays its contiguous committed tail. An exact acquire intent is journaled
before S3 mutation, and restart restores its original fixed cut and allocation.
Entered physical work retains page/image ownership and memory admission after
cancellation; physical inventory quarantine still refuses verification. Persistent
holds remain retained until an explicit owner can fence users and join their work;
dropping a controller or timing out does not release remote retention.
Standalone existing-root connections cannot perform live proof or dispatch stop.
Status and exact committed receipt reconciliation remain metadata operations.
See the [departure workflow](../../docs/design/multi-raft/fleet-operations/operator-workflows.md#evacuate-and-permanently-remove-a-node)
Expand Down
17 changes: 17 additions & 0 deletions crates/cellar-admin/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ mod cron;
mod events;
mod nodes;
mod raft;
mod raft_first_group;
mod raft_lifecycle;
mod raft_maintenance;
mod raft_nodes;
Expand Down Expand Up @@ -109,6 +110,22 @@ pub fn router(console: Console) -> Result<Router> {
"/fleets/{fleet}/raft/nodes",
post(raft_nodes::register).layer(DefaultBodyLimit::max(16 * 1024)),
)
.route(
"/fleets/{fleet}/raft/namespaces/{namespace}/first-group/standby",
get(raft_first_group::standby),
)
.route(
"/fleets/{fleet}/raft/namespaces/{namespace}/first-group/reserve",
post(raft_first_group::reserve),
)
.route(
"/fleets/{fleet}/raft/namespaces/{namespace}/first-group/publish",
post(raft_first_group::publish),
)
.route(
"/fleets/{fleet}/raft/namespaces/{namespace}/first-group/archive",
post(raft_first_group::archive),
)
.route("/fleets/{fleet}/raft/nodes/{node}", get(raft_nodes::status))
.route(
"/fleets/{fleet}/raft/nodes/{node}/qualify",
Expand Down
177 changes: 177 additions & 0 deletions crates/cellar-admin/raft_first_group.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
// Copyright 2026 Cellar Project Authors. Licensed under Apache-2.0.

//! Bind first-group operations to the authenticated fleet and namespace.
use crate::{
api::ApiError,
raft::{audit_failure, backend, failure, finish, hex_digest, TIMEOUT},
Console, Permission, Principal,
};
use axum::{
extract::{rejection::JsonRejection, Path, State},
response::{IntoResponse, Response},
Extension, Json,
};
use cellar::sdk::fleet_operations::*;
use serde::Serialize;
use std::sync::Arc;

pub(crate) async fn standby(
State(console): State<Arc<Console>>,
Extension(principal): Extension<Principal>,
Path((fleet, namespace)): Path<(String, String)>,
) -> Result<Response, ApiError> {
principal.require(&fleet, Permission::MetadataRead)?;
Ok(match backend(&console, &fleet) {
Ok(control) => match control.first_group_standby(&namespace, TIMEOUT).await {
Ok(value) => Json(value).into_response(),
Err(error) => failure(error),
},
Err(error) => failure(error),
})
}

pub(crate) async fn reserve(
State(console): State<Arc<Console>>,
Extension(principal): Extension<Principal>,
Path((fleet, namespace)): Path<(String, String)>,
body: Result<Json<RaftFleetFirstGroupPlan>, JsonRejection>,
) -> Result<Response, ApiError> {
principal.require(&fleet, Permission::FleetTopology)?;
let Ok(Json(plan)) = body else {
return Ok(failure(RaftFleetFailure::invalid(
"invalid first group plan",
)));
};
submit(
&console,
&principal,
&fleet,
&namespace,
Mutation::Reserve(plan),
)
.await
}

pub(crate) async fn publish(
State(console): State<Arc<Console>>,
Extension(principal): Extension<Principal>,
Path((fleet, namespace)): Path<(String, String)>,
body: Result<Json<RaftFleetFirstGroupPublish>, JsonRejection>,
) -> Result<Response, ApiError> {
principal.require(&fleet, Permission::FleetTopology)?;
let Ok(Json(request)) = body else {
return Ok(failure(RaftFleetFailure::invalid(
"invalid first group confirmation",
)));
};
submit(
&console,
&principal,
&fleet,
&namespace,
Mutation::Publish(request),
)
.await
}

pub(crate) async fn archive(
State(console): State<Arc<Console>>,
Extension(principal): Extension<Principal>,
Path((fleet, namespace)): Path<(String, String)>,
body: Result<Json<RaftFleetFirstGroupMutation>, JsonRejection>,
) -> Result<Response, ApiError> {
principal.require(&fleet, Permission::FleetTopology)?;
let Ok(Json(request)) = body else {
return Ok(failure(RaftFleetFailure::invalid(
"invalid first group archive request",
)));
};
submit(
&console,
&principal,
&fleet,
&namespace,
Mutation::Archive(request),
)
.await
}

#[derive(Serialize)]
#[serde(rename_all = "snake_case")]
enum Mutation {
Reserve(RaftFleetFirstGroupPlan),
Publish(RaftFleetFirstGroupPublish),
Archive(RaftFleetFirstGroupMutation),
}

async fn submit(
console: &Console,
principal: &Principal,
fleet: &str,
namespace: &str,
mutation: Mutation,
) -> Result<Response, ApiError> {
let (plan, request_id, action, valid) = match &mutation {
Mutation::Reserve(plan) => (
plan,
&plan.request_id,
"raft_first_group_reserve",
plan.validate(namespace),
),
Mutation::Publish(request) => (
&request.plan,
&request.request_id,
"raft_first_group_publish",
request.validate(namespace),
),
Mutation::Archive(request) => (
&request.plan,
&request.request_id,
"raft_first_group_archive",
request.validate(namespace),
),
};
if let Err(error) = valid {
return Ok(failure(error));
}
let fingerprint = match serde_json::to_vec(&mutation) {
Ok(bytes) => hex_digest(&bytes),
Err(_) => {
return Ok(failure(RaftFleetFailure::invalid(
"invalid first group request",
)))
}
};
let mut audit = match console.audit.begin(
&format!("raft-{}-{request_id}", plan.catalog_id),
fleet,
&principal.id,
&format!("raft/namespaces/{namespace}/first-group"),
action,
&fingerprint,
) {
Ok(value) => value,
Err(error) => return Ok(audit_failure(error)),
};
let result = match backend(console, fleet) {
Ok(control) => match &mutation {
Mutation::Reserve(plan) => {
control
.reserve_first_group(&principal.id, namespace, plan, TIMEOUT)
.await
}
Mutation::Publish(request) => {
control
.publish_first_group(&principal.id, namespace, request, TIMEOUT)
.await
}
Mutation::Archive(request) => {
control
.initialize_first_group_archive(&principal.id, namespace, request, TIMEOUT)
.await
}
},
Err(error) => Err(error),
};
finish(console, &mut audit, result)
}
Loading
Loading