|
6 | 6 | import struct
|
7 | 7 | import time
|
8 | 8 | from abc import ABCMeta, abstractmethod
|
9 |
| -from asyncio import DatagramProtocol, Future, TimeoutError, ensure_future, get_event_loop |
| 9 | +from asyncio import DatagramProtocol, Future, Task, ensure_future, get_event_loop |
| 10 | +from asyncio import TimeoutError as AsyncTimeoutError |
10 | 11 | from typing import TYPE_CHECKING, Any, List, NoReturn, cast
|
11 | 12 |
|
12 | 13 | import async_timeout
|
@@ -59,6 +60,7 @@ def __init__(self, tracker_type: str, tracker_url: str, tracker_address: tuple[s
|
59 | 60 | self.timeout = timeout
|
60 | 61 | self.infohash_list: list[bytes] = []
|
61 | 62 | self.last_contact = 0
|
| 63 | + self.cleanup_task: Task | None = None |
62 | 64 |
|
63 | 65 | # some flags
|
64 | 66 | self.is_initiated = False # you cannot add requests to a session if it has been initiated
|
@@ -102,8 +104,8 @@ def failed(self, msg: str | None = None) -> NoReturn:
|
102 | 104 |
|
103 | 105 | :raises ValueError: always.
|
104 | 106 | """
|
105 |
| - if not self.is_failed: |
106 |
| - self.register_anonymous_task("Cleanup", self.cleanup) |
| 107 | + if not self.is_failed and not self.cleanup_task: |
| 108 | + self.cleanup_task = ensure_future(self.cleanup()) |
107 | 109 | self.is_failed = True
|
108 | 110 | result_msg = f"{self.tracker_type} tracker failed for url {self.tracker_url}"
|
109 | 111 | if msg:
|
@@ -363,7 +365,7 @@ async def connect_to_tracker(self) -> TrackerResponse:
|
363 | 365 | self.ip_address = infos[0][-1][0]
|
364 | 366 | await self.connect()
|
365 | 367 | return await self.scrape()
|
366 |
| - except TimeoutError: |
| 368 | + except AsyncTimeoutError: |
367 | 369 | self.failed(msg="request timed out")
|
368 | 370 | except socket.gaierror as e:
|
369 | 371 | self.failed(msg=str(e))
|
|
0 commit comments