From baa1f32f8e761da0571a5a7760df8f2e3d82b563 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 6 Aug 2026 19:23:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E6=B3=A8=E5=9B=BE=E9=9B=86=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9=E4=B8=8E=E6=B5=81=E6=B0=B4=E7=BA=BF=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E5=80=BA=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 确认计费提交早于持久化的边界继承自 master,并补充可对账状态 TODO 确认编码与上传共用并发槽继承自 master,并补充有界流水线 TODO 保留既有 OSS 清理历史 TODO,本提交不改变运行行为 --- server-rs/crates/api-server/src/editor_project_icon.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server-rs/crates/api-server/src/editor_project_icon.rs b/server-rs/crates/api-server/src/editor_project_icon.rs index fe55350c1..47c47db42 100644 --- a/server-rs/crates/api-server/src/editor_project_icon.rs +++ b/server-rs/crates/api-server/src/editor_project_icon.rs @@ -850,6 +850,9 @@ pub(crate) async fn persist_editor_spritesheet_slices( // TODO(legacy-spritesheet-cleanup): 历史并发上传链路在部分 PUT/HEAD 成功后失败时没有 // 记录成功对象并执行可重试补偿;需先定义 staged/committed/cleanup-pending 生命周期, // 再处理批量持久化失败、补偿失败和任务重放,不能只做一次 best-effort delete。 + // TODO(legacy-spritesheet-pipeline): 该并发结构继承自 master;同一个 stream slot 串联编码、 + // PUT 与 HEAD,慢上传会阻塞尚未开始的编码并继续消耗 processing_deadline。应拆成带有界 + // channel 的独立编码池和上传池,并分别定义 CPU/内存准入、处理期限与网络超时。 let mut uploads = futures_util::stream::iter(0..prepared.plan.len()) .map(|index| { let prepared = prepared.clone(); @@ -1358,6 +1361,10 @@ pub(crate) async fn generate_editor_icon_spritesheet_for_owner( .or_else(|| payload.project_id.clone()), ); let http_client = build_openai_image_http_client(&settings)?; + // TODO(legacy-icon-spritesheet-billing-boundary): 该计费边界继承自 master 的历史实现; + // Provider 成功后 operation 即提交,后续解码、OSS、资源与画布持久化失败时缺少可对账中间态。 + // 调整前需先定义 provider_succeeded/persistence_pending 等状态、稳定幂等键和补偿语义, + // 不能只把后续副作用机械包入 billable future。 let (generated, prompt, screen_background_decision) = execute_billable_asset_operation_with_cost( state,