Skip to content
zit Artifact [cdd2e6adc3]
Login

Artifact [cdd2e6adc3]

Artifact cdd2e6adc38a3273ba1d2f38badd297a5e57503d80a74d20ee11f1d8d499b3c9:

Instance of technote [a04e06fec0] - The open that log paid twice by dmestas on 2026-09-17 14:34:35.
C The\sopen\sthat\slog\spaid\stwice
D 2026-09-17T14:34:35.209
E 2026-09-17T14:34:35.209 a04e06fec0191017e567ff255a7f3b9fb009ebd6
N text/x-markdown
U dmestas
W 2080
# The open that log paid twice

The cold-open issue carried a suspicion: that opening a large repository
costs most of a second, that every read verb pays it, and that the cost was
allocation and validation after the bytes land, since reading the sidecars
took thirty milliseconds. Measured on 0.3.18, the last part was right and the
first two were not.

A warm cache hit reads one sidecar, the repository image, and points at it in
place. The only pass over the whole buffer is a checksum. Read verbs that go
through the open funnel get a view in the time that checksum takes, about
sixty milliseconds on the million-artifact pkgsrc mirror. `info` and
`timeline` already opened that fast.

`zit log` reached past the funnel and called the repository open with the
default options. The default mode was the full record replay, the one meant
for write verbs, which rebuilds a mutable state from every record in the
image. For a symbolic name such as `trunk`, `log` paid it twice: once to
resolve the name, once to walk. Correct output, no error, and 0.94 seconds
before the first row where the image path gives 0.05.

This is the second time a defaulted field has cost a verb a whole derive.
`diff` did the same in an earlier release, and the comment above the field
named the trap. Naming a trap does not close it. 0.3.19 opens `log` once, on
the image, for every route, and removes the default: every caller now says
which mode it wants, so a verb written past the funnel cannot inherit the
expensive one silently. Output is byte-identical on every route, and an
end-to-end test runs each route under the derive-footprint seam and fails if
a record is replayed.

| release build, warm cache | 0.3.18 | 0.3.19 |
|---|---|---|
| `log -n 1 trunk`, SQLite mirror | 0.46s | 0.02s |
| `log -n 1 trunk`, pkgsrc sub-manifest mirror | 0.94s | 0.05s |
| `log --long -n 5 trunk Makefile`, pkgsrc | 1.32s | 0.40s |

What remains on the per-file query is after open: the manifest reads
`--long` needs for its rows. The sixty-millisecond checksum floor is real,
and nothing asks for less yet.

Z d2a30c7a65d822dd7a333f9208c2ac43