docker/patch/0232-docker-ensure-layer-digest-folder-removed-if-ls.driv.patch
chenjiankun 54c9d1260f docker: ensure layer digest folder removed if ls.driver.Remove fails
If image pull fails of context canceled, image layer will perform a
rollback operation. When image layer is released, the diff folder of layer
will be removed first, and then the digest folder will be removed.
If the diff folder fails to be removed, such as operation not permitted or
interrupted by others, both the digest folder and diff folder will remain
on the disk, this will cause image not be complete and not repairable.

So we should remove the digest folder first for image layers rollback
and ensure image can be re-pulled completely.
2022-09-15 17:31:01 +08:00

69 lines
2.6 KiB
Diff

From ef17936c73849e17039f0b1558f6a87f70a35890 Mon Sep 17 00:00:00 2001
From: zhangsong <zhangsong34@huawei.com>
Date: Mon, 29 Aug 2022 11:41:15 +0800
Subject: [PATCH] docker: ensure layer digest folder removed if
ls.driver.Remove fails
If image pull fails of context canceled, image layer will perform a
rollback operation. When image layer is released, the diff folder
of layer will be removed first, and then the digest folder will be
removed. If the diff folder fails to be removed, such as operation
not permitted or interrupted by others, both the digest folder and diff
folder will remain on the disk, this will cause image not be complete
and not repairable.
So we should remove the digest folder first for image layers rollback
and ensure image can be re-pulled completely.
Signed-off-by: zhangsong <zhangsong34@huawei.com>
---
components/engine/layer/layer_store.go | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/components/engine/layer/layer_store.go b/components/engine/layer/layer_store.go
index c514ed80..e3030c3c 100644
--- a/components/engine/layer/layer_store.go
+++ b/components/engine/layer/layer_store.go
@@ -311,6 +311,8 @@ func (ls *layerStore) registerWithDescriptor(ts io.Reader, parent ChainID, descr
// Release parent chain if error
defer func() {
if err != nil {
+ logrus.Errorf("Create layer cache id: %s, diff id: %s, chain id: %s, error: %v",
+ p.cacheID, p.diffID, p.chainID, err)
ls.layerL.Lock()
ls.releaseLayer(p)
ls.layerL.Unlock()
@@ -428,12 +430,18 @@ func (ls *layerStore) Map() map[ChainID]Layer {
}
func (ls *layerStore) deleteLayer(layer *roLayer, metadata *Metadata) error {
- err := ls.driver.Remove(layer.cacheID)
+ logrus.Debugf("Deleting layer cache id: %s, diff id: %s, chain id: %s",
+ layer.cacheID, layer.diffID, layer.chainID)
+ err := ls.store.Remove(layer.chainID)
if err != nil {
+ logrus.Errorf("Remove layer store: cache id: %s, diff id: %s, chain id: %s, error: %v",
+ layer.cacheID, layer.diffID, layer.chainID, err)
return err
}
- err = ls.store.Remove(layer.chainID)
+ err = ls.driver.Remove(layer.cacheID)
if err != nil {
+ logrus.Errorf("Remove driver store: cache id: %s, diff id: %s, chain id: %s, error: %v",
+ layer.cacheID, layer.diffID, layer.chainID, err)
return err
}
metadata.DiffID = layer.diffID
@@ -444,6 +452,8 @@ func (ls *layerStore) deleteLayer(layer *roLayer, metadata *Metadata) error {
}
metadata.DiffSize = layer.size
+ logrus.Debugf("Delete layer cache id: %s, diff id: %s, chain id: %s done",
+ layer.cacheID, layer.diffID, layer.chainID)
return nil
}
--
2.27.0