From b181c76cbdc9ff2946967a3970280ef0652d8c06 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Wed, 5 Aug 2020 09:59:56 -0400 Subject: [PATCH] Deflake TestUpdateNodeStatusWithLease - guard cached machineInfo --- pkg/kubelet/kubelet.go | 5 +++-- pkg/kubelet/kubelet_getters.go | 8 ++++++++ pkg/kubelet/kubelet_node_status_test.go | 24 +++++++++++++++--------- pkg/kubelet/kubelet_test.go | 2 +- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 051671a9fc8..b75a9a094b0 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -561,7 +561,7 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, if err != nil { return nil, err } - klet.machineInfo = machineInfo + klet.setCachedMachineInfo(machineInfo) imageBackOff := flowcontrol.NewBackOff(backOffPeriod, MaxContainerBackOff) @@ -911,7 +911,8 @@ type Kubelet struct { configMapManager configmap.Manager // Cached MachineInfo returned by cadvisor. - machineInfo *cadvisorapi.MachineInfo + machineInfoLock sync.RWMutex + machineInfo *cadvisorapi.MachineInfo // Handles certificate rotations. serverCertificateManager certificate.Manager diff --git a/pkg/kubelet/kubelet_getters.go b/pkg/kubelet/kubelet_getters.go index 76e8d08bfc5..aed08db4c2f 100644 --- a/pkg/kubelet/kubelet_getters.go +++ b/pkg/kubelet/kubelet_getters.go @@ -382,5 +382,13 @@ func (kl *Kubelet) GetVersionInfo() (*cadvisorapiv1.VersionInfo, error) { // GetCachedMachineInfo assumes that the machine info can't change without a reboot func (kl *Kubelet) GetCachedMachineInfo() (*cadvisorapiv1.MachineInfo, error) { + kl.machineInfoLock.RLock() + defer kl.machineInfoLock.RUnlock() return kl.machineInfo, nil } + +func (kl *Kubelet) setCachedMachineInfo(info *cadvisorapiv1.MachineInfo) { + kl.machineInfoLock.Lock() + defer kl.machineInfoLock.Unlock() + kl.machineInfo = info +} diff --git a/pkg/kubelet/kubelet_node_status_test.go b/pkg/kubelet/kubelet_node_status_test.go index 85b88c83647..ba03c18e9c8 100644 --- a/pkg/kubelet/kubelet_node_status_test.go +++ b/pkg/kubelet/kubelet_node_status_test.go @@ -212,7 +212,7 @@ func TestUpdateNewNodeStatus(t *testing.T) { NumCores: 2, MemoryCapacity: 10e9, // 10G } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) expectedNode := &v1.Node{ ObjectMeta: metav1.ObjectMeta{Name: testKubeletHostname}, @@ -390,7 +390,7 @@ func TestUpdateExistingNodeStatus(t *testing.T) { NumCores: 2, MemoryCapacity: 20e9, } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) expectedNode := &v1.Node{ ObjectMeta: metav1.ObjectMeta{Name: testKubeletHostname}, @@ -596,7 +596,7 @@ func TestUpdateNodeStatusWithRuntimeStateError(t *testing.T) { NumCores: 2, MemoryCapacity: 10e9, } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) expectedNode := &v1.Node{ ObjectMeta: metav1.ObjectMeta{Name: testKubeletHostname}, @@ -816,7 +816,7 @@ func TestUpdateNodeStatusWithLease(t *testing.T) { NumCores: 2, MemoryCapacity: 20e9, } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) now := metav1.NewTime(clock.Now()).Rfc3339Copy() expectedNode := &v1.Node{ @@ -961,7 +961,13 @@ func TestUpdateNodeStatusWithLease(t *testing.T) { // Report node status even if it is still within the duration of nodeStatusReportFrequency. clock.Step(10 * time.Second) var newMemoryCapacity int64 = 40e9 - kubelet.machineInfo.MemoryCapacity = uint64(newMemoryCapacity) + oldMachineInfo, err := kubelet.GetCachedMachineInfo() + if err != nil { + t.Fatal(err) + } + newMachineInfo := oldMachineInfo.Clone() + newMachineInfo.MemoryCapacity = uint64(newMemoryCapacity) + kubelet.setCachedMachineInfo(newMachineInfo) assert.NoError(t, kubelet.updateNodeStatus()) // 2 more action (There were 5 actions before). @@ -1073,7 +1079,7 @@ func TestUpdateNodeStatusAndVolumesInUseWithNodeLease(t *testing.T) { kubelet.containerManager = &localCM{ContainerManager: cm.NewStubContainerManager()} kubelet.lastStatusReportTime = kubelet.clock.Now() kubelet.nodeStatusReportFrequency = time.Hour - kubelet.machineInfo = &cadvisorapi.MachineInfo{} + kubelet.setCachedMachineInfo(&cadvisorapi.MachineInfo{}) // override test volumeManager fakeVolumeManager := kubeletvolume.NewFakeVolumeManager(tc.existingVolumes) @@ -1147,7 +1153,7 @@ func TestRegisterWithApiServer(t *testing.T) { NumCores: 2, MemoryCapacity: 1024, } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) done := make(chan struct{}) go func() { @@ -1356,7 +1362,7 @@ func TestUpdateNewNodeStatusTooLargeReservation(t *testing.T) { NumCores: 2, MemoryCapacity: 10e9, // 10G } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) expectedNode := &v1.Node{ ObjectMeta: metav1.ObjectMeta{Name: testKubeletHostname}, @@ -2183,7 +2189,7 @@ func TestRegisterWithApiServerWithTaint(t *testing.T) { NumCores: 2, MemoryCapacity: 1024, } - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) var gotNode runtime.Object kubeClient.AddReactor("create", "nodes", func(action core.Action) (bool, runtime.Object, error) { diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 73ac185b38c..46fae8016b8 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -215,7 +215,7 @@ func newTestKubeletWithImageList( kubelet.cadvisor = &cadvisortest.Fake{} machineInfo, _ := kubelet.cadvisor.MachineInfo() - kubelet.machineInfo = machineInfo + kubelet.setCachedMachineInfo(machineInfo) fakeMirrorClient := podtest.NewFakeMirrorClient() secretManager := secret.NewSimpleSecretManager(kubelet.kubeClient)