Skip to content

Commit 0e6ddd4

Browse files
Merge pull request #323 from rabi/panic
Don't repanic in the defer() function
2 parents d70ef34 + 36669d2 commit 0e6ddd4

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

controllers/openstackbaremetalset_controller.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controllers
1818

1919
import (
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
5460
type 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

controllers/openstackprovisionserver_controller.go

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

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"net"
2324
"strconv"
@@ -61,6 +62,9 @@ var (
6162
Version: "v1alpha1",
6263
Resource: "provisionings",
6364
}
65+
66+
// ErrProvisionServerReconciliationPanic indicates a panic occurred during ProvisionServer reconciliation
67+
ErrProvisionServerReconciliationPanic = errors.New("provision server reconciliation panic occurred")
6468
)
6569

6670
// OpenStackProvisionServerReconciler reconciles a OpenStackProvisionServer object
@@ -135,17 +139,28 @@ func (r *OpenStackProvisionServerReconciler) Reconcile(ctx context.Context, req
135139
// Always patch the instance status when exiting this function so we can
136140
// persist any changes.
137141
defer func() {
138-
// Don't update the status, if reconciler Panics
142+
// Handle reconciler panics gracefully to prevent controller crash
139143
if rc := recover(); rc != nil {
140-
r.Log.Info(fmt.Sprintf("panic during reconcile %v\n", rc))
141-
panic(rc)
144+
// Log detailed panic information
145+
r.Log.Error(ErrProvisionServerReconciliationPanic,
146+
"Panic occurred during OpenStackProvisionServer reconciliation",
147+
"instance", instance.Name,
148+
"namespace", instance.Namespace,
149+
"panic", rc)
150+
151+
// Set return error to trigger requeue with backoff
152+
_err = fmt.Errorf("%w: %v", ErrProvisionServerReconciliationPanic, rc)
153+
return // Skip status update - reconciliation incomplete, let controller-runtime handle requeue
142154
}
155+
143156
condition.RestoreLastTransitionTimes(
144157
&instance.Status.Conditions, savedConditions)
145158
if instance.Status.Conditions.IsUnknown(condition.ReadyCondition) {
146159
instance.Status.Conditions.Set(
147160
instance.Status.Conditions.Mirror(condition.ReadyCondition))
148161
}
162+
163+
// Update status only if no panic occurred
149164
err := helper.PatchInstance(ctx, instance)
150165
if err != nil {
151166
_err = err

0 commit comments

Comments
 (0)