Skip to content

Commit 8e3c41b

Browse files
authored
Refactor service status update logic to remove unnecessary context and client parameters (#1144) (#1152)
Signed-off-by: Daniel Fan <[email protected]>
1 parent 6eb853a commit 8e3c41b

File tree

3 files changed

+31
-48
lines changed

3 files changed

+31
-48
lines changed

api/v1alpha1/operandrequest_types.go

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,10 @@
1717
package v1alpha1
1818

1919
import (
20-
"context"
2120
"strings"
2221
"sync"
2322
"time"
2423

25-
client "sigs.k8s.io/controller-runtime/pkg/client"
26-
2724
gset "github.com/deckarep/golang-set"
2825
corev1 "k8s.io/api/core/v1"
2926
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -438,52 +435,40 @@ func (r *OperandRequest) RemoveOperandPhase(name string, mu sync.Locker) {
438435
}
439436
}
440437

441-
func (r *OperandRequest) SetServiceStatus(ctx context.Context, service ServiceStatus, updater client.StatusClient, mu sync.Locker) error {
438+
// SetServiceStatus updates the service status in the local object
439+
func (r *OperandRequest) SetServiceStatus(service ServiceStatus, mu sync.Locker) {
442440
mu.Lock()
443441
defer mu.Unlock()
442+
444443
pos, _ := getServiceStatus(&r.Status, service.OperatorName)
445444
if pos != -1 {
446445
if len(r.Status.Services[pos].Resources) == 0 {
446+
// If no resources, replace the entire service
447447
r.Status.Services[pos] = service
448-
updateerr := updater.Status().Update(ctx, r)
449-
if updateerr != nil {
450-
return updateerr
451-
}
452448
} else {
449+
// Update status if different
453450
if r.Status.Services[pos].Status != service.Status {
454451
r.Status.Services[pos].Status = service.Status
455-
updateerr := updater.Status().Update(ctx, r)
456-
if updateerr != nil {
457-
return updateerr
458-
}
459452
}
453+
454+
// Process each resource
460455
for i := range service.Resources {
461456
if service.Resources[i].ObjectName != "" {
462457
resourcePos, _ := getResourceStatus(r.Status.Services[pos].Resources, service.Resources[i].ObjectName)
463458
if resourcePos != -1 {
459+
// Update existing resource
464460
r.Status.Services[pos].Resources[resourcePos] = service.Resources[i]
465-
updateerr := updater.Status().Update(ctx, r)
466-
if updateerr != nil {
467-
return updateerr
468-
}
469461
} else {
462+
// Add new resource
470463
r.Status.Services[pos].Resources = append(r.Status.Services[pos].Resources, service.Resources[i])
471-
updateerr := updater.Status().Update(ctx, r)
472-
if updateerr != nil {
473-
return updateerr
474-
}
475464
}
476465
}
477466
}
478467
}
479468
} else {
469+
// Add new service
480470
r.Status.Services = append(r.Status.Services, service)
481-
updateerr := updater.Status().Update(ctx, r)
482-
if updateerr != nil {
483-
return updateerr
484-
}
485471
}
486-
return nil
487472
}
488473

489474
func (r *OperandRequest) setOperatorReadyCondition(operatorPhase OperatorPhase, name string) {

controllers/operandrequest/operandrequest_controller.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package operandrequest
1818

1919
import (
2020
"context"
21-
"fmt"
2221
"reflect"
2322
"regexp"
2423
"strings"
@@ -91,24 +90,28 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Re
9190

9291
// Always attempt to patch the status after each reconciliation.
9392
defer func() {
94-
// get the latest instance from the server and check if the status has changed
95-
existingInstance := &operatorv1alpha1.OperandRequest{}
96-
if err := r.Client.Get(ctx, req.NamespacedName, existingInstance); err != nil && !apierrors.IsNotFound(err) {
97-
// Error reading the latest object - requeue the request.
98-
reconcileErr = utilerrors.NewAggregate([]error{reconcileErr, fmt.Errorf("error while get latest OperandRequest.Status from server: %v", err)})
99-
}
100-
101-
if reflect.DeepEqual(existingInstance.Status, requestInstance.Status) {
93+
// Don't update status for deleted objects
94+
if !requestInstance.DeletionTimestamp.IsZero() {
10295
return
10396
}
10497

105-
// Update requestInstance's resource version to avoid conflicts
106-
requestInstance.ResourceVersion = existingInstance.ResourceVersion
107-
if err := r.Client.Status().Patch(ctx, requestInstance, client.MergeFrom(existingInstance)); err != nil && !apierrors.IsNotFound(err) {
108-
reconcileErr = utilerrors.NewAggregate([]error{reconcileErr, fmt.Errorf("error while patching OperandRequest.Status: %v", err)})
109-
}
110-
if reconcileErr != nil {
111-
klog.Errorf("failed to patch status for OperandRequest %s: %v", req.NamespacedName.String(), reconcileErr)
98+
// Only update if status has changed from the original
99+
if !reflect.DeepEqual(originalInstance.Status, requestInstance.Status) {
100+
// The controller-runtime client will handle retries with exponential backoff
101+
if err := r.Client.Status().Update(ctx, requestInstance); err != nil {
102+
if !apierrors.IsConflict(err) {
103+
// Only aggregate non-conflict errors
104+
reconcileErr = utilerrors.NewAggregate([]error{reconcileErr, err})
105+
klog.Errorf("Failed to update status: %v", err)
106+
} else {
107+
// Log conflicts but don't return an error - the controller will retry anyway
108+
klog.V(2).Infof("Status update conflict for %s/%s - will be retried",
109+
requestInstance.Namespace, requestInstance.Name)
110+
}
111+
} else {
112+
klog.V(2).Infof("Successfully updated status for %s/%s",
113+
requestInstance.Namespace, requestInstance.Name)
114+
}
112115
}
113116
}()
114117

controllers/operandrequest/reconcile_operand.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -349,9 +349,7 @@ func (r *Reconciler) reconcileCRwithConfig(ctx context.Context, service *operato
349349
var resources []operatorv1alpha1.OperandStatus
350350
resources = append(resources, statusFromCR)
351351
serviceStatus := newServiceStatus(operandName, operatorNamespace, resources)
352-
if seterr := requestInstance.SetServiceStatus(ctx, serviceStatus, r.Client, mu); seterr != nil {
353-
return seterr
354-
}
352+
requestInstance.SetServiceStatus(serviceStatus, mu)
355353
}
356354
} else {
357355
klog.V(2).Info("Skip the custom resource not created by ODLM")
@@ -431,10 +429,7 @@ func (r *Reconciler) reconcileCRwithRequest(ctx context.Context, requestInstance
431429
var resources []operatorv1alpha1.OperandStatus
432430
resources = append(resources, statusFromCR)
433431
serviceStatus := newServiceStatus(operand.Name, operatorNamespace, resources)
434-
seterr := requestInstance.SetServiceStatus(ctx, serviceStatus, r.Client, mu)
435-
if seterr != nil {
436-
return seterr
437-
}
432+
requestInstance.SetServiceStatus(serviceStatus, mu)
438433
}
439434
} else {
440435
klog.V(2).Info("Skip the custom resource not created by ODLM")

0 commit comments

Comments
 (0)