Repository navigation
Conversation
…y model Local campaign branch C (spec-C.md). A new SyncIndexer backend, `indexer::arena_c::ArenaIndexC`, hosted by ThreadPoolIndexer and selectable in mooncake_bench as `arena-c`. CRTC is unchanged. Storage (design ideas adapted from SMG's chain index, smg-project/smg#2814, Apache-2.0; clean-room implementation): - runs in a segmented slab, named by u32 ids, each a window into a shared hash array in a u32-addressed word arena with size-class free lists; - children at any offset, keyed by (offset, head) in open-addressing tables (claims to 3/4 load, rebuilds to 3/8, same-key tombstone reuse); - splits only past 16 partial holders, sharing the array and leaving forwarding records; no splits on divergence; - per-rank lane maps with 16-byte (run, offset) slots, resolved through DEAD, forwarding and the external-hash check, with path compression. Concurrency is CRTC's: sticky lanes, per-run shape gate plus state lock, plan-then-validate writers with an end-child re-probe for appends, readers under the state read lock (ROOT's table read lock-free under the pin), and every id, array, table and chunk reused only through a per-lane FreeBatch deferred to crossbeam-epoch. Reclamation: eager unlink with try-lock, pending retries on idle, and a volume sweep. Tests: unit tests per spec invariant, the CRTC race tests ported, the shared harness suite, the shared KvIndexerInterface matrix with an arena_c variant, an adapted thread-exit test, and loom models with negative controls in the standalone lib/kv-router/loom-arena-c workspace. Bench: `mooncake_bench arena-c --num-event-workers N`, the indexer_memory `arena-c` backend, and a local-only `mooncake-system-alloc` feature that builds mooncake_bench without the jemalloc global allocator. Written without reading SMG sources. Signed-off-by: PeaBrane <yanrpei@gmail.com>
A store between two planning steps sits at (run, o), just past the blocks it has placed. If other lanes split the run twice meanwhile (at o, then below o) and the first suffix died for lack of holders, forwarding position o hit the dead suffix and the store failed as "a held run died": an unexpected apply error and later unexplained undercounts. Follow position o - 1 instead, which the rank holds, so its suffix is alive, and continue at the end of what the rank holds there. Found by the shared differential with PARTIAL_CAP lowered to 2 (1000 seeds, pool4: 8 unexpected apply errors, 54 unexplained undercounts; now 0). The default cap of 16 cannot split with the harness's two to eight ranks. Also: the cutoff-table growth clamp no longer panics when PARTIAL_CAP is below the minimum table capacity, and the ROOT-retirement test needs no unsafe. Signed-off-by: PeaBrane <yanrpei@gmail.com>
…libc malloc The local glibc variant now builds both campaign benches over the system allocator: mooncake_bench with no global allocator, and indexer_memory's counting allocator over System instead of jemalloc. Signed-off-by: PeaBrane <yanrpei@gmail.com>
⏹️ Dynamo PR CI cancelled — run 38001611155 (attempt 1) on
|
| Other | Jobs |
|---|---|
| dynamo-runtime | ⏹️ 1 |
| planner | ⏹️ 1 |
Failure details
No job failed; the 2 cancelled jobs are not fail-fast or manual cancels: both multi-arch image builds hit the 1h job timeout (The job has exceeded the maximum execution time of 1h0m0s) while still building, with no build error in the log before the timeout. The two gate checks fail only because of these.
⏰ dynamo-runtime / image / Build multi-arch cuda13.0: job exceeded 1h0m0s timeout
Job: dynamo-runtime / image / Build multi-arch cuda13.0 · Failed step: Build and Push Test Image · Logs: gh run view --job 114060878898 -R ai-dynamo/dynamo --log-failed
#128 [linux/amd64 runtime_wheel_builder 5/13] RUN ... maturin build --release --features "kv-indexer,slot-tracker,select-service,mm-routing,ais-forward-pass,request-trace-s3,nvtx" ...
#157 [linux/amd64 runtime 14/19] RUN ... uv pip install /opt/dynamo/wheelhouse/ai_dynamo_runtime*.whl ...
##[error]The operation was canceled.
Annotation: The job has exceeded the maximum execution time of 1h0m0s
The multi-arch runtime image build (step started 22:54, cancelled 23:54 UTC) was still running buildkit stages when the 60-minute job timeout hit; no compile or Docker error precedes the cancel. A rerun of failed jobs is likely enough if the build completes faster with a warm cache.
⏰ planner / Build multi-arch cpu: job exceeded 1h0m0s timeout
Job: planner / Build multi-arch cpu · Failed step: Build and Push Image · Logs: gh run view --job 114060878627 -R ai-dynamo/dynamo --log-failed
#158 53.64 Successfully built /opt/dynamo/dist/nixl/nixl_cu13-1.3.2-cp312-cp312-linux_aarch64.whl
#158 DONE 53.7s
#159 [linux/arm64 runtime_wheel_builder 7/15] COPY deploy/inference-gateway/ext-proc/ ...
#160 [linux/arm64 wheel_builder 4/11] COPY .cargo/ /opt/dynamo/.cargo/
#161 [linux/arm64 runtime_wheel_builder 8/15] COPY deploy/inference-gateway/sidecar/ ...
##[error]The operation was canceled.
Annotation: The job has exceeded the maximum execution time of 1h0m0s
The arm64 half of the multi-arch planner image build (ffmpeg/libvpx, NIXL and runtime wheel stages) was still in progress when the 60-minute job timeout hit; no build error precedes the cancel. A rerun of failed jobs is likely enough if the build completes faster with a warm cache.
For agents
{"pr": 16036, "run_id": 38001611155, "run_attempt": 1, "head_sha": "70319b9f83bd7d21e7e1391b921222348eecf13f",
"failures": [
{"job": "dynamo-runtime / image / Build multi-arch cuda13.0", "job_id": 114060878898, "failed_step": "Build and Push Test Image", "signature": "job exceeded maximum execution time of 1h0m0s (cancelled)", "tests": [], "log_cmd": "gh run view --job 114060878898 -R ai-dynamo/dynamo --log-failed"},
{"job": "planner / Build multi-arch cpu", "job_id": 114060878627, "failed_step": "Build and Push Image", "signature": "job exceeded maximum execution time of 1h0m0s (cancelled)", "tests": [], "log_cmd": "gh run view --job 114060878627 -R ai-dynamo/dynamo --log-failed"}
]}Posted automatically by Devin for run 38001611155. Updated on every full-CI run of this PR.
Status (2026-10-09). John Thomson is taking this over. Exploratory draft, not for merge as is. This is "Branch C" of the follow-up indexer redesign, the proposed direction; Branch B (#16035) is its SMG-style sibling. The decision rule: C becomes canonical if it is within noise of B or better and passes the same gates; B wins only at ≥~10% better sustained throughput; either must beat improved CRTC (
rupei/crtc-volume-sweep). Details are in the handoff gist'sfollowups-2026-10-09.md; the full spec isspec-C-arena-lanes.md. Outcome: the parked canonical arena branch. The gate passed and the microbench is below. Neither arena branch beats the improved CRTC (rupei/crtc-volume-sweep) by enough to justify a new stack now; if the arena direction resumes, it resumes from this branch (with B's optimistic reads for reads under write load), after a DEP.Summary
A new
SyncIndexerbackend,indexer::arena_c::ArenaIndexC, hosted byThreadPoolIndexerand selectable inmooncake_benchasarena-c. CRTC is unchanged. It takes the arena's storage and keeps Dynamo's concurrency model.LaneLookupholds,repair.rsandEdgeIndex.KvIndexerInterfacematrix with anarena_cvariant, an adapted thread-exit test, and loom models with negative controls in the standalonelib/kv-router/loom-arena-cworkspace.mooncake_bench arena-c --num-event-workers N, theindexer_memoryarena-cbackend, and a localmooncake-system-allocfeature that builds the bench without jemalloc.Validation
Correctness gate (independent reviewer): pass.
known_grouped_removal_overcountand the harness self-test pass.arena_ctests, the thread-exit test, and 4 loom models with negative controls pass.HashLifecycle; add a unit test for the append version check.