Fix delayed reconnect after DNS failure
The XML stream will re-schedule a reconnect on socket errors, except for DNS failures. If a user has no uplink connection, then DNS will also fail, preventing an automatic reconnection. This patch consolidates the two code paths and sets a maximum back-off time of 5min (300s).
This commit is contained in:
parent
5ceb48bbcd
commit
b44ab17c8f
@ -493,16 +493,11 @@ class XMLStream(asyncio.BaseProtocol):
|
|||||||
except Socket.gaierror as e:
|
except Socket.gaierror as e:
|
||||||
self.event('connection_failed',
|
self.event('connection_failed',
|
||||||
'No DNS record available for %s' % self.default_domain)
|
'No DNS record available for %s' % self.default_domain)
|
||||||
|
self.reschedule_connection_attempt()
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
log.debug('Connection failed: %s', e)
|
log.debug('Connection failed: %s', e)
|
||||||
self.event("connection_failed", e)
|
self.event("connection_failed", e)
|
||||||
if self._current_connection_attempt is None:
|
self.reschedule_connection_attempt()
|
||||||
return
|
|
||||||
self._connect_loop_wait = self._connect_loop_wait * 2 + 1
|
|
||||||
self._current_connection_attempt = asyncio.ensure_future(
|
|
||||||
self._connect_routine(),
|
|
||||||
loop=self.loop,
|
|
||||||
)
|
|
||||||
|
|
||||||
def process(self, *, forever: bool = True, timeout: Optional[int] = None) -> None:
|
def process(self, *, forever: bool = True, timeout: Optional[int] = None) -> None:
|
||||||
"""Process all the available XMPP events (receiving or sending data on the
|
"""Process all the available XMPP events (receiving or sending data on the
|
||||||
@ -638,6 +633,20 @@ class XMLStream(asyncio.BaseProtocol):
|
|||||||
self._set_disconnected_future()
|
self._set_disconnected_future()
|
||||||
self.event("disconnected", self.disconnect_reason or exception)
|
self.event("disconnected", self.disconnect_reason or exception)
|
||||||
|
|
||||||
|
def reschedule_connection_attempt(self) -> None:
|
||||||
|
"""
|
||||||
|
Increase the exponential back-off and initate another background
|
||||||
|
_connect_routine call to connect to the server.
|
||||||
|
"""
|
||||||
|
# abort if there is no ongoing connection attempt
|
||||||
|
if self._current_connection_attempt is None:
|
||||||
|
return
|
||||||
|
self._connect_loop_wait = min(300, self._connect_loop_wait * 2 + 1)
|
||||||
|
self._current_connection_attempt = asyncio.ensure_future(
|
||||||
|
self._connect_routine(),
|
||||||
|
loop=self.loop,
|
||||||
|
)
|
||||||
|
|
||||||
def cancel_connection_attempt(self) -> None:
|
def cancel_connection_attempt(self) -> None:
|
||||||
"""
|
"""
|
||||||
Immediately cancel the current create_connection() Future.
|
Immediately cancel the current create_connection() Future.
|
||||||
|
Loading…
Reference in New Issue
Block a user