Browse code

Fix image size calc on initial save

Michael Crosby authored on 2013/11/21 07:51:04
Showing 2 changed files
... ...
@@ -1575,8 +1575,7 @@ func (container *Container) GetSize() (int64, int64) {
1575 1575
 		}
1576 1576
 	}
1577 1577
 
1578
-	_, err = os.Stat(container.RootfsPath())
1579
-	if err == nil {
1578
+	if _, err = os.Stat(container.RootfsPath()); err != nil {
1580 1579
 		filepath.Walk(container.RootfsPath(), func(path string, fileInfo os.FileInfo, err error) error {
1581 1580
 			if fileInfo != nil {
1582 1581
 				sizeRootfs += fileInfo.Size()
... ...
@@ -62,19 +62,27 @@ func LoadImage(root string) (*Image, error) {
62 62
 	return img, nil
63 63
 }
64 64
 
65
-func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, rootfs string) error {
65
+func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, layer string) error {
66 66
 	// Store the layer
67
-	layer := rootfs
67
+	var (
68
+		size   int64
69
+		err    error
70
+		driver = img.graph.driver
71
+	)
68 72
 	if err := os.MkdirAll(layer, 0755); err != nil {
69 73
 		return err
70 74
 	}
71 75
 
72 76
 	// If layerData is not nil, unpack it into the new layer
73 77
 	if layerData != nil {
74
-		if differ, ok := img.graph.driver.(graphdriver.Differ); ok {
78
+		if differ, ok := driver.(graphdriver.Differ); ok {
75 79
 			if err := differ.ApplyDiff(img.ID, layerData); err != nil {
76 80
 				return err
77 81
 			}
82
+
83
+			if size, err = differ.DiffSize(img.ID); err != nil {
84
+				return err
85
+			}
78 86
 		} else {
79 87
 			start := time.Now()
80 88
 			utils.Debugf("Start untar layer")
... ...
@@ -82,6 +90,24 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro
82 82
 				return err
83 83
 			}
84 84
 			utils.Debugf("Untar time: %vs", time.Now().Sub(start).Seconds())
85
+
86
+			if img.Parent == "" {
87
+				if size, err = utils.TreeSize(layer); err != nil {
88
+					return err
89
+				}
90
+			} else {
91
+				parent, err := driver.Get(img.Parent)
92
+				if err != nil {
93
+					return err
94
+				}
95
+				changes, err := archive.ChangesDirs(layer, parent)
96
+				if err != nil {
97
+					return err
98
+				}
99
+				if size = archive.ChangesSize(layer, changes); err != nil {
100
+					return err
101
+				}
102
+			}
85 103
 		}
86 104
 	}
87 105
 
... ...
@@ -90,18 +116,13 @@ func StoreImage(img *Image, jsonData []byte, layerData archive.Archive, root, ro
90 90
 		return ioutil.WriteFile(jsonPath(root), jsonData, 0600)
91 91
 	}
92 92
 	// Otherwise, unmarshal the image
93
-	jsonData, err := json.Marshal(img)
94
-	if err != nil {
93
+	if jsonData, err = json.Marshal(img); err != nil {
95 94
 		return err
96 95
 	}
97 96
 	if err := ioutil.WriteFile(jsonPath(root), jsonData, 0600); err != nil {
98 97
 		return err
99 98
 	}
100
-	// Compute and save the size of the rootfs
101
-	size, err := utils.TreeSize(rootfs)
102
-	if err != nil {
103
-		return fmt.Errorf("Error computing size of rootfs %s: %s", img.ID, err)
104
-	}
99
+
105 100
 	img.Size = size
106 101
 	if err := img.SaveSize(root); err != nil {
107 102
 		return err