Przeglądaj źródła

Merge pull request #20058 from tonistiigi/fix-parent-reset

Clear old parent reference on resetting image parent
Antonio Murdaca 9 lat temu
rodzic
commit
78f2b8d87d
2 zmienionych plików z 59 dodań i 0 usunięć
  1. 3 0
      image/store.go
  2. 56 0
      image/store_test.go

+ 3 - 0
image/store.go

@@ -231,6 +231,9 @@ func (is *store) SetParent(id, parent ID) error {
 	if parentMeta == nil {
 	if parentMeta == nil {
 		return fmt.Errorf("unknown parent image ID %s", parent.String())
 		return fmt.Errorf("unknown parent image ID %s", parent.String())
 	}
 	}
+	if parent, err := is.GetParent(id); err == nil && is.images[parent] != nil {
+		delete(is.images[parent].children, id)
+	}
 	parentMeta.children[id] = struct{}{}
 	parentMeta.children[id] = struct{}{}
 	return is.fs.SetMetadata(id, "parent", []byte(parent))
 	return is.fs.SetMetadata(id, "parent", []byte(parent))
 }
 }

+ 56 - 0
image/store_test.go

@@ -233,6 +233,62 @@ func TestSearchAfterDelete(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestParentReset(t *testing.T) {
+	tmpdir, err := ioutil.TempDir("", "images-fs-store")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer os.RemoveAll(tmpdir)
+	fs, err := NewFSStoreBackend(tmpdir)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	is, err := NewImageStore(fs, &mockLayerGetReleaser{})
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	id, err := is.Create([]byte(`{"comment": "abc1", "rootfs": {"type": "layers"}}`))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	id2, err := is.Create([]byte(`{"comment": "abc2", "rootfs": {"type": "layers"}}`))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	id3, err := is.Create([]byte(`{"comment": "abc3", "rootfs": {"type": "layers"}}`))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if err := is.SetParent(id, id2); err != nil {
+		t.Fatal(err)
+	}
+
+	ids := is.Children(id2)
+	if actual, expected := len(ids), 1; expected != actual {
+		t.Fatalf("wrong number of children: %d, got %d", expected, actual)
+	}
+
+	if err := is.SetParent(id, id3); err != nil {
+		t.Fatal(err)
+	}
+
+	ids = is.Children(id2)
+	if actual, expected := len(ids), 0; expected != actual {
+		t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
+	}
+
+	ids = is.Children(id3)
+	if actual, expected := len(ids), 1; expected != actual {
+		t.Fatalf("wrong number of children after parent reset: %d, got %d", expected, actual)
+	}
+
+}
+
 type mockLayerGetReleaser struct{}
 type mockLayerGetReleaser struct{}
 
 
 func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) {
 func (ls *mockLayerGetReleaser) Get(layer.ChainID) (layer.Layer, error) {