diff --git a/go-backend/internal/http/handler/control_plane.go b/go-backend/internal/http/handler/control_plane.go index ba875c6..d3f62ec 100644 --- a/go-backend/internal/http/handler/control_plane.go +++ b/go-backend/internal/http/handler/control_plane.go @@ -474,6 +474,9 @@ func (h *Handler) controlForwardServices(forward *forwardRecord, commandType str nodeHandled, lastNotFoundErr, err := h.controlForwardServicesOnNode(fp.NodeID, bases, commandType) if err != nil { + if isNodeOfflineOrTimeoutError(err) { + continue + } return err } diff --git a/go-backend/internal/http/handler/upgrade.go b/go-backend/internal/http/handler/upgrade.go index 26ef384..ebde530 100644 --- a/go-backend/internal/http/handler/upgrade.go +++ b/go-backend/internal/http/handler/upgrade.go @@ -389,9 +389,7 @@ func (h *Handler) consumeNodePendingUpgradeRedeploy(nodeID int64) bool { } func (h *Handler) onNodeOnline(nodeID int64) { - if !h.consumeNodePendingUpgradeRedeploy(nodeID) { - return - } + h.consumeNodePendingUpgradeRedeploy(nodeID) h.redeployNodeRuntimeAfterUpgrade(nodeID) } @@ -401,7 +399,7 @@ func (h *Handler) redeployNodeRuntimeAfterUpgrade(nodeID int64) { fmt.Printf("post-upgrade redeploy: list tunnels for node %d failed: %v\n", nodeID, err) return } - forwardIDs, err := h.repo.ListActiveForwardIDsByNode(nodeID) + forwardIDs, err := h.repo.ListForwardIDsByNode(nodeID) if err != nil { fmt.Printf("post-upgrade redeploy: list forwards for node %d failed: %v\n", nodeID, err) return diff --git a/go-backend/internal/store/repo/repository_control.go b/go-backend/internal/store/repo/repository_control.go index e1c0882..bff4fbb 100644 --- a/go-backend/internal/store/repo/repository_control.go +++ b/go-backend/internal/store/repo/repository_control.go @@ -99,6 +99,22 @@ func (r *Repository) ListActiveForwardIDsByNode(nodeID int64) ([]int64, error) { return ids, nil } +func (r *Repository) ListForwardIDsByNode(nodeID int64) ([]int64, error) { + if r == nil || r.db == nil { + return nil, errors.New("repository not initialized") + } + var ids []int64 + err := r.db.Model(&model.ForwardPort{}). + Where("forward_port.node_id = ?", nodeID). + Select("DISTINCT forward_port.forward_id"). + Order("forward_port.forward_id ASC"). + Pluck("forward_port.forward_id", &ids).Error + if err != nil { + return nil, err + } + return ids, nil +} + func (r *Repository) ListForwardPorts(forwardID int64) ([]model.ForwardPortRecord, error) { if r == nil || r.db == nil { return nil, errors.New("repository not initialized") diff --git a/vite-frontend/src/pages/tunnel.tsx b/vite-frontend/src/pages/tunnel.tsx index 6c08ec6..efe4e77 100644 --- a/vite-frontend/src/pages/tunnel.tsx +++ b/vite-frontend/src/pages/tunnel.tsx @@ -2184,16 +2184,27 @@ export default function TunnelPage() {