From 38e2f0038266ecc0fa9de68b3702c3e67ee6acab Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Fri, 14 Jun 2024 10:43:39 -0700 Subject: [PATCH] Adds a mutex to protect fallback host Race detector complains about concurrent access such as with Dispatch on push. Signed-off-by: Derek McGowan --- core/remotes/docker/resolver.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/core/remotes/docker/resolver.go b/core/remotes/docker/resolver.go index 0b559ea5f..03f5b3693 100644 --- a/core/remotes/docker/resolver.go +++ b/core/remotes/docker/resolver.go @@ -28,6 +28,7 @@ import ( "os" "path" "strings" + "sync" "github.com/containerd/errdefs" "github.com/containerd/log" @@ -728,11 +729,16 @@ func NewHTTPFallback(transport http.RoundTripper) http.RoundTripper { type httpFallback struct { super http.RoundTripper host string + mu sync.Mutex } func (f *httpFallback) RoundTrip(r *http.Request) (*http.Response, error) { + f.mu.Lock() + fallback := f.host == r.URL.Host + f.mu.Unlock() + // only fall back if the same host had previously fell back - if f.host != r.URL.Host { + if !fallback { resp, err := f.super.RoundTrip(r) if !isTLSError(err) && !isPortError(err, r.URL.Host) { return resp, err @@ -745,8 +751,12 @@ func (f *httpFallback) RoundTrip(r *http.Request) (*http.Response, error) { plainHTTPRequest := *r plainHTTPRequest.URL = &plainHTTPUrl - if f.host != r.URL.Host { - f.host = r.URL.Host + if !fallback { + f.mu.Lock() + if f.host != r.URL.Host { + f.host = r.URL.Host + } + f.mu.Unlock() // update body on the second attempt if r.Body != nil && r.GetBody != nil {