Consider all reconnect attempts as retrying (#1557)

This means that a value of 0 retries will no longer try to reconnect.
This commit is contained in:
yash-dk 2020-09-13 13:13:01 +05:30 committed by GitHub
parent 2a114917f1
commit 1d6fd7898a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 5 deletions

View File

@ -51,6 +51,7 @@ class UserMethods:
request_index = 0 request_index = 0
self._last_request = time.time() self._last_request = time.time()
for attempt in retry_range(self._request_retries): for attempt in retry_range(self._request_retries):
try: try:
future = sender.send(request, ordered=ordered) future = sender.send(request, ordered=ordered)

View File

@ -95,17 +95,23 @@ def strip_text(text, entities):
return text return text
def retry_range(retries): def retry_range(retries, force_retry=True):
""" """
Generates an integer sequence starting from 1. If `retries` is Generates an integer sequence starting from 1. If `retries` is
not a zero or a positive integer value, the sequence will be not a zero or a positive integer value, the sequence will be
infinite, otherwise it will end at `retries + 1`. infinite, otherwise it will end at `retries + 1`.
""" """
yield 1
# We need at least one iteration even if the retries are 0
# when force_retry is True.
if force_retry and not (retries is None or retries < 0):
retries += 1
attempt = 0 attempt = 0
while attempt != retries: while attempt != retries:
attempt += 1 attempt += 1
yield 1 + attempt yield attempt
async def _maybe_await(value): async def _maybe_await(value):

View File

@ -217,6 +217,7 @@ class MTProtoSender:
self._log.info('Connecting to %s...', self._connection) self._log.info('Connecting to %s...', self._connection)
connected = False connected = False
for attempt in retry_range(self._retries): for attempt in retry_range(self._retries):
if not connected: if not connected:
connected = await self._try_connect(attempt) connected = await self._try_connect(attempt)
@ -357,14 +358,16 @@ class MTProtoSender:
self._state.reset() self._state.reset()
retries = self._retries if self._auto_reconnect else 0 retries = self._retries if self._auto_reconnect else 0
for attempt in retry_range(retries):
attempt = 0
# We're already "retrying" to connect, so we don't want to force retries
for attempt in retry_range(retries, force_retry=False):
try: try:
await self._connect() await self._connect()
except (IOError, asyncio.TimeoutError) as e: except (IOError, asyncio.TimeoutError) as e:
last_error = e last_error = e
self._log.info('Failed reconnection attempt %d with %s', self._log.info('Failed reconnection attempt %d with %s',
attempt, e.__class__.__name__) attempt, e.__class__.__name__)
await asyncio.sleep(self._delay) await asyncio.sleep(self._delay)
except Exception as e: except Exception as e:
last_error = e last_error = e