Skip to content

Commit c03d13a

Browse files
authored
Merge pull request #8 from MaurUppi/dns_fix
fix(dns): harden ingress queue and complete trace-back 2nd fixes
2 parents 969edae + 53e4201 commit c03d13a

File tree

7 files changed

+663
-37
lines changed

7 files changed

+663
-37
lines changed

.github/workflows/bpf-test.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
name: BPF Test
22

33
on:
4+
workflow_dispatch:
45
pull_request:
56
paths:
67
- "**/*.c"
@@ -27,7 +28,7 @@ jobs:
2728

2829
steps:
2930
- name: Checkout code
30-
uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0
31+
uses: actions/checkout@v4
3132
with:
3233
persist-credentials: false
3334
fetch-depth: 0
@@ -41,6 +42,15 @@ jobs:
4142
- name: Run BPF tests
4243
env: ${{ matrix.env }}
4344
run: |
45+
set -o pipefail
4446
git submodule update --init
45-
sudo CLANG=clang-$VERSION make ebpf-test || (echo "Run 'make ebpf-test' locally to investigate failures"; exit 1)
47+
sudo CLANG=clang-$VERSION make ebpf-test 2>&1 | tee bpf-test-clang-$VERSION.log
4648
49+
- name: Upload BPF test logs
50+
if: always()
51+
uses: actions/upload-artifact@v4
52+
with:
53+
name: bpf-test-logs-clang-${{ matrix.env.VERSION }}
54+
path: bpf-test-clang-*.log
55+
if-no-files-found: ignore
56+
retention-days: 7
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
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

Comments
 (0)