# [Bug] `add_latency` 对 data-UDP(UDP/QUIC 数据流)选路失效 ## 现象 `min` 策略下给节点配 `add_latency` 想人为偏置/指定某节点:**TCP、DNS-UDP 生效,但 data-UDP(QUIC / 游戏等真实 UDP 流量)完全不生效**——人工加权被静默忽略,实际按配置顺序/顺序兜底选节点。 ## 根因 偏移量只在 `if hasLatency {` 内并入排序值: ```go // component/outbound/dialer/alive_dialer_set.go (NotifyLatencyChange) if hasLatency { sortingLatency = rawLatency + a.dialerToLatencyOffset[dialer] } ``` 而 data-UDP **没有延时探针**(全库无 `udp_check_data`),其 `Latencies10` 永远为空 → `hasLatency` 对所有节点**恒为 false** → 偏移量永不进 `sortingLatency`。所有 data-UDP 节点排序分都是 0,平局按配置序 → `add_latency` 成 no-op。 **本质**:开发者把 `add_latency` 建模成「延时增量」(没延时就没东西可加);但用户语义是「无视实测、强行打破排序的人工权重」,两者在 data-UDP 上分叉。这是语义实现 bug,不是设计取舍。 ## 影响 - 用 `add_latency` 让 UDP 流量走指定节点 → 无效。 - 与 TCP/DNS-UDP(生效)矛盾:同一组节点 DNS 走 JMS04、data 走别的节点。 - failover 仍工作(死→顺延下一个活着的节点),只是排序不再听人工偏好。 ## 修复 方案 A(最小侵入,治本):让偏移量**无条件**进 `sortingLatency`(3 处:`NotifyLatencyChange` 初始化与 `!hasLatency` 分支、`recomputeSelectionStateLocked`)。实施后 data-UDP 排序分 = `0 + add_latency`,人工偏好生效且保留 failover。 → 已实现:PR #1073(`itoywh:fix/add-latency-data-udp`)。 ## 附:data-UDP 选路行为 - **冷启动**:所有节点以 `alive=true` 入集,**配置序第一个节点**被钉为首选(非流量竞速)。 - **切换**:仅「节点死 → 顺延下一个活着的(配置序)」「整组空 → 回退 DNS-UDP/TCP」;死而复活者排到队尾、不自动抢回首选。 - **无探针** → 不会「实测变快就自动换节点」。
Activity
dae-prow commentedon Aug 10, 2026
Thanks for opening this issue!
itoywh commentedon Aug 10, 2026
@olicesx
[-][Bug] data-UDP 连通性槽无主动探针时永久 NOT ALIVE,导致多节点组中偏置节点的 UDP/QUIC 流量被错误 failover[/-][+][Bug] data-UDP 无主动探针 + add_latency 偏置在冷启动/无延迟数据时失效,致偏置节点 UDP/QUIC 流量被错选[/+][-][Bug] data-UDP 无主动探针 + add_latency 偏置在冷启动/无延迟数据时失效,致偏置节点 UDP/QUIC 流量被错选[/-][+][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效,致偏置节点 UDP/QUIC 流量被错选[/+][-][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效,致偏置节点 UDP/QUIC 流量被错选[/-][+][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效(集合锁定致不自愈),致偏置节点 UDP/QUIC 流量被错选[/+][-][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效(集合锁定致不自愈),致偏置节点 UDP/QUIC 流量被错选[/-][+][Bug] add_latency 偏置在 data-UDP 域失效且不自愈:offset 被 if hasLatency 跳过 + GetMinLatency 缓存短路(偏置节点其实进了 data-UDP 集合)[/+][-][Bug] add_latency 偏置在 data-UDP 域失效且不自愈:offset 被 if hasLatency 跳过 + GetMinLatency 缓存短路(偏置节点其实进了 data-UDP 集合)[/-][+][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效(偏置节点已进 data-UDP 集合,但被 GetMinLatency 增量缓存短路永久压住)[/+][-][Bug] data-UDP 无主动探针 + add_latency 人工加权在冷启动/无延迟数据时失效(偏置节点已进 data-UDP 集合,但被 GetMinLatency 增量缓存短路永久压住)[/-][+][Bug] data-UDP 无延时采集路径导致 add_latency 偏置对 UDP/QUIC 选路完全失效(结构性 no-op)[/+][-][Bug] data-UDP 无延时采集路径导致 add_latency 偏置对 UDP/QUIC 选路完全失效(结构性 no-op)[/-][+][Bug] `add_latency` 对 data-UDP(UDP/QUIC 数据流)选路完全失效(结构性 no-op)[/+][-][Bug] `add_latency` 对 data-UDP(UDP/QUIC 数据流)选路完全失效(结构性 no-op)[/-][+][Bug] add_latency 对 data-UDP(UDP/QUIC 数据流)选路失效[/+]fix(dialer): apply add_latency offset for network types without a lat…
fix(dialer): also apply add_latency offset unconditionally for data-UDP