Skip to content

Commit f7e5154

Browse files
authored
Merge pull request moby#37781 from mtrmac/reference-race-upstream
Don't fail on two concurrent reference.store.AddDigest calls
2 parents 6611ab1 + f29dda9 commit f7e5154

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

reference/store.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ func (store *store) addReference(ref reference.Named, id digest.Digest, force bo
149149
oldID, exists := repository[refStr]
150150

151151
if exists {
152+
if oldID == id {
153+
// Nothing to do. The caller may have checked for this using store.Get in advance, but store.mu was unlocked in the meantime, so this can legitimately happen nevertheless.
154+
return nil
155+
}
156+
152157
// force only works for tags
153158
if digested, isDigest := ref.(reference.Canonical); isDigest {
154159
return errors.WithStack(conflictingTagError("Cannot overwrite digest " + digested.Digest().String()))

reference/store_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,10 @@ func TestAddDeleteGet(t *testing.T) {
163163
if err = store.AddTag(ref4, testImageID2, false); err != nil {
164164
t.Fatalf("error adding to store: %v", err)
165165
}
166+
// Write the same values again; should silently succeed
167+
if err = store.AddTag(ref4, testImageID2, false); err != nil {
168+
t.Fatalf("error redundantly adding to store: %v", err)
169+
}
166170

167171
ref5, err := reference.ParseNormalizedNamed("username/repo3@sha256:58153dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c")
168172
if err != nil {
@@ -171,6 +175,10 @@ func TestAddDeleteGet(t *testing.T) {
171175
if err = store.AddDigest(ref5.(reference.Canonical), testImageID2, false); err != nil {
172176
t.Fatalf("error adding to store: %v", err)
173177
}
178+
// Write the same values again; should silently succeed
179+
if err = store.AddDigest(ref5.(reference.Canonical), testImageID2, false); err != nil {
180+
t.Fatalf("error redundantly adding to store: %v", err)
181+
}
174182

175183
// Attempt to overwrite with force == false
176184
if err = store.AddTag(ref4, testImageID3, false); err == nil || !strings.HasPrefix(err.Error(), "Conflict:") {

0 commit comments

Comments
 (0)