QualifyLoop only touches the registrar when the refresh fires. Between refreshes there is no liveness signal at all, so a registrar that has gone away is not noticed for as long as the refresh interval — which, once the refresh is derived from a long grant, can be tens of minutes.
Proposal: OptionsKeepaliveLoop, an opt-in out-of-dialog OPTIONS every 15s that gives up after 3 consecutive transport errors or transaction timeouts. Nothing in Register calls it, so it is inert unless a caller starts it.
The period and the failure threshold are unexported constants with no RegisterOptions knob — deliberate for a first cut, and easy to expose if you would rather they were settable.
This adds one exported method, so it is a design call. Stacked on #167, which it needs.
QualifyLoop only touches the registrar when the refresh fires. Between refreshes there is no liveness signal at all, so a registrar that has gone away is not noticed for as long as the refresh interval — which, once the refresh is derived from a long grant, can be tens of minutes.
Proposal: OptionsKeepaliveLoop, an opt-in out-of-dialog OPTIONS every 15s that gives up after 3 consecutive transport errors or transaction timeouts. Nothing in Register calls it, so it is inert unless a caller starts it.
The period and the failure threshold are unexported constants with no RegisterOptions knob — deliberate for a first cut, and easy to expose if you would rather they were settable.
This adds one exported method, so it is a design call. Stacked on #167, which it needs.