Browse code

Merge pull request #37781 from mtrmac/reference-race-upstream

Don't fail on two concurrent reference.store.AddDigest calls

Yong Tang authored on 2018/10/19 04:35:57
Showing 2 changed files
... ...
@@ -149,6 +149,11 @@ func (store *store) addReference(ref reference.Named, id digest.Digest, force bo
149 149
 	oldID, exists := repository[refStr]
150 150
 
151 151
 	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
+
152 157
 		// force only works for tags
153 158
 		if digested, isDigest := ref.(reference.Canonical); isDigest {
154 159
 			return errors.WithStack(conflictingTagError("Cannot overwrite digest " + digested.Digest().String()))
... ...
@@ -163,6 +163,10 @@ func TestAddDeleteGet(t *testing.T) {
163 163
 	if err = store.AddTag(ref4, testImageID2, false); err != nil {
164 164
 		t.Fatalf("error adding to store: %v", err)
165 165
 	}
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
+	}
166 170
 
167 171
 	ref5, err := reference.ParseNormalizedNamed("username/repo3@sha256:58153dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c")
168 172
 	if err != nil {
... ...
@@ -171,6 +175,10 @@ func TestAddDeleteGet(t *testing.T) {
171 171
 	if err = store.AddDigest(ref5.(reference.Canonical), testImageID2, false); err != nil {
172 172
 		t.Fatalf("error adding to store: %v", err)
173 173
 	}
174
+	// Write the same values again; should silently succeed
175
+	if err = store.AddDigest(ref5.(reference.Canonical), testImageID2, false); err != nil {
176
+		t.Fatalf("error redundantly adding to store: %v", err)
177
+	}
174 178
 
175 179
 	// Attempt to overwrite with force == false
176 180
 	if err = store.AddTag(ref4, testImageID3, false); err == nil || !strings.HasPrefix(err.Error(), "Conflict:") {