From e40d00cf53a3f0ed6a10e3d5b5a3efe68b232e56 Mon Sep 17 00:00:00 2001 From: cvvz Date: Sun, 13 Aug 2023 15:52:25 +0800 Subject: [PATCH 1/4] fix: 119921 --- pkg/kubelet/volumemanager/reconciler/reconstruct.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubelet/volumemanager/reconciler/reconstruct.go b/pkg/kubelet/volumemanager/reconciler/reconstruct.go index 71bc69e8f0b..4351094f4f6 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconstruct.go +++ b/pkg/kubelet/volumemanager/reconciler/reconstruct.go @@ -83,7 +83,6 @@ func (rc *reconciler) syncStates(kubeletPodDir string) { if cachedInfo, ok := volumesNeedUpdate[reconstructedVolume.volumeName]; ok { gvl = cachedInfo } - gvl.addPodVolume(reconstructedVolume) if volumeInDSW { // Some pod needs the volume. And it exists on disk. Some previous // kubelet must have created the directory, therefore it must have @@ -95,6 +94,7 @@ func (rc *reconciler) syncStates(kubeletPodDir string) { klog.V(4).InfoS("Volume exists in desired state, marking as InUse", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) continue } + gvl.addPodVolume(reconstructedVolume) // There is no pod that uses the volume. if rc.operationExecutor.IsOperationPending(reconstructedVolume.volumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) { klog.InfoS("Volume is in pending operation, skip cleaning up mounts") From ab1f97bd6edb9829ae182bada0b3da3991e79a45 Mon Sep 17 00:00:00 2001 From: cvvz Date: Fri, 25 Aug 2023 19:55:56 +0800 Subject: [PATCH 2/4] fix --- pkg/kubelet/volumemanager/reconciler/reconstruct.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/kubelet/volumemanager/reconciler/reconstruct.go b/pkg/kubelet/volumemanager/reconciler/reconstruct.go index 4351094f4f6..e14f421bde0 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconstruct.go +++ b/pkg/kubelet/volumemanager/reconciler/reconstruct.go @@ -78,10 +78,6 @@ func (rc *reconciler) syncStates(kubeletPodDir string) { devicePath: reconstructedVolume.devicePath, deviceMounter: reconstructedVolume.deviceMounter, blockVolumeMapper: reconstructedVolume.blockVolumeMapper, - mounter: reconstructedVolume.mounter, - } - if cachedInfo, ok := volumesNeedUpdate[reconstructedVolume.volumeName]; ok { - gvl = cachedInfo } if volumeInDSW { // Some pod needs the volume. And it exists on disk. Some previous @@ -90,16 +86,23 @@ func (rc *reconciler) syncStates(kubeletPodDir string) { // this new kubelet so reconcile() calls SetUp and re-mounts the // volume if it's necessary. volumeNeedReport = append(volumeNeedReport, reconstructedVolume.volumeName) + if cachedInfo, ok := rc.skippedDuringReconstruction[reconstructedVolume.volumeName]; ok { + gvl = cachedInfo + } + gvl.addPodVolume(reconstructedVolume) rc.skippedDuringReconstruction[reconstructedVolume.volumeName] = gvl klog.V(4).InfoS("Volume exists in desired state, marking as InUse", "podName", volume.podName, "volumeSpecName", volume.volumeSpecName) continue } - gvl.addPodVolume(reconstructedVolume) // There is no pod that uses the volume. if rc.operationExecutor.IsOperationPending(reconstructedVolume.volumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) { klog.InfoS("Volume is in pending operation, skip cleaning up mounts") } klog.V(2).InfoS("Reconciler sync states: could not find pod information in desired state, update it in actual state", "reconstructedVolume", reconstructedVolume) + if cachedInfo, ok := volumesNeedUpdate[reconstructedVolume.volumeName]; ok { + gvl = cachedInfo + } + gvl.addPodVolume(reconstructedVolume) volumesNeedUpdate[reconstructedVolume.volumeName] = gvl } From 56c241783e3d12e7ec2e5a884141d519fd1e7d08 Mon Sep 17 00:00:00 2001 From: cvvz Date: Fri, 25 Aug 2023 19:56:54 +0800 Subject: [PATCH 3/4] fix --- pkg/kubelet/volumemanager/reconciler/reconstruct.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/kubelet/volumemanager/reconciler/reconstruct.go b/pkg/kubelet/volumemanager/reconciler/reconstruct.go index e14f421bde0..ee00537da90 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconstruct.go +++ b/pkg/kubelet/volumemanager/reconciler/reconstruct.go @@ -78,6 +78,7 @@ func (rc *reconciler) syncStates(kubeletPodDir string) { devicePath: reconstructedVolume.devicePath, deviceMounter: reconstructedVolume.deviceMounter, blockVolumeMapper: reconstructedVolume.blockVolumeMapper, + mounter: reconstructedVolume.mounter, } if volumeInDSW { // Some pod needs the volume. And it exists on disk. Some previous From b91f07008cc0151547b6416a4bd4a4b11693f47a Mon Sep 17 00:00:00 2001 From: weizhichen Date: Mon, 6 Nov 2023 08:20:42 +0000 Subject: [PATCH 4/4] add ut --- .../reconciler/reconciler_test.go | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/volumemanager/reconciler/reconciler_test.go b/pkg/kubelet/volumemanager/reconciler/reconciler_test.go index 7e69ace560d..3dda3fd5eca 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconciler_test.go +++ b/pkg/kubelet/volumemanager/reconciler/reconciler_test.go @@ -2326,15 +2326,31 @@ func TestSyncStates(t *testing.T) { filepath.Join("pod2uid", "volumes", "fake-plugin", "volume-name"), }, createMountPoint: true, - podInfos: []podInfo{defaultPodInfo}, + podInfos: []podInfo{ + { + podName: "pod2", + podUID: "pod2uid", + outerVolumeName: "volume-name", + innerVolumeName: "volume-name", + }, + }, verifyFunc: func(rcInstance *reconciler, fakePlugin *volumetesting.FakeVolumePlugin) error { // for pod that is deleted, volume is considered as mounted mountedPods := rcInstance.actualStateOfWorld.GetMountedVolumes() if len(mountedPods) != 1 { return fmt.Errorf("expected 1 pods to in asw got %d", len(mountedPods)) } - if types.UniquePodName("pod2uid") != mountedPods[0].PodName { - return fmt.Errorf("expected mounted pod to be %s got %s", "pod2uid", mountedPods[0].PodName) + if types.UniquePodName("pod1uid") != mountedPods[0].PodName { + return fmt.Errorf("expected mounted pod to be %s got %s", "pod1uid", mountedPods[0].PodName) + } + + // for pod that is in dsw, volume is in skippedDuringReconstruction + skippedVolumes := rcInstance.skippedDuringReconstruction + if len(skippedVolumes) != 1 { + return fmt.Errorf("expected 1 pods to in skippedDuringReconstruction got %d", len(skippedVolumes)) + } + if skippedVolumes["fake-plugin/volume-name"] == nil { + return fmt.Errorf("expected %s is in skippedDuringReconstruction, got %+v", "fake-plugin/volume-name", skippedVolumes) } return nil },