From b6e091a441036a583056c581604efb3d8145d8dc Mon Sep 17 00:00:00 2001 From: chlins Date: Thu, 13 Aug 2026 16:52:22 +0800 Subject: [PATCH 1/2] chore(changelogs): rename unreleased changelog entry to 10155-chlins Signed-off-by: chlins --- .../unreleased/{RS-MIRRORS_GITHUB_VELERO-22 => 10155-chlins} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelogs/unreleased/{RS-MIRRORS_GITHUB_VELERO-22 => 10155-chlins} (100%) diff --git a/changelogs/unreleased/RS-MIRRORS_GITHUB_VELERO-22 b/changelogs/unreleased/10155-chlins similarity index 100% rename from changelogs/unreleased/RS-MIRRORS_GITHUB_VELERO-22 rename to changelogs/unreleased/10155-chlins From 4f55fb5a657706d6ee67e594f12a6967ddd537cd Mon Sep 17 00:00:00 2001 From: lyndon-li <98304688+Lyndon-Li@users.noreply.github.com> Date: Fri, 14 Aug 2026 00:21:20 +0800 Subject: [PATCH 2/2] Fix pvr deadlock (#10250) * fix pvr deadlock Signed-off-by: Lyndon-Li * fix pvr deadlock Signed-off-by: Lyndon-Li --------- Signed-off-by: Lyndon-Li --- changelogs/unreleased/10250-Lyndon-Li | 1 + pkg/podvolume/restorer.go | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/10250-Lyndon-Li diff --git a/changelogs/unreleased/10250-Lyndon-Li b/changelogs/unreleased/10250-Lyndon-Li new file mode 100644 index 000000000..29ca747a0 --- /dev/null +++ b/changelogs/unreleased/10250-Lyndon-Li @@ -0,0 +1 @@ +Fix a potential deadlock when resultsLock is held by the informer but blocked on resChan because the early quit of RestorePodVolumes \ No newline at end of file diff --git a/pkg/podvolume/restorer.go b/pkg/podvolume/restorer.go index cd6533ac5..2cc72fe5e 100644 --- a/pkg/podvolume/restorer.go +++ b/pkg/podvolume/restorer.go @@ -105,9 +105,9 @@ func newRestorer( if pvr.Status.Phase == velerov1api.PodVolumeRestorePhaseCompleted || pvr.Status.Phase == velerov1api.PodVolumeRestorePhaseFailed || pvr.Status.Phase == velerov1api.PodVolumeRestorePhaseCanceled { r.resultsLock.Lock() - defer r.resultsLock.Unlock() - resChan, ok := r.results[resultsKey(pvr.Spec.Pod.Namespace, pvr.Spec.Pod.Name)] + r.resultsLock.Unlock() + if !ok { log.Errorf("No results channel found for pod %s/%s to send pod volume restore %s/%s on", pvr.Spec.Pod.Namespace, pvr.Spec.Pod.Name, pvr.Namespace, pvr.Name) return @@ -146,7 +146,7 @@ func (r *restorer) RestorePodVolumes(data RestoreData, tracker *volume.RestoreVo r.repoLocker.Lock(repo.Name) defer r.repoLocker.Unlock(repo.Name) - resultsChan := make(chan *velerov1api.PodVolumeRestore) + resultsChan := make(chan *velerov1api.PodVolumeRestore, len(volumesToRestore)) r.resultsLock.Lock() r.results[resultsKey(data.Pod.Namespace, data.Pod.Name)] = resultsChan