From 7a4ccb8bfe82a0d6e4b515d405b6260b2205e1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:56:51 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E4=BA=A7=E7=89=A9=E5=93=88=E5=B8=8C?= =?UTF-8?q?=E6=8C=AA=E5=88=B0=20blocking=20=E7=BA=BF=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server-rs/crates/api-server/src/tripo3d/storage.rs:上传前对最大 512 MiB 的产物做 sha256 会占住一个 Tokio worker,改成 spawn_blocking 并把 bytes 原样带回(不做整块复制),失败按 500 收口 --- server-rs/crates/api-server/src/tripo3d/storage.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server-rs/crates/api-server/src/tripo3d/storage.rs b/server-rs/crates/api-server/src/tripo3d/storage.rs index efafde061..eb4d9c823 100644 --- a/server-rs/crates/api-server/src/tripo3d/storage.rs +++ b/server-rs/crates/api-server/src/tripo3d/storage.rs @@ -113,7 +113,19 @@ pub(crate) async fn store_model3d_artifact( .ok_or_else(|| oss_unavailable("OSS 未完成环境变量配置,无法写入 3D 产物。"))?; let http_client = state.editor_oss_http_client(); let content_type = resolve_artifact_content_type(content_type, slot, bytes.as_slice())?; - let sha256 = sha256_hex(bytes.as_slice()); + // 模型产物上限是 512 MiB,同步哈希会把一个 Tokio worker 占住几百毫秒,拖慢同一运行时上的 + // 其它任务。挪到 blocking 线程池,并让任务把 bytes 原样带回来,省掉一次整块复制。 + let (sha256, bytes) = tokio::task::spawn_blocking(move || { + let sha256 = sha256_hex(bytes.as_slice()); + (sha256, bytes) + }) + .await + .map_err(|error| { + AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_details(json!({ + "provider": TRIPO_PROVIDER, + "message": format!("3D 产物哈希任务失败:{error}"), + })) + })?; let extension = slot .artifact_extension(content_type.as_str()) .ok_or_else(|| unsupported_artifact_content_type(content_type.as_str(), slot))?;