Преглед изворни кода

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

Fix image save size
Victor Vieux пре 11 година
родитељ
комит
2f0d18ac4a
3 измењених фајлова са 53 додато и 16 уклоњено
  1. 1 2
      container.go
  2. 1 1
      graph.go
  3. 51 13
      image.go

+ 1 - 2
container.go

@@ -1575,8 +1575,7 @@ func (container *Container) GetSize() (int64, int64) {
 		}
 		}
 	}
 	}
 
 
-	_, err = os.Stat(container.RootfsPath())
-	if err == nil {
+	if _, err = os.Stat(container.RootfsPath()); 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()

+ 1 - 1
graph.go

@@ -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
 	}
 	}

+ 51 - 13
image.go

@@ -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 err != nil {
+	if jsonData, err = json.Marshal(img); 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 {