From 6689bc7ede8614338ea59bac9682dad77f16ef1d Mon Sep 17 00:00:00 2001 From: Vishnu Kannan Date: Mon, 15 Sep 2014 23:14:04 +0000 Subject: [PATCH] Adding state to exec commands to prevent multiple starts of a single exec command. Docker-DCO-1.1-Signed-off-by: Vishnu Kannan (github: vishh) Upstream-commit: 39030382c4809029cc3897e59f97948b00d57ad1 Component: engine --- components/engine/daemon/exec.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/components/engine/daemon/exec.go b/components/engine/daemon/exec.go index d32930d3ec..80c6a9e6d1 100644 --- a/components/engine/daemon/exec.go +++ b/components/engine/daemon/exec.go @@ -18,7 +18,9 @@ import ( ) type execConfig struct { + sync.Mutex ID string + Running bool ProcessConfig execdriver.ProcessConfig StreamConfig OpenStdin bool @@ -128,6 +130,7 @@ func (d *Daemon) ContainerExecCreate(job *engine.Job) engine.Status { StreamConfig: StreamConfig{}, ProcessConfig: processConfig, Container: container, + Running: false, } d.registerExecCommand(execConfig) @@ -149,11 +152,20 @@ func (d *Daemon) ContainerExecStart(job *engine.Job) engine.Status { execName = job.Args[0] ) - if execName == "" { - return job.Errorf("ExecName not specified. Cannot start exec command") + execConfig, err := d.getExecConfig(execName) + if err != nil { + return job.Error(err) } - execConfig, err := d.getExecConfig(execName) + func() { + execConfig.Lock() + defer execConfig.Unlock() + if execConfig.Running { + err = fmt.Errorf("Error: Exec command %s is already running", execName) + } + execConfig.Running = true + }() + if err != nil { return job.Error(err) }