Remove restart test
This test is not applicable anymore now that containers are not stopped when the daemon is restored. Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
parent
290be017c5
commit
31e903b0e1
4 changed files with 78 additions and 115 deletions
|
@ -27,7 +27,7 @@ func (c *RefCounter) Increment(path string) int {
|
|||
c.mu.Lock()
|
||||
m := c.counts[path]
|
||||
if m == nil {
|
||||
m = &minfo{check: true}
|
||||
m = &minfo{}
|
||||
c.counts[path] = m
|
||||
}
|
||||
// if we are checking this path for the first time check to make sure
|
||||
|
@ -50,7 +50,7 @@ func (c *RefCounter) Decrement(path string) int {
|
|||
c.mu.Lock()
|
||||
m := c.counts[path]
|
||||
if m == nil {
|
||||
m = &minfo{check: true}
|
||||
m = &minfo{}
|
||||
c.counts[path] = m
|
||||
}
|
||||
// if we are checking this path for the first time check to make sure
|
||||
|
|
|
@ -1616,35 +1616,6 @@ func (s *DockerDaemonSuite) TestRunContainerWithBridgeNone(c *check.C) {
|
|||
check.Commentf("The network interfaces in container should be the same with host when --net=host when bridge network is disabled: %s", out))
|
||||
}
|
||||
|
||||
// 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) {
|
||||
testRequires(c, NotExperimentalDaemon)
|
||||
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)
|
||||
}
|
||||
|
||||
func (s *DockerDaemonSuite) TestDaemonRestartWithContainerRunning(t *check.C) {
|
||||
if err := s.d.StartWithBusybox(); err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
containerd "github.com/docker/containerd/api/grpc/types"
|
||||
"github.com/docker/docker/pkg/idtools"
|
||||
"github.com/docker/docker/pkg/mount"
|
||||
"github.com/opencontainers/specs/specs-go"
|
||||
specs "github.com/opencontainers/specs/specs-go"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
|
@ -380,6 +380,81 @@ func (clnt *client) getOrCreateExitNotifier(containerID string) *exitNotifier {
|
|||
return w
|
||||
}
|
||||
|
||||
func (clnt *client) restore(cont *containerd.Container, options ...CreateOption) (err error) {
|
||||
clnt.lock(cont.Id)
|
||||
defer clnt.unlock(cont.Id)
|
||||
|
||||
logrus.Debugf("restore container %s state %s", cont.Id, cont.Status)
|
||||
|
||||
containerID := cont.Id
|
||||
if _, err := clnt.getContainer(containerID); err == nil {
|
||||
return fmt.Errorf("container %s is already active", containerID)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if err != nil {
|
||||
clnt.deleteContainer(cont.Id)
|
||||
}
|
||||
}()
|
||||
|
||||
container := clnt.newContainer(cont.BundlePath, options...)
|
||||
container.systemPid = systemPid(cont)
|
||||
|
||||
var terminal bool
|
||||
for _, p := range cont.Processes {
|
||||
if p.Pid == InitFriendlyName {
|
||||
terminal = p.Terminal
|
||||
}
|
||||
}
|
||||
|
||||
iopipe, err := container.openFifos(terminal)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := clnt.backend.AttachStreams(containerID, *iopipe); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
clnt.appendContainer(container)
|
||||
|
||||
err = clnt.backend.StateChanged(containerID, StateInfo{
|
||||
CommonStateInfo: CommonStateInfo{
|
||||
State: StateRestore,
|
||||
Pid: container.systemPid,
|
||||
}})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if event, ok := clnt.remote.pastEvents[containerID]; ok {
|
||||
// This should only be a pause or resume event
|
||||
if event.Type == StatePause || event.Type == StateResume {
|
||||
return clnt.backend.StateChanged(containerID, StateInfo{
|
||||
CommonStateInfo: CommonStateInfo{
|
||||
State: event.Type,
|
||||
Pid: container.systemPid,
|
||||
}})
|
||||
}
|
||||
|
||||
logrus.Warnf("unexpected backlog event: %#v", event)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (clnt *client) Restore(containerID string, options ...CreateOption) error {
|
||||
cont, err := clnt.getContainerdContainer(containerID)
|
||||
if err == nil && cont.Status != "stopped" {
|
||||
if err := clnt.restore(cont, options...); err != nil {
|
||||
logrus.Errorf("error restoring %s: %v", containerID, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return clnt.setExited(containerID)
|
||||
}
|
||||
|
||||
type exitNotifier struct {
|
||||
id string
|
||||
client *client
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
package libcontainerd
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
containerd "github.com/docker/containerd/api/grpc/types"
|
||||
)
|
||||
|
||||
func (clnt *client) restore(cont *containerd.Container, options ...CreateOption) (err error) {
|
||||
clnt.lock(cont.Id)
|
||||
defer clnt.unlock(cont.Id)
|
||||
|
||||
logrus.Debugf("restore container %s state %s", cont.Id, cont.Status)
|
||||
|
||||
containerID := cont.Id
|
||||
if _, err := clnt.getContainer(containerID); err == nil {
|
||||
return fmt.Errorf("container %s is already active", containerID)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if err != nil {
|
||||
clnt.deleteContainer(cont.Id)
|
||||
}
|
||||
}()
|
||||
|
||||
container := clnt.newContainer(cont.BundlePath, options...)
|
||||
container.systemPid = systemPid(cont)
|
||||
|
||||
var terminal bool
|
||||
for _, p := range cont.Processes {
|
||||
if p.Pid == InitFriendlyName {
|
||||
terminal = p.Terminal
|
||||
}
|
||||
}
|
||||
|
||||
iopipe, err := container.openFifos(terminal)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := clnt.backend.AttachStreams(containerID, *iopipe); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
clnt.appendContainer(container)
|
||||
|
||||
err = clnt.backend.StateChanged(containerID, StateInfo{
|
||||
CommonStateInfo: CommonStateInfo{
|
||||
State: StateRestore,
|
||||
Pid: container.systemPid,
|
||||
}})
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if event, ok := clnt.remote.pastEvents[containerID]; ok {
|
||||
// This should only be a pause or resume event
|
||||
if event.Type == StatePause || event.Type == StateResume {
|
||||
return clnt.backend.StateChanged(containerID, StateInfo{
|
||||
CommonStateInfo: CommonStateInfo{
|
||||
State: event.Type,
|
||||
Pid: container.systemPid,
|
||||
}})
|
||||
}
|
||||
|
||||
logrus.Warnf("unexpected backlog event: %#v", event)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (clnt *client) Restore(containerID string, options ...CreateOption) error {
|
||||
cont, err := clnt.getContainerdContainer(containerID)
|
||||
if err == nil && cont.Status != "stopped" {
|
||||
if err := clnt.restore(cont, options...); err != nil {
|
||||
logrus.Errorf("error restoring %s: %v", containerID, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
return clnt.setExited(containerID)
|
||||
}
|
Loading…
Reference in a new issue