diff --git a/components/engine/daemon/cluster/cluster.go b/components/engine/daemon/cluster/cluster.go index 828748bc5c..8589530174 100644 --- a/components/engine/daemon/cluster/cluster.go +++ b/components/engine/daemon/cluster/cluster.go @@ -58,6 +58,7 @@ import ( swarmnode "github.com/docker/swarmkit/node" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "google.golang.org/grpc" ) const swarmDirName = "swarm" @@ -399,7 +400,10 @@ func (c *Cluster) Cleanup() { func managerStats(client swarmapi.ControlClient, currentNodeID string) (current bool, reachable int, unreachable int, err error) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - nodes, err := client.ListNodes(ctx, &swarmapi.ListNodesRequest{}) + nodes, err := client.ListNodes( + ctx, &swarmapi.ListNodesRequest{}, + grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse), + ) if err != nil { return false, 0, 0, err } diff --git a/components/engine/daemon/cluster/swarm.go b/components/engine/daemon/cluster/swarm.go index 65dfe9eb45..6ceadf8122 100644 --- a/components/engine/daemon/cluster/swarm.go +++ b/components/engine/daemon/cluster/swarm.go @@ -19,6 +19,7 @@ import ( swarmnode "github.com/docker/swarmkit/node" "github.com/pkg/errors" "github.com/sirupsen/logrus" + "google.golang.org/grpc" ) // Init initializes new cluster from user provided request. @@ -442,7 +443,10 @@ func (c *Cluster) Info() types.Info { info.Cluster = &swarm.ClusterInfo - if r, err := state.controlClient.ListNodes(ctx, &swarmapi.ListNodesRequest{}); err != nil { + if r, err := state.controlClient.ListNodes( + ctx, &swarmapi.ListNodesRequest{}, + grpc.MaxCallRecvMsgSize(defaultRecvSizeForListResponse), + ); err != nil { info.Error = err.Error() } else { info.Nodes = len(r.Nodes) diff --git a/components/engine/vendor.conf b/components/engine/vendor.conf index 71dd97847c..165cc5c42b 100644 --- a/components/engine/vendor.conf +++ b/components/engine/vendor.conf @@ -130,7 +130,7 @@ github.com/containerd/ttrpc 2a805f71863501300ae1976d29f0454ae003e85a github.com/gogo/googleapis 08a7655d27152912db7aaf4f983275eaf8d128ef # cluster -github.com/docker/swarmkit 19e791fd6dc76e8e894cbc99b77f946b7d00ebb9 # bump_v18.09 branch +github.com/docker/swarmkit 142a73731c850daf24d32001aa2358b6ffe36eab # bump_v18.09 branch github.com/gogo/protobuf v1.0.0 github.com/cloudflare/cfssl 1.3.2 github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2 diff --git a/components/engine/vendor/github.com/docker/swarmkit/manager/controlapi/node.go b/components/engine/vendor/github.com/docker/swarmkit/manager/controlapi/node.go index 5308b7419e..6e8bdba5bd 100644 --- a/components/engine/vendor/github.com/docker/swarmkit/manager/controlapi/node.go +++ b/components/engine/vendor/github.com/docker/swarmkit/manager/controlapi/node.go @@ -265,12 +265,23 @@ func orphanNodeTasks(tx store.Tx, nodeID string) error { return err } for _, task := range tasks { - task.Status = api.TaskStatus{ - Timestamp: gogotypes.TimestampNow(), - State: api.TaskStateOrphaned, - Message: "Task belonged to a node that has been deleted", + // this operation must occur within the same transaction boundary. If + // we cannot accomplish this task orphaning in the same transaction, we + // could crash or die between transactions and not get a chance to do + // this. however, in cases were there is an exceptionally large number + // of tasks for a node, this may cause the transaction to exceed the + // max message size. + // + // therefore, we restrict updating to only tasks in a non-terminal + // state. Tasks in a terminal state do not need to be updated. + if task.Status.State < api.TaskStateCompleted { + task.Status = api.TaskStatus{ + Timestamp: gogotypes.TimestampNow(), + State: api.TaskStateOrphaned, + Message: "Task belonged to a node that has been deleted", + } + store.UpdateTask(tx, task) } - store.UpdateTask(tx, task) } return nil }