Skip to content

Commit a04f8c2

Browse files
committed
containerimage: fix possible race on parallel image create
When image was (externally or in parallel build request) created in between Update and Create calls, Create can fail. Handle this case by running Update again. Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 81ee8a1 commit a04f8c2

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

exporter/containerimage/export.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -297,14 +297,20 @@ func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source
297297
}
298298
for _, sfx := range sfx {
299299
img.Name = targetName + sfx
300-
if _, err := e.opt.Images.Update(imageClientCtx, img); err != nil {
301-
if !errors.Is(err, cerrdefs.ErrNotFound) {
302-
return nil, nil, tagDone(err)
303-
}
300+
for { // handle possible race between Update and Create
301+
if _, err := e.opt.Images.Update(imageClientCtx, img); err != nil {
302+
if !errors.Is(err, cerrdefs.ErrNotFound) {
303+
return nil, nil, tagDone(err)
304+
}
304305

305-
if _, err := e.opt.Images.Create(imageClientCtx, img); err != nil {
306-
return nil, nil, tagDone(err)
306+
if _, err := e.opt.Images.Create(imageClientCtx, img); err != nil {
307+
if !errors.Is(err, cerrdefs.ErrAlreadyExists) {
308+
return nil, nil, tagDone(err)
309+
}
310+
continue
311+
}
307312
}
313+
break
308314
}
309315
}
310316
tagDone(nil)

0 commit comments

Comments
 (0)