From 725301dd92fa9f407e39792d1832ed54449b4faf Mon Sep 17 00:00:00 2001 From: Rongsong Shen Date: Sat, 26 Sep 2026 09:55:24 +0000 Subject: [PATCH] chore(buglog): bug-1867 fixed (e4bb492a); log bug-1870 (checkpoint marker never replicated) Co-Authored-By: Claude Opus 5.5 (1M context) --- .wolf/buglog.json | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/.wolf/buglog.json b/.wolf/buglog.json index 983bfd7d..41a97f29 100644 --- a/.wolf/buglog.json +++ b/.wolf/buglog.json @@ -28089,9 +28089,9 @@ "id": "bug-1867", "gitea_synced_status": "open", "gitea_issue": 286, - "status": "open", + "status": "fixed", "status_updated": "2026-09-26", - "status_note": "found while fixing bug-1754; needs a Job.exitCode capnp field + encode/decode, snapshot round-trip test", + "status_note": "e4bb492a: capnp Job.exitInfo (JobExitInfo) -- checkpoint encode/decode/restore carry exit_info. Live force-snapshot soak blocked by pre-existing bug-1870.", "timestamp": "2026-09-26T03:33:15Z", "error_message": "Controller job snapshot/checkpoint drops job.exit_info: the capnp Job struct (controller.capnp) has no exit-info field, so capnp_encode_job() never writes it and a job restored from a snapshot (rather than WAL replay) has exit_info NULL for both DONE/EXIT (FINISH) and failed (FAIL) jobs", "file": "src/schema/controller.capnp", @@ -28159,6 +28159,29 @@ ], "occurrences": 1, "last_seen": "2026-09-26T07:55:23Z" + }, + { + "id": "bug-1870", + "status": "open", + "status_updated": "2026-09-26", + "status_note": "found while soak-verifying bug-1867; blocks live verification of snapshot restore", + "timestamp": "2026-09-26T09:55:09Z", + "error_message": "xce-test-ha --force-snapshot FAIL: 'could not submit 110 jobs to trigger a checkpoint' -- writes stall right after the first max-wal-records checkpoint. The primary's WAL holds a CHECKPOINT entry (plen 0) at the checkpoint LSN that no standby ever receives (primary ctrl-1: 109 JOB_SUBMIT, 110 CHECKPOINT, 111 JOB_SUBMIT; standbys stop at 109). Every later AppendEntries carries prevIdx=, standbys reply ae_reject_logmismatch, the primary marks catch-up and re-sends the last common entry forever: 'commit: async continuation deadline expired without commit', 'HA quorum lost: connected=0'.", + "file": "src/controller/persist.c (checkpoint marker append), src/controller/repl.c / config_repl.c (broadcast / catch-up)", + "root_cause": "Not yet root-caused. The checkpoint marker is appended to the local WAL (and consumes an LSN in the replicated log) without being broadcast to / streamed to standbys, so the log has a hole standbys can never fill. Reproduced on a565779d (baseline, 2026-09-26) and on the bug-1867 working tree -- independent of both. Repro: nix develop ./src --command bash .claude/skills/xce-test-ha/run-ha-soak.sh --force-snapshot (max-wal-records=100, wal-segment-bytes=4096).", + "fix": "", + "tags": [ + "ha", + "replication", + "checkpoint", + "wal", + "force-snapshot", + "soak", + "livelock" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-09-26T09:55:09Z" } ] }