From 83ee5da75e9ae924228b69bf1976a6960be9b8e8 Mon Sep 17 00:00:00 2001 From: KeZhang Date: Wed, 9 Jun 2021 17:53:30 +0800 Subject: [PATCH] Fix:slow memory leak may be in kubelet podworkers.isWorking --- pkg/kubelet/pod_workers.go | 3 ++- pkg/kubelet/pod_workers_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/pod_workers.go b/pkg/kubelet/pod_workers.go index 5072cf18411..f39f7b73f1a 100644 --- a/pkg/kubelet/pod_workers.go +++ b/pkg/kubelet/pod_workers.go @@ -282,7 +282,8 @@ func (p *podWorkers) checkForUpdates(uid types.UID) { p.podUpdates[uid] <- workUpdate delete(p.lastUndeliveredWorkUpdate, uid) } else { - p.isWorking[uid] = false + // put this line in removeWorker may cause dead lock, so keep reset it here + delete(p.isWorking, uid) } } diff --git a/pkg/kubelet/pod_workers_test.go b/pkg/kubelet/pod_workers_test.go index f13761203ec..59eaae48fe1 100644 --- a/pkg/kubelet/pod_workers_test.go +++ b/pkg/kubelet/pod_workers_test.go @@ -241,6 +241,30 @@ func TestForgetNonExistingPodWorkers(t *testing.T) { } } +func TestIsWorkingClearedAfterForgetPodWorkers(t *testing.T) { + podWorkers, _ := createPodWorkers() + + numPods := 20 + for i := 0; i < numPods; i++ { + podWorkers.UpdatePod(&UpdatePodOptions{ + Pod: newPod(strconv.Itoa(i), "name"), + UpdateType: kubetypes.SyncPodUpdate, + }) + } + drainWorkers(podWorkers, numPods) + + if len(podWorkers.podUpdates) != numPods { + t.Errorf("Incorrect number of open channels %v", len(podWorkers.podUpdates)) + } + podWorkers.ForgetNonExistingPodWorkers(map[types.UID]sets.Empty{}) + if len(podWorkers.podUpdates) != 0 { + t.Errorf("Incorrect number of open channels %v", len(podWorkers.podUpdates)) + } + if len(podWorkers.isWorking) != 0 { + t.Errorf("Incorrect number of isWorking %v", len(podWorkers.isWorking)) + } +} + type simpleFakeKubelet struct { pod *v1.Pod mirrorPod *v1.Pod