aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/src/meshbay_node/daemon.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-node/src/meshbay_node/daemon.py')
-rw-r--r--packages/meshbay-node/src/meshbay_node/daemon.py17
1 files changed, 17 insertions, 0 deletions
diff --git a/packages/meshbay-node/src/meshbay_node/daemon.py b/packages/meshbay-node/src/meshbay_node/daemon.py
index 4800dac..dc5df81 100644
--- a/packages/meshbay-node/src/meshbay_node/daemon.py
+++ b/packages/meshbay-node/src/meshbay_node/daemon.py
@@ -983,6 +983,23 @@ class NodeDaemon(EnrichmentMixin):
self._config.hub.username, self._config.hub.url,
)
await asyncio.sleep(5)
+ elif e.response.status_code in (429, 500, 502, 503, 504):
+ # Transient: the hub is busy (429 — often this daemon's own
+ # retry storm against the sign-in rate limit), restarting
+ # (502/503) or erroring (500/504). None of these is a reason
+ # to exit: the daemon exiting here crash-loops under systemd
+ # and strands the operator, who needs it alive to read the
+ # node key (`meshbay-node status`, the desktop client) so
+ # they can link it. Back off — respecting Retry-After when
+ # the hub sends one — and try again, rather than dying.
+ self._state["status"] = "waiting_for_hub"
+ delay = 10
+ ra = (e.response.headers or {}).get("Retry-After")
+ if ra and str(ra).isdigit():
+ delay = min(max(delay, int(ra)), 300)
+ log.warning("Hub returned %s on login — retrying in %ds",
+ e.response.status_code, delay)
+ await asyncio.sleep(delay)
else:
raise
except Exception as e: