Artifact 8a0e3e18186a82f44f2200feaecf085920aac7eaeadb7317431f36d591fa938c:
- File
internal/sync/horizon_structural.go
-
2026-10-24 01:44:26
— part of check-in
[776eae66e9]
on branch main
— fix(sync): judge pending pushed seeds at the crosslink step (#471)
Re-review found two faults in the shun-based design:
- Only the push path judged a dangling seed. A base filled by a pull, a local check-in or a later sweep still crosslinked the seed. - Shunning the seed was wrong. The shun table syncs through the shun config group. A horizon clone that pushed its own current seed back as a dangling delta could get the origin to shun that hash, and every clone pulling the group would then drop its seed.
New design, in internal/seedcheck:
- A store-local seedcheck(rid, refused) table, created on first use and carried by no configuration group. - The push handler records a delta it cannot expand as pending. Only pushed artifacts are recorded: a seed-shaped artifact that arrives by any other route is ordinary (B.2). - One choke point: manifest.linkArtifact. AfterDephantomize, the sweep, rebuild, the receive linker and required-content linking all reach it. There a pending control artifact is judged: a seed becomes refused, is not linked, and leaves unclustered and unsent. Anything else loses its row and links as usual. A pending non-control row is left, inert. - A seed judged within the request that carried it still refuses that request atomically (ownSeedReadable). It expands through the pass's basis cache, so a dangling chain is expanded once along its length. - Serving honours refused: gimme/file, inventory and private igots, both clone paths, and the client's file cards when it pushes on.
judgeGrounded, the shun use and the shun filters added to the sweep, rebuild and cascade are removed.
Tests: - The pull-fills-base probe and a check-in-fills-base case. - A refused seed not cloned, and not pushed on even when a peer asks for it by name. - The seedcheck table is in no config group. - B.4.4 also asserts the real minted seed is refused while the shun table stays empty. - Disabling the choke point, or any of the serving filters, fails a test.
Clone receive is not covered: a fresh clone has no pending rows, so that path cannot meet one. (user: [email protected], size: 13159) [annotate] [blame] [check-ins using]
-
2026-10-24 06:39:04
— part of check-in
[81d00b2e3b]
on branch main
— Merge branch 'feat/471-seed-refusal' into feat/horizon-names-seed-refusal
# Conflicts: # conformance/horizon_test.go # docs/site/data/conformance.json (user: [email protected], size: 13159) [annotate] [blame] [check-ins using]
-
2026-10-24 12:32:24
— part of check-in
[5a7c2ba12e]
on branch main
— Merge pull request #476 from danmestas/feat/horizon-names-seed-refusal
feat(horizon): named horizons with depth, and origin seed refusal (user: [email protected], size: 13159) [annotate] [blame] [check-ins using]
-
2026-10-24 01:44:26
— part of check-in
[776eae66e9]
on branch main
— fix(sync): judge pending pushed seeds at the crosslink step (#471)