|
|
@@ -8,6 +8,7 @@ from app.service.task.base_task import BaseTask
|
|
|
from app.service.task.task_param import TaskParam
|
|
|
from app.service.task.task_result import TaskResult
|
|
|
from app.util.http_util import logged_client
|
|
|
+from app.util.retry_util import retry_on_failure
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@@ -39,34 +40,34 @@ class KelingImage2VideoTask(BaseTask):
|
|
|
"Authorization": f"Bearer {self._generate_jwt()}",
|
|
|
}
|
|
|
|
|
|
- def _retry_execute(self, param: TaskParam, remaining: int = 30) -> dict | None:
|
|
|
- logger.info("[%s] Submitting task: POST %s (remaining_retries=%d)",
|
|
|
- self.get_type(), self.execute_url, remaining)
|
|
|
- try:
|
|
|
- with logged_client(timeout=60) as client:
|
|
|
- resp = client.post(self.execute_url, headers=self._headers(), json=param.inputs)
|
|
|
- logger.info("[%s] Submit response: status=%d", self.get_type(), resp.status_code)
|
|
|
- bean = resp.json()
|
|
|
- except Exception as e:
|
|
|
- raise RuntimeError(f"Request failed: {e}")
|
|
|
-
|
|
|
+ def _submit(self, inputs: dict) -> dict:
|
|
|
+ with logged_client(timeout=60) as client:
|
|
|
+ resp = client.post(self.execute_url, headers=self._headers(), json=inputs)
|
|
|
+ logger.info("[%s] Submit response: status=%d", self.get_type(), resp.status_code)
|
|
|
+ resp.raise_for_status()
|
|
|
+ bean = resp.json()
|
|
|
code = bean.get("code", 0)
|
|
|
- if code in (1302, 1303) and remaining > 0:
|
|
|
- logger.warning("[%s] Rate limited (code=%d), retrying in 5s ... remaining=%d",
|
|
|
- self.get_type(), code, remaining - 1)
|
|
|
- time.sleep(5)
|
|
|
- return self._retry_execute(param, remaining - 1)
|
|
|
+ if code in (1302, 1303):
|
|
|
+ raise RuntimeError(f"Rate limited (code={code})")
|
|
|
+ if not bean.get("data"):
|
|
|
+ msg = bean.get("message", "unknown error")
|
|
|
+ raise RuntimeError(f"Submit failed: {msg}")
|
|
|
return bean
|
|
|
|
|
|
def execute(self, param: TaskParam) -> TaskResult:
|
|
|
t0 = time.time()
|
|
|
- bean = self._retry_execute(param)
|
|
|
- if not bean:
|
|
|
- return TaskResult.failure("submit task fail !")
|
|
|
- if not bean.get("data"):
|
|
|
- msg = bean.get("message", "unknown error")
|
|
|
- logger.error("[%s] Submit failed: %s", self.get_type(), msg)
|
|
|
- return TaskResult.failure(msg)
|
|
|
+ logger.info("[%s] Submitting task: POST %s", self.get_type(), self.execute_url)
|
|
|
+ try:
|
|
|
+ bean = retry_on_failure(
|
|
|
+ lambda: self._submit(param.inputs),
|
|
|
+ max_retries=5,
|
|
|
+ backoff_base=3.0,
|
|
|
+ task_name=self.get_type(),
|
|
|
+ )
|
|
|
+ except Exception as e:
|
|
|
+ elapsed = time.time() - t0
|
|
|
+ logger.error("[%s] Submit failed in %.2fs: %s", self.get_type(), elapsed, e)
|
|
|
+ return TaskResult.failure(f"submit task fail: {e}")
|
|
|
|
|
|
task_id = bean["data"].get("task_id")
|
|
|
logger.info("[%s] Task submitted, remote_id=%s", self.get_type(), task_id)
|