Don't fail on two concurrent reference.store.AddDigest calls
| ... | ... |
@@ -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:") {
|