From 2e55352974a073ae53834cd9cbb0e362112376db Mon Sep 17 00:00:00 2001 From: Maarten Rijke Date: Sat, 27 Jun 2026 19:05:05 +0200 Subject: [PATCH] hold/pds: fix scan broadcaster predecessor check to compare successor did checkPredecessor returned true for any hold with a non-empty successor field, without verifying the successor was actually this hold. This caused every hold running proactive scan discovery to queue manifests from every other migrated hold on the network, producing 404 errors when the scanner tried to fetch foreign blobs from its own S3. Signed-off-by: Maarten Rijke --- pkg/hold/pds/scan_broadcaster.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/hold/pds/scan_broadcaster.go b/pkg/hold/pds/scan_broadcaster.go index 3013722..f49159e 100644 --- a/pkg/hold/pds/scan_broadcaster.go +++ b/pkg/hold/pds/scan_broadcaster.go @@ -1446,13 +1446,19 @@ func (sb *ScanBroadcaster) checkPredecessor(ctx context.Context, holdDID string) return false } - if captain.Successor != "" { - slog.Info("Proactive scan: discovered migrated hold (has successor label)", - "holdDID", holdDID, "successor", captain.Successor) - return true + if captain.Successor == "" { + return false } - return false + if captain.Successor != sb.holdDID { + slog.Debug("Proactive scan: hold has successor, but it is not us", + "holdDID", holdDID, "successor", captain.Successor, "ourHoldDID", sb.holdDID) + return false + } + + slog.Info("Proactive scan: discovered migrated hold pointing at us as successor", + "holdDID", holdDID, "successor", captain.Successor) + return true } // hasConnectedScanners returns true if at least one scanner is connected.