From ee43d040a6888cbc41b6c6b774339a201064beea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wenkai=20Yin=28=E5=B0=B9=E6=96=87=E5=BC=80=29?= Date: Thu, 27 Feb 2025 14:50:55 +0800 Subject: [PATCH] Return directly if no pod volme backup are tracked MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return directly if no pod volme backup are tracked Fixes #8723 Signed-off-by: Wenkai Yin(尹文开) --- changelogs/unreleased/8728-ywk253100 | 1 + pkg/podvolume/backupper.go | 8 ++++++- pkg/podvolume/backupper_test.go | 32 +++++++++++++++++++++------- 3 files changed, 32 insertions(+), 9 deletions(-) create mode 100644 changelogs/unreleased/8728-ywk253100 diff --git a/changelogs/unreleased/8728-ywk253100 b/changelogs/unreleased/8728-ywk253100 new file mode 100644 index 0000000000..e90b186142 --- /dev/null +++ b/changelogs/unreleased/8728-ywk253100 @@ -0,0 +1 @@ +Return directly if no pod volme backup are tracked \ No newline at end of file diff --git a/pkg/podvolume/backupper.go b/pkg/podvolume/backupper.go index 6e13dd0e61..d873cc96cc 100644 --- a/pkg/podvolume/backupper.go +++ b/pkg/podvolume/backupper.go @@ -387,13 +387,19 @@ func (b *backupper) WaitAllPodVolumesProcessed(log logrus.FieldLogger) []*velero } }() + var podVolumeBackups []*velerov1api.PodVolumeBackup + // if no pod volume backups are tracked, return directly to avoid issue mentioned in + // https://github.com/vmware-tanzu/velero/issues/8723 + if len(b.pvbIndexer.List()) == 0 { + return podVolumeBackups + } + done := make(chan struct{}) go func() { defer close(done) b.wg.Wait() }() - var podVolumeBackups []*velerov1api.PodVolumeBackup select { case <-b.ctx.Done(): log.Error("timed out waiting for all PodVolumeBackups to complete") diff --git a/pkg/podvolume/backupper_test.go b/pkg/podvolume/backupper_test.go index 026cd5bb38..ac0386bd11 100644 --- a/pkg/podvolume/backupper_test.go +++ b/pkg/podvolume/backupper_test.go @@ -725,26 +725,33 @@ func (l *logHook) Fire(entry *logrus.Entry) error { } func TestWaitAllPodVolumesProcessed(t *testing.T) { - timeoutCtx, cancelFunc := context.WithTimeout(context.Background(), 1*time.Second) - defer func() { - cancelFunc() - }() + timeoutCtx, cancelFunc := context.WithCancel(context.Background()) + cancelFunc() log := logrus.New() + pvb := builder.ForPodVolumeBackup(velerov1api.DefaultNamespace, "pvb"). + PodNamespace("pod-namespace").PodName("pod-name").Volume("volume").Result() cases := []struct { name string ctx context.Context + pvb *velerov1api.PodVolumeBackup statusToBeUpdated *velerov1api.PodVolumeBackupStatus expectedErr string expectedPVBPhase velerov1api.PodVolumeBackupPhase }{ + { + name: "contains no pvb should report no error", + ctx: timeoutCtx, + }, { name: "context canceled", ctx: timeoutCtx, + pvb: pvb, expectedErr: "timed out waiting for all PodVolumeBackups to complete", }, { name: "failed pvbs", ctx: context.Background(), + pvb: pvb, statusToBeUpdated: &velerov1api.PodVolumeBackupStatus{ Phase: velerov1api.PodVolumeBackupPhaseFailed, Message: "failed", @@ -755,6 +762,7 @@ func TestWaitAllPodVolumesProcessed(t *testing.T) { { name: "completed pvbs", ctx: context.Background(), + pvb: pvb, statusToBeUpdated: &velerov1api.PodVolumeBackupStatus{ Phase: velerov1api.PodVolumeBackupPhaseCompleted, Message: "completed", @@ -764,10 +772,13 @@ func TestWaitAllPodVolumesProcessed(t *testing.T) { } for _, c := range cases { - newPVB := builder.ForPodVolumeBackup(velerov1api.DefaultNamespace, "pvb").Result() + var objs []ctrlclient.Object + if c.pvb != nil { + objs = append(objs, c.pvb) + } scheme := runtime.NewScheme() velerov1api.AddToScheme(scheme) - client := ctrlfake.NewClientBuilder().WithScheme(scheme).WithObjects(newPVB).Build() + client := ctrlfake.NewClientBuilder().WithScheme(scheme).WithObjects(objs...).Build() lw := kube.InternalLW{ Client: client, @@ -786,11 +797,14 @@ func TestWaitAllPodVolumesProcessed(t *testing.T) { logger.Hooks.Add(logHook) backuper := newBackupper(c.ctx, log, nil, nil, informer, nil, "", &velerov1api.Backup{}) - backuper.wg.Add(1) + if c.pvb != nil { + backuper.pvbIndexer.Add(c.pvb) + backuper.wg.Add(1) + } if c.statusToBeUpdated != nil { pvb := &velerov1api.PodVolumeBackup{} - err := client.Get(context.Background(), ctrlclient.ObjectKey{Namespace: newPVB.Namespace, Name: newPVB.Name}, pvb) + err := client.Get(context.Background(), ctrlclient.ObjectKey{Namespace: c.pvb.Namespace, Name: c.pvb.Name}, pvb) require.NoError(t, err) pvb.Status = *c.statusToBeUpdated @@ -802,6 +816,8 @@ func TestWaitAllPodVolumesProcessed(t *testing.T) { if c.expectedErr != "" { assert.Equal(t, c.expectedErr, logHook.entry.Message) + } else { + assert.Nil(t, logHook.entry) } if c.expectedPVBPhase != "" {