Module 9 · Chapter III — The engines
Tigris & the fence.
Both engines, however different inside, write the same remote: a Tigris bucket holding two kinds of object — page segments and the commit chain that is the durable log head. Three operations run against it: push rollup coalesces changed pages into a segment, the create-if-not-exists fence picks one winner per commit, and log-head recovery reads the head back. Tap an operation to see which objects it touches.
One remote, two engines, three jobs
graft.roadmap.md · eg.2The remote is where the two engines stop being different. Whatever a Volume is locally — a CubDB keyspace or a Fjall partition — its durable, shareable form is the same: Zstd-framed page segments and a chain of commit objects whose tip is the log head, all in one Tigris bucket reached over OpenDAL (S3-compatible, SigV4). Three operations act on it. Push rollup turns the pages changed since the last upload into one segment. The fence — a conditional create-if-not-exists on the next commit object — lets the bucket itself decide which writer owns each commit, so even two engines or a promoting replica can never fork the log; in the Rust engine this is put_commit with if_not_exists returning ConditionNotMatch on a loss, and in the native engine the matching create-only If-None-Match PUT — the same protocol, two implementations, which is exactly what rung eg.2 verifies. And log-head recovery lets any cold node read the head back from the bucket and start serving, faulting pages on demand. Each is a dive.
The three dives
module 9Push rollup
Many page writes, some repeated, become one segment: the rollup keeps the latest version per page, frames it with Zstd, and uploads a single object. Watch the writes collapse.
Dive 9.2The create-if-not-exists fence
Three different writers race for one commit slot; the bucket grants exactly one. Watch the losers step down and the commit chain stay strictly linear — cross-engine, no fork.
Dive 9.3Log-head recovery
A cold node with nothing local reads the head and commit chain from the bucket, then faults pages from segments on demand — no full download. Step a recovery through.
Build & check
Name the two object kinds in the bucket and what each is for, then map the three operations onto them: which writes segments, which writes a commit object, which reads them back. The bucket layout is the deliverable.
Answer without code: what single object-store primitive lets the remote arbitrate commits across both engines, and why can’t the log fork? “Create-if-not-exists on the commit object” means you have the module.
References & sources
- Echo records
- graft.roadmap.mdeg.2 — Tigris remote backend + commit/fence verified
- graft specs / graft.2.mdthe eg.2 rung spec — the remote, segments, the fence
- graft.design.mdsegments, commit objects, the remote
- graft.engine-split.design.mdboth engines, one shared bucket
- External
- Tigris conditional writescreate-if-not-exists, the fence
- orbitinghail/graftsegments + commit chain on object storage
- Object storagethe durable floor