Merge pull request #59 from crosbymichael/fix-image-save-size

Fix image save size
This commit is contained in:
Victor Vieux 2013-11-20 15:58:31 -08:00
commit 2f0d18ac4a
3 changed files with 53 additions and 16 deletions

View File

@ -1575,8 +1575,7 @@ func (container *Container) GetSize() (int64, int64) {
} }
} }
_, err = os.Stat(container.RootfsPath()) if _, err = os.Stat(container.RootfsPath()); err != nil {
if err == nil {
filepath.Walk(container.RootfsPath(), func(path string, fileInfo os.FileInfo, err error) error { filepath.Walk(container.RootfsPath(), func(path string, fileInfo os.FileInfo, err error) error {
if fileInfo != nil { if fileInfo != nil {
sizeRootfs += fileInfo.Size() sizeRootfs += fileInfo.Size()

View File

@ -187,7 +187,7 @@ func (graph *Graph) TempLayerArchive(id string, compression archive.Compression,
if err != nil { if err != nil {
return nil, err return nil, err
} }
a, err := image.TarLayer(compression) a, err := image.TarLayer()
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -62,19 +62,27 @@ func LoadImage(root string) (*Image, error) {
return img, nil return img, nil
} }
func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, rootfs string) error { func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, layer string) error {
// Store the layer // Store the layer
layer := rootfs var (
size int64
err error
driver = img.graph.driver
)
if err := os.MkdirAll(layer, 0755); err != nil { if err := os.MkdirAll(layer, 0755); err != nil {
return err return err
} }
// If layerData is not nil, unpack it into the new layer // If layerData is not nil, unpack it into the new layer
if layerData != nil { if layerData != nil {
if differ, ok := img.graph.driver.(graphdriver.Differ); ok { if differ, ok := driver.(graphdriver.Differ); ok {
if err := differ.ApplyDiff(img.ID, layerData); err != nil { if err := differ.ApplyDiff(img.ID, layerData); err != nil {
return err return err
} }
if size, err = differ.DiffSize(img.ID); err != nil {
return err
}
} else { } else {
start := time.Now() start := time.Now()
utils.Debugf("Start untar layer") utils.Debugf("Start untar layer")
@ -82,6 +90,24 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro
return err return err
} }
utils.Debugf("Untar time: %vs", time.Now().Sub(start).Seconds()) utils.Debugf("Untar time: %vs", time.Now().Sub(start).Seconds())
if img.Parent == "" {
if size, err = utils.TreeSize(layer); err != nil {
return err
}
} else {
parent, err := driver.Get(img.Parent)
if err != nil {
return err
}
changes, err := archive.ChangesDirs(layer, parent)
if err != nil {
return err
}
if size = archive.ChangesSize(layer, changes); err != nil {
return err
}
}
} }
} }
@ -90,18 +116,13 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro
return ioutil.WriteFile(jsonPath(root), jsonData, 0600) return ioutil.WriteFile(jsonPath(root), jsonData, 0600)
} }
// Otherwise, unmarshal the image // Otherwise, unmarshal the image
jsonData, err := json.Marshal(img) if jsonData, err = json.Marshal(img); err != nil {
if err != nil {
return err return err
} }
if err := ioutil.WriteFile(jsonPath(root), jsonData, 0600); err != nil { if err := ioutil.WriteFile(jsonPath(root), jsonData, 0600); err != nil {
return err return err
} }
// Compute and save the size of the rootfs
size, err := utils.TreeSize(rootfs)
if err != nil {
return fmt.Errorf("Error computing size of rootfs %s: %s", img.ID, err)
}
img.Size = size img.Size = size
if err := img.SaveSize(root); err != nil { if err := img.SaveSize(root); err != nil {
return err return err
@ -123,15 +144,32 @@ func jsonPath(root string) string {
} }
// TarLayer returns a tar archive of the image's filesystem layer. // TarLayer returns a tar archive of the image's filesystem layer.
func (img *Image) TarLayer(compression archive.Compression) (archive.Archive, error) { func (img *Image) TarLayer() (archive.Archive, error) {
if img.graph == nil { if img.graph == nil {
return nil, fmt.Errorf("Can't load storage driver for unregistered image %s", img.ID) return nil, fmt.Errorf("Can't load storage driver for unregistered image %s", img.ID)
} }
layerPath, err := img.graph.driver.Get(img.ID) driver := img.graph.driver
if differ, ok := driver.(graphdriver.Differ); ok {
return differ.Diff(img.ID)
}
imgFs, err := driver.Get(img.ID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return archive.Tar(layerPath, compression) if img.Parent == "" {
return archive.Tar(imgFs, archive.Uncompressed)
} else {
parentFs, err := driver.Get(img.Parent)
if err != nil {
return nil, err
}
changes, err := archive.ChangesDirs(imgFs, parentFs)
if err != nil {
return nil, err
}
return archive.ExportChanges(imgFs, changes)
}
} }
func ValidateID(id string) error { func ValidateID(id string) error {