ソースを参照

Clean up retry loop and send checkpoints from it

Tulir Asokan 2 年 前
コミット
b90ed01a11
1 ファイル変更15 行追加10 行削除
  1. 15 10
      mautrix_instagram/portal.py

+ 15 - 10
mautrix_instagram/portal.py

@@ -475,11 +475,11 @@ class Portal(DBPortal, BasePortal):
             data, duration_ms=duration, width=width, height=height
         )
         self.log.trace(f"Broadcasting uploaded video with request ID {request_id}")
-        broadcast_response = None
-        retries_left = 4
-        while broadcast_response is None:
+        retry_num = 0
+        max_retries = 4
+        while True:
             try:
-                broadcast_response = await sender.client.broadcast(
+                return await sender.client.broadcast(
                     self.thread_id,
                     ThreadItemType.CONFIGURE_VIDEO,
                     client_context=request_id,
@@ -487,16 +487,21 @@ class Portal(DBPortal, BasePortal):
                     video_result="",
                 )
             except IGResponseError as e:
-                if e.response.status == 500 and retries_left > 0:
-                    self.log.warn(
-                        f"Received 500 on broadcast - retrying in 5 sec "
-                        f"({retries_left} retries left)"
+                if e.response.status == 500 and retry_num < max_retries:
+                    self.log.warning("Received 500 on broadcast, retrying in 5 seconds")
+                    sender.send_remote_checkpoint(
+                        status=MessageSendCheckpointStatus.WILL_RETRY,
+                        event_id=event_id,
+                        room_id=self.mxid,
+                        event_type=EventType.ROOM_MESSAGE,
+                        message_type=MessageType.VIDEO,
+                        error=e,
+                        retry_num=retry_num,
                     )
                     await asyncio.sleep(5)
-                    retries_left -= 1
+                    retry_num += 1
                 else:
                     raise e
-        return broadcast_response
 
     async def _handle_matrix_audio(
         self,