From e5e22baf43e959957bfc92eef6a8c2784d8b8f59 Mon Sep 17 00:00:00 2001 From: sagit <36596628+Sagit-chu@users.noreply.github.com> Date: Sun, 15 Feb 2026 19:04:53 +0800 Subject: [PATCH] fix(federation): cleanup tunnels when unsharing federation node (#126) When unsharing a federation node, tunnels created via federationTunnelCreate were not cleaned up, allowing clients to continue using them. Added cleanupFederationTunnels() to delete these tunnels and reload the node agent. --- .../internal/http/handler/federation.go | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/go-backend/internal/http/handler/federation.go b/go-backend/internal/http/handler/federation.go index b44ad00..9cfdc7f 100644 --- a/go-backend/internal/http/handler/federation.go +++ b/go-backend/internal/http/handler/federation.go @@ -299,13 +299,20 @@ func (h *Handler) federationShareDelete(w http.ResponseWriter, r *http.Request) return } + share, _ := h.repo.GetPeerShare(req.ID) + h.cleanupPeerShareRuntimes(req.ID) + h.cleanupFederationTunnels(req.ID) if err := h.repo.DeletePeerShare(req.ID); err != nil { response.WriteJSON(w, response.Err(-2, err.Error())) return } + if share != nil && h.wsServer != nil { + h.wsServer.SendCommand(share.NodeID, "reload", nil, time.Second*5) + } + response.WriteJSON(w, response.OKEmpty()) } @@ -1642,3 +1649,27 @@ func (h *Handler) cleanupPeerShareRuntimes(shareID int64) { _ = h.repo.MarkPeerShareRuntimeReleased(runtime.ID, now) } } + +func (h *Handler) cleanupFederationTunnels(shareID int64) { + if h == nil || h.repo == nil || shareID <= 0 { + return + } + namePrefix := fmt.Sprintf("Share-%d-Port-", shareID) + rows, err := h.repo.DB().Query(`SELECT id FROM tunnel WHERE name LIKE ?`, namePrefix+"%") + if err != nil { + return + } + defer rows.Close() + + var tunnelIDs []int64 + for rows.Next() { + var id int64 + if err := rows.Scan(&id); err == nil { + tunnelIDs = append(tunnelIDs, id) + } + } + + for _, tid := range tunnelIDs { + _ = h.deleteTunnelByID(tid) + } +}