|
@@ -577,11 +577,7 @@ func (ls *layerStore) initMount(graphID, parent, mountLabel string, initFunc Mou
|
|
}
|
|
}
|
|
|
|
|
|
func (ls *layerStore) assembleTarTo(graphID string, metadata io.ReadCloser, size *int64, w io.Writer) error {
|
|
func (ls *layerStore) assembleTarTo(graphID string, metadata io.ReadCloser, size *int64, w io.Writer) error {
|
|
- type diffPathDriver interface {
|
|
|
|
- DiffPath(string) (string, func() error, error)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- diffDriver, ok := ls.driver.(diffPathDriver)
|
|
|
|
|
|
+ diffDriver, ok := ls.driver.(graphdriver.DiffGetterDriver)
|
|
if !ok {
|
|
if !ok {
|
|
diffDriver = &naiveDiffPathDriver{ls.driver}
|
|
diffDriver = &naiveDiffPathDriver{ls.driver}
|
|
}
|
|
}
|
|
@@ -589,17 +585,16 @@ func (ls *layerStore) assembleTarTo(graphID string, metadata io.ReadCloser, size
|
|
defer metadata.Close()
|
|
defer metadata.Close()
|
|
|
|
|
|
// get our relative path to the container
|
|
// get our relative path to the container
|
|
- fsPath, releasePath, err := diffDriver.DiffPath(graphID)
|
|
|
|
|
|
+ fileGetCloser, err := diffDriver.DiffGetter(graphID)
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- defer releasePath()
|
|
|
|
|
|
+ defer fileGetCloser.Close()
|
|
|
|
|
|
metaUnpacker := storage.NewJSONUnpacker(metadata)
|
|
metaUnpacker := storage.NewJSONUnpacker(metadata)
|
|
upackerCounter := &unpackSizeCounter{metaUnpacker, size}
|
|
upackerCounter := &unpackSizeCounter{metaUnpacker, size}
|
|
- fileGetter := storage.NewPathFileGetter(fsPath)
|
|
|
|
- logrus.Debugf("Assembling tar data for %s from %s", graphID, fsPath)
|
|
|
|
- return asm.WriteOutputTarStream(fileGetter, upackerCounter, w)
|
|
|
|
|
|
+ logrus.Debugf("Assembling tar data for %s", graphID)
|
|
|
|
+ return asm.WriteOutputTarStream(fileGetCloser, upackerCounter, w)
|
|
}
|
|
}
|
|
|
|
|
|
func (ls *layerStore) Cleanup() error {
|
|
func (ls *layerStore) Cleanup() error {
|
|
@@ -618,12 +613,20 @@ type naiveDiffPathDriver struct {
|
|
graphdriver.Driver
|
|
graphdriver.Driver
|
|
}
|
|
}
|
|
|
|
|
|
-func (n *naiveDiffPathDriver) DiffPath(id string) (string, func() error, error) {
|
|
|
|
|
|
+type fileGetPutter struct {
|
|
|
|
+ storage.FileGetter
|
|
|
|
+ driver graphdriver.Driver
|
|
|
|
+ id string
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (w *fileGetPutter) Close() error {
|
|
|
|
+ return w.driver.Put(w.id)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (n *naiveDiffPathDriver) DiffGetter(id string) (graphdriver.FileGetCloser, error) {
|
|
p, err := n.Driver.Get(id, "")
|
|
p, err := n.Driver.Get(id, "")
|
|
if err != nil {
|
|
if err != nil {
|
|
- return "", nil, err
|
|
|
|
|
|
+ return nil, err
|
|
}
|
|
}
|
|
- return p, func() error {
|
|
|
|
- return n.Driver.Put(id)
|
|
|
|
- }, nil
|
|
|
|
|
|
+ return &fileGetPutter{storage.NewPathFileGetter(p), n.Driver, id}, nil
|
|
}
|
|
}
|