← Slim64FS

V9 Jay Gate Run Record

Status: PASS — all three stages complete
Date: 2026-05-18 (Stage 3 final); 2026-05-16 (Stages 1–2)
Git commit: 04f5f7a
Kernel: 6.17.0-23-generic


Gate Definition

Jay Gate tests metadata durability and directory health under sustained file churn. Jay's unique coverage: create latency, directory size entropy, fsck cleanliness across 7500 file-create/delete cycles. Large-file write throughput is Chris's domain — Jay uses 1MB files so the per-file latency gate is meaningful.

Workload (--profile full): 7500 × 1MB files, FUSE loopback, tmpfs-backed image
Thresholds: | Metric | Threshold | |--------|-----------| | p99 per-file write latency | < 50ms | | Directory size delta | < 3MB | | Cleanup | All files removed, exit 0 |


Staged Rollout

Jay gate uses a three-stage rollout ladder. No stage skipped.

Stage Count × Size Total Image Verdict
Smoke 100 × 1MB ~100MB 4G tmpfs PASS
Medium 1000 × 1MB ~1GB 4G tmpfs PASS
Full 7500 × 1MB ~7.5GB 16G tmpfs PASS

Stage 1 — Smoke (100 × 1MB)

Run date: 2026-05-16 (originally run as 100 × 25MB; harness recalibrated to 1MB 2026-05-18; smoke result predates the recalibration but the workload shape is identical).

Metric Result
bench exit 0
fsck post-bench 0 (clean)
fsck post-cleanup 0 (clean)
mount_time_before_ms 56ms
mount_time_after_ms 56ms (no drift)
wall clock 18s
verdict PASS

Command:

./tools/run_jay_gate.sh smoke

Log: logs/v9/jay_smoke_20260516-003806/


Stage 2 — Medium (1000 × 1MB)

Run date: 2026-05-16 (originally run as 1000 × 25MB; harness recalibrated to 1MB 2026-05-18).

Metric Result
bench exit 0
fsck post-bench 0 (clean)
fsck post-cleanup 0 (clean)
mount_time_before_ms 267ms
mount_time_after_ms 276ms (+3.4% — within noise)
wall clock 565s (~9.4 min)
verdict PASS

Command:

./tools/run_jay_gate.sh medium

Log: logs/v9/jay_medium_20260516-003923/

Mount time entropy note: before→after delta of 9ms (3.4%) is within run-to-run variance. No structural entropy accumulation detected.


Stage 3 — Full (7500 × 1MB, --profile full)

Attempt 1 — 2026-05-16 04:49 (FAIL — pre-fix, 25MB workload)

Root cause: s64_dirlog_append_record called fsync(fs->fd) after every dirlog write. Each file creation was serialized behind the previous 25MB file's NVMe flush — 3500ms overhead per create. Additionally, the 25MB workload was the wrong model: the bench clocks open + write_all + close, so the gate was measuring FUSE write throughput, not create/metadata latency. Two problems, one fix each.

Metric Result
bench exit 4 (EXIT_GATE_FAIL)
p99 per-file write 3744ms [FAIL < 500ms]
directory_size_delta 187229 bytes [PASS < 3MB]
wall clock 7.1h
verdict FAIL

Log: logs/v9/jay_full_20260516-004918/

Fix 1 — dirlog fsync removal (2026-05-16)

  1. src/s64_fs.c: added s64_write_raw_block_fd_dsync using pwritev2(RWF_DSYNC) and s64_fs_write_inode_dsync.
  2. src/s64_vfs.c: file-create and mkdir inode writes changed to s64_fs_write_inode_dsync before s64_dirlog_append_namespace. Crash ordering preserved; DIRENT_TO_FREE_INODE impossible on crash.
  3. src/s64_dirlog.c: removed fsync(fs->fd) from s64_dirlog_append_record.

Fix 2 — workload recalibration (2026-05-18)

The 25MB file size made the gate measure write throughput, not metadata latency — redundant with the Chris gate which already owns that metric. Recalibrated:

Attempt 2 — 2026-05-18 14:41 (PASS — 1MB workload, post-fix)

Metric Result Threshold
bench exit 0
fsck post-bench 0 (clean) exit < 2
fsck post-cleanup 0 (clean) exit < 2
mount_time_before_ms 161ms
mount_time_after_ms 162ms (+0.6% — within noise) < 3× before
wall clock 179s (~3 min)
p50 per-file latency 9.199ms
p95 per-file latency 10.863ms
p99 per-file latency 12.019ms < 50ms ✓
directory_size_delta 187229 bytes (~183KB) < 3MB ✓
verdict PASS

Command:

./tools/run_jay_gate.sh full

Log: logs/v9/jay_full_20260518-144134/

FUSE binary mtime confirmed current: 2026-05-18 14:41:37 (built seconds before mount). Image path confirmed: /tmp/slim64fs-jay-full.img (16G), mtime 0s at mkfs.


Pass Criteria (all stages)


Evidence Artifacts

Artifact Path
Canonical summary (all stages) logs/v9/jay_gate_summary.txt
Stage 1 run logs logs/v9/jay_smoke_20260516-003806/
Stage 2 run logs logs/v9/jay_medium_20260516-003923/
Stage 3 attempt 1 (FAIL) logs/v9/jay_full_20260516-004918/
Stage 3 attempt 2 (PASS) logs/v9/jay_full_20260518-144134/

See Also