Skip to content

v0.1.7: competitive result against v0.1.6 behind FUSE — mount and first-read latency on matched semantics #207

Description

@yifanxuaaa

Status: Not started; no measurement exists on either side for the number this issue is about. Filed 2026-09-20 from the #205/#190 attribution round (ledger L53).

Related: #179 (projection/runtime, the FUSE design this depends on) · #205 (where the gap was measured) · #190 (read path) · #70 (FUSE request overhead, older numbering).

The requirement

The replacement core must be competitive with v0.1.6 behind a FUSE projection, measured on matched semantics. Today it is not comparable, and the reason is a scope difference rather than a demonstrated slowness — so the first deliverable is a matched comparison, not an optimization.

Why this is not yet a comparison

v0.1.6's recorded create phase — create_workspace_session, the FUSE mount — is 9–11 ms, and it is flat across history depth (issue154/final-complete-matrix.json):

case create (mount) commit
boundary-cycle k10 → k100 11.14 → 9.14 ms 3.19 → 3.11 ms
large-hotset k10 → k100 10.17 → 9.77 ms 3.44 → 3.06 ms
namespace-inode k10 → k100 9.90 → 9.82 ms 4.31 → 4.15 ms

That call materialises no content: it pins the branch, creates a state dir, attaches the projection and reads initial tree metadata (crates/layerfs-workspace/src/lifecycle.rs:452). Construction on the legacy side happens inside Commit/push.

The replacement core, by contrast, pays eagerly and inside the measured operation: at stride10 content 1.585 s, filesystem 5.146 s, accept_loop 8.820 s — for work the FUSE design defers to first read.

  v0.1.6 mount  = branch pin + dir + attach + tree-metadata read   ->  9-11 ms
  core (today)  = construct every changed path + rebuild + publish ->  1.04-5.15 s / state
  v0.1.6 first read after mount                                    ->  NEVER MEASURED

So "9–11 ms vs 1–5 s" measures a lazy mount against an eager materialisation, and the decisive half is missing on both sides. v0.1.6's historical_access family is exactly the missing operation — mount a retained state, perform declared reads — and it declares performance N/A in all six cases. No read-after-history case has ever been run on the core either.

Acceptance criteria

  1. A core FUSE-backed projection exists per v0.1.7 co-design pair 1: projection and runtime — FUSE against the workspace accumulator #179 and can be measured on the retained-history corpus.
  2. A mount node, so the core has a direct counterpart to v0.1.6's 9–11 ms. Expectation from measured neighbours (store.create 4–5 ms) is single-digit to low-double-digit ms; that is an expectation to test, not a number to claim.
  3. First read after mount, measured, with the read fraction declared — the fraction of the stored history the workload actually touches. This is the number that decides the trade and it currently exists nowhere.
  4. A matched v0.1.6 figure for the same operation (its deferred read cost), or an explicit statement that the comparison is unmatched and no speed claim is made.
  5. Both axes reported where the design trades space for time, per the owner's standing ruling.

The condition the requirement must be stated with

FUSE relocates this cost; it does not delete it. Ingest still has to construct and admit whatever it serves. The trade is decided by the read fraction:

workload shape expected outcome
reads a small fraction of what it stores FUSE wins — v0.1.6's shape
reads most of what it stores FUSE loses — same construction, plus fault/round-trip overhead

This lane's history-stride1 row is the second shape (904,143 path-states, 4,936,693,030 bytes of cumulative logical history, 217,646 changed paths). So "competitive with v0.1.6" is only meaningful once the read fraction is fixed; the honest target is a crossover curve, not a single number.

What must not happen

  • No cost moved into setup to make the timed region look fast. Deferring construction to read time is legitimate design; moving it outside the timer is not. The rule is the same as the harness's: if a phase's work is going to happen, the phase that is measured must pay for it.
  • No invented cold stance, no pre-touched inputs, no shrunk selection, and no comparison against a v0.1.6 number measured on a different corpus or a different operation.
  • No percentage or shortfall claim from unmatched arithmetic. The historical 11,370,679,212 ns is v0.1.6's Commit, excludes its fixture install and workload exec, and is not a matched figure.
  • Preserve authentication, bounds, error/visibility behaviour and the single construction worker.

Open questions for the owner

  1. Is the core's eager filesystem cost intended? It is what makes the Store dedupe a whole history in one operation — this lane's actual claim — so it is not obviously a defect.
  2. Which read fraction defines "competitive"? Without a ruling the requirement cannot be satisfied or failed.
  3. Does the v0.1.6 side get re-measured for the deferred read (a matched arm), or is the comparison declared unmatched and closed as descriptive only? The scaling handoff currently says do not rerun v0.1.6 for the v0.1.7: retained-history read optimizations and remaining qualification gaps #190 continuation; that constraint needs an explicit exception if criterion 4 is to be met.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions