From 5304c6125aa27c31c2d3bf63d4605570c336c287 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Thu, 24 Jan 2019 14:21:59 -0500 Subject: [PATCH] drivers/docker: handle shutdown of upgraded tasks correctly --- drivers/docker/driver_pre09.go | 2 +- .../shared/executor/legacy_executor_wrapper.go | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/docker/driver_pre09.go b/drivers/docker/driver_pre09.go index 9e34b8a03..9de349492 100644 --- a/drivers/docker/driver_pre09.go +++ b/drivers/docker/driver_pre09.go @@ -69,7 +69,7 @@ type executorDockerLoggerShim struct { func (e *executorDockerLoggerShim) Start(*docklog.StartOpts) error { return nil } func (e *executorDockerLoggerShim) Stop() error { - if err := e.exec.Shutdown("", 0); err != nil { + if err := e.exec.Shutdown("docker", 0); err != nil { return err } diff --git a/drivers/shared/executor/legacy_executor_wrapper.go b/drivers/shared/executor/legacy_executor_wrapper.go index e9a01a4cd..ec0fecbc3 100644 --- a/drivers/shared/executor/legacy_executor_wrapper.go +++ b/drivers/shared/executor/legacy_executor_wrapper.go @@ -15,6 +15,12 @@ import ( "golang.org/x/net/context" ) +const ( + // pre09DockerSignal is used in executor.Shutdown to know if it should + // call the ShutDown RPC on the pre09 executor + pre09DockerSignal = "docker" +) + // Registering these types since we have to serialize and de-serialize the Task // structs over the wire between drivers and the executor. func init() { @@ -49,8 +55,16 @@ func (l *legacyExecutorWrapper) Wait(ctx context.Context) (*ProcessState, error) } func (l *legacyExecutorWrapper) Shutdown(signal string, gracePeriod time.Duration) error { - if err := l.client.ShutDown(); err != nil { - return err + // The legacy docker driver only used the executor to start a syslog server + // for logging. Thus calling ShutDown for docker will always return an error + // because it never started a process through the executor. If signal is set + // to 'docker' then we'll skip the ShutDown RPC and just call Exit. + // + // This is painful to look at but will only be around a few releases + if signal != pre09DockerSignal { + if err := l.client.ShutDown(); err != nil { + return err + } } if err := l.client.Exit(); err != nil {