Run the catch-up at the controller's start and after each merge it hears (ADR 0457, issue 1336)

This commit is contained in:
2026-10-20 12:58:16 +00:00
parent 4e0a82010c
commit 815d60a7e4
2 changed files with 12 additions and 1 deletions
+2
View File
@@ -208,6 +208,8 @@ func serve(ctx context.Context) (err error) {
if err := server.Follows(following{open: open}); err != nil {
return err
}
// And the merges it did not hear while it was away, caught up once it serves (novox/hq ADR 0457, issue 1336).
go catchUpAtStart(ctx, open)
// And the merges mesh-delivery made, kept a week with the ask each was made on: what registers a module that
// moved between repositories on the operator's Approve (novox/hq ADR 0420 §7, issue 1025).
if err := server.KeepsDeliveryMerges(keepingDeliveryMerges{js: server.JetStream, catalog: open.inventory.Catalogued,
+10 -1
View File
@@ -316,7 +316,16 @@ func unsaved(err error) error {
// SourceMoved is the forge announcing a merge. It is put into the open batch (novox/hq ADR 0276), which
// becomes one walk when its merge window closes: hearMerge, and cutBatchesHeld in batches.go.
func (f following) SourceMoved(ctx context.Context, m link.SourceMoved) error {
return f.hearMerge(ctx, m, time.Now().UTC())
if err := f.hearMerge(ctx, m, time.Now().UTC()); err != nil {
return err
}
// And the merges of that trunk it did not hear, in the trunk's order (novox/hq ADR 0457): a catch-up that leaves
// something for later is no failure of this merge's hearing, and is never a reason to hear it again.
if !f.oneShot {
trunk := &caughtTrunk{Owner: m.Owner, Repo: m.Repo, Branch: m.Base}
catchUpBeside(func() { f.catchUp(context.WithoutCancel(ctx), trunk) })
}
return nil
}
// movesOfMerge is what one merge moves, acted on: every module recorded as built from that repository and