diff --git a/integration/image/remove_unix_test.go b/integration/image/remove_unix_test.go index 6f16f2d8ee..cbcb3c23fb 100644 --- a/integration/image/remove_unix_test.go +++ b/integration/image/remove_unix_test.go @@ -110,4 +110,10 @@ func TestRemoveImageGarbageCollector(t *testing.T) { i.Cleanup() _, err = os.Stat(data["UpperDir"]) assert.Assert(t, os.IsNotExist(err)) + + // Make sure that removal pending layers does not exist on layerdb either + layerdbItems, _ := ioutil.ReadDir(filepath.Join(d.RootDir(), "/image/overlay2/layerdb/sha256")) + for _, folder := range layerdbItems { + assert.Equal(t, false, strings.HasSuffix(folder.Name(), "-removing")) + } } diff --git a/layer/filestore.go b/layer/filestore.go index a1726a5a40..0c15cc9b96 100644 --- a/layer/filestore.go +++ b/layer/filestore.go @@ -403,7 +403,7 @@ func (fms *fileMetadataStore) Remove(layer ChainID, cache string) error { return err } for _, f := range files { - if !strings.HasSuffix(f.Name(), "-removing") || !strings.HasPrefix(f.Name(), dgst.String()) { + if !strings.HasSuffix(f.Name(), "-removing") || !strings.HasPrefix(f.Name(), dgst.Encoded()) { continue } diff --git a/layer/layer_store.go b/layer/layer_store.go index dd766c9d55..bb4cc1783b 100644 --- a/layer/layer_store.go +++ b/layer/layer_store.go @@ -419,11 +419,11 @@ func (ls *layerStore) Map() map[ChainID]Layer { func (ls *layerStore) deleteLayer(layer *roLayer, metadata *Metadata) error { // Rename layer digest folder first so we detect orphan layer(s) // if ls.driver.Remove fails - dir := ls.store.getLayerDirectory(layer.chainID) + var dir string for { dgst := digest.Digest(layer.chainID) tmpID := fmt.Sprintf("%s-%s-removing", dgst.Hex(), stringid.GenerateRandomID()) - dir := filepath.Join(ls.store.root, string(dgst.Algorithm()), tmpID) + dir = filepath.Join(ls.store.root, string(dgst.Algorithm()), tmpID) err := os.Rename(ls.store.getLayerDirectory(layer.chainID), dir) if os.IsExist(err) { continue