Skip to content
go-libfossil Timeline
Login

Timeline

8 descendants of 4701ed89a217cca0

2026-10-20
18:47
test(manifest): retain pending repairs across cancelled finalization

Exercise a caller-owned committed link, failed repair on cancellation and a normal candidate deferred until retry. Verify the same receive linker retains the original schedule and converges after retry. Update repair comments to describe the per-batch gates. leaf check-in: 72251e2dcd user: [email protected] tags: main, perf/tag-repair-batch, trunk

18:14
Merge main into batch tag repair, preserving unreleased changes check-in: ef382ed65e user: [email protected] tags: main, perf/tag-repair-batch, trunk
07:08
fix(manifest): recheck the parents of a check-in tagged before it is linked

A control artifact can write a check-in's branch row before the check-in is linked; that write schedules the check-in while it has no parents. When the check-in is linked later, in another transaction, its plink rows name parents nothing rechecks, so a parent on the same branch keeps a leaf row it no longer earns. Applying leaf rechecks per link transaction made this common in a clone, which links each received artifact in its own transaction: a clone of fossil.fossil ended with 1435 leaves instead of fossil's 1426.

Linking a check-in that already carries a branch row now schedules it, and with it the parents it names. A check-in with no branch row is left alone, as fossil leaves it (#426). TestReparent's relink keeps propagated branch rows, so it now gives c2 the verdict a rebuild does.

Tracked in #432. check-in: 789434c556 user: [email protected] tags: main, perf/tag-repair-batch, trunk

06:29
test(manifest): probe arrival order against a rebuild

TestArrivalOrderMatchesRebuild builds a random history per seed, delivers its blobs to a fresh repository in random order and rounds, crosslinking after each, and compares tags and leaves with a rebuild. It runs only when LIBFOSSIL_ARRIVAL_PROBE names a seed count. Without reparents every seed must match; with them it reports the seeds that differ, the divergence documented on ReparentCheckins.

Tracked in #432. check-in: 4f3f1669e6 user: [email protected] tags: main, perf/tag-repair-batch, trunk

05:45
docs(manifest): state where a reparent diverges from a rebuild

A reparent propagates from the new parent, which fossil's manifest_reparent_checkin does not, and never removes the tags inherited from the old parent, which fossil does not either; fossil's own rebuild is order-dependent there. Say both in ReparentCheckins, and rename the reparent test so it no longer claims full convergence. Note in the CHANGELOG that a failed sync no longer sweeps before it returns, so artifacts committed outside a phantom fill wait for the next crosslink.

Tracked in #432. check-in: 9ff7dea0b5 user: [email protected] tags: main, perf/tag-repair-batch, trunk

04:47
fix(manifest): apply leaf rechecks in the transaction that links the batch

Each link transaction now runs the whole repair gate before it commits: the reparent pass, tag propagation from the parents it linked, and the leaf rechecks it scheduled. Fossil's manifest_crosslink_end runs the reparent pass and leaf_do_pending_checks inside the transaction that linked the check-ins, so a crash can never leave a committed check-in without its leaf row; this does the same. The schedule records whether a transaction linked anything, so one that linked nothing skips the gate.

The gate at the end of a sweep or a receive is gone. Finalize repairs only what a caller linked through LinkStored in a transaction it opened itself rather than through ReceiveLinker.WithTx, which is all that can still leave work on the schedule.

Tracked in #432. check-in: 8c00d632b7 user: [email protected] tags: main, perf/tag-repair-batch, trunk

03:13
refactor(sync): drop the closing gate a cascade no longer needs

Each phantom-fill cascade batch already reparents, propagates and applies its leaf rechecks before it commits, so a sync's closing crosslink and the repair after a failed round owed the cascades nothing. Remove the cascade count that kept them running: CrosslinkAfterCascades folds into CrosslinkContext, the sync client and handler stop counting cascaded links, and the handler stores files through storeReceivedFile. The closing gate now runs only when its own sweep linked something, for the sweep's leaf rechecks and the reparent pass.

Tracked in #432. check-in: 1ed447441a user: [email protected] tags: main, perf/tag-repair-batch, trunk

2026-10-19
22:07
fix(manifest): propagate tags in the transaction that links the batch

Each link transaction (a sweep batch, a receive transaction, a retried waiter) now reparents and propagates from the parents it wrote plink rows for before it commits, as fossil's crosslink propagates from a check-in's parent in the transaction that links it. A link and the propagation it owes commit or roll back together, so a failed gate or an interrupted process can no longer leave a committed plink edge whose parent's tags never reached the child. The closing gate still applies the batch's leaf rechecks once, runs the reparent pass for parent tags no link transaction reached, and propagates from any parent left by a link outside a link transaction.

Tracked in #432. check-in: e9eeab7e17 user: [email protected] tags: main, perf/tag-repair-batch, trunk

20:40
perf(manifest): skip a reparent whose plink rows are already settled

Each phantom-fill cascade batch now runs the repair gate, so the reparent pass runs once per batch rather than once per sync. A check-in whose plink rows already name the parent tag's parents, each a linked check-in, is no longer re-expanded and rewritten, and its parent is not propagated from again. A rewrite against a parent that is not linked yet is still redone at every gate until it is.

Tracked in #432. check-in: 4701ed89a2 user: [email protected] tags: main, perf/tag-repair-batch, trunk