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>
| ... | ... |
@@ -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 |
} |