@@ -578,55 +578,32 @@ func (v *VRGInstance) validateVRGMode() error {
578
578
return nil
579
579
}
580
580
581
- func (v * VRGInstance ) clusterDataRestore (result * ctrl.Result ) error {
582
- if v .instance .Spec .PrepareForFinalSync || v .instance .Spec .RunFinalSync {
583
- msg := "PV restore skipped, as VRG is orchestrating final sync"
584
- setVRGClusterDataReadyCondition (& v .instance .Status .Conditions , v .instance .Generation , msg )
585
-
586
- return nil
587
- }
581
+ func (v * VRGInstance ) clusterDataRestore (result * ctrl.Result ) (int , error ) {
582
+ v .log .Info ("Restoring PVs and PVCs" )
588
583
589
- clusterDataReady := findCondition (v .instance .Status .Conditions , VRGConditionTypeClusterDataReady )
590
- if clusterDataReady != nil {
591
- v .log .Info ("ClusterDataReady condition" ,
592
- "status" , clusterDataReady .Status ,
593
- "reason" , clusterDataReady .Reason ,
594
- "message" , clusterDataReady .Message ,
595
- "observedGeneration" , clusterDataReady .ObservedGeneration ,
596
- "generation" , v .instance .Generation ,
597
- )
598
-
599
- if clusterDataReady .Status == metav1 .ConditionTrue &&
600
- clusterDataReady .ObservedGeneration == v .instance .Generation {
601
- v .log .Info ("VRG's ClusterDataReady condition found. PV restore must have already been applied" )
602
-
603
- return nil
604
- }
605
- } else {
606
- v .log .Info ("ClusterDataReady condition absent" )
607
- }
608
-
609
- err := v .restorePVsForVolSync ()
584
+ numRestoredForVS , err := v .restorePVsAndPVCsForVolSync ()
610
585
if err != nil {
611
- v .log .Info ("VolSync PV restore failed" )
586
+ v .log .Info ("VolSync PV/PVC restore failed" )
612
587
613
- result .Requeue = true
614
-
615
- return fmt .Errorf ("failed to restore PVs for VolSync (%w)" , err )
588
+ return numRestoredForVS , fmt .Errorf ("failed to restore PV/PVC for VolSync (%w)" , err )
616
589
}
617
590
618
- err = v .clusterDataRestoreForVolRep (result )
591
+ numRestoredForVR , err : = v .restorePVsAndPVCsForVolRep (result )
619
592
if err != nil {
620
- v .log .Info ("VolRep ClusterData restore failed" )
593
+ v .log .Info ("VolRep PV/PVC restore failed" )
621
594
622
- return fmt .Errorf ("failed to restore ClusterData for VolRep (%w)" , err )
595
+ return numRestoredForVS + numRestoredForVR , fmt .Errorf ("failed to restore PV/PVC for VolRep (%w)" , err )
623
596
}
624
597
625
598
// Only after both succeed, we mark ClusterDataReady as true
626
- msg := "Restored cluster data"
599
+ msg := "Restored PVs and PVCs"
600
+ if numRestoredForVS + numRestoredForVR == 0 {
601
+ msg = "Nothing to restore"
602
+ }
603
+
627
604
setVRGClusterDataReadyCondition (& v .instance .Status .Conditions , v .instance .Generation , msg )
628
605
629
- return nil
606
+ return numRestoredForVS + numRestoredForVR , nil
630
607
}
631
608
632
609
func (v * VRGInstance ) listPVCsByVrgPVCSelector () (* corev1.PersistentVolumeClaimList , error ) {
@@ -877,8 +854,18 @@ func (v *VRGInstance) processAsPrimary() ctrl.Result {
877
854
return v .dataError (err , "PVCs deselected unprotect failed" , v .result .Requeue )
878
855
}
879
856
880
- if err := v .clusterDataRestore (& v .result ); err != nil {
881
- return v .clusterDataError (err , "Failed to restore PVs" , v .result )
857
+ if v .shouldRestoreClusterData () {
858
+ v .result .Requeue = true
859
+
860
+ numOfRestoredRes , err := v .clusterDataRestore (& v .result )
861
+ if err != nil {
862
+ return v .clusterDataError (err , "Failed to restore PVs/PVCs" , v .result )
863
+ }
864
+
865
+ // Save status and requeue if we restored any resources (PV/PVCs). Otherwise, continue
866
+ if numOfRestoredRes != 0 {
867
+ return v .updateVRGConditionsAndStatus (v .result )
868
+ }
882
869
}
883
870
884
871
v .reconcileAsPrimary ()
@@ -895,6 +882,35 @@ func (v *VRGInstance) processAsPrimary() ctrl.Result {
895
882
return v .updateVRGConditionsAndStatus (v .result )
896
883
}
897
884
885
+ func (v * VRGInstance ) shouldRestoreClusterData () bool {
886
+ if v .instance .Spec .PrepareForFinalSync || v .instance .Spec .RunFinalSync {
887
+ msg := "PV restore skipped, as VRG is orchestrating final sync"
888
+ setVRGClusterDataReadyCondition (& v .instance .Status .Conditions , v .instance .Generation , msg )
889
+
890
+ return false
891
+ }
892
+
893
+ clusterDataReady := findCondition (v .instance .Status .Conditions , VRGConditionTypeClusterDataReady )
894
+ if clusterDataReady != nil {
895
+ v .log .Info ("ClusterDataReady condition" ,
896
+ "status" , clusterDataReady .Status ,
897
+ "reason" , clusterDataReady .Reason ,
898
+ "message" , clusterDataReady .Message ,
899
+ "observedGeneration" , clusterDataReady .ObservedGeneration ,
900
+ "generation" , v .instance .Generation ,
901
+ )
902
+
903
+ if clusterDataReady .Status == metav1 .ConditionTrue &&
904
+ clusterDataReady .ObservedGeneration == v .instance .Generation {
905
+ v .log .Info ("VRG's ClusterDataReady condition found. PV restore must have already been applied" )
906
+
907
+ return false
908
+ }
909
+ }
910
+
911
+ return true
912
+ }
913
+
898
914
func (v * VRGInstance ) reconcileAsPrimary () {
899
915
var finalSyncPrepared struct {
900
916
volSync bool
0 commit comments