Skip to content
This repository was archived by the owner on Oct 13, 2023. It is now read-only.

Commit aa4e506

Browse files
authored
Merge pull request #158 from swernli/applyingReleasableLayerFix
[17.06] Fixing releaseableLayer handling of layer streams and mounts.
2 parents 8738f29 + 60340be commit aa4e506

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

components/engine/daemon/build.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,58 @@ type releaseableLayer struct {
2323
}
2424

2525
func (rl *releaseableLayer) Mount() (string, error) {
26+
var err error
27+
var mountPath string
2628
if rl.roLayer == nil {
2729
return "", errors.New("can not mount an image with no root FS")
2830
}
29-
var err error
3031
mountID := stringid.GenerateRandomID()
3132
rl.rwLayer, err = rl.layerStore.CreateRWLayer(mountID, rl.roLayer.ChainID(), nil)
3233
if err != nil {
3334
return "", errors.Wrap(err, "failed to create rwlayer")
3435
}
3536

36-
return rl.rwLayer.Mount("")
37+
mountPath, err = rl.rwLayer.Mount("")
38+
if err != nil {
39+
// Clean up the layer if we fail to mount it here.
40+
metadata, err := rl.layerStore.ReleaseRWLayer(rl.rwLayer)
41+
layer.LogReleaseMetadata(metadata)
42+
if err != nil {
43+
logrus.Errorf("Failed to release RWLayer: %s", err)
44+
}
45+
rl.rwLayer = nil
46+
return "", err
47+
}
48+
49+
return mountPath, nil
3750
}
3851

3952
func (rl *releaseableLayer) Release() error {
40-
rl.releaseRWLayer()
41-
return rl.releaseROLayer()
53+
if err := rl.releaseRWLayer(); err != nil {
54+
// Best effort attempt at releasing read-only layer before returning original error.
55+
rl.releaseROLayer()
56+
return err
57+
}
58+
if err := rl.releaseROLayer(); err != nil {
59+
return err
60+
}
61+
return nil
4262
}
4363

4464
func (rl *releaseableLayer) releaseRWLayer() error {
4565
if rl.rwLayer == nil {
4666
return nil
4767
}
68+
if err := rl.rwLayer.Unmount(); err != nil {
69+
logrus.Errorf("Failed to unmount RWLayer: %s", err)
70+
return err
71+
}
4872
metadata, err := rl.layerStore.ReleaseRWLayer(rl.rwLayer)
4973
layer.LogReleaseMetadata(metadata)
5074
if err != nil {
5175
logrus.Errorf("Failed to release RWLayer: %s", err)
5276
}
77+
rl.rwLayer = nil
5378
return err
5479
}
5580

@@ -59,6 +84,10 @@ func (rl *releaseableLayer) releaseROLayer() error {
5984
}
6085
metadata, err := rl.layerStore.Release(rl.roLayer)
6186
layer.LogReleaseMetadata(metadata)
87+
if err != nil {
88+
logrus.Errorf("Failed to release ROLayer: %s", err)
89+
}
90+
rl.roLayer = nil
6291
return err
6392
}
6493

0 commit comments

Comments
 (0)