From 027de801a88ff08af9b8581907cc85e97edae5cc Mon Sep 17 00:00:00 2001 From: Stephen J Day Date: Mon, 25 Jul 2016 14:52:27 -0700 Subject: [PATCH] swarm/controller: allow cancellation to propagate Ensure that cancellation of a pull propagates rather than continuing to container creation. This ensures that the `Prepare` method is properly re-entrant. Signed-off-by: Stephen J Day (cherry picked from commit d99c6b837ffd18ffe5bce801feb4936bf0edd2aa) Signed-off-by: Tibor Vass --- daemon/cluster/executor/container/controller.go | 5 +++++ distribution/errors.go | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/daemon/cluster/executor/container/controller.go b/daemon/cluster/executor/container/controller.go index 12c7eb0f72..50de5ddad5 100644 --- a/daemon/cluster/executor/container/controller.go +++ b/daemon/cluster/executor/container/controller.go @@ -85,6 +85,11 @@ func (r *controller) Prepare(ctx context.Context) error { } if err := r.adapter.pullImage(ctx); err != nil { + cause := errors.Cause(err) + if cause == context.Canceled || cause == context.DeadlineExceeded { + return err + } + // NOTE(stevvooe): We always try to pull the image to make sure we have // the most up to date version. This will return an error, but we only // log it. If the image truly doesn't exist, the create below will diff --git a/distribution/errors.go b/distribution/errors.go index a9a17bd261..1e7630e380 100644 --- a/distribution/errors.go +++ b/distribution/errors.go @@ -40,7 +40,11 @@ type fallbackError struct { // Error renders the FallbackError as a string. func (f fallbackError) Error() string { - return f.err.Error() + return f.Cause().Error() +} + +func (f fallbackError) Cause() error { + return f.err } // shouldV2Fallback returns true if this error is a reason to fall back to v1.