Jelajahi Sumber

Merge pull request #32905 from dperny/17.05.x-fix-agent-logs-segfault

[17.05.x] Cherry-pick: Fix a rare segfault that can occur in service logs
Aaron Lehmann 8 tahun lalu
induk
melakukan
a3600db8c5
2 mengubah file dengan 17 tambahan dan 7 penghapusan
  1. 1 1
      vendor.conf
  2. 16 6
      vendor/github.com/docker/swarmkit/agent/worker.go

+ 1 - 1
vendor.conf

@@ -105,7 +105,7 @@ github.com/docker/containerd 9048e5e50717ea4497b757314bad98ea3763c145
 github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
 github.com/tonistiigi/fifo 1405643975692217d6720f8b54aeee1bf2cd5cf4
 
 
 # cluster
 # cluster
-github.com/docker/swarmkit 78db8a5fed39c637dcd136b9e16c29f135b41c94
+github.com/docker/swarmkit bd105f8afe9609137a48f817ae124295df0e8ef1
 github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
 github.com/gogo/protobuf 8d70fb3182befc465c4a1eac8ad4d38ff49778e2
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
 github.com/cloudflare/cfssl 7fb22c8cba7ecaf98e4082d22d65800cf45e042a
 github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e
 github.com/google/certificate-transparency d90e65c3a07988180c5b1ece71791c0b6506826e

+ 16 - 6
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 {
 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.
 	_, err := w.taskManager(ctx, tx, task) // side-effect taskManager creation.
 
 
 	if err != nil {
 	if err != nil {
 		log.G(ctx).WithError(err).Error("failed to start taskManager")
 		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
 	return nil
 }
 }
 
 
@@ -464,7 +469,7 @@ func (w *worker) newTaskManager(ctx context.Context, tx *bolt.Tx, task *api.Task
 	}
 	}
 
 
 	if err != nil {
 	if err != nil {
-		log.G(ctx).Error("controller resolution failed")
+		log.G(ctx).WithError(err).Error("controller resolution failed")
 		return nil, err
 		return nil, err
 	}
 	}
 
 
@@ -568,9 +573,14 @@ func (w *worker) Subscribe(ctx context.Context, subscription *api.SubscriptionMe
 		case v := <-ch:
 		case v := <-ch:
 			task := v.(*api.Task)
 			task := v.(*api.Task)
 			if match(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():
 		case <-ctx.Done():
 			return ctx.Err()
 			return ctx.Err()