diff --git a/cmd/thv-operator/controllers/mcpserver_controller.go b/cmd/thv-operator/controllers/mcpserver_controller.go index 29ddff9b2d..d6799f8e36 100644 --- a/cmd/thv-operator/controllers/mcpserver_controller.go +++ b/cmd/thv-operator/controllers/mcpserver_controller.go @@ -181,6 +181,36 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( return ctrl.Result{}, err } + // Check if the MCPServer instance is marked to be deleted. + // This check is performed early to avoid unnecessary validation and external API calls during deletion. + if mcpServer.GetDeletionTimestamp() != nil { + // The object is being deleted + if controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") { + // Run finalization logic. If the finalization logic fails, + // don't remove the finalizer so that we can retry during the next reconciliation. + if err := r.finalizeMCPServer(ctx, mcpServer); err != nil { + return ctrl.Result{}, err + } + + // Remove the finalizer. Once all finalizers have been removed, the object will be deleted. + controllerutil.RemoveFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") + err := r.Update(ctx, mcpServer) + if err != nil { + return ctrl.Result{}, err + } + } + return ctrl.Result{}, nil + } + + // Add finalizer for this CR + if !controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") { + controllerutil.AddFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") + err = r.Update(ctx, mcpServer) + if err != nil { + return ctrl.Result{}, err + } + } + // Check if the restart annotation has been updated and trigger a rolling restart if needed if shouldTriggerRestart, err := r.handleRestartAnnotation(ctx, mcpServer); err != nil { ctxLogger.Error(err, "Failed to handle restart annotation") @@ -306,34 +336,6 @@ func (r *MCPServerReconciler) Reconcile(ctx context.Context, req ctrl.Request) ( } } - // Check if the MCPServer instance is marked to be deleted - if mcpServer.GetDeletionTimestamp() != nil { - // The object is being deleted - if controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") { - // Run finalization logic. If the finalization logic fails, - // don't remove the finalizer so that we can retry during the next reconciliation. - if err := r.finalizeMCPServer(ctx, mcpServer); err != nil { - return ctrl.Result{}, err - } - - // Remove the finalizer. Once all finalizers have been removed, the object will be deleted. - controllerutil.RemoveFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") - err := r.Update(ctx, mcpServer) - if err != nil { - return ctrl.Result{}, err - } - } - return ctrl.Result{}, nil - } - - // Add finalizer for this CR - if !controllerutil.ContainsFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") { - controllerutil.AddFinalizer(mcpServer, "mcpserver.toolhive.stacklok.dev/finalizer") - err = r.Update(ctx, mcpServer) - if err != nil { - return ctrl.Result{}, err - } - } // Update the MCPServer status with the pod status if err := r.updateMCPServerStatus(ctx, mcpServer); err != nil {