// GetSize, return real size, virtual size func (container *Container) GetSize() (int64, int64) { var ( sizeRw, sizeRootfs int64 err error driver = container.daemon.driver ) if err := container.Mount(); err != nil { log.Errorf("Failed to compute size of container rootfs %s: %s", container.ID, err) return sizeRw, sizeRootfs } defer container.Unmount() initID := fmt.Sprintf("%s-init", container.ID) sizeRw, err = driver.DiffSize(container.ID, initID) if err != nil { log.Errorf("Driver %s couldn't return diff size of container %s: %s", driver, container.ID, err) // FIXME: GetSize should return an error. Not changing it now in case // there is a side-effect. sizeRw = -1 } if _, err = os.Stat(container.basefs); err != nil { if sizeRootfs, err = directory.Size(container.basefs); err != nil { sizeRootfs = -1 } } return sizeRw, sizeRootfs }
// VolumesPrune removes unused local volumes func (daemon *Daemon) VolumesPrune(pruneFilters filters.Args) (*types.VolumesPruneReport, error) { rep := &types.VolumesPruneReport{} pruneVols := func(v volume.Volume) error { name := v.Name() refs := daemon.volumes.Refs(v) if len(refs) == 0 { vSize, err := directory.Size(v.Path()) if err != nil { logrus.Warnf("could not determine size of volume %s: %v", name, err) } err = daemon.volumes.Remove(v) if err != nil { logrus.Warnf("could not remove volume %s: %v", name, err) return nil } rep.SpaceReclaimed += uint64(vSize) rep.VolumesDeleted = append(rep.VolumesDeleted, name) } return nil } err := daemon.traverseLocalVolumes(pruneVols) return rep, err }
// DiffSize calculates the changes between the specified id // and its parent and returns the size in bytes of the changes // relative to its base filesystem directory. func (a *Driver) DiffSize(id, parent string) (size int64, err error) { if !a.isParent(id, parent) { return a.naiveDiff.DiffSize(id, parent) } // AUFS doesn't need the parent layer to calculate the diff size. return directory.Size(path.Join(a.rootPath(), "diff", id)) }
// ApplyDiff applies the new layer into a root func (d *Driver) ApplyDiff(id string, parent string, diff io.Reader) (size int64, err error) { if !d.isParent(id, parent) { return d.naiveDiff.ApplyDiff(id, parent, diff) } applyDir := d.getDiffPath(id) logrus.Debugf("Applying tar in %s", applyDir) // Overlay doesn't need the parent id to apply the diff if err := untar(diff, applyDir, &archive.TarOptions{ UIDMaps: d.uidMaps, GIDMaps: d.gidMaps, WhiteoutFormat: archive.OverlayWhiteoutFormat, }); err != nil { return 0, err } return directory.Size(applyDir) }
// SystemDiskUsage returns information about the daemon data disk usage func (daemon *Daemon) SystemDiskUsage() (*types.DiskUsage, error) { // Retrieve container list allContainers, err := daemon.Containers(&types.ContainerListOptions{ Size: true, All: true, }) if err != nil { return nil, fmt.Errorf("failed to retrieve container list: %v", err) } // Get all top images with extra attributes allImages, err := daemon.Images(filters.NewArgs(), false, true) if err != nil { return nil, fmt.Errorf("failed to retrieve image list: %v", err) } // Get all local volumes allVolumes := []*types.Volume{} getLocalVols := func(v volume.Volume) error { name := v.Name() refs := daemon.volumes.Refs(v) tv := volumeToAPIType(v) sz, err := directory.Size(v.Path()) if err != nil { logrus.Warnf("failed to determine size of volume %v", name) sz = -1 } tv.UsageData = &types.VolumeUsageData{Size: sz, RefCount: int64(len(refs))} allVolumes = append(allVolumes, tv) return nil } err = daemon.traverseLocalVolumes(getLocalVols) if err != nil { return nil, err } // Get total layers size on disk layerRefs := daemon.getLayerRefs() allLayers := daemon.layerStore.Map() var allLayersSize int64 for _, l := range allLayers { size, err := l.DiffSize() if err == nil { if _, ok := layerRefs[l.ChainID()]; ok { allLayersSize += size } else { logrus.Warnf("found leaked image layer %v", l.ChainID()) } } else { logrus.Warnf("failed to get diff size for layer %v", l.ChainID()) } } return &types.DiskUsage{ LayersSize: allLayersSize, Containers: allContainers, Volumes: allVolumes, Images: allImages, }, nil }
// DiffSize calculates the changes between the specified id // and its parent and returns the size in bytes of the changes // relative to its base filesystem directory. func (d *Driver) DiffSize(id, parent string) (size int64, err error) { return directory.Size(d.getDiffPath(id)) }
// DiffSize calculates the changes between the specified id // and its parent and returns the size in bytes of the changes // relative to its base filesystem directory. func (d *Driver) DiffSize(id, parent string) (size int64, err error) { return directory.Size(path.Join(virtPath, id)) }
// DiffSize calculates the changes between the specified id // and its parent and returns the size in bytes of the changes // relative to its base filesystem directory. func (d *Driver) DiffSize(id, parent string) (size int64, err error) { if !d.isParent(id, parent) { return d.naiveDiff.DiffSize(id, parent) } return directory.Size(d.getDiffPath(id)) }