Skip to content

Commit 1f9ad6c

Browse files
committed
solver: fix possible race for provenance ResolveImageConfig
ResolveImageConfig can be called concurrently - for example, by dockerfile2llb during conversion, we loop through each stage and resolve the base image for that stage. In the case that two calls to ResolveImageConfig finish at roughly the same time, we can hit an edge case where we attempt to modify the bridge's image records at the same time. To fix this, we just need to use the bridge's mutex to prevent concurrent access here. This should fix the following stack trace found in CI: sandbox.go:144: goroutine 1079 [running]: sandbox.go:144: github.com/moby/buildkit/solver/llbsolver.(*provenanceBridge).ResolveImageConfig(0xc000431e00, {0x1c2b040?, 0xc0008e5b30?}, {0xc00094ba00?, 0xc0003728f0?}, {0x0, 0xc0006cb580, {0x19ba868, 0x7}, {0xc0008f7500, ...}, ...}) sandbox.go:144: /src/solver/llbsolver/provenance.go:139 +0x1fb sandbox.go:144: github.com/moby/buildkit/frontend/dockerfile/dockerfile2llb.toDispatchState.func3.1() sandbox.go:144: /src/frontend/dockerfile/dockerfile2llb/convert.go:405 +0x5fe sandbox.go:144: golang.org/x/sync/errgroup.(*Group).Go.func1() sandbox.go:144: /src/vendor/golang.org/x/sync/errgroup/errgroup.go:75 +0x64 sandbox.go:144: created by golang.org/x/sync/errgroup.(*Group).Go sandbox.go:144: /src/vendor/golang.org/x/sync/errgroup/errgroup.go:72 +0xa5 --- FAIL: TestIntegration/TestNoCache/worker=oci-rootless/frontend=builtin (4.45s) No other explanation for this failure makes sense - `b` cannot be `nil` at this point, since a call to `b.llbBridge.ResolveImageConfig` has just succeeded (also because that would be very strange). Signed-off-by: Justin Chadwell <[email protected]> (cherry picked from commit c08f767) Signed-off-by: Justin Chadwell <[email protected]>
1 parent 5976062 commit 1f9ad6c

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

solver/llbsolver/provenance.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,14 @@ func (b *provenanceBridge) ResolveImageConfig(ctx context.Context, ref string, o
137137
return "", "", nil, err
138138
}
139139

140+
b.mu.Lock()
140141
b.images = append(b.images, provenance.ImageSource{
141142
Ref: ref,
142143
Platform: opt.Platform,
143144
Digest: dgst,
144145
Local: opt.ResolverType == llb.ResolverTypeOCILayout,
145146
})
147+
b.mu.Unlock()
146148
return ref, dgst, config, nil
147149
}
148150

0 commit comments

Comments
 (0)