add ErrCgroupNotExist

For some rootless container, runc has no access to cgroup,
But the container is still running. So we should return the
`ErrNotRunning` and `ErrCgroupNotExist` error seperatlly.

Signed-off-by: lifubang <lifubang@acmcoder.com>
This commit is contained in:
lifubang
2024-09-23 20:59:57 +08:00
committed by lfbzhm
parent 15904913c2
commit 10c951e335
3 changed files with 14 additions and 10 deletions
+5
View File
@@ -394,6 +394,11 @@ func (c *Container) Signal(s os.Signal) error {
// https://github.com/opencontainers/runc/pull/4395#pullrequestreview-2291179652
return c.signal(s)
}
// For not rootless container, if there is no init process and no cgroup,
// it means that the container is not running.
if errors.Is(err, ErrCgroupNotExist) && !c.hasInit() {
err = ErrNotRunning
}
return fmt.Errorf("unable to kill all processes: %w", err)
}
return nil
+8 -7
View File
@@ -3,11 +3,12 @@ package libcontainer
import "errors"
var (
ErrExist = errors.New("container with given ID already exists")
ErrInvalidID = errors.New("invalid container ID format")
ErrNotExist = errors.New("container does not exist")
ErrPaused = errors.New("container paused")
ErrRunning = errors.New("container still running")
ErrNotRunning = errors.New("container not running")
ErrNotPaused = errors.New("container not paused")
ErrExist = errors.New("container with given ID already exists")
ErrInvalidID = errors.New("invalid container ID format")
ErrNotExist = errors.New("container does not exist")
ErrPaused = errors.New("container paused")
ErrRunning = errors.New("container still running")
ErrNotRunning = errors.New("container not running")
ErrNotPaused = errors.New("container not paused")
ErrCgroupNotExist = errors.New("cgroup not exist")
)
+1 -3
View File
@@ -695,11 +695,9 @@ func setupPersonality(config *configs.Config) error {
// signalAllProcesses freezes then iterates over all the processes inside the
// manager's cgroups sending the signal s to them.
//
// signalAllProcesses returns ErrNotRunning when the cgroup does not exist.
func signalAllProcesses(m cgroups.Manager, s unix.Signal) error {
if !m.Exists() {
return ErrNotRunning
return ErrCgroupNotExist
}
// Use cgroup.kill, if available.
if s == unix.SIGKILL {