Artifact 0d56ce2803b2ea6c1c242735247c3475f3b124b93ea0cc6c4279d4c9856e2b51:
- File
internal/sync/stubs.go
— part of check-in
[ad975ea85b]
at
2026-10-29 03:02:04
on branch feat/horizon-peer-serving
— fix(sync): judge the horizon refusal after the push, serve later peers
Review of #525.
- A requested C this store cannot place is a peer ahead of it, not one asking for history it lacks, and is served what the store holds. A peer at a later C the store holds is placed inside its held set and served. - The refusal is judged after the card loop, once the pull card has passed its permission check and the push half is stored. Only the pull half is refused: the reply is reset to the one error card, the request is not rolled back, and a push in the same sync is kept. - The held sets are computed through the classification memo, which keeps them per store and drops them when the store changes; the inventory reuses the view the judgment read. - The refusal begins with the machine-readable prefix horizon-not-held:, which the client matches instead of the whole text. - The fallback remedy moves from a new result field into the existing diagnostics, prefixed horizon-fallback:: SyncResult.Errors and CloneResult.Messages. The CLI still prints it. (user: [email protected], size: 3772) [annotate] [blame] [check-ins using] [more...]
package sync import ( "github.com/danmestas/go-libfossil/internal/cone" "github.com/danmestas/go-libfossil/simio" ) // CloneOpts configures a clone operation. type CloneOpts struct { StoreCone *cone.Cone // nil is dense; local policy, never synchronized User string // Credentials for clone auth (also default admin user) Password string Version int // Protocol version (default 3) Env *simio.Env // nil defaults to RealEnv Observer Observer // nil defaults to no-op Buggify BuggifyChecker // fault injection for DST (nil = no faults) // PullPhantoms, when set, makes Clone fetch the artifacts the clone // rounds left missing with a follow-up pull session, and fail with a // *PhantomStallError if any are still missing after it. That pull // departs from Section 8.2 of the sync draft, which sends no clone, // pull or push card after clone_seqno 0, so it is off by default. PullPhantoms bool // SeedKey, when set, is the origin's public key: an SSH public key line // or an OpenPGP fingerprint. The clone keeps it as its horizon-seed-key // setting and verifies every structural seed against it // (draft-fossil-horizon-00 §5.2.4); empty accepts an unsigned seed. SeedKey string // Origin names the peer the clone addresses, keying the horizon cursor // a converged horizon clone records (draft-fossil-horizon-00 §6.2.6) as // SyncOpts.Origin keys a sync's. Empty keeps none. Origin string // Named, when set, asks for the store's horizon by name rather than by // hash (draft-fossil-horizon-00 §6.1, §6.2.7); StoreCone then gives the // path members alone and must carry no horizon. The store records only // the check-in the name resolves to. Named *NamedHorizon } // NamedHorizon is a horizon asked for by name: the origin resolves Name, // tip, a symbolic name or a full check-in hash, and steps back Depth // check-ins along primary parents (§6.2.7); a peer that does not resolve it // serves densely and the clone resolves it at the content horizon (§6.3). type NamedHorizon struct { Name string Depth uint32 Rule cone.HorizonRule Level cone.HorizonDepth } // CloneResult reports what happened during a clone. type CloneResult struct { Elided int // artifacts deliberately absent under the store cone ConeServed int // replies acknowledging the store cone (sparse-cone §6.3); the rest were filtered locally HorizonServed int // replies serving the store's horizon at either level (horizon §6.2.5); the rest were classified locally // StructuralServed counts the replies that served the structural level, // and HorizonFallback reports a structural clone that kept the content // horizon instead: its origin did not serve the structural level with a // seed in the first reply, or the seed failed its provenance (§5.1, // §5.2.4, §6.3). StructuralServed int HorizonFallback bool Rounds int BlobsRecvd int ArtifactsLinked int // Manifests crosslinked into event table ProjectCode string ServerCode string Messages []string // Informational messages from server, and a horizon-fallback: remedy (§6.3) // HorizonHistoryURL is the interface outside the protocol at which the // origin says history below a horizon can be queried (horizon-served // URL, §6.2.5), the last a reply named; "" when none did. HorizonHistoryURL string // HorizonResolved is the check-in a clone's Named horizon resolved to and // HorizonSteps the steps back it took, fewer than its Depth when // history ran out; HorizonResolvedLocally reports the clone resolved it // itself, its origin having answered no horizon-resolved (§6.3). HorizonResolved string HorizonSteps uint32 HorizonResolvedLocally bool }