Skip to content

Commit

Permalink
Merge pull request moby#34192 from swernli/fixBuilderCopy
Browse files Browse the repository at this point in the history
Fixing releaseableLayer handling of layer streams and mounts.
  • Loading branch information
johnstep authored Jul 27, 2017
2 parents 2f8a3af + 1d45799 commit e9cd2fe
Showing 1 changed file with 33 additions and 3 deletions.
36 changes: 33 additions & 3 deletions daemon/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ type releaseableLayer struct {

func (rl *releaseableLayer) Mount() (string, error) {
var err error
var mountPath string
var chainID layer.ChainID
if rl.roLayer != nil {
chainID = rl.roLayer.ChainID()
Expand All @@ -38,7 +39,19 @@ func (rl *releaseableLayer) Mount() (string, error) {
return "", errors.Wrap(err, "failed to create rwlayer")
}

return rl.rwLayer.Mount("")
mountPath, err = rl.rwLayer.Mount("")
if err != nil {
// Clean up the layer if we fail to mount it here.
metadata, err := rl.layerStore.ReleaseRWLayer(rl.rwLayer)
layer.LogReleaseMetadata(metadata)
if err != nil {
logrus.Errorf("Failed to release RWLayer: %s", err)
}
rl.rwLayer = nil
return "", err
}

return mountPath, nil
}

func (rl *releaseableLayer) Commit(platform string) (builder.ReleaseableLayer, error) {
Expand All @@ -51,6 +64,7 @@ func (rl *releaseableLayer) Commit(platform string) (builder.ReleaseableLayer, e
if err != nil {
return nil, err
}
defer stream.Close()

newLayer, err := rl.layerStore.Register(stream, chainID, layer.Platform(platform))
if err != nil {
Expand All @@ -75,20 +89,32 @@ func (rl *releaseableLayer) Release() error {
if rl.released {
return nil
}
if err := rl.releaseRWLayer(); err != nil {
// Best effort attempt at releasing read-only layer before returning original error.
rl.releaseROLayer()
return err
}
if err := rl.releaseROLayer(); err != nil {
return err
}
rl.released = true
rl.releaseRWLayer()
return rl.releaseROLayer()
return nil
}

func (rl *releaseableLayer) releaseRWLayer() error {
if rl.rwLayer == nil {
return nil
}
if err := rl.rwLayer.Unmount(); err != nil {
logrus.Errorf("Failed to unmount RWLayer: %s", err)
return err
}
metadata, err := rl.layerStore.ReleaseRWLayer(rl.rwLayer)
layer.LogReleaseMetadata(metadata)
if err != nil {
logrus.Errorf("Failed to release RWLayer: %s", err)
}
rl.rwLayer = nil
return err
}

Expand All @@ -98,6 +124,10 @@ func (rl *releaseableLayer) releaseROLayer() error {
}
metadata, err := rl.layerStore.Release(rl.roLayer)
layer.LogReleaseMetadata(metadata)
if err != nil {
logrus.Errorf("Failed to release ROLayer: %s", err)
}
rl.roLayer = nil
return err
}

Expand Down

0 comments on commit e9cd2fe

Please sign in to comment.