From a1e2415fae38f028d38262a862008bef05639d2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 3 Oct 2026 18:51:41 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E4=BC=9A=E5=91=98):=20=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=E5=A4=96=E9=83=A8=E7=94=9F=E6=88=90=E8=AE=A4=E9=A2=86=E7=9A=84?= =?UTF-8?q?=E8=B7=A8=E8=B4=A6=E5=8F=B7=E9=98=9F=E5=A4=B4=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=20TODO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - claim_external_generation_jobs_tx 的 take(limit) 只检查前 limit 行,被上限拦下/lease 终结的行仍占检查名额 - 记录触发条件(负载越高 limit 越小)与未决修法(改为成功认领才计数,仍是全局 FIFO),本次不修 --- .../crates/spacetime-module/src/external_generation.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server-rs/crates/spacetime-module/src/external_generation.rs b/server-rs/crates/spacetime-module/src/external_generation.rs index 91f0758ba..8aa594511 100644 --- a/server-rs/crates/spacetime-module/src/external_generation.rs +++ b/server-rs/crates/spacetime-module/src/external_generation.rs @@ -885,6 +885,13 @@ fn claim_external_generation_jobs_tx( .then_with(|| left.job_id.cmp(&right.job_id)) }); + // TODO(并发认领公平性): `take(limit)` 只检查按 `available_at / created_at` 排序的前 `limit` 行, + // 而 `limit` 就是 worker 空闲槽数(api-server 传 `available`,池子默认 2 / release 8),被并发上限 + // 拦下或被 lease 耗尽终结的行只 `continue`,却已吃掉一个检查名额。若队头若干行都属已饱和账号, + // 本轮 `claimed` 可能为空,后面其它账号的可认领任务看不到 —— 跨账号队头阻塞;负载越高 `limit` + // 越小(7/8 worker 占用时 `limit = 1`)越容易触发。 + // 修法(未决,改前需确认单事务写集上界):遍历全部候选,成功认领一行才计数,`claimed.len() >= limit` + // 才 break,被跳过 / 终结的行不占名额,仍是全局 FIFO;若要「不同账号平均穿插」则需另做按账号轮转。 let mut claimed = Vec::new(); let mut concurrency = ExternalGenerationOwnerConcurrencyCache::default(); for mut row in candidates.into_iter().take(limit) {