56 lines
2.2 KiB
Diff
56 lines
2.2 KiB
Diff
|
|
From 241fc5d726e63e995d3518b734e18efff76284ac Mon Sep 17 00:00:00 2001
|
||
|
|
From: zhangyu235 <zhangyu235@huawei.com>
|
||
|
|
Date: Fri, 18 Jan 2019 11:07:06 +0800
|
||
|
|
Subject: [PATCH 057/111] docker: Ignore ToDisk error in StateChanged
|
||
|
|
|
||
|
|
reason:If container is started normally, but failed to save
|
||
|
|
state to disk due to error "no space left on device",
|
||
|
|
then container can not be stopped, because container's
|
||
|
|
infomation in libcontainerd is cleaned up when error
|
||
|
|
occurred(so it can not process event 'exit').
|
||
|
|
|
||
|
|
We can ignore ToDisk error in StateChanged, it only
|
||
|
|
change status of container. Status is correct if docker
|
||
|
|
daemon not restart, because right status exists in memory.
|
||
|
|
If docker daemon restart, it will restore these status
|
||
|
|
using status of containerd, so status is also correct.
|
||
|
|
|
||
|
|
This fix can break consistency of status in memory and
|
||
|
|
disk, but considering there is no space in disk, it is
|
||
|
|
not a big problem in this situation. Status in disk can
|
||
|
|
recover if disk have space and if ToDisk is written
|
||
|
|
again(for example, status changed).
|
||
|
|
|
||
|
|
Fix issuse #322
|
||
|
|
|
||
|
|
Cherry-pick from docker 1.11.2:
|
||
|
|
- 5eb9015 Ignore ToDisk error in StateChanged
|
||
|
|
|
||
|
|
Change-Id: Ifbdbffac06d1d739b03ea13962fb2d1fde7b5b3e
|
||
|
|
Signed-off-by: Fengtu Wang <wangfengtu@huawei.com>
|
||
|
|
Signed-off-by: zhangyu235 <zhangyu235@huawei.com>
|
||
|
|
---
|
||
|
|
components/engine/daemon/monitor.go | 6 +++++-
|
||
|
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/components/engine/daemon/monitor.go b/components/engine/daemon/monitor.go
|
||
|
|
index 9b4452d7ef..807cdcaa89 100644
|
||
|
|
--- a/components/engine/daemon/monitor.go
|
||
|
|
+++ b/components/engine/daemon/monitor.go
|
||
|
|
@@ -154,7 +154,11 @@ func (daemon *Daemon) ProcessEvent(id string, e libcontainerd.EventType, ei libc
|
||
|
|
daemon.initHealthMonitor(c)
|
||
|
|
|
||
|
|
if err := c.CheckpointTo(daemon.containersReplica); err != nil {
|
||
|
|
- return err
|
||
|
|
+ // If return err, container can not be stopped, see issue #322 for detail.
|
||
|
|
+ // Ignore error is safe, because if daemon not restart, status in memory is
|
||
|
|
+ // correct, and if daemon restart, it will restore status using status in
|
||
|
|
+ // containerd, so status in memory is also correct.
|
||
|
|
+ logrus.Debugf("Set status %v to disk failed: %v", e, err)
|
||
|
|
}
|
||
|
|
daemon.LogContainerEvent(c, "start")
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.17.1
|
||
|
|
|