Merge pull request #129063 from carlory/automated-cherry-pick-of-#128219-upstream-release-1.30

Automated cherry pick of #128219: kubelet: Fix the volume manager didn't check the device mount state in the actual state of the world before marking the volume as detached
This commit is contained in:
Kubernetes Prow Robot 2025-01-07 15:08:29 -08:00 committed by GitHub
commit 538bf455a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 0 deletions

View File

@ -168,6 +168,11 @@ type ActualStateOfWorld interface {
// or have a mount/unmount operation pending.
GetAttachedVolumes() []AttachedVolume
// GetAttachedVolume returns the volume that is known to be attached to the node
// with the given volume name. If the volume is not found, the second return value
// is false.
GetAttachedVolume(volumeName v1.UniqueVolumeName) (AttachedVolume, bool)
// SyncReconstructedVolume check the volume.outerVolumeSpecName in asw and
// the one populated from dsw, if they do not match, update this field from the value from dsw.
SyncReconstructedVolume(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName, outerVolumeSpecName string)
@ -1104,6 +1109,18 @@ func (asw *actualStateOfWorld) GetAttachedVolumes() []AttachedVolume {
return allAttachedVolumes
}
func (asw *actualStateOfWorld) GetAttachedVolume(volumeName v1.UniqueVolumeName) (AttachedVolume, bool) {
asw.RLock()
defer asw.RUnlock()
volumeObj, ok := asw.attachedVolumes[volumeName]
if !ok {
return AttachedVolume{}, false
}
return asw.newAttachedVolume(&volumeObj), true
}
func (asw *actualStateOfWorld) GetUnmountedVolumes() []AttachedVolume {
asw.RLock()
defer asw.RUnlock()

View File

@ -270,6 +270,11 @@ func (rc *reconciler) unmountDetachDevices() {
// Check IsOperationPending to avoid marking a volume as detached if it's in the process of mounting.
if !rc.desiredStateOfWorld.VolumeExists(attachedVolume.VolumeName, attachedVolume.SELinuxMountContext) &&
!rc.operationExecutor.IsOperationPending(attachedVolume.VolumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) {
// Re-read the actual state of the world, maybe the volume got mounted in the meantime.
// This is safe, because there is no pending operation (checked above) and no new operation
// could start in the meantime. The only goroutine that adds new operations is this reconciler.
attachedVolume, _ = rc.actualStateOfWorld.GetAttachedVolume(attachedVolume.VolumeName)
if attachedVolume.DeviceMayBeMounted() {
// Volume is globally mounted to device, unmount it
klog.V(5).InfoS(attachedVolume.GenerateMsgDetailed("Starting operationExecutor.UnmountDevice", ""))