diff --git a/telethon/helpers.py b/telethon/helpers.py index 55eb1b79..985c625d 100644 --- a/telethon/helpers.py +++ b/telethon/helpers.py @@ -101,11 +101,11 @@ def retry_range(retries): not a zero or a positive integer value, the sequence will be infinite, otherwise it will end at `retries + 1`. """ - yield 1 + attempt = 0 while attempt != retries: - attempt += 1 yield 1 + attempt + attempt += 1 async def _maybe_await(value): diff --git a/telethon/network/mtprotosender.py b/telethon/network/mtprotosender.py index 48f6e238..fee1f62b 100644 --- a/telethon/network/mtprotosender.py +++ b/telethon/network/mtprotosender.py @@ -217,6 +217,7 @@ class MTProtoSender: self._log.info('Connecting to %s...', self._connection) connected = False + attempt = 0 for attempt in retry_range(self._retries): if not connected: connected = await self._try_connect(attempt) @@ -357,32 +358,36 @@ class MTProtoSender: self._state.reset() retries = self._retries if self._auto_reconnect else 0 - for attempt in retry_range(retries): - try: - await self._connect() - except (IOError, asyncio.TimeoutError) as e: - last_error = e - self._log.info('Failed reconnection attempt %d with %s', - attempt, e.__class__.__name__) + if retries: + for attempt in retry_range(retries): + try: + await self._connect() + except (IOError, asyncio.TimeoutError) as e: + last_error = e + self._log.info('Failed reconnection attempt %d with %s', + attempt, e.__class__.__name__) - await asyncio.sleep(self._delay) - except Exception as e: - last_error = e - self._log.exception('Unexpected exception reconnecting on ' - 'attempt %d', attempt) + await asyncio.sleep(self._delay) + except Exception as e: + last_error = e + self._log.exception('Unexpected exception reconnecting on ' + 'attempt %d', attempt) - await asyncio.sleep(self._delay) + await asyncio.sleep(self._delay) + else: + self._send_queue.extend(self._pending_state.values()) + self._pending_state.clear() + + if self._auto_reconnect_callback: + asyncio.get_event_loop().create_task(self._auto_reconnect_callback()) + + break else: - self._send_queue.extend(self._pending_state.values()) - self._pending_state.clear() - - if self._auto_reconnect_callback: - asyncio.get_event_loop().create_task(self._auto_reconnect_callback()) - - break + self._log.error('Automatic reconnection failed %d time(s)', attempt) + await self._disconnect(error=last_error.with_traceback(None)) else: - self._log.error('Automatic reconnection failed %d time(s)', attempt) - await self._disconnect(error=last_error.with_traceback(None)) + self._log.error('Automatic reconnection is False.') + await self._disconnect(error=last_error.with_traceback(None)) def _start_reconnect(self, error): """Starts a reconnection in the background."""