From 7dd7bdd3c7c169e04fb557e9f755d9bb1220a3a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 13:50:24 +0800 Subject: [PATCH] =?UTF-8?q?provider=20checkpoint=20=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=80=A7=E6=A0=A1=E9=AA=8C=E8=A1=A5=E4=B8=8A=20provider=5Fkind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - at-most-once submit 的两字段不变量在数据层一起判定 --- .../crates/spacetime-module/src/external_generation.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/server-rs/crates/spacetime-module/src/external_generation.rs b/server-rs/crates/spacetime-module/src/external_generation.rs index 07c2cbab4..eba694174 100644 --- a/server-rs/crates/spacetime-module/src/external_generation.rs +++ b/server-rs/crates/spacetime-module/src/external_generation.rs @@ -1881,11 +1881,10 @@ fn get_worker_owned_external_generation_job( fn ensure_external_generation_job_provider_checkpoint_absent( row: &ExternalGenerationJob, ) -> Result<(), String> { - if row.provider_task_id.is_some() { - return Err( - "external_generation_job.provider_task_id 已存在,禁止覆盖 provider checkpoint" - .to_string(), - ); + // checkpoint 由 provider_kind + provider_task_id 两个字段共同构成, + // 只判 task_id 会让部分写入的行绕过 at-most-once submit 保护。 + if row.provider_kind.is_some() || row.provider_task_id.is_some() { + return Err("external_generation_job.provider checkpoint 已存在,禁止覆盖".to_string()); } Ok(()) }