Browse code

Forbid exec a restarting container

Currently if we exec a restarting container, client will fail silently,
and daemon will print error that container can't be found which is not a
very meaningful prompt to user.

This commit will stop user from exec a restarting container and gives
more explicit error message.

Signed-off-by: Zhang Wei <zhangwei555@huawei.com>

Zhang Wei authored on 2016/01/26 00:38:03
Showing 3 changed files
... ...
@@ -247,6 +247,14 @@ func (s *State) IsPaused() bool {
247 247
 	return res
248 248
 }
249 249
 
250
+// IsRestarting returns whether the container is restarting or not.
251
+func (s *State) IsRestarting() bool {
252
+	s.Lock()
253
+	res := s.Restarting
254
+	s.Unlock()
255
+	return res
256
+}
257
+
250 258
 // SetRemovalInProgress sets the container state as being removed.
251 259
 func (s *State) SetRemovalInProgress() error {
252 260
 	s.Lock()
... ...
@@ -52,6 +52,9 @@ func (d *Daemon) getExecConfig(name string) (*exec.Config, error) {
52 52
 			if container.IsPaused() {
53 53
 				return nil, derr.ErrorCodeExecPaused.WithArgs(container.ID)
54 54
 			}
55
+			if container.IsRestarting() {
56
+				return nil, derr.ErrorCodeExecRestarting.WithArgs(container.ID)
57
+			}
55 58
 			return ec, nil
56 59
 		}
57 60
 	}
... ...
@@ -76,6 +79,9 @@ func (d *Daemon) getActiveContainer(name string) (*container.Container, error) {
76 76
 	if container.IsPaused() {
77 77
 		return nil, derr.ErrorCodeExecPaused.WithArgs(name)
78 78
 	}
79
+	if container.IsRestarting() {
80
+		return nil, derr.ErrorCodeExecRestarting.WithArgs(name)
81
+	}
79 82
 	return container, nil
80 83
 }
81 84
 
... ...
@@ -733,6 +733,15 @@ var (
733 733
 		HTTPStatusCode: http.StatusConflict,
734 734
 	})
735 735
 
736
+	// ErrorCodeExecRestarting is generated when we try to start an exec
737
+	// but the container is restarting.
738
+	ErrorCodeExecRestarting = errcode.Register(errGroup, errcode.ErrorDescriptor{
739
+		Value:          "EXECRESTARTING",
740
+		Message:        "Container %s is restarting, wait until the container is running",
741
+		Description:    "An attempt to start an 'exec' was made, but the owning container is restarting",
742
+		HTTPStatusCode: http.StatusConflict,
743
+	})
744
+
736 745
 	// ErrorCodeExecRunning is generated when we try to start an exec
737 746
 	// but its already running.
738 747
 	ErrorCodeExecRunning = errcode.Register(errGroup, errcode.ErrorDescriptor{