summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew Erny <drew.erny@docker.com>2017-04-27 15:51:38 -0700
committerDrew Erny <drew.erny@docker.com>2017-04-28 11:43:00 -0700
commitfa4b810b4144d7b660618ad917146a79e036736b (patch)
treeca63c78dd75b175553cd17d4292952fc0b273cd9
parentc57fdb2a14cfba584686ddad909e3006284d10aa (diff)
downloaddocker-fa4b810b4144d7b660618ad917146a79e036736b.tar.gz
Fix a rare segfault that can occur in service logs
Revendors swarmkit with a change that fixes a rare segfault that can occur when following logs on a brand new service with bad bind mount options. Fixes docker/swarmkit#2147 Signed-off-by: Drew Erny <drew.erny@docker.com>
-rw-r--r--vendor.conf2
-rw-r--r--vendor/github.com/docker/swarmkit/agent/worker.go22
2 files changed, 17 insertions, 7 deletions
diff --git a/vendor.conf b/vendor.conf
index 165c1b08b6..062fbe2901 100644
--- a/vendor.conf
+++ b/vendor.conf
@@ -105,7 +105,7 @@ github.com/docker/containerd 9048e5e50717ea4497b757314bad98ea3763c145
github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
# cluster
-github.com/docker/swarmkit 78db8a5fed39c637dcd136b9e16c29f135b41c94
+github.com/docker/swarmkit bd105f8afe9609137a48f817ae124295df0e8ef1
github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
diff --git a/vendor/github.com/docker/swarmkit/agent/worker.go b/vendor/github.com/docker/swarmkit/agent/worker.go
index a27cd96ee4..ff138c2b74 100644
--- a/vendor/github.com/docker/swarmkit/agent/worker.go
+++ b/vendor/github.com/docker/swarmkit/agent/worker.go
@@ -426,14 +426,19 @@ func (w *worker) Listen(ctx context.Context, reporter StatusReporter) {
}
func (w *worker) startTask(ctx context.Context, tx *bolt.Tx, task *api.Task) error {
- w.taskevents.Publish(task.Copy())
_, err := w.taskManager(ctx, tx, task) // side-effect taskManager creation.
if err != nil {
log.G(ctx).WithError(err).Error("failed to start taskManager")
+ // we ignore this error: it gets reported in the taskStatus within
+ // `newTaskManager`. We log it here and move on. If their is an
+ // attempted restart, the lack of taskManager will have this retry
+ // again.
+ return nil
}
- // TODO(stevvooe): Add start method for taskmanager
+ // only publish if controller resolution was successful.
+ w.taskevents.Publish(task.Copy())
return nil
}
@@ -464,7 +469,7 @@ func (w *worker) newTaskManager(ctx context.Context, tx *bolt.Tx, task *api.Task
}
if err != nil {
- log.G(ctx).Error("controller resolution failed")
+ log.G(ctx).WithError(err).Error("controller resolution failed")
return nil, err
}
@@ -568,9 +573,14 @@ func (w *worker) Subscribe(ctx context.Context, subscription *api.SubscriptionMe
case v := <-ch:
task := v.(*api.Task)
if match(task) {
- w.mu.Lock()
- go w.taskManagers[task.ID].Logs(ctx, *subscription.Options, publisher)
- w.mu.Unlock()
+ w.mu.RLock()
+ tm, ok := w.taskManagers[task.ID]
+ w.mu.RUnlock()
+ if !ok {
+ continue
+ }
+
+ go tm.Logs(ctx, *subscription.Options, publisher)
}
case <-ctx.Done():
return ctx.Err()