@@ -18,6 +18,7 @@ package controllers
1818
1919import (
2020 "context"
21+ "errors"
2122 "fmt"
2223 "reflect"
2324 "time"
@@ -50,6 +51,11 @@ import (
5051 "github.com/openstack-k8s-operators/openstack-baremetal-operator/pkg/openstackbaremetalset"
5152)
5253
54+ var (
55+ // ErrBaremetalSetReconciliationPanic indicates a panic occurred during BaremetalSet reconciliation
56+ ErrBaremetalSetReconciliationPanic = errors .New ("baremetal set reconciliation panic occurred" )
57+ )
58+
5359// OpenStackBaremetalSetReconciler reconciles a OpenStackBaremetalSet object
5460type OpenStackBaremetalSetReconciler struct {
5561 client.Client
@@ -112,17 +118,28 @@ func (r *OpenStackBaremetalSetReconciler) Reconcile(ctx context.Context, req ctr
112118 // Always patch the instance status when exiting this function so we can
113119 // persist any changes.
114120 defer func () {
115- // Don't update the status, if reconciler Panics
121+ // Handle reconciler panics gracefully to prevent controller crash
116122 if rc := recover (); rc != nil {
117- r .Log .Info (fmt .Sprintf ("panic during reconcile %v\n " , rc ))
118- panic (rc )
123+ // Log detailed panic information
124+ r .Log .Error (ErrBaremetalSetReconciliationPanic ,
125+ "Panic occurred during OpenStackBaremetalSet reconciliation" ,
126+ "instance" , instance .Name ,
127+ "namespace" , instance .Namespace ,
128+ "panic" , rc )
129+
130+ // Set return error to trigger requeue with backoff
131+ _err = fmt .Errorf ("%w: %v" , ErrBaremetalSetReconciliationPanic , rc )
132+ return // Skip status update - reconciliation incomplete, let controller-runtime handle requeue
119133 }
134+
120135 condition .RestoreLastTransitionTimes (
121136 & instance .Status .Conditions , savedConditions )
122137 if instance .Status .Conditions .IsUnknown (condition .ReadyCondition ) {
123138 instance .Status .Conditions .Set (
124139 instance .Status .Conditions .Mirror (condition .ReadyCondition ))
125140 }
141+
142+ // Update status only if no panic occurred
126143 err := helper .PatchInstance (ctx , instance )
127144 if err != nil {
128145 _err = err
0 commit comments