Skip to content

Commit

Permalink
podman system df: fix percent calculation
Browse files Browse the repository at this point in the history
The calculate the percentage we need floating point numbers. The current
code however casted the result of reclaimable/size to an int first.
Casting to an int in go will just discard the decimal points, thus the
result was either 0 or 1 so if multiplied by 100 it would show up as 0%
or 100%.

To fix this we have to multiply by 100 first before casting the result
to an int. Also add a check for div by zero which results in NaN and use
math.Round() to correctly round a number.

Ref containers#13516

Signed-off-by: Paul Holzinger <pholzing@redhat.com>
  • Loading branch information
Luap99 committed Mar 21, 2022
1 parent 248dbf6 commit e3cc071
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
7 changes: 6 additions & 1 deletion cmd/podman/system/df.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package system

import (
"fmt"
"math"
"os"
"strings"
"time"
Expand Down Expand Up @@ -288,6 +289,10 @@ func (d *dfSummary) Size() string {
}

func (d *dfSummary) Reclaimable() string {
percent := int(float64(d.reclaimable)/float64(d.size)) * 100
percent := 0
// make sure to check this to prevent div by zero problems
if d.size > 0 {
percent = int(math.Round(float64(d.reclaimable) / float64(d.size) * float64(100)))
}
return fmt.Sprintf("%s (%d%%)", units.HumanSize(float64(d.reclaimable)), percent)
}
17 changes: 12 additions & 5 deletions test/e2e/system_df_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,17 @@ var _ = Describe("podman system df", func() {
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

session = podmanTest.Podman([]string{"volume", "create", "data"})
// run two containers with volumes to create something in the volume
session = podmanTest.Podman([]string{"run", "-v", "data1:/data", "--name", "container1", BB, "sh", "-c", "echo test > /data/1"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

session = podmanTest.Podman([]string{"create", "-v", "data:/data", "--name", "container1", BB})
session = podmanTest.Podman([]string{"run", "-v", "data2:/data", "--name", "container2", BB, "sh", "-c", "echo test > /data/1"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

// remove one container, we keep the volume
session = podmanTest.Podman([]string{"rm", "container2"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))

Expand All @@ -61,9 +67,10 @@ var _ = Describe("podman system df", func() {
images := strings.Fields(session.OutputToStringArray()[1])
containers := strings.Fields(session.OutputToStringArray()[2])
volumes := strings.Fields(session.OutputToStringArray()[3])
Expect(images[1]).To(Equal(string(totImages)))
Expect(containers[1]).To(Equal("2"))
Expect(volumes[2]).To(Equal("1"))
Expect(images[1]).To(Equal(string(totImages)), "total images expected")
Expect(containers[1]).To(Equal("2"), "total containers expected")
Expect(volumes[2]).To(Equal("2"), "total volumes expected")
Expect(volumes[6]).To(Equal("(50%)"), "percentage usage expected")
})

It("podman system df image with no tag", func() {
Expand Down

0 comments on commit e3cc071

Please sign in to comment.