(self)
| 272 | self.scheduler.schedule(first_delay, self.run) |
| 273 | |
| 274 | def run(self): |
| 275 | if self._cancelled: |
| 276 | return |
| 277 | |
| 278 | conn = None |
| 279 | try: |
| 280 | conn = self.try_reconnect() |
| 281 | except Exception as exc: |
| 282 | try: |
| 283 | next_delay = next(self.schedule) |
| 284 | except StopIteration: |
| 285 | # the schedule has been exhausted |
| 286 | next_delay = None |
| 287 | |
| 288 | # call on_exception for logging purposes even if next_delay is None |
| 289 | if self.on_exception(exc, next_delay): |
| 290 | if next_delay is None: |
| 291 | log.warning( |
| 292 | "Will not continue to retry reconnection attempts " |
| 293 | "due to an exhausted retry schedule") |
| 294 | else: |
| 295 | self.scheduler.schedule(next_delay, self.run) |
| 296 | else: |
| 297 | if not self._cancelled: |
| 298 | self.on_reconnection(conn) |
| 299 | self.callback(*(self.callback_args), **(self.callback_kwargs)) |
| 300 | finally: |
| 301 | if conn: |
| 302 | conn.close() |
| 303 | |
| 304 | def cancel(self): |
| 305 | self._cancelled = True |
nothing calls this directly
no test coverage detected