From 3a097d7e3d52cf882d15281c67dcf4929ab1fcba Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Fri, 3 Oct 2025 15:49:03 -0700 Subject: [PATCH] remotecache: fix inline cache used with multiple exporters When multiple exports run in parallel inline cache exporting can run for each of them into the same cache exporter instance. Inline cache exporter can only be invoked multiple times sequentially. There is a 'reset()` call after every invocation that completely switches out the internal cache chains collector. Before v0.25 this caused some corruption in inline cache (or some unknown error). Since v0.25 this case is likely to trigger internal consistency check error and fail the build. Signed-off-by: Tonis Tiigi --- solver/llbsolver/solver.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/solver/llbsolver/solver.go b/solver/llbsolver/solver.go index d1b3c7994eff..c5f0e02f6376 100644 --- a/solver/llbsolver/solver.go +++ b/solver/llbsolver/solver.go @@ -847,6 +847,7 @@ func (s *Solver) runExporters(ctx context.Context, exporters []exporter.Exporter eg, ctx := errgroup.WithContext(ctx) resps := make([]map[string]string, len(exporters)) descs := make([]exporter.DescriptorReference, len(exporters)) + var inlineCacheMu sync.Mutex for i, exp := range exporters { i, exp := i, exp eg.Go(func() error { @@ -865,6 +866,8 @@ func (s *Solver) runExporters(ctx context.Context, exporters []exporter.Exporter } } inlineCache := exptypes.InlineCache(func(ctx context.Context) (*result.Result[*exptypes.InlineCacheEntry], error) { + inlineCacheMu.Lock() // ensure only one inline cache exporter runs at a time + defer inlineCacheMu.Unlock() return runInlineCacheExporter(ctx, exp, inlineCacheExporter, job, cached) })