Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 66c030e

Browse files
committedMar 9, 2025·
Optimize updateAndSetOwner to Reduce Multiple Updates and Prevent Conflicts
Signed-off-by: Oded Viner <[email protected]>
1 parent a27c727 commit 66c030e

File tree

1 file changed

+94
-48
lines changed

1 file changed

+94
-48
lines changed
 

‎internal/controller/drplacementcontrol_controller.go

+94-48
Original file line numberDiff line numberDiff line change
@@ -565,40 +565,36 @@ func GetDRClusters(ctx context.Context, client client.Client, drPolicy *rmn.DRPo
565565
}
566566

567567
// updateObjectMetadata updates drpc labels, annotations and finalizer, and also updates placementObj finalizer
568-
func (r DRPlacementControlReconciler) updateObjectMetadata(ctx context.Context,
569-
drpc *rmn.DRPlacementControl, placementObj client.Object, log logr.Logger,
570-
) error {
571-
var update bool
568+
func (r DRPlacementControlReconciler) updateObjectMetadata(
569+
drpc *rmn.DRPlacementControl, placementObj client.Object,
570+
) (drpcModified bool, placementModified bool, err error) {
571+
// Explicit initialization
572+
drpcModified = false
573+
placementModified = false
574+
575+
if rmnutil.AddLabel(drpc, rmnutil.OCMBackupLabelKey, rmnutil.OCMBackupLabelValue) {
576+
drpcModified = true
577+
}
572578

573-
update = rmnutil.AddLabel(drpc, rmnutil.OCMBackupLabelKey, rmnutil.OCMBackupLabelValue)
574-
update = rmnutil.AddFinalizer(drpc, DRPCFinalizer) || update
579+
added := rmnutil.AddFinalizer(drpc, DRPCFinalizer)
580+
if added {
581+
drpcModified = true
582+
}
575583

576584
vrgNamespace, err := selectVRGNamespace(r.Client, r.Log, drpc, placementObj)
577585
if err != nil {
578-
return err
586+
return drpcModified, placementModified, err
579587
}
580588

581-
update = rmnutil.AddAnnotation(drpc, DRPCAppNamespace, vrgNamespace) || update
582-
583-
if update {
584-
if err := r.Update(ctx, drpc); err != nil {
585-
log.Error(err, "Failed to add annotations, labels, or finalizer to drpc")
586-
587-
return fmt.Errorf("%w", err)
588-
}
589+
if rmnutil.AddAnnotation(drpc, DRPCAppNamespace, vrgNamespace) {
590+
drpcModified = true
589591
}
590592

591-
// add finalizer to User PlacementRule/Placement
592-
finalizerAdded := rmnutil.AddFinalizer(placementObj, DRPCFinalizer)
593-
if finalizerAdded {
594-
if err := r.Update(ctx, placementObj); err != nil {
595-
log.Error(err, "Failed to add finalizer to user placement rule")
596-
597-
return fmt.Errorf("%w", err)
598-
}
593+
if rmnutil.AddFinalizer(placementObj, DRPCFinalizer) {
594+
placementModified = true
599595
}
600596

601-
return nil
597+
return drpcModified, placementModified, nil
602598
}
603599

604600
func (r *DRPlacementControlReconciler) processDeletion(ctx context.Context,
@@ -854,15 +850,76 @@ func (r *DRPlacementControlReconciler) updateAndSetOwner(
854850
usrPlacement client.Object,
855851
log logr.Logger,
856852
) (bool, error) {
857-
if err := r.annotateObject(ctx, drpc, usrPlacement, log); err != nil {
853+
var (
854+
err error
855+
updated bool
856+
placementModified bool
857+
placementAnnotateModified bool
858+
placementMetadataModified bool
859+
)
860+
861+
// Annotate the placement object
862+
if placementAnnotateModified, err = r.annotateObject(drpc, usrPlacement, log); err != nil {
858863
return false, err
859864
}
860865

861-
if err := r.updateObjectMetadata(ctx, drpc, usrPlacement, log); err != nil {
866+
// Update object metadata
867+
if _, placementMetadataModified, err = r.updateObjectMetadata(drpc, usrPlacement); err != nil {
862868
return false, err
863869
}
864870

865-
return r.setDRPCOwner(ctx, drpc, usrPlacement, log)
871+
// Merge both modifications
872+
placementModified = placementAnnotateModified || placementMetadataModified
873+
874+
// Set DRPC Owner
875+
updated, err = r.setDRPCOwner(drpc, usrPlacement, log)
876+
if err != nil {
877+
return false, err
878+
}
879+
880+
if placementModified {
881+
if err = r.updatePlacement(ctx, usrPlacement, log); err != nil {
882+
return false, err
883+
}
884+
}
885+
886+
if err = r.updateDRPC(ctx, drpc, log); err != nil {
887+
return false, err
888+
}
889+
890+
return updated, nil
891+
}
892+
893+
func (r *DRPlacementControlReconciler) updatePlacement(
894+
ctx context.Context,
895+
owner client.Object,
896+
log logr.Logger,
897+
) error {
898+
if err := r.Update(ctx, owner); err != nil {
899+
log.Error(err, "Failed to update Placement object")
900+
901+
return fmt.Errorf("failed to update placement %s: %w", owner.GetName(), err)
902+
}
903+
904+
log.Info("Successfully updated Placement resource", "placement", owner.GetName())
905+
906+
return nil
907+
}
908+
909+
func (r *DRPlacementControlReconciler) updateDRPC(
910+
ctx context.Context,
911+
drpc *rmn.DRPlacementControl,
912+
log logr.Logger,
913+
) error {
914+
if err := r.Update(ctx, drpc); err != nil {
915+
log.Error(err, "Failed to update DRPC")
916+
917+
return fmt.Errorf("failed to update DRPC %s: %w", drpc.GetName(), err)
918+
}
919+
920+
log.Info("Successfully updated DRPC resource", "drpc", drpc.GetName())
921+
922+
return nil
866923
}
867924

868925
func getPlacementOrPlacementRule(
@@ -984,11 +1041,13 @@ func getPlacement(ctx context.Context, k8sclient client.Client,
9841041
return usrPlmnt, nil
9851042
}
9861043

987-
func (r *DRPlacementControlReconciler) annotateObject(ctx context.Context,
988-
drpc *rmn.DRPlacementControl, obj client.Object, log logr.Logger,
989-
) error {
1044+
func (r *DRPlacementControlReconciler) annotateObject(
1045+
drpc *rmn.DRPlacementControl,
1046+
obj client.Object,
1047+
log logr.Logger,
1048+
) (bool, error) {
9901049
if rmnutil.ResourceIsDeleted(obj) {
991-
return nil
1050+
return false, nil
9921051
}
9931052

9941053
if obj.GetAnnotations() == nil {
@@ -1002,29 +1061,21 @@ func (r *DRPlacementControlReconciler) annotateObject(ctx context.Context,
10021061
obj.GetAnnotations()[DRPCNameAnnotation] = drpc.Name
10031062
obj.GetAnnotations()[DRPCNamespaceAnnotation] = drpc.Namespace
10041063

1005-
err := r.Update(ctx, obj)
1006-
if err != nil {
1007-
log.Error(err, "Failed to update Object annotation", "objName", obj.GetName())
1008-
1009-
return fmt.Errorf("failed to update Object %s annotation '%s/%s' (%w)",
1010-
obj.GetName(), DRPCNameAnnotation, drpc.Name, err)
1011-
}
1012-
1013-
return nil
1064+
return true, nil
10141065
}
10151066

10161067
if ownerName != drpc.Name || ownerNamespace != drpc.Namespace {
10171068
log.Info("Object not owned by this DRPC", "objName", obj.GetName())
10181069

1019-
return fmt.Errorf("object %s not owned by this DRPC '%s/%s'",
1070+
return false, fmt.Errorf("object %s not owned by this DRPC '%s/%s'",
10201071
obj.GetName(), drpc.Name, drpc.Namespace)
10211072
}
10221073

1023-
return nil
1074+
return false, nil
10241075
}
10251076

10261077
func (r *DRPlacementControlReconciler) setDRPCOwner(
1027-
ctx context.Context, drpc *rmn.DRPlacementControl, owner client.Object, log logr.Logger,
1078+
drpc *rmn.DRPlacementControl, owner client.Object, log logr.Logger,
10281079
) (bool, error) {
10291080
const updated = true
10301081

@@ -1039,11 +1090,6 @@ func (r *DRPlacementControlReconciler) setDRPCOwner(
10391090
return !updated, fmt.Errorf("failed to set DRPC owner %w", err)
10401091
}
10411092

1042-
err = r.Update(ctx, drpc)
1043-
if err != nil {
1044-
return !updated, fmt.Errorf("failed to update drpc %s (%w)", drpc.GetName(), err)
1045-
}
1046-
10471093
log.Info(fmt.Sprintf("Object %s owns DRPC %s", owner.GetName(), drpc.GetName()))
10481094

10491095
return updated, nil

0 commit comments

Comments
 (0)
Please sign in to comment.