moby/integration-cli/docker_cli_daemon_not_experimental_test.go
Tonis Tiigi 1e36e346db Fix already active error on restoring from ungraceful restart
On killing the processes that were still running
after ungraceful restart, containerd can’t fully
exit the process if the fifos have not been fully
read. In this case process was just marked as exited
and not removed from the internal containers array.

Fixes #22913

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
2016-05-26 16:19:11 -07:00

59 lines
2.1 KiB
Go

// +build daemon,!windows,!experimental
package main
import (
"io/ioutil"
"os"
"strings"
"github.com/go-check/check"
)
// os.Kill should kill daemon ungracefully, leaving behind container mounts.
// A subsequent daemon restart shoud clean up said mounts.
func (s *DockerDaemonSuite) TestCleanupMountsAfterDaemonKill(c *check.C) {
c.Assert(s.d.StartWithBusybox(), check.IsNil)
out, err := s.d.Cmd("run", "-d", "busybox", "top")
c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
id := strings.TrimSpace(out)
c.Assert(s.d.cmd.Process.Signal(os.Kill), check.IsNil)
mountOut, err := ioutil.ReadFile("/proc/self/mountinfo")
c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut))
// container mounts should exist even after daemon has crashed.
comment := check.Commentf("%s should stay mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut)
c.Assert(strings.Contains(string(mountOut), id), check.Equals, true, comment)
// restart daemon.
if err := s.d.Restart(); err != nil {
c.Fatal(err)
}
// Now, container mounts should be gone.
mountOut, err = ioutil.ReadFile("/proc/self/mountinfo")
c.Assert(err, check.IsNil, check.Commentf("Output: %s", mountOut))
comment = check.Commentf("%s is still mounted from older daemon start:\nDaemon root repository %s\n%s", id, s.d.folder, mountOut)
c.Assert(strings.Contains(string(mountOut), id), check.Equals, false, comment)
}
// #22913
func (s *DockerDaemonSuite) TestContainerStartAfterDaemonKill(c *check.C) {
testRequires(c, DaemonIsLinux)
c.Assert(s.d.StartWithBusybox(), check.IsNil)
// the application is chosen so it generates output and doesn't react to SIGTERM
out, err := s.d.Cmd("run", "-d", "busybox", "sh", "-c", "while true;do date;done")
c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
id := strings.TrimSpace(out)
c.Assert(s.d.cmd.Process.Signal(os.Kill), check.IsNil)
// restart daemon.
if err := s.d.Restart(); err != nil {
c.Fatal(err)
}
out, err = s.d.Cmd("start", id)
c.Assert(err, check.IsNil, check.Commentf("Output: %s", out))
}