summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastiaan van Stijn <github@gone.nl>2022-05-02 00:05:21 +0200
committerSebastiaan van Stijn <github@gone.nl>2022-05-05 00:53:49 +0200
commit2ec2b65e45ca6ae28480c6da49aaf06fda1a091f (patch)
tree1437b08972ea68148233b2e81dcfb3cf119d9a1d
parentc9b37e5cb430b01816c4d8e18d199745d0d6f765 (diff)
downloaddocker-2ec2b65e45ca6ae28480c6da49aaf06fda1a091f.tar.gz
libcontainerd: SignalProcess(): accept syscall.Signal
This helps reducing some type-juggling / conversions further up the stack. Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
-rw-r--r--daemon/exec.go4
-rw-r--r--daemon/kill.go16
-rw-r--r--daemon/util_test.go3
-rw-r--r--libcontainerd/remote/client.go4
-rw-r--r--libcontainerd/types/types.go3
-rw-r--r--plugin/executor/containerd/containerd.go3
6 files changed, 17 insertions, 16 deletions
diff --git a/daemon/exec.go b/daemon/exec.go
index a0b0623b8f..f53709e333 100644
--- a/daemon/exec.go
+++ b/daemon/exec.go
@@ -279,7 +279,7 @@ func (daemon *Daemon) ContainerExecStart(ctx context.Context, name string, stdin
select {
case <-ctx.Done():
logrus.Debugf("Sending TERM signal to process %v in container %v", name, c.ID)
- daemon.containerd.SignalProcess(ctx, c.ID, name, int(signal.SignalMap["TERM"]))
+ daemon.containerd.SignalProcess(ctx, c.ID, name, signal.SignalMap["TERM"])
timeout := time.NewTimer(termProcessTimeout)
defer timeout.Stop()
@@ -287,7 +287,7 @@ func (daemon *Daemon) ContainerExecStart(ctx context.Context, name string, stdin
select {
case <-timeout.C:
logrus.Infof("Container %v, process %v failed to exit within %v of signal TERM - using the force", c.ID, name, termProcessTimeout)
- daemon.containerd.SignalProcess(ctx, c.ID, name, int(signal.SignalMap["KILL"]))
+ daemon.containerd.SignalProcess(ctx, c.ID, name, signal.SignalMap["KILL"])
case <-attachErr:
// TERM signal worked
}
diff --git a/daemon/kill.go b/daemon/kill.go
index 98c44abb22..daa3d21146 100644
--- a/daemon/kill.go
+++ b/daemon/kill.go
@@ -60,7 +60,8 @@ func (daemon *Daemon) ContainerKill(name string, sig uint64) error {
// or not running, or if there is a problem returned from the
// underlying kill command.
func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int) error {
- logrus.Debugf("Sending kill signal %d to container %s", sig, container.ID)
+ var stopSignal = syscall.Signal(sig)
+ logrus.Debugf("Sending kill signal %d to container %s", stopSignal, container.ID)
container.Lock()
defer container.Unlock()
@@ -69,12 +70,12 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int)
}
var unpause bool
- if container.Config.StopSignal != "" && syscall.Signal(sig) != syscall.SIGKILL {
+ if container.Config.StopSignal != "" && stopSignal != syscall.SIGKILL {
containerStopSignal, err := signal.ParseSignal(container.Config.StopSignal)
if err != nil {
return err
}
- if containerStopSignal == syscall.Signal(sig) {
+ if containerStopSignal == stopSignal {
container.ExitOnNext()
unpause = container.Paused
}
@@ -95,7 +96,8 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int)
return nil
}
- if err := daemon.kill(container, sig); err != nil {
+ err := daemon.containerd.SignalProcess(context.Background(), container.ID, libcontainerdtypes.InitProcessName, stopSignal)
+ if err != nil {
if errdefs.IsNotFound(err) {
unpause = false
logrus.WithError(err).WithField("container", container.ID).WithField("action", "kill").Debug("container kill failed because of 'container not found' or 'no such process'")
@@ -125,7 +127,7 @@ func (daemon *Daemon) killWithSignal(container *containerpkg.Container, sig int)
}
attributes := map[string]string{
- "signal": fmt.Sprintf("%d", sig),
+ "signal": fmt.Sprintf("%d", stopSignal),
}
daemon.LogContainerEventWithAttributes(container, "kill", attributes)
return nil
@@ -182,7 +184,3 @@ func (daemon *Daemon) killPossiblyDeadProcess(container *containerpkg.Container,
}
return err
}
-
-func (daemon *Daemon) kill(c *containerpkg.Container, sig int) error {
- return daemon.containerd.SignalProcess(context.Background(), c.ID, libcontainerdtypes.InitProcessName, sig)
-}
diff --git a/daemon/util_test.go b/daemon/util_test.go
index 64a28be865..5ac47fef3b 100644
--- a/daemon/util_test.go
+++ b/daemon/util_test.go
@@ -5,6 +5,7 @@ package daemon
import (
"context"
+ "syscall"
"time"
"github.com/containerd/containerd"
@@ -35,7 +36,7 @@ func (c *MockContainerdClient) Create(ctx context.Context, containerID string, s
func (c *MockContainerdClient) Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio libcontainerdtypes.StdioCallback) (pid int, err error) {
return 0, nil
}
-func (c *MockContainerdClient) SignalProcess(ctx context.Context, containerID, processID string, signal int) error {
+func (c *MockContainerdClient) SignalProcess(ctx context.Context, containerID, processID string, signal syscall.Signal) error {
return nil
}
func (c *MockContainerdClient) Exec(ctx context.Context, containerID, processID string, spec *specs.Process, withStdin bool, attachStdio libcontainerdtypes.StdioCallback) (int, error) {
diff --git a/libcontainerd/remote/client.go b/libcontainerd/remote/client.go
index f82911884e..d530fb6bc2 100644
--- a/libcontainerd/remote/client.go
+++ b/libcontainerd/remote/client.go
@@ -333,12 +333,12 @@ func (c *client) Exec(ctx context.Context, containerID, processID string, spec *
return int(p.Pid()), nil
}
-func (c *client) SignalProcess(ctx context.Context, containerID, processID string, signal int) error {
+func (c *client) SignalProcess(ctx context.Context, containerID, processID string, signal syscall.Signal) error {
p, err := c.getProcess(ctx, containerID, processID)
if err != nil {
return err
}
- return wrapError(p.Kill(ctx, syscall.Signal(signal)))
+ return wrapError(p.Kill(ctx, signal))
}
func (c *client) ResizeTerminal(ctx context.Context, containerID, processID string, width, height int) error {
diff --git a/libcontainerd/types/types.go b/libcontainerd/types/types.go
index 1d1a420e79..71082f7661 100644
--- a/libcontainerd/types/types.go
+++ b/libcontainerd/types/types.go
@@ -2,6 +2,7 @@ package types // import "github.com/docker/docker/libcontainerd/types"
import (
"context"
+ "syscall"
"time"
"github.com/containerd/containerd"
@@ -54,7 +55,7 @@ type Client interface {
Create(ctx context.Context, containerID string, spec *specs.Spec, shim string, runtimeOptions interface{}, opts ...containerd.NewContainerOpts) error
Start(ctx context.Context, containerID, checkpointDir string, withStdin bool, attachStdio StdioCallback) (pid int, err error)
- SignalProcess(ctx context.Context, containerID, processID string, signal int) error
+ SignalProcess(ctx context.Context, containerID, processID string, signal syscall.Signal) error
Exec(ctx context.Context, containerID, processID string, spec *specs.Process, withStdin bool, attachStdio StdioCallback) (int, error)
ResizeTerminal(ctx context.Context, containerID, processID string, width, height int) error
CloseStdin(ctx context.Context, containerID, processID string) error
diff --git a/plugin/executor/containerd/containerd.go b/plugin/executor/containerd/containerd.go
index 0daf8afda6..10186c6c91 100644
--- a/plugin/executor/containerd/containerd.go
+++ b/plugin/executor/containerd/containerd.go
@@ -4,6 +4,7 @@ import (
"context"
"io"
"sync"
+ "syscall"
"github.com/containerd/containerd"
"github.com/containerd/containerd/cio"
@@ -113,7 +114,7 @@ func (e *Executor) IsRunning(id string) (bool, error) {
// Signal sends the specified signal to the container
func (e *Executor) Signal(id string, signal int) error {
- return e.client.SignalProcess(context.Background(), id, libcontainerdtypes.InitProcessName, signal)
+ return e.client.SignalProcess(context.Background(), id, libcontainerdtypes.InitProcessName, syscall.Signal(signal))
}
// ProcessEvent handles events from containerd