背景:入库前审查链路一直整条超时(日志每 ~20s 一条 WARN),异步那层 (含刚装好的 T1)从未成功跑过。 - 新增 endpoint.go:把「连接语义上不可靠」的回环别名规范化成 127.0.0.1 (localhost 大小写不敏感 / 0.0.0.0 / 空主机),只替换 Host,不碰 path / query / fragment / userinfo;显式 [::1] 与真实主机名逐字不动 - Embed 加独立短超时 DefaultRequestTimeout = 5s(远小于审查 20s 预算): 卡住的调用快速失败并走既有「降级到词项余弦」的路径,把预算留给 T1 - .env.example 示例地址 localhost -> 127.0.0.1(未注释行键数 69 -> 69,无增删) - 跨包测试钉住 5s 严格小于审查总预算 诚实边界(子代理实测,推翻了主代理原先的 IPv6 根因推断): - Go 客户端走 localhost 实测约 57ms、curl 约 0.2s ⇒「localhost -> ::1 等满 20s 预算」这条链不成立;更可能是单槽 llama.cpp 的吞吐/争用 (一批 64 条约 2.1~2.9s,审查 201 条约 8~10s,再叠 T1 8s 顶满预算) - 规范化在任何环境下都无害,5s 快速失败对这个真因对症;但真因 (容量/争用)需要另排切片,已记入工作小结
30 lines
1.3 KiB
Go
30 lines
1.3 KiB
Go
package memory
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"git.yeij.top/AskaEth/Cyrene_v2/internal/runtime/embedding"
|
|
)
|
|
|
|
// TestEmbeddingTimeoutFitsReviewBudget 钉住一条**跨包**口径:embedding 单次调用的
|
|
// 独立超时必须严格小于入库前审查的单条总预算(defaultReviewTimeout = 20s)。
|
|
//
|
|
// 这不是风格问题:2026-10-07 实测的故障形态就是「端点主机写成 localhost → 先试
|
|
// IPv6 ::1 → 连接等系统超时(Windows 上约 21s)」,一次 embedding 失败正好吃光 20s
|
|
// 预算,整条审查超时(`memory/review: context deadline exceeded`),排在后面的 T1
|
|
// 灰区判定连执行机会都没有。地址规范化(embedding.normalizeEndpointURL)治的是根,
|
|
// 本断言守的是「就算再有新的卡死来源,也得先把预算留给后续步骤」。
|
|
//
|
|
// embedding 侧同一口径也有一条钉值测试(api_url_test.go),两边互为护栏。
|
|
func TestEmbeddingTimeoutFitsReviewBudget(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if embedding.DefaultRequestTimeout <= 0 {
|
|
t.Fatalf("embedding.DefaultRequestTimeout = %s, 必须为正", embedding.DefaultRequestTimeout)
|
|
}
|
|
if embedding.DefaultRequestTimeout >= defaultReviewTimeout {
|
|
t.Fatalf("embedding 单次超时 %s 必须严格小于审查总预算 %s",
|
|
embedding.DefaultRequestTimeout, defaultReviewTimeout)
|
|
}
|
|
}
|