fix(config): 单条入库审查的墙钟上限收敛到唯一真源(M16)
生产启动行仍是 timeout=20s —— M15 把 memory 包的 defaultReviewTimeout 抬到 90s 的修复**从未生效**:config 层的 env tag 自己带着 default:"20", env 层永远产出非零值,于是 memory 侧「≤0 才回落默认」的归一化成了死代码。 修法(二选一中的「① 让 memory 侧成为唯一真源」):去掉 config 侧 MEMORY_REVIEW_TIMEOUT_SEC 的字面默认值,未配置时读出 0 = 「没配」, 由 normalizeReviewConfig 单点落地 90s。 生效值: .env / env 没写这个键 ⇒ 90s(唯一真源) 写了正数 ⇒ 原样生效(不做任何「保底抬到 90」的加码) 写了 0 / 负数 ⇒ 90s(与项目其它旋钮同一口径:≤0 = 用默认) 新增测试(走真实组装路径,不绕过任何一层): config.LoadMemoryReviewConfig → ReviewConfig.Timeout → NewPreInsertReviewer → normalizeReviewConfig → 生效值(= 启动行打印的 timeout=) 断言生效值严格大于「实测最坏召回链 57s + T1 子超时 8s」,并断言启动行打印它。 变异自证(修前红):把 tag 的 default:"20" 加回去 ⇒ 报出 「组装后 timeout = 20s」+「生效值 20s != 唯一真源 1m30s」 原有 TestEmbeddingTimeoutFitsReviewBudget 拦不住这条,因为它比的是**本包常量**, 看不见 env 层;注释里已写明「比常量」与「比组装后生效值」的区别(防后人重蹈)。
This commit is contained in:
1 parent
202cd8535e
commit
42a07cb454
4 files changed
+259
-6
No files matched your search
@@ -18,9 +18,18 @@ const (
|
||||
defaultReviewQueueSize = 256
|
||||
// defaultReviewScanLimit 是每次审查在同一分区内最多比对的既有条目数。
|
||||
defaultReviewScanLimit = 200
|
||||
// defaultReviewTimeout 是单条审查的墙钟上限。
|
||||
// defaultReviewTimeout 是单条审查的墙钟上限,**也是全链的唯一真源**
|
||||
// (切片 M16,2026-10-13):配置层 `config.MemoryReviewConfig.TimeoutSec`
|
||||
// 的 env tag **刻意不带** `default:`,没配时读出 0(= 没配),
|
||||
// 由本文件下方的 normalizeReviewConfig 落地成这个常量。
|
||||
//
|
||||
// 🔴 2026-10-13 由 20s 抬到 90s。依据是**实测的链长**,不是感觉:
|
||||
// 🔴 为什么要把真源搬到这里:原先 tag 上写着 `default:"20"`,而 20s 又等于
|
||||
// 当时的本常量 ⇒ 看着「两处一致」,实际是 **env 层永远产出一个非零值**,
|
||||
// 「≤0 才回落默认」这条归一化**永远是死代码** ⇒ 本常量改成 90s 后生产启动行
|
||||
// 仍是 `timeout=20s`(塔在部署后读真实启动行抓到)。所以别再往 env tag 上写
|
||||
// 字面默认值:那等于把「默认值」搬回配置层,本常量又一次变成装饰。
|
||||
//
|
||||
// 取值推导如下(2026-10-13 由 20s 抬到 90s),依据是**实测的链长**,不是感觉:
|
||||
// 单条审查的召回链是「新条 1 + ScanLimit 200 = 201 条文本」,而 embedding 侧
|
||||
// 一次请求只吃 DefaultBatchLimit 条(改前 4、改后 8,见 embedding/budget.go 的
|
||||
// 文件头实测)⇒ 链长 = ⌈201/批次⌉ 个请求:
|
||||
@@ -162,6 +171,9 @@ func normalizeReviewConfig(cfg ReviewConfig) ReviewConfig {
|
||||
cfg.ScanLimit = defaultReviewScanLimit
|
||||
}
|
||||
if cfg.Timeout <= 0 {
|
||||
// 单条审查预算的**唯一**落地处(切片 M16):配置层的 env tag 不带默认值,
|
||||
// 所以「没配」与「配了 ≤0」都走这一行。全链的生效值就是这一行的结果 ——
|
||||
// 启动行 `memory ingest review started … timeout=` 打印的也正是它。
|
||||
cfg.Timeout = defaultReviewTimeout
|
||||
}
|
||||
if cfg.Threshold <= 0 {
|
||||
|
||||
Reference in new issue
Block a user