mirror of https://github.com/containers/podman.git
Merge pull request #24400 from giuseppe/fix-race-reading-cgroup-stats
libpod: report cgroups deleted during Stat() call
This commit is contained in:
commit
364761fc30
|
@ -3,6 +3,7 @@
|
||||||
package libpod
|
package libpod
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
@ -36,6 +37,11 @@ func (c *Container) getPlatformContainerStats(stats *define.ContainerStats, prev
|
||||||
// Ubuntu does not have swap memory in cgroups because swap is often not enabled.
|
// Ubuntu does not have swap memory in cgroups because swap is often not enabled.
|
||||||
cgroupStats, err := cgroup.Stat()
|
cgroupStats, err := cgroup.Stat()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// cgroup.Stat() is not an atomic operation, so it is possible that the cgroup is removed
|
||||||
|
// while Stat() is running. Try to catch this case and return a more specific error.
|
||||||
|
if (errors.Is(err, unix.ENOENT) || errors.Is(err, unix.ENODEV)) && !cgroupExist(cgroupPath) {
|
||||||
|
return fmt.Errorf("cgroup %s does not exist: %w", cgroupPath, define.ErrCtrStopped)
|
||||||
|
}
|
||||||
return fmt.Errorf("unable to obtain cgroup stats: %w", err)
|
return fmt.Errorf("unable to obtain cgroup stats: %w", err)
|
||||||
}
|
}
|
||||||
conState := c.state.State
|
conState := c.state.State
|
||||||
|
|
Loading…
Reference in New Issue