From c0d30a455f606409d49d95df0e5c221893c2f233 Mon Sep 17 00:00:00 2001 From: LP B Date: Mon, 3 Feb 2025 20:25:25 +0100 Subject: [PATCH] fix(api/edge): backend panic on edge stack removal (#371) --- api/http/handler/edgestacks/edgestack_status_update.go | 4 ++-- .../edgestacks/edgestack_status_update_coordinator.go | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/api/http/handler/edgestacks/edgestack_status_update.go b/api/http/handler/edgestacks/edgestack_status_update.go index 4cf912030..fef5a6927 100644 --- a/api/http/handler/edgestacks/edgestack_status_update.go +++ b/api/http/handler/edgestacks/edgestack_status_update.go @@ -79,7 +79,7 @@ func (handler *Handler) edgeStackStatusUpdate(w http.ResponseWriter, r *http.Req } updateFn := func(stack *portainer.EdgeStack) (*portainer.EdgeStack, error) { - return handler.updateEdgeStackStatus(stack, endpoint, r, stack.ID, payload) + return handler.updateEdgeStackStatus(stack, stack.ID, payload) } stack, err := handler.stackCoordinator.UpdateStatus(r, portainer.EdgeStackID(stackID), updateFn) @@ -99,7 +99,7 @@ func (handler *Handler) edgeStackStatusUpdate(w http.ResponseWriter, r *http.Req return response.JSON(w, stack) } -func (handler *Handler) updateEdgeStackStatus(stack *portainer.EdgeStack, endpoint *portainer.Endpoint, r *http.Request, stackID portainer.EdgeStackID, payload updateStatusPayload) (*portainer.EdgeStack, error) { +func (handler *Handler) updateEdgeStackStatus(stack *portainer.EdgeStack, stackID portainer.EdgeStackID, payload updateStatusPayload) (*portainer.EdgeStack, error) { if payload.Version > 0 && payload.Version < stack.Version { return stack, nil } diff --git a/api/http/handler/edgestacks/edgestack_status_update_coordinator.go b/api/http/handler/edgestacks/edgestack_status_update_coordinator.go index f81e2fc3e..885b4c6da 100644 --- a/api/http/handler/edgestacks/edgestack_status_update_coordinator.go +++ b/api/http/handler/edgestacks/edgestack_status_update_coordinator.go @@ -60,6 +60,11 @@ func (c *EdgeStackStatusUpdateCoordinator) loop() { return err } + // Return early when the agent tries to update the status on a deleted stack + if stack == nil { + return nil + } + // 2. Mutate the edge stack opportunistically until there are no more pending updates for { stack, err = u.updateFn(stack)