From dc0349a220d01464751e0085006ba7d83d5d034d Mon Sep 17 00:00:00 2001 From: jochen Date: Wed, 4 Nov 2026 18:09:42 +0100 Subject: [PATCH] G-catalog-B 5: distribution and gitea look at every open transfer at the idle watch's start A transfer whose idle key ended while the bundle was down was never dropped. Both hand mesh-sdk's FollowIdle their open transfers, which it gives Expired once the watch is taken. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig --- modules/distribution/cmd/distribution-tools/main.go | 2 +- modules/gitea/cmd/package-registry/incoming.go | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/distribution/cmd/distribution-tools/main.go b/modules/distribution/cmd/distribution-tools/main.go index de40893b..c63bff40 100644 --- a/modules/distribution/cmd/distribution-tools/main.go +++ b/modules/distribution/cmd/distribution-tools/main.go @@ -501,7 +501,7 @@ func main() { Transfers: parts.BusTransfers[holder.Opening](holder.TransfersState), Cap: parts.BusCap(holder.IncomingObjects), Idle: parts.BusArm(holder.IdleState)} v := &holder.Verbs{Holder: h, Catalog: store, Holds: kept[holder.Hold]{state: "holds", key: holder.Hold.Key}, Mirrors: mirrors{}} go followMirrors(v) - go parts.FollowIdle(holder.IdleState, h.Expired, func(id string, dropped bool, err error) { + go parts.FollowIdle(holder.IdleState, parts.IDs(h.Transfers), h.Expired, func(id string, dropped bool, err error) { if err != nil { logf("%v", err) return diff --git a/modules/gitea/cmd/package-registry/incoming.go b/modules/gitea/cmd/package-registry/incoming.go index 9ad5c3c7..945eaf1b 100644 --- a/modules/gitea/cmd/package-registry/incoming.go +++ b/modules/gitea/cmd/package-registry/incoming.go @@ -51,9 +51,17 @@ func incomingTool(typ, seat string, holder func() (*packageseats.Holder, error)) } } -// followIdle drops a transfer when its idle key ends (packageseats.Holder.Expired): the bus's marker is the event. +// followIdle drops a transfer when its idle key ends (packageseats.Holder.Expired): the bus's marker is the event; at the +// watch's start every open transfer is looked at too, so one that ended while the bundle was down is dropped. func followIdle(holder func() (*packageseats.Holder, error)) { - parts.FollowIdle(packageseats.IdleState, func(id string) (bool, error) { + open := func() ([]string, error) { + h, err := holder() + if err != nil { + return nil, fmt.Errorf("the holder cannot be made: %w", err) + } + return parts.IDs(h.Transfers)() + } + parts.FollowIdle(packageseats.IdleState, open, func(id string) (bool, error) { h, err := holder() if err != nil { return false, fmt.Errorf("transfer %s's idle bound ended, but the holder cannot be made: %w", id, err)