diff --git a/changelogs/unreleased/8021-shubham-pampattiwar b/changelogs/unreleased/8021-shubham-pampattiwar new file mode 100644 index 0000000000..40d4a95a73 --- /dev/null +++ b/changelogs/unreleased/8021-shubham-pampattiwar @@ -0,0 +1 @@ +Make PVPatchMaximumDuration timeout configurable \ No newline at end of file diff --git a/pkg/cmd/server/server.go b/pkg/cmd/server/server.go index 692f4d96ef..d8938ca56f 100644 --- a/pkg/cmd/server/server.go +++ b/pkg/cmd/server/server.go @@ -1022,6 +1022,7 @@ func (s *server) runControllers(defaultVolumeSnapshotLocations map[string]string s.metrics, s.crClient, multiHookTracker, + s.config.resourceTimeout, ).SetupWithManager(s.mgr); err != nil { s.logger.Fatal(err, "unable to create controller", "controller", controller.RestoreFinalizer) } diff --git a/pkg/controller/restore_finalizer_controller.go b/pkg/controller/restore_finalizer_controller.go index 856de13e6f..a75ea199a3 100644 --- a/pkg/controller/restore_finalizer_controller.go +++ b/pkg/controller/restore_finalizer_controller.go @@ -45,10 +45,6 @@ import ( "github.com/vmware-tanzu/velero/pkg/util/results" ) -const ( - PVPatchMaximumDuration = 10 * time.Minute -) - type restoreFinalizerReconciler struct { client.Client namespace string @@ -59,6 +55,7 @@ type restoreFinalizerReconciler struct { clock clock.WithTickerAndDelayedExecution crClient client.Client multiHookTracker *hook.MultiHookTracker + resourceTimeout time.Duration } func NewRestoreFinalizerReconciler( @@ -70,6 +67,7 @@ func NewRestoreFinalizerReconciler( metrics *metrics.ServerMetrics, crClient client.Client, multiHookTracker *hook.MultiHookTracker, + resourceTimeout time.Duration, ) *restoreFinalizerReconciler { return &restoreFinalizerReconciler{ Client: client, @@ -81,6 +79,7 @@ func NewRestoreFinalizerReconciler( clock: &clock.RealClock{}, crClient: crClient, multiHookTracker: multiHookTracker, + resourceTimeout: resourceTimeout, } } @@ -163,6 +162,7 @@ func (r *restoreFinalizerReconciler) Reconcile(ctx context.Context, req ctrl.Req volumeInfo: volumeInfo, restoredPVCList: restoredPVCList, multiHookTracker: r.multiHookTracker, + resourceTimeout: r.resourceTimeout, } warnings, errs := finalizerCtx.execute() @@ -246,6 +246,7 @@ type finalizerContext struct { volumeInfo []*volume.BackupVolumeInfo restoredPVCList map[string]struct{} multiHookTracker *hook.MultiHookTracker + resourceTimeout time.Duration } func (ctx *finalizerContext) execute() (results.Result, results.Result) { //nolint:unparam //temporarily ignore the lint report: result 0 is always nil (unparam) @@ -268,6 +269,7 @@ func (ctx *finalizerContext) patchDynamicPVWithVolumeInfo() (errs results.Result var pvWaitGroup sync.WaitGroup var resultLock sync.Mutex + maxConcurrency := 3 semaphore := make(chan struct{}, maxConcurrency) @@ -294,7 +296,7 @@ func (ctx *finalizerContext) patchDynamicPVWithVolumeInfo() (errs results.Result log := ctx.logger.WithField("PVC", volInfo.PVCName).WithField("PVCNamespace", restoredNamespace) log.Debug("patching dynamic PV is in progress") - err := wait.PollUntilContextTimeout(context.Background(), 10*time.Second, PVPatchMaximumDuration, true, func(context.Context) (bool, error) { + err := wait.PollUntilContextTimeout(context.Background(), 10*time.Second, ctx.resourceTimeout, true, func(context.Context) (bool, error) { // wait for PVC to be bound pvc := &v1.PersistentVolumeClaim{} err := ctx.crClient.Get(context.Background(), client.ObjectKey{Name: volInfo.PVCName, Namespace: restoredNamespace}, pvc) diff --git a/pkg/controller/restore_finalizer_controller_test.go b/pkg/controller/restore_finalizer_controller_test.go index 9ca5658493..32b28765cd 100644 --- a/pkg/controller/restore_finalizer_controller_test.go +++ b/pkg/controller/restore_finalizer_controller_test.go @@ -138,6 +138,7 @@ func TestRestoreFinalizerReconcile(t *testing.T) { metrics.NewServerMetrics(), fakeClient, hook.NewMultiHookTracker(), + 10*time.Minute, ) r.clock = testclocks.NewFakeClock(now) @@ -200,6 +201,7 @@ func TestUpdateResult(t *testing.T) { metrics.NewServerMetrics(), fakeClient, hook.NewMultiHookTracker(), + 10*time.Minute, ) restore := builder.ForRestore(velerov1api.DefaultNamespace, "restore-1").Result() res := map[string]results.Result{"warnings": {}, "errors": {}}