Skip to content

The log's lifecycle follow-up reads a lane snapshot nobody can search as no snapshot, and can say "another act got there first" when no other act ran (follow-up to #309) #317

Open

Description

@brettheap

From lane 4's #309 design (6350724542, its R6) and lane 3's review of it (#309 6352329119, ruling R6). It is filed on Brett Heap's approval, "File a v1.2.0 issue now (Recommended)", given in lane 3's session on the morning of 2026-10-23.

#309 fixes this reading in set-lane-state, set-lane-tree and rename-lane. This issue is the same reading in the follow-up that moves a lane's snapshot after a lifecycle line. #309 leaves it out because act 2 rewrites the functions it lives in.

What is wrong (at 33ce26d)

These facts come from reading the code, and lane 3's reviewer confirmed them by reading. Nobody has run them.

  • lane_state_fingerprint (lanes-edit.sh:13629–13635) answers none/0/none, which means "this lane has no snapshot", for any file that [ -e ] cannot see. A lane-state.yaml under a directory nobody can search is one of those.
  • lane_state_preimage (:13773–13778) also answers none/0/none when lane_control_root fails, whatever the reason.
  • The two reads. write_event takes the pre-image before its line lands (:6131), and retire_rows takes one for each lane it sweeps (:12901). lane_state_follow (:13817–13867) then reads the snapshot again under the mutex, and compares the two answers (:13847–13848):
    • when both reads are blocked, the answers agree. The follow-up tries to write, the write fails, and its note says so (:13865);
    • when only one read is blocked, the answers differ. The note then says "Another act got there first — a recovery, or a second handoff" (:13850), which is false. Nothing is written.
  • lane_state_follow returns without a word when lane_control_root fails (:13830). So a blocked lookup reads as a lane with no control root, which is the ordinary case before the cutover.
  • The three functions are byte-identical at 3e97ae5, A lane control root that cannot be searched reads as "no trees", so an inventory sync removes its rows (from #289's review) #291's branch, where they start at :13695, :13843 and :13887.

Direction

Not started: v1.2.0 work waits for the v1.1.0 tag and Brett's word.

Activity

  1. added this to the v1.2.0 milestone on Oct 23, 2026
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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions