Bläddra i källkod

Merge pull request #45347 from thaJeztah/align_size_virtualsize

c8d: align "Size" and "VirtualSize" for images
Sebastiaan van Stijn 2 år sedan
förälder
incheckning
7103efac9d
2 ändrade filer med 17 tillägg och 10 borttagningar
  1. 14 8
      daemon/containerd/image_list.go
  2. 3 2
      daemon/containerd/service.go

+ 14 - 8
daemon/containerd/image_list.go

@@ -203,11 +203,15 @@ func (i *ImageService) singlePlatformImage(ctx context.Context, contentStore con
 		sizeCache[d] = usage.Size
 		return usage.Size, nil
 	}
-	virtualSize, err := computeVirtualSize(chainIDs, snapshotSizeFn)
+	snapshotSize, err := computeSnapshotSize(chainIDs, snapshotSizeFn)
 	if err != nil {
 		return nil, nil, err
 	}
 
+	// totalSize is the size of the image's packed layers and snapshots
+	// (unpacked layers) combined.
+	totalSize := size + snapshotSize
+
 	var repoTags, repoDigests []string
 	rawImg := image.Metadata()
 	target := rawImg.Target.Digest
@@ -245,8 +249,8 @@ func (i *ImageService) singlePlatformImage(ctx context.Context, contentStore con
 		Created:     rawImg.CreatedAt.Unix(),
 		RepoDigests: repoDigests,
 		RepoTags:    repoTags,
-		Size:        size,
-		VirtualSize: virtualSize,
+		Size:        totalSize,
+		VirtualSize: totalSize,
 		// -1 indicates that the value has not been set (avoids ambiguity
 		// between 0 (default) and "not set". We cannot use a pointer (nil)
 		// for this, as the JSON representation uses "omitempty", which would
@@ -476,16 +480,18 @@ func setupLabelFilter(store content.Store, fltrs filters.Args) (func(image image
 	}, nil
 }
 
-func computeVirtualSize(chainIDs []digest.Digest, sizeFn func(d digest.Digest) (int64, error)) (int64, error) {
-	var virtualSize int64
+// computeSnapshotSize calculates the total size consumed by the snapshots
+// for the given chainIDs.
+func computeSnapshotSize(chainIDs []digest.Digest, sizeFn func(d digest.Digest) (int64, error)) (int64, error) {
+	var totalSize int64
 	for _, chainID := range chainIDs {
 		size, err := sizeFn(chainID)
 		if err != nil {
-			return virtualSize, err
+			return totalSize, err
 		}
-		virtualSize += size
+		totalSize += size
 	}
-	return virtualSize, nil
+	return totalSize, nil
 }
 
 func computeSharedSize(chainIDs []digest.Digest, layers map[digest.Digest]int, sizeFn func(d digest.Digest) (int64, error)) (int64, error) {

+ 3 - 2
daemon/containerd/service.go

@@ -195,10 +195,11 @@ func (i *ImageService) GetContainerLayerSize(ctx context.Context, containerID st
 	}
 
 	chainIDs := identity.ChainIDs(img.RootFS.DiffIDs)
-	virtualSize, err := computeVirtualSize(chainIDs, snapshotSizeFn)
+	snapShotSize, err := computeSnapshotSize(chainIDs, snapshotSizeFn)
 	if err != nil {
 		return 0, 0, err
 	}
 
-	return usage.Size, usage.Size + virtualSize, nil
+	// TODO(thaJeztah): include content-store size for the image (similar to "GET /images/json")
+	return usage.Size, usage.Size + snapShotSize, nil
 }