Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 19 additions & 3 deletions internal/controller/arksapplication_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/util/retry"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
ctrl "sigs.k8s.io/controller-runtime"
Expand Down Expand Up @@ -94,9 +95,24 @@ func (r *ArksApplicationReconciler) Reconcile(ctx context.Context, req ctrl.Requ
// reconcile model
result, err := r.reconcile(ctx, application)

// update application status
if err := r.Client.Status().Update(ctx, application); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to update status for application %s/%s (%s): %q", application.Namespace, application.Name, application.UID, err)
// update application status with retry on conflict
statusErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
// Get latest version before updating status
latest := &arksv1.ArksApplication{}
if getErr := r.Client.Get(ctx, req.NamespacedName, latest); getErr != nil {
return getErr
}

// Copy status from reconciled application to latest version
latest.Status = application.Status

// Update status on latest version
return r.Client.Status().Update(ctx, latest)
})

if statusErr != nil {
klog.Errorf("failed to update status for application %s/%s: %v", application.Namespace, application.Name, statusErr)
return ctrl.Result{}, fmt.Errorf("failed to update status: %w", statusErr)
}

// handle reconcile error
Expand Down
22 changes: 19 additions & 3 deletions internal/controller/arksdisaggregatedapplication_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/util/retry"
"k8s.io/klog/v2"
"k8s.io/utils/ptr"
ctrl "sigs.k8s.io/controller-runtime"
Expand Down Expand Up @@ -90,9 +91,24 @@ func (r *ArksDisaggregatedApplicationReconciler) Reconcile(ctx context.Context,
// reconcile model
result, err := r.reconcile(ctx, application)

// update application status
if err := r.Client.Status().Update(ctx, application); err != nil {
return ctrl.Result{}, fmt.Errorf("failed to update status for application %s/%s (%s): %q", application.Namespace, application.Name, application.UID, err)
// update application status with retry on conflict
statusErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
// Get latest version before updating status
latest := &arksv1.ArksDisaggregatedApplication{}
if getErr := r.Client.Get(ctx, req.NamespacedName, latest); getErr != nil {
return getErr
}

// Copy status from reconciled application to latest version
latest.Status = application.Status

// Update status on latest version
return r.Client.Status().Update(ctx, latest)
})

if statusErr != nil {
klog.Errorf("failed to update status for application %s/%s: %v", application.Namespace, application.Name, statusErr)
return ctrl.Result{}, fmt.Errorf("failed to update status: %w", statusErr)
}

// handle reconcile error
Expand Down