mirror of https://github.com/containers/podman.git
Ensure that the DF endpoint updated volume refcount
The field was already exposed already in the `system df` output so this just required a bit of plumbing and testing. As part of this, fix `podman systemd df` volume in-use logic. Previously, volumes were only considered to be in use if the container using them was running. This does not match Docker's behavior, where a volume is considered in use as long as a container exists that uses the volume, even if said container is not running. Fixes #15720 Signed-off-by: Matthew Heon <matthew.heon@pm.me>
This commit is contained in:
parent
94864cbce6
commit
07a8eb8295
|
@ -76,7 +76,7 @@ func GetDiskUsage(w http.ResponseWriter, r *http.Request) {
|
||||||
Scope: "local",
|
Scope: "local",
|
||||||
Status: nil,
|
Status: nil,
|
||||||
UsageData: &docker.VolumeUsageData{
|
UsageData: &docker.VolumeUsageData{
|
||||||
RefCount: 1,
|
RefCount: int64(o.Links),
|
||||||
Size: o.Size,
|
Size: o.Size,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,6 @@ import (
|
||||||
|
|
||||||
"github.com/containers/common/pkg/cgroups"
|
"github.com/containers/common/pkg/cgroups"
|
||||||
"github.com/containers/common/pkg/config"
|
"github.com/containers/common/pkg/config"
|
||||||
cutil "github.com/containers/common/pkg/util"
|
|
||||||
"github.com/containers/podman/v4/libpod/define"
|
"github.com/containers/podman/v4/libpod/define"
|
||||||
"github.com/containers/podman/v4/pkg/domain/entities"
|
"github.com/containers/podman/v4/pkg/domain/entities"
|
||||||
"github.com/containers/podman/v4/pkg/domain/entities/reports"
|
"github.com/containers/podman/v4/pkg/domain/entities/reports"
|
||||||
|
@ -321,19 +320,9 @@ func (ic *ContainerEngine) SystemDf(ctx context.Context, options entities.System
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
running, err := ic.Libpod.GetRunningContainers()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
runningContainers := make([]string, 0, len(running))
|
|
||||||
for _, c := range running {
|
|
||||||
runningContainers = append(runningContainers, c.ID())
|
|
||||||
}
|
|
||||||
|
|
||||||
dfVolumes := make([]*entities.SystemDfVolumeReport, 0, len(vols))
|
dfVolumes := make([]*entities.SystemDfVolumeReport, 0, len(vols))
|
||||||
for _, v := range vols {
|
for _, v := range vols {
|
||||||
var reclaimableSize uint64
|
var reclaimableSize uint64
|
||||||
var consInUse int
|
|
||||||
mountPoint, err := v.MountPoint()
|
mountPoint, err := v.MountPoint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -355,14 +344,9 @@ func (ic *ContainerEngine) SystemDf(ctx context.Context, options entities.System
|
||||||
if len(inUse) == 0 {
|
if len(inUse) == 0 {
|
||||||
reclaimableSize = volSize
|
reclaimableSize = volSize
|
||||||
}
|
}
|
||||||
for _, viu := range inUse {
|
|
||||||
if cutil.StringInSlice(viu, runningContainers) {
|
|
||||||
consInUse++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
report := entities.SystemDfVolumeReport{
|
report := entities.SystemDfVolumeReport{
|
||||||
VolumeName: v.Name(),
|
VolumeName: v.Name(),
|
||||||
Links: consInUse,
|
Links: len(inUse),
|
||||||
Size: int64(volSize),
|
Size: int64(volSize),
|
||||||
ReclaimableSize: int64(reclaimableSize),
|
ReclaimableSize: int64(reclaimableSize),
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,24 @@ t GET system/df 200 '.Volumes[0].Name=foo1'
|
||||||
|
|
||||||
t GET libpod/system/df 200 '.Volumes[0].VolumeName=foo1'
|
t GET libpod/system/df 200 '.Volumes[0].VolumeName=foo1'
|
||||||
|
|
||||||
|
# Verify that no containers reference the volume
|
||||||
|
t GET system/df 200 '.Volumes[0].UsageData.RefCount=0'
|
||||||
|
|
||||||
|
# Make a container using the volume
|
||||||
|
podman pull $IMAGE &>/dev/null
|
||||||
|
t POST containers/create Image=$IMAGE Volumes='{"/test":{}}' HostConfig='{"Binds":["foo1:/test"]}' 201 \
|
||||||
|
.Id~[0-9a-f]\\{64\\}
|
||||||
|
cid=$(jq -r '.Id' <<<"$output")
|
||||||
|
|
||||||
|
# Verify that one container references the volume
|
||||||
|
t GET system/df 200 '.Volumes[0].UsageData.RefCount=1'
|
||||||
|
|
||||||
|
# Remove the container
|
||||||
|
t DELETE containers/$cid?v=true 204
|
||||||
|
|
||||||
|
# Verify that no containers reference the volume
|
||||||
|
t GET system/df 200 '.Volumes[0].UsageData.RefCount=0'
|
||||||
|
|
||||||
# Create two more volumes to test pruneing
|
# Create two more volumes to test pruneing
|
||||||
t POST libpod/volumes/create \
|
t POST libpod/volumes/create \
|
||||||
Name=foo2 \
|
Name=foo2 \
|
||||||
|
|
|
@ -27,7 +27,7 @@ function teardown() {
|
||||||
run_podman system df --format '{{ .Type }}:{{ .Total }}:{{ .Active }}'
|
run_podman system df --format '{{ .Type }}:{{ .Total }}:{{ .Active }}'
|
||||||
is "${lines[0]}" "Images:1:1" "system df : Images line"
|
is "${lines[0]}" "Images:1:1" "system df : Images line"
|
||||||
is "${lines[1]}" "Containers:2:1" "system df : Containers line"
|
is "${lines[1]}" "Containers:2:1" "system df : Containers line"
|
||||||
is "${lines[2]}" "Local Volumes:2:1" "system df : Volumes line"
|
is "${lines[2]}" "Local Volumes:2:2" "system df : Volumes line"
|
||||||
|
|
||||||
# Try -v. (Grrr. No way to specify individual formats)
|
# Try -v. (Grrr. No way to specify individual formats)
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue