From 70719eee4de01572f41cb64da48c303935932bef Mon Sep 17 00:00:00 2001 From: Rajesh Tailor Date: Tue, 27 May 2025 15:45:02 +0530 Subject: [PATCH] Do not update status when reconciler exits due to panic Currently we use deferred call to always update the status field when Reconcile call exits, which seems correct for any other error except when Reconciler exits due to panic. This change adds a call to recover function and try to hangle panic and log error. Closes: OSPRH-16970 --- controllers/ironic_controller.go | 5 +++++ controllers/ironicapi_controller.go | 5 +++++ controllers/ironicconductor_controller.go | 5 +++++ controllers/ironicinspector_controller.go | 5 +++++ controllers/ironicneutronagent_controller.go | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/controllers/ironic_controller.go b/controllers/ironic_controller.go index fb705b5c..7a2f904d 100644 --- a/controllers/ironic_controller.go +++ b/controllers/ironic_controller.go @@ -150,6 +150,11 @@ func (r *IronicReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res // Always patch the instance status when exiting this function so we can // persist any changes. defer func() { + // Don't update the status, if reconciler Panics + if r := recover(); r != nil { + Log.Info(fmt.Sprintf("panic during reconcile %v\n", r)) + panic(r) + } condition.RestoreLastTransitionTimes( &instance.Status.Conditions, savedConditions) if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) { diff --git a/controllers/ironicapi_controller.go b/controllers/ironicapi_controller.go index 216d9aef..dd3fb346 100644 --- a/controllers/ironicapi_controller.go +++ b/controllers/ironicapi_controller.go @@ -146,6 +146,11 @@ func (r *IronicAPIReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( // Always patch the instance status when exiting this function so we can // persist any changes. defer func() { + // Don't update the status, if reconciler Panics + if r := recover(); r != nil { + Log.Info(fmt.Sprintf("panic during reconcile %v\n", r)) + panic(r) + } condition.RestoreLastTransitionTimes( &instance.Status.Conditions, savedConditions) if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) { diff --git a/controllers/ironicconductor_controller.go b/controllers/ironicconductor_controller.go index 9dac0798..f526908c 100644 --- a/controllers/ironicconductor_controller.go +++ b/controllers/ironicconductor_controller.go @@ -140,6 +140,11 @@ func (r *IronicConductorReconciler) Reconcile(ctx context.Context, req ctrl.Requ // Always patch the instance status when exiting this function so we can // persist any changes. defer func() { + // Don't update the status, if reconciler Panics + if r := recover(); r != nil { + Log.Info(fmt.Sprintf("panic during reconcile %v\n", r)) + panic(r) + } condition.RestoreLastTransitionTimes( &instance.Status.Conditions, savedConditions) if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) { diff --git a/controllers/ironicinspector_controller.go b/controllers/ironicinspector_controller.go index 8699ac98..1f15903d 100644 --- a/controllers/ironicinspector_controller.go +++ b/controllers/ironicinspector_controller.go @@ -165,6 +165,11 @@ func (r *IronicInspectorReconciler) Reconcile( // Always patch the instance status when exiting this function so we can // persist any changes. defer func() { + // Don't update the status, if reconciler Panics + if r := recover(); r != nil { + Log.Info(fmt.Sprintf("panic during reconcile %v\n", r)) + panic(r) + } condition.RestoreLastTransitionTimes( &instance.Status.Conditions, savedConditions) if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) { diff --git a/controllers/ironicneutronagent_controller.go b/controllers/ironicneutronagent_controller.go index 78566efb..02985ff0 100644 --- a/controllers/ironicneutronagent_controller.go +++ b/controllers/ironicneutronagent_controller.go @@ -138,6 +138,11 @@ func (r *IronicNeutronAgentReconciler) Reconcile( // Always patch the instance status when exiting this function so we can // persist any changes. defer func() { + // Don't update the status, if reconciler Panics + if r := recover(); r != nil { + Log.Info(fmt.Sprintf("panic during reconcile %v\n", r)) + panic(r) + } condition.RestoreLastTransitionTimes( &instance.Status.Conditions, savedConditions) if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) {