provider 报 unknown 任务状态时改为可重试,不再直接判死
- platform-tripo:`TaskStatus::Unknown` 不再归一成 `OutputSchema` 终态失败,改成新的 `TripoError::TaskStatusUnknown`,并把它的可重试性判为真(SDK 自己也没把 unknown 算进终态) - platform-tripo:补用例——provider 回 `"status":"unknown"` 时必须返回可重试的 `TaskStatusUnknown`,不能当成正常快照 - api-server:错误映射补 `TaskStatusUnknown` 分支(502 + 固定文案,轮询侧早已按可重试继续查到截止时间) - api-server worker:状态查询遇到可重试错误时补一条 warn 日志,便于区分「一直是 unknown」和「一次网络抖动」 - docs:Provider 集成方案写明 unknown 按可重试处理及其理由
This commit is contained in:
@@ -144,6 +144,15 @@ pub(crate) fn map_provider_error(error: TripoError) -> AppError {
|
||||
"3D 生成任务的结果格式不符合预期,未落库。".to_string(),
|
||||
)
|
||||
}
|
||||
// 轮询侧按可重试继续查到截止时间,真走到这里说明预估的时间已经用尽。
|
||||
TripoError::TaskStatusUnknown { .. } => {
|
||||
tracing::error!(error = %error, "tripo task status is unrecognized");
|
||||
(
|
||||
StatusCode::BAD_GATEWAY,
|
||||
"tripo-task-status-unknown",
|
||||
"3D 生成服务的任务状态暂时无法识别,请稍后重试。".to_string(),
|
||||
)
|
||||
}
|
||||
// 配置问题正常在 `provider.rs` 就按 503 拦下;这里只是把枚举匹配补全,
|
||||
// 真走到这一步说明有调用方绕过了构造入口,按服务不可用上报。
|
||||
TripoError::Configuration { .. } => {
|
||||
|
||||
@@ -252,6 +252,9 @@ async fn poll_until_terminal(
|
||||
// 查询本身已经带过一轮退避重试;仍是瞬时故障时继续按轮询间隔查到预算用尽,
|
||||
// 不因为一次 provider 抖动就作废这笔已经提交、不能重来的任务。
|
||||
Err(error) if error.is_retryable() => {
|
||||
// 包括 provider 报的 `unknown` 状态:继续查到截止时间,日志留痕便于区分
|
||||
// 「一直是 unknown」和「一次网络抖动」。
|
||||
tracing::warn!(error = %error, "3D 生成任务状态查询遇到可重试错误,继续轮询");
|
||||
let remaining = provider_deadline.saturating_duration_since(Instant::now());
|
||||
tokio::time::sleep(MODEL3D_POLL_INTERVAL.min(remaining)).await;
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user