Merge pull request #2304 from unclejack/fix_layer_size_computation

Fix layer size computation: handle hard links correctly
This commit is contained in:
Michael Crosby 2013-11-21 16:10:24 -08:00
commit f7c2a00557
2 changed files with 44 additions and 5 deletions

View File

@ -1346,20 +1346,46 @@ func validateID(id string) error {
// GetSize, return real size, virtual size // GetSize, return real size, virtual size
func (container *Container) GetSize() (int64, int64) { func (container *Container) GetSize() (int64, int64) {
var sizeRw, sizeRootfs int64 var sizeRw, sizeRootfs int64
data := make(map[uint64]bool)
filepath.Walk(container.rwPath(), func(path string, fileInfo os.FileInfo, err error) error { filepath.Walk(container.rwPath(), func(path string, fileInfo os.FileInfo, err error) error {
if fileInfo != nil { if fileInfo == nil {
sizeRw += fileInfo.Size() return nil
} }
size := fileInfo.Size()
if size == 0 {
return nil
}
inode := fileInfo.Sys().(*syscall.Stat_t).Ino
if _, entryExists := data[inode]; entryExists {
return nil
}
data[inode] = false
sizeRw += size
return nil return nil
}) })
data = make(map[uint64]bool)
_, err := os.Stat(container.RootfsPath()) _, err := os.Stat(container.RootfsPath())
if 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() return nil
} }
size := fileInfo.Size()
if size == 0 {
return nil
}
inode := fileInfo.Sys().(*syscall.Stat_t).Ino
if _, entryExists := data[inode]; entryExists {
return nil
}
data[inode] = false
sizeRootfs += size
return nil return nil
}) })
} }

View File

@ -16,6 +16,7 @@ import (
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
"syscall"
"time" "time"
) )
@ -114,10 +115,22 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root str
func StoreSize(img *Image, root string) error { func StoreSize(img *Image, root string) error {
layer := layerPath(root) layer := layerPath(root)
data := make(map[uint64]bool)
var totalSize int64 var totalSize int64
filepath.Walk(layer, func(path string, fileInfo os.FileInfo, err error) error { filepath.Walk(layer, func(path string, fileInfo os.FileInfo, err error) error {
totalSize += fileInfo.Size() size := fileInfo.Size()
if size == 0 {
return nil
}
inode := fileInfo.Sys().(*syscall.Stat_t).Ino
if _, entryExists := data[inode]; entryExists {
return nil
}
data[inode] = false
totalSize += size
return nil return nil
}) })
img.Size = totalSize img.Size = totalSize