Skip to content

Commit 8349e9c

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 <tonistiigi@gmail.com>
1 parent bb7bb20 commit 8349e9c

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

exporter/containerimage/export.go

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

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

0 commit comments

Comments
 (0)