diff --git a/packages/node/meshnet_node/startup.py b/packages/node/meshnet_node/startup.py index c0f6c73..dd8a4df 100644 --- a/packages/node/meshnet_node/startup.py +++ b/packages/node/meshnet_node/startup.py @@ -531,7 +531,7 @@ def _start_heartbeat( if applied.get("action") == "ADD_SHARD": _register_additional_assignment(applied) return applied - if applied.get("action") == "DROP_SHARD": + if applied.get("action") in {"DROP_SHARD", "DROP_ALL_SHARDS"}: # A release has no replacement range. It is not a failed # heartbeat and must not re-register the released assignment. return applied diff --git a/packages/node/meshnet_node/torch_server.py b/packages/node/meshnet_node/torch_server.py index 36fbeb9..d464561 100644 --- a/packages/node/meshnet_node/torch_server.py +++ b/packages/node/meshnet_node/torch_server.py @@ -1556,6 +1556,19 @@ class TorchNodeServer: def apply_tracker_directives(self, directives: list[dict]) -> dict | None: """Apply tracker shard directives (LOAD_SHARD replace, ADD_SHARD load-more).""" + drop_all_directive = next( + (directive for directive in reversed(directives) if directive.get("action") == "DROP_ALL_SHARDS"), + None, + ) + if drop_all_directive is not None: + self._backends.clear() + self._backend = None + self._tracker_mode = False + if self._server is not None: + self._server.backends = {} + self._server.backend = None + self._server.tracker_mode = False + return {"action": "DROP_ALL_SHARDS"} drop_directive = next( (directive for directive in reversed(directives) if directive.get("action") == "DROP_SHARD"), None, diff --git a/packages/tracker/meshnet_tracker/dashboard.html b/packages/tracker/meshnet_tracker/dashboard.html index f6615e1..0984262 100644 --- a/packages/tracker/meshnet_tracker/dashboard.html +++ b/packages/tracker/meshnet_tracker/dashboard.html @@ -333,7 +333,8 @@ -
+ +