Commit 18362beb authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #42254 from justinsb/volumes_dont_leak_nodestatusupdateneeded

Automatic merge from submit-queue volumes: SetNodeStatusUpdateNeeded on error If an error happened during the UpdateNodeStatuses loop, there were some code paths where we would not call SetNodeStatusUpdateNeeded, leaking the state. Add it to all paths by adding a function. Part of #40583 ```release-note NONE ```
parents be0b0450 d420531f
...@@ -22,6 +22,7 @@ go_library( ...@@ -22,6 +22,7 @@ go_library(
"//vendor/github.com/golang/glog:go_default_library", "//vendor/github.com/golang/glog:go_default_library",
"//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library",
], ],
) )
......
...@@ -26,6 +26,7 @@ import ( ...@@ -26,6 +26,7 @@ import (
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
...@@ -83,65 +84,79 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error { ...@@ -83,65 +84,79 @@ func (nsu *nodeStatusUpdater) UpdateNodeStatuses() error {
continue continue
} }
clonedNode, err := api.Scheme.DeepCopy(nodeObj) if err := nsu.updateNodeStatus(nodeName, nodeObj, attachedVolumes); err != nil {
if err != nil { // If update node status fails, reset flag statusUpdateNeeded back to true
return fmt.Errorf("error cloning node %q: %v", // to indicate this node status needs to be updated again
nsu.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName)
glog.V(2).Infof(
"Could not update node status for %q; re-marking for update. %v",
nodeName, nodeName,
err) err)
}
node, ok := clonedNode.(*v1.Node) // We currently always return immediately on error
if !ok || node == nil { return err
return fmt.Errorf(
"failed to cast %q object %#v to Node",
nodeName,
clonedNode)
} }
}
return nil
}
// TODO: Change to pkg/util/node.UpdateNodeStatus. func (nsu *nodeStatusUpdater) updateNodeStatus(nodeName types.NodeName, nodeObj *v1.Node, attachedVolumes []v1.AttachedVolume) error {
oldData, err := json.Marshal(node) clonedNode, err := api.Scheme.DeepCopy(nodeObj)
if err != nil { if err != nil {
return fmt.Errorf( return fmt.Errorf("error cloning node %q: %v",
"failed to Marshal oldData for node %q. %v", nodeName,
nodeName, err)
err) }
}
node.Status.VolumesAttached = attachedVolumes node, ok := clonedNode.(*v1.Node)
if !ok || node == nil {
return fmt.Errorf(
"failed to cast %q object %#v to Node",
nodeName,
clonedNode)
}
newData, err := json.Marshal(node) // TODO: Change to pkg/util/node.UpdateNodeStatus.
if err != nil { oldData, err := json.Marshal(node)
return fmt.Errorf( if err != nil {
"failed to Marshal newData for node %q. %v", return fmt.Errorf(
nodeName, "failed to Marshal oldData for node %q. %v",
err) nodeName,
} err)
}
patchBytes, err := node.Status.VolumesAttached = attachedVolumes
strategicpatch.CreateTwoWayMergePatch(oldData, newData, node)
if err != nil {
return fmt.Errorf(
"failed to CreateTwoWayMergePatch for node %q. %v",
nodeName,
err)
}
_, err = nsu.kubeClient.Core().Nodes().PatchStatus(string(nodeName), patchBytes) newData, err := json.Marshal(node)
if err != nil { if err != nil {
// If update node status fails, reset flag statusUpdateNeeded back to true return fmt.Errorf(
// to indicate this node status needs to be updated again "failed to Marshal newData for node %q. %v",
nsu.actualStateOfWorld.SetNodeStatusUpdateNeeded(nodeName)
return fmt.Errorf(
"failed to kubeClient.Core().Nodes().Patch for node %q. %v",
nodeName,
err)
}
glog.V(2).Infof(
"Updating status for node %q succeeded. patchBytes: %q VolumesAttached: %v",
nodeName, nodeName,
string(patchBytes), err)
node.Status.VolumesAttached) }
patchBytes, err :=
strategicpatch.CreateTwoWayMergePatch(oldData, newData, node)
if err != nil {
return fmt.Errorf(
"failed to CreateTwoWayMergePatch for node %q. %v",
nodeName,
err)
} }
_, err = nsu.kubeClient.Core().Nodes().PatchStatus(string(nodeName), patchBytes)
if err != nil {
return fmt.Errorf(
"failed to kubeClient.Core().Nodes().Patch for node %q. %v",
nodeName,
err)
}
glog.V(4).Infof(
"Updating status for node %q succeeded. patchBytes: %q VolumesAttached: %v",
nodeName,
string(patchBytes),
node.Status.VolumesAttached)
return nil return nil
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment