docker/patch/0133-docker-Fixed-docker-ps-and-docker-inspect-sta.patch
2019-09-30 10:37:25 -04:00

91 lines
2.7 KiB
Diff

From 4e614995fea775779078f1903fc45bc89e2afe4e Mon Sep 17 00:00:00 2001
Date: Wed, 26 Jun 2019 12:00:39 +0800
Subject: [PATCH] docker: Fixed "docker ps" and "docker inspect"
status inconsistency.
reason: fixed "docker ps" and "docker inspect" status inconsistency.
The SaveFlag is marked when toDisk is failed. Using this flag to
retrycheckpoint.
Change-Id: I9ea160233043964e48ea0ff2f384f64bac921312
Signed-off-by: panwenxiang <panwenxiang@huawei.com>
---
components/engine/container/container.go | 21 +++++++++++++++++++++
components/engine/daemon/stop.go | 3 +++
2 files changed, 24 insertions(+)
diff --git a/components/engine/container/container.go b/components/engine/container/container.go
index 02adc20..c194220 100644
--- a/components/engine/container/container.go
+++ b/components/engine/container/container.go
@@ -11,6 +11,7 @@ import (
"runtime"
"strings"
"sync"
+ "sync/atomic"
"syscall"
"time"
@@ -57,6 +58,12 @@ type ExitStatus struct {
ExitedAt time.Time
}
+const (
+ SaveSuccess = iota
+ SaveFailed
+ SavePending
+)
+
// Container holds the structure defining a container object.
type Container struct {
StreamConfig *stream.Config
@@ -109,6 +116,7 @@ type Container struct {
// Fields here are specific to Windows
NetworkSharedContainerID string `json:"-"`
SharedEndpointList []string `json:"-"`
+ SaveFlag int32
}
// NewBaseContainer creates a new container with its
@@ -194,10 +202,23 @@ func (container *Container) toDisk() (*Container, error) {
func (container *Container) CheckpointTo(store ViewDB) error {
deepCopy, err := container.toDisk()
if err != nil {
+ atomic.StoreInt32(&container.SaveFlag, SaveFailed)
return err
}
return store.Save(deepCopy)
}
+func (container *Container) RetryCheckPoint(store ViewDB) error {
+ if atomic.CompareAndSwapInt32(&container.SaveFlag, SaveFailed, SavePending) {
+ container.Lock()
+ defer container.Unlock()
+ err := container.CheckpointTo(store)
+ if err != nil {
+ return err
+ }
+ atomic.StoreInt32(&container.SaveFlag, SaveSuccess)
+ }
+ return nil
+}
// readHostConfig reads the host configuration from disk for the container.
func (container *Container) readHostConfig() error {
diff --git a/components/engine/daemon/stop.go b/components/engine/daemon/stop.go
index 3c4cd76..40bc36d 100644
--- a/components/engine/daemon/stop.go
+++ b/components/engine/daemon/stop.go
@@ -23,6 +23,9 @@ func (daemon *Daemon) ContainerStop(name string, timeout *int) error {
if err != nil {
return err
}
+ defer func() {
+ go container.RetryCheckPoint(daemon.containersReplica)
+ }()
if !container.IsRunning() {
return containerNotModifiedError{running: false}
}
--
2.1.3