From 8c362dc0dc9bcadb4d2caacb31543d698c23df8d Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Thu, 16 Jun 2016 10:24:33 -0700 Subject: [PATCH] Fix uint64 overflow in info/v2/conversion.go. --- info/v2/conversion.go | 57 ++------------------------------------ info/v2/conversion_test.go | 2 +- 2 files changed, 3 insertions(+), 56 deletions(-) diff --git a/info/v2/conversion.go b/info/v2/conversion.go index 739ccefc6a..b6664ecc23 100644 --- a/info/v2/conversion.go +++ b/info/v2/conversion.go @@ -206,7 +206,8 @@ func InstCpuStats(last, cur *v1.ContainerStats) (*CpuInstStats, error) { return 0, fmt.Errorf("cumulative stats decrease") } valueDelta := curValue - lastValue - return (valueDelta * 1e9) / timeDeltaNs, nil + // Use float64 to keep precision + return uint64(float64(valueDelta) / float64(timeDeltaNs) * 1e9), nil } total, err := convertToRate(last.Cpu.Usage.Total, cur.Cpu.Usage.Total) if err != nil { @@ -268,57 +269,3 @@ func ContainerSpecFromV1(specV1 *v1.ContainerSpec, aliases []string, namespace s specV2.Namespace = namespace return specV2 } - -func instCpuStats(last, cur *v1.ContainerStats) (*CpuInstStats, error) { - if last == nil { - return nil, nil - } - if !cur.Timestamp.After(last.Timestamp) { - return nil, fmt.Errorf("container stats move backwards in time") - } - if len(last.Cpu.Usage.PerCpu) != len(cur.Cpu.Usage.PerCpu) { - return nil, fmt.Errorf("different number of cpus") - } - timeDelta := cur.Timestamp.Sub(last.Timestamp) - if timeDelta <= 100*time.Millisecond { - return nil, fmt.Errorf("time delta unexpectedly small") - } - // Nanoseconds to gain precision and avoid having zero seconds if the - // difference between the timestamps is just under a second - timeDeltaNs := uint64(timeDelta.Nanoseconds()) - convertToRate := func(lastValue, curValue uint64) (uint64, error) { - if curValue < lastValue { - return 0, fmt.Errorf("cumulative stats decrease") - } - valueDelta := curValue - lastValue - return (valueDelta * 1e9) / timeDeltaNs, nil - } - total, err := convertToRate(last.Cpu.Usage.Total, cur.Cpu.Usage.Total) - if err != nil { - return nil, err - } - percpu := make([]uint64, len(last.Cpu.Usage.PerCpu)) - for i := range percpu { - var err error - percpu[i], err = convertToRate(last.Cpu.Usage.PerCpu[i], cur.Cpu.Usage.PerCpu[i]) - if err != nil { - return nil, err - } - } - user, err := convertToRate(last.Cpu.Usage.User, cur.Cpu.Usage.User) - if err != nil { - return nil, err - } - system, err := convertToRate(last.Cpu.Usage.System, cur.Cpu.Usage.System) - if err != nil { - return nil, err - } - return &CpuInstStats{ - Usage: CpuInstUsage{ - Total: total, - PerCpu: percpu, - User: user, - System: system, - }, - }, nil -} diff --git a/info/v2/conversion_test.go b/info/v2/conversion_test.go index 568be450df..b9609ecb5d 100644 --- a/info/v2/conversion_test.go +++ b/info/v2/conversion_test.go @@ -352,7 +352,7 @@ func TestInstCpuStats(t *testing.T) { }, } for _, c := range tests { - got, err := instCpuStats(c.last, c.cur) + got, err := InstCpuStats(c.last, c.cur) if err != nil { if c.want == nil { continue