|
| 1 | +# DNS Trace-Back 2nd 修复开发任务书(执行版) |
| 2 | + |
| 3 | +> 来源审计: `/Users/ouzy/Documents/DevProjects/dae/.plan/code_audit_trace-back-2nd.md` |
| 4 | +> 分支: `dns_fix` |
| 5 | +> 目标: 按 High -> Medium 顺序关闭 F1/F3/F4/F2,并补齐任务级验证与测试记录 |
| 6 | +
|
| 7 | +## 0. 串行执行策略(落实) |
| 8 | + |
| 9 | +1. High 任务先行,且按依赖顺序执行:`T1(F1+F4 ingress)` -> `T2(F3 shutdown)` -> `M1(High 里程碑回归)`。 |
| 10 | +2. Medium 任务只在 High 代码与本地可执行验证完成后进入:`T3(F2)` -> `M2(总里程碑回归)`。 |
| 11 | +3. 本地环境限制(非 Linux + 无 eBPF 生成链路)下,回归分为两层: |
| 12 | + - 本地:代码级静态/结构验证(gofmt + 路径断言)。 |
| 13 | + - CI:Linux + eBPF 构建与编译测试闭环。 |
| 14 | + |
| 15 | +## 1. High 实施关系设计 |
| 16 | + |
| 17 | +### T1(HIGH,覆盖 F1+F4 主因) |
| 18 | + |
| 19 | +**目标**: |
| 20 | +- 消除 DNS lane 满时阻塞 UDP 读循环。 |
| 21 | +- 增加可观测性计数(queue full / drop)用于长跑退化归因。 |
| 22 | + |
| 23 | +**代码实现**: |
| 24 | +- 文件: `/Users/ouzy/Documents/DevProjects/dae/control/control_plane.go` |
| 25 | +- 改动: |
| 26 | + 1. `enqueueDnsIngressTask` 增加 `default` 分支,队列满时不阻塞。 |
| 27 | + 2. 新增 `dnsIngressQueueFullTotal`、`dnsIngressDropTotal` 两个计数器。 |
| 28 | + 3. 新增 `onDnsIngressQueueFull`(计数 + 节流日志),日志字段名与审计要求一致: |
| 29 | + - `dns_ingress_queue_full_total` |
| 30 | + - `dns_ingress_drop_total` |
| 31 | + 4. `dispatchDnsOrQueue` 显式检查入队返回值。 |
| 32 | + |
| 33 | +**任务级测试(本地可执行)**: |
| 34 | +- `gofmt -w control/control_plane.go control/dns_improvement_test.go` |
| 35 | +- `rg -n "dnsIngressQueueLogEvery|onDnsIngressQueueFull|dns_ingress_queue_full_total|dns_ingress_drop_total" control/control_plane.go` |
| 36 | +- `rg -n "TestUdpIngressDispatch_NoSyncFallbackWhenDnsLaneBusy|dnsIngressQueueFullTotal|dnsIngressDropTotal" control/dns_improvement_test.go` |
| 37 | + |
| 38 | +**结果**: 通过(结构与路径验证通过)。 |
| 39 | + |
| 40 | +--- |
| 41 | + |
| 42 | +### T2(HIGH,覆盖 F3) |
| 43 | + |
| 44 | +**目标**: |
| 45 | +- reload/close 时不遗留 `dnsIngressQueue` 中的 buffer。 |
| 46 | + |
| 47 | +**代码实现**: |
| 48 | +- 文件: `/Users/ouzy/Documents/DevProjects/dae/control/control_plane.go` |
| 49 | +- 改动: |
| 50 | + 1. 新增 `drainDnsIngressQueue`,在退出路径排空队列并回收 buffer。 |
| 51 | + 2. worker 收到 `ctx.Done()` 后执行 drain 再退出。 |
| 52 | + 3. worker 取到 task 后增加 `ctx.Err()` 检查,关闭期间不再进入 `handlePkt`,直接回收。 |
| 53 | + |
| 54 | +**任务级测试(本地可执行)**: |
| 55 | +- `rg -n "drainDnsIngressQueue|ctx\.Err\(\)" control/control_plane.go` |
| 56 | +- `rg -n "TestDrainDnsIngressQueue_DrainsWithoutCountingDrop" control/dns_improvement_test.go` |
| 57 | + |
| 58 | +**结果**: 通过(结构与路径验证通过)。 |
| 59 | + |
| 60 | +--- |
| 61 | + |
| 62 | +### M1(High 里程碑回归) |
| 63 | + |
| 64 | +**目标**: 对 High 变更执行本地编译级回归尝试并记录环境阻塞。 |
| 65 | + |
| 66 | +**执行命令**: |
| 67 | +1. `GOWORK=off go test ./control -run 'Test(UdpIngressDispatch|DrainDnsIngressQueue|AnyfromPoolGetOrCreate_(ZeroTTLStillPooled|NegativeTTLStillPooled))' -count=1` |
| 68 | +2. `GOWORK=off GOOS=linux GOARCH=amd64 go test ./control -run 'Test(UdpIngressDispatch|DrainDnsIngressQueue|AnyfromPoolGetOrCreate_(ZeroTTLStillPooled|NegativeTTLStillPooled))' -count=1` |
| 69 | + |
| 70 | +**结果**: |
| 71 | +- 命令 1 失败:macOS 缺失 Linux netlink/IP_TRANSPARENT 常量(平台限制)。 |
| 72 | +- 命令 2 失败:缺少 eBPF 生成类型(`bpfObjects/bpfRoutingResult`),需 CI 生成链路。 |
| 73 | + |
| 74 | +**结论**: |
| 75 | +- High 改动已完成本地代码级验证。 |
| 76 | +- Linux + eBPF 编译测试需由 CI 接管。 |
| 77 | + |
| 78 | +## 2. Medium 实施 |
| 79 | + |
| 80 | +### T3(MEDIUM,覆盖 F2) |
| 81 | + |
| 82 | +**目标**: |
| 83 | +- 修复 `AnyfromPool.GetOrCreate` 在 `ttl<=0` 时不入池问题。 |
| 84 | + |
| 85 | +**代码实现**: |
| 86 | +- 文件: `/Users/ouzy/Documents/DevProjects/dae/control/anyfrom_pool.go` |
| 87 | +- 改动: |
| 88 | + 1. `p.pool[lAddr] = newAf` 移到 `if ttl > 0` 外,保证 `ttl<=0` 仍入池。 |
| 89 | + 2. 新增 `createAnyfromFn` 测试 seam(默认指向 `createAnyfrom`),支撑无 socket 单元语义测试。 |
| 90 | + 3. 竞争失败关闭连接处增加 nil 防护(测试 seam 下更稳健)。 |
| 91 | +- 文件: `/Users/ouzy/Documents/DevProjects/dae/control/dns_improvement_test.go` |
| 92 | +- 新增测试: |
| 93 | + 1. `TestAnyfromPoolGetOrCreate_ZeroTTLStillPooled` |
| 94 | + 2. `TestAnyfromPoolGetOrCreate_NegativeTTLStillPooled` |
| 95 | + |
| 96 | +**任务级测试(本地可执行)**: |
| 97 | +- `gofmt -w control/anyfrom_pool.go control/dns_improvement_test.go` |
| 98 | +- `rg -n "createAnyfromFn|p\.pool\[lAddr\] = newAf" control/anyfrom_pool.go` |
| 99 | +- `rg -n "TestAnyfromPoolGetOrCreate_ZeroTTLStillPooled|TestAnyfromPoolGetOrCreate_NegativeTTLStillPooled" control/dns_improvement_test.go` |
| 100 | + |
| 101 | +**结果**: 通过(结构与路径验证通过)。 |
| 102 | + |
| 103 | +## 3. M2(总里程碑回归) |
| 104 | + |
| 105 | +**目标**: 对 High+Medium 的变更做统一本地回归尝试并确认 CI 接管项。 |
| 106 | + |
| 107 | +**本地结论**: |
| 108 | +1. 代码级修复路径完整落地(F1/F3/F4/F2)。 |
| 109 | +2. 本地无法完成 `control` 包 Linux/eBPF 编译测试(环境限制已复现)。 |
| 110 | +3. 下一步必须提交 PR 触发 CI 完成最终编译与测试闭环。 |
| 111 | + |
| 112 | +## 4. 交付清单 |
| 113 | + |
| 114 | +1. `/Users/ouzy/Documents/DevProjects/dae/control/control_plane.go` |
| 115 | + - 非阻塞 DNS 入队、queue/drop 计数器、关闭排空逻辑。 |
| 116 | +2. `/Users/ouzy/Documents/DevProjects/dae/control/anyfrom_pool.go` |
| 117 | + - `ttl<=0` 入池修复 + create seam。 |
| 118 | +3. `/Users/ouzy/Documents/DevProjects/dae/control/dns_improvement_test.go` |
| 119 | + - 队列满语义测试更新、drain 测试、`ttl<=0` 语义测试。 |
| 120 | +4. `/Users/ouzy/Documents/DevProjects/dae/.plan/code_audit_trace-back-2nd-dev.md` |
| 121 | + - 本执行文档。 |
| 122 | + |
| 123 | +## 5. CI 要求(必须) |
| 124 | + |
| 125 | +1. 在 Linux runner 上完成 eBPF 代码生成后执行 `go test`。 |
| 126 | +2. 覆盖 DNS 分流、关闭排空、AnyfromPool 语义回归。 |
| 127 | +3. 结合 endurance/soak 数据确认 F4(长跑退化)是否收敛。 |
0 commit comments