From 239f42f5aa2203e0d6bf891b4faa75bc8660dc91 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Sun, 12 Jul 2026 14:43:06 +0800 Subject: [PATCH] fix(marker): stop auto-deleting markers on node stop in node_updated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Markers are persistent link-scoped features (like packet filters), not transient runtime features (like capture). Tearing them down on every node stop breaks stop/start restore: the NIO-based re-application in _ubridge_apply_markers works correctly on restart, but node_updated was prematurely calling stop_marker which erased _markers state and dumped an empty topology. Now markers survive node stop transparently — the ubridge filter dies with the process but is re-added from nio.markers in add_ubridge_udp_connection when the node starts again, mirroring exactly how packet filters behave. --- gns3server/controller/udp_link.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gns3server/controller/udp_link.py b/gns3server/controller/udp_link.py index ff17069d1..20dd6ae3b 100644 --- a/gns3server/controller/udp_link.py +++ b/gns3server/controller/udp_link.py @@ -321,10 +321,11 @@ class UDPLink(Link): """ if self._capture_node and node == self._capture_node["node"] and node.status != "started": await self.stop_capture() - # Tear down any marker whose capture-side node just stopped. - for name, marker_info in list(self._markers.items()): - if marker_info.get("capture_node_id") == node.id and node.status != "started": - await self.stop_marker(name) + # Marker clean-up is *not* done on node stop — markers are a persistent + # link-scoped feature that recovers via NIO on restart (see + # _ubridge_apply_markers in add_ubridge_udp_connection). The user + # explicitly deletes a marker via the REST API, and a marker is torn + # down automatically only when its link is deleted. def _capture_node_for_marker(self, name): """Return the stored (node, adapter_number, port_number) for a marker's capture side."""