From b740a6f03772c00759795f1a9d5883bf165041d8 Mon Sep 17 00:00:00 2001 From: Lukasz Jakimczuk <39192420+ljakimczuk@users.noreply.github.com> Date: Mon, 1 Sep 2025 20:55:48 +0200 Subject: [PATCH] fix: close the `syncResult` channel by any goroutine that receives the data (#3348) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: race condition in on-demand syncing Signed-off-by: Ɓukasz Jakimczuk --- pkg/extensions/sync/on_demand.go | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/pkg/extensions/sync/on_demand.go b/pkg/extensions/sync/on_demand.go index 2dc788c1..0e0f0036 100644 --- a/pkg/extensions/sync/on_demand.go +++ b/pkg/extensions/sync/on_demand.go @@ -55,11 +55,7 @@ func (onDemand *BaseOnDemand) SyncImage(ctx context.Context, repo, reference str syncResult, _ := val.(chan error) - err, ok := <-syncResult - // if channel closed exit - if !ok { - return nil - } + err := <-syncResult return err } @@ -68,14 +64,10 @@ func (onDemand *BaseOnDemand) SyncImage(ctx context.Context, repo, reference str onDemand.requestStore.Store(req, syncResult) defer onDemand.requestStore.Delete(req) - defer close(syncResult) go onDemand.syncImage(ctx, repo, reference, syncResult) - err, ok := <-syncResult - if !ok { - return nil - } + err := <-syncResult return err } @@ -95,11 +87,7 @@ func (onDemand *BaseOnDemand) SyncReferrers(ctx context.Context, repo string, syncResult, _ := val.(chan error) - err, ok := <-syncResult - // if channel closed exit - if !ok { - return nil - } + err := <-syncResult return err } @@ -108,14 +96,10 @@ func (onDemand *BaseOnDemand) SyncReferrers(ctx context.Context, repo string, onDemand.requestStore.Store(req, syncResult) defer onDemand.requestStore.Delete(req) - defer close(syncResult) go onDemand.syncReferrers(ctx, repo, subjectDigestStr, referenceTypes, syncResult) - err, ok := <-syncResult - if !ok { - return nil - } + err := <-syncResult return err } @@ -123,6 +107,8 @@ func (onDemand *BaseOnDemand) SyncReferrers(ctx context.Context, repo string, func (onDemand *BaseOnDemand) syncReferrers(ctx context.Context, repo, subjectDigestStr string, referenceTypes []string, syncResult chan error, ) { + defer close(syncResult) + var err error for serviceID, service := range onDemand.services { err = service.SyncReferrers(ctx, repo, subjectDigestStr, referenceTypes) @@ -176,6 +162,8 @@ func (onDemand *BaseOnDemand) syncReferrers(ctx context.Context, repo, subjectDi } func (onDemand *BaseOnDemand) syncImage(ctx context.Context, repo, reference string, syncResult chan error) { + defer close(syncResult) + var err error for serviceID, service := range onDemand.services {