mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Make runsc events robust against bad data and avoid division by zero.
Updates #9383 PiperOrigin-RevId: 572079494
This commit is contained in:
committed by
gVisor bot
parent
19399cd60b
commit
1e5df83edf
@@ -1455,6 +1455,13 @@ func (c *Container) populateStats(event *boot.EventOut) {
|
||||
// proportionally according to the sentry-internal usage measurements,
|
||||
// only counting Running containers.
|
||||
log.Debugf("event.ContainerUsage: %v", event.ContainerUsage)
|
||||
numContainers := uint64(len(event.ContainerUsage))
|
||||
if numContainers == 0 {
|
||||
log.Warningf("events: no containers listed in usage, returning zero CPU usage")
|
||||
event.Event.Data.CPU.Usage.Total = 0
|
||||
return
|
||||
}
|
||||
|
||||
var containerUsage uint64
|
||||
var allContainersUsage uint64
|
||||
for ID, usage := range event.ContainerUsage {
|
||||
@@ -1474,9 +1481,9 @@ func (c *Container) populateStats(event *boot.EventOut) {
|
||||
|
||||
// Get the host cgroup CPU usage.
|
||||
cgroupsUsage, err := cgroup.CPUUsage()
|
||||
if err != nil {
|
||||
if err != nil || cgroupsUsage == 0 {
|
||||
// No cgroup usage, so rely purely on the sentry's accounting.
|
||||
log.Warningf("events: failed when getting cgroup CPU usage for container: %v", err)
|
||||
log.Warningf("events: failed when getting cgroup CPU usage for container: usage=%d, err: %v", cgroupsUsage, err)
|
||||
event.Event.Data.CPU.Usage.Total = containerUsage
|
||||
return
|
||||
}
|
||||
@@ -1486,7 +1493,7 @@ func (c *Container) populateStats(event *boot.EventOut) {
|
||||
if allContainersUsage == 0 {
|
||||
log.Warningf("events: no sentry CPU usage reported")
|
||||
allContainersUsage = cgroupsUsage
|
||||
containerUsage = cgroupsUsage / uint64(len(event.ContainerUsage))
|
||||
containerUsage = cgroupsUsage / numContainers
|
||||
}
|
||||
|
||||
// Scaling can easily overflow a uint64 (e.g. a containerUsage and
|
||||
|
||||
Reference in New Issue
Block a user