From 55f031e16767906be18acc1ff8e56676f4fbb3b1 Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Thu, 3 Nov 2016 23:16:22 -0700 Subject: [PATCH] Add retry to node scheduability marking. --- pkg/kubectl/cmd/drain.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/drain.go b/pkg/kubectl/cmd/drain.go index e29521b2ffb..6a1b6978937 100644 --- a/pkg/kubectl/cmd/drain.go +++ b/pkg/kubectl/cmd/drain.go @@ -73,6 +73,7 @@ const ( kLocalStorageWarning = "Deleting pods with local storage" kUnmanagedFatal = "pods not managed by ReplicationController, ReplicaSet, Job, or DaemonSet (use --force to override)" kUnmanagedWarning = "Deleting pods not managed by ReplicationController, ReplicaSet, Job, or DaemonSet" + kMaxNodeUpdateRetry = 10 ) var ( @@ -451,7 +452,21 @@ func (o *DrainOptions) RunCordonOrUncordon(desired bool) error { } else { helper := resource.NewHelper(o.restClient, o.nodeInfo.Mapping) unsched.SetBool(desired) - _, err := helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object) + var err error + for i := 0; i < kMaxNodeUpdateRetry; i++ { + // We don't care about what previous versions may exist, we always want + // to overwrite, and Replace always sets current ResourceVersion if version is "". + helper.Versioner.SetResourceVersion(o.nodeInfo.Object, "") + _, err = helper.Replace(cmdNamespace, o.nodeInfo.Name, true, o.nodeInfo.Object) + if err != nil { + if !apierrors.IsConflict(err) { + return err + } + } else { + break + } + // It's a race, no need to sleep + } if err != nil { return err }