Browse code

Fix image deletion conflicts with search

Removed images were not cleaned up from the
digest-set that is used for the search index.

Fixes #18437

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2015/12/05 06:15:54
Showing 3 changed files
... ...
@@ -212,6 +212,9 @@ func (is *store) Delete(id ID) ([]layer.Metadata, error) {
212 212
 		delete(is.images[parent].children, id)
213 213
 	}
214 214
 
215
+	if err := is.digestSet.Remove(digest.Digest(id)); err != nil {
216
+		logrus.Errorf("error removing %s from digest set: %q", id, err)
217
+	}
215 218
 	delete(is.images, id)
216 219
 	is.fs.Delete(id)
217 220
 
... ...
@@ -194,6 +194,45 @@ func TestAddDelete(t *testing.T) {
194 194
 
195 195
 }
196 196
 
197
+func TestSearchAfterDelete(t *testing.T) {
198
+	tmpdir, err := ioutil.TempDir("", "images-fs-store")
199
+	if err != nil {
200
+		t.Fatal(err)
201
+	}
202
+	defer os.RemoveAll(tmpdir)
203
+	fs, err := NewFSStoreBackend(tmpdir)
204
+	if err != nil {
205
+		t.Fatal(err)
206
+	}
207
+
208
+	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
209
+	if err != nil {
210
+		t.Fatal(err)
211
+	}
212
+
213
+	id, err := is.Create([]byte(`{"comment": "abc", "rootfs": {"type": "layers"}}`))
214
+	if err != nil {
215
+		t.Fatal(err)
216
+	}
217
+
218
+	id1, err := is.Search(string(id)[:15])
219
+	if err != nil {
220
+		t.Fatal(err)
221
+	}
222
+
223
+	if actual, expected := id1, id; expected != actual {
224
+		t.Fatalf("wrong id returned from search: expected %q, got %q", expected, actual)
225
+	}
226
+
227
+	if _, err := is.Delete(id); err != nil {
228
+		t.Fatal(err)
229
+	}
230
+
231
+	if _, err := is.Search(string(id)[:15]); err == nil {
232
+		t.Fatal("expected search after deletion to fail")
233
+	}
234
+}
235
+
197 236
 type mockLayerGetReleaser struct{}
198 237
 
199 238
 func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) {
... ...
@@ -348,11 +348,11 @@ func (s *DockerSuite) TestInspectByPrefix(c *check.C) {
348 348
 	c.Assert(err, checker.IsNil)
349 349
 	c.Assert(id, checker.HasPrefix, "sha256:")
350 350
 
351
-	id2, err := inspectField(id[:10], "Id")
351
+	id2, err := inspectField(id[:12], "Id")
352 352
 	c.Assert(err, checker.IsNil)
353 353
 	c.Assert(id, checker.Equals, id2)
354 354
 
355
-	id3, err := inspectField(strings.TrimPrefix(id, "sha256:")[:10], "Id")
355
+	id3, err := inspectField(strings.TrimPrefix(id, "sha256:")[:12], "Id")
356 356
 	c.Assert(err, checker.IsNil)
357 357
 	c.Assert(id, checker.Equals, id3)
358 358
 }