优化: 代理工具代码审查修复

This commit is contained in:
2026-04-01 18:11:06 +08:00
parent f77ed2572a
commit 38b16a6efc
9 changed files with 321 additions and 91 deletions

View File

@@ -1,6 +1,6 @@
# 代理工具孵化记录
> 状态:孵化中 | 更新2026-03-24
> 状态:孵化中 | 更新2026-03-27
---
@@ -152,6 +152,54 @@ ssh <user>@<host> "<command>"
---
## 代码审查 (2026-03-27)
> 12 维度并行审查架构一致性、错误处理、安全性、性能、DRY、日志、配置管理、CLI 一致性、边界条件、依赖、资源清理、代码度量
### 必须修复
| # | 问题 | 文件 | 说明 | 状态 |
|---|------|------|------|------|
| 1 | .gitignore 未覆盖 mongo/redis 配置 | `.gitignore` | 含真实密码,随时可能被 `git add` 提交 | ✅ |
| 2 | Redis 密码无 URL 编码 | `redis-proxy/src/config.rs` | 密码含 `@` `:` 时 URL 解析失败 | ✅ |
| 3 | mongo urlencoding 不完整 | `mongo-proxy/src/config.rs` | 只编码 5 字符mysql 编码 19 字符 | ✅ |
| 4 | Redis 无重连机制 | `redis-proxy/src/db.rs` | Redis 重启后持续失败 5 分钟直到 idle timeout | ✅ |
| 5 | mysql-proxy handler 阻塞 tokio runtime | `mysql-proxy/src/handler.rs` | 同步 DB 操作未用 spawn_blocking阻塞 worker 线程 | ✅ |
| 6 | 全部失败路径无日志 | 所有 handler.rs (4 项目) | 约 36 个 map_err/?? 路径跳过 logger.log() | ✅ |
| 7 | with_error() 从未调用 | 所有 logger.rs (4 项目) | 错误日志 level 永远是 INFO | ✅ |
### 建议改进
| # | 问题 | 文件 | 说明 |
|---|------|------|------|
| 8 | get_conn TOCTOU 竞态 | mysql/mongo/redis `db.rs` | 释放锁后重建,可能重复创建连接 |
| 9 | mysql `--config` 占用 `-c` | `mysql-proxy/src/main.rs:22` | 与 `--conn` 冲突 |
| 10 | LogEntry 字段不一致 | 4 个 `logger.rs` | server/sql/rows/exitCode 各有缺失 |
| 11 | logger.rs 等 ~300 行重复 | 4 个项目 | RequestLogger/LogEntry/辅助函数高度重复 |
| 12 | ssh-proxy 无 SSH disconnect | `ssh-proxy/src/session.rs` | cleanup 只移除 HashMap 不发 disconnect |
| 13 | 无 graceful shutdown | 4 个 `main.rs` | Ctrl+C 不等待进行中请求 |
| 14 | redis-proxy 降级提示单行 | `redis-proxy/src/main.rs:52` | 其他 3 个用多行格式 |
| 15 | mongo-proxy JSON 模式打印耗时 | `mongo-proxy/src/cli.rs:86` | 破坏 JSON 输出纯度 |
| 16 | redis-proxy 无 JSON 输出 | `redis-proxy/src/cli.rs` | 其他 3 个都支持 -F json |
| 17 | mongo insert/update 缺 usage 连接列表 | `mongo-proxy/src/handler.rs:224,256` | find/count 有但 insert/update 没有 |
| 18 | ssh-proxy 未使用 russh-keys 依赖 | `ssh-proxy/Cargo.toml` | beta 版本,代码用 russh::keys |
| 19 | tokio features = ["full"] 过宽 | 4 个 `Cargo.toml` | 实际只需 rt-multi-thread/net/time/sync |
| 20 | 日志写入阻塞 tokio | 4 个 `logger.rs` | 同步 writeln 阻塞 worker 线程 |
### 代码度量
| 项目 | 行数 | 文件数 | 最长函数 | unwrap | clone | unsafe |
|------|------|--------|---------|-------|-------|
| mysql-proxy | 1,209 | 6 | query() 74行 | 10 | 18 | 0 |
| ssh-proxy | 997 | 6 | exec() 49行 | 0 | 17 | 0 |
| mongo-proxy | 1,422 | 6 | find() 38行 | 9 | 11 | 0 |
| redis-proxy | 964 | 6 | run_cmd() 19行 | 10 | 30 | 0 |
| **合计** | **4,592** | **24** | -- | **29** | **76** | **0** |
> 无 unsafe 代码,无 TODO/FIXME嵌套深度最大 3 层,函数最长 74 行。代码质量良好。
---
## 已知问题
### ssh-proxy
@@ -166,4 +214,11 @@ ssh <user>@<host> "<command>"
## 待优化
*由 AI 在实际使用过程中根据遇到的问题填写*
- [ ] 提取 proxy-common 公共 crate (logger/config/error/cli 基础)
- [ ] HTTP API 认证机制 (当前仅依赖 127.0.0.1 绑定)
- [ ] SSH 主机密钥验证 (当前无条件信任)
- [ ] redis-proxy 改用 redis::aio::ConnectionManager (避免 spawn_blocking)
- [ ] 日志写入改为 channel + 后台线程 (避免阻塞 tokio)
- [ ] 统一 graceful shutdown (with_graceful_shutdown)
- [x] .gitignore 补充 mongo/redis 配置文件
- [x] redis/mongo URL 编码对齐 mysql