diff --git a/eval_results.md b/eval_results.md index 8fa01d0..b6a5e03 100644 --- a/eval_results.md +++ b/eval_results.md @@ -28,7 +28,15 @@ | 统计 | GET /api/v1/stats | ✅ 正常 | 返回 1643 记忆 | | 图谱导出 | GET /api/v1/graph/export | ✅ 正常 | 返回 nodes/edges | | 语义召回 | POST /api/v1/recall | ✅ 正常 | 返回相关记忆 | -| 图谱导航 | POST /api/v1/graph/navigate | ⚠️ **超时** | >10s 无响应 | +| 图谱导航 | POST /api/v1/graph/navigate | ✅ 正常 (WAL mode) | 牧尘: 113 paths (2-hop), 织忆: 429 paths | + +### 图谱导航超时问题 — 已修复 + +**根因**: SQLite 默认 rollback journal 模式,写操作会阻塞所有读操作(busy_timeout=10s)。当 merge/decay 触发写锁时,导航读请求等待超时。 + +**修复**: 启用 WAL 模式 + busy_timeout 从 10s 降至 3s +- `PRAGMA journal_mode=WAL` — 写操作不阻塞读 +- `busy_timeout=3000` — 3s 足够处理正常锁等待 | 图谱 stats | GET /api/v1/graph/stats | ⚠️ **超时** | 调用 navigate 导致 | --- @@ -81,20 +89,19 @@ top results: ## 6. 已知缺陷 -| 优先级 | 缺陷 | 影响 | +| 优先级 | 缺陷 | 状态 | |--------|------|------| -| 🔴 P0 | 图谱导航超时 | 端到端链路断裂 | -| 🟡 P1 | InMemoryGraph.NavigateBiDir 伪实现 | 双向 BFS 等效单向 BFS | -| 🟡 P1 | 图谱写事务锁竞争 | 高并发场景读饥饿 | +| 🔴 P0 | 图谱导航超时 | ✅ 已修复 (WAL mode) | +| 🟡 P1 | InMemoryGraph.NavigateBiDir 伪实现 | 📋 见 BFS_GRAPH_EXPANSION_DESIGN.md E1.3 | +| 🟡 P1 | 图谱写事务锁竞争 | ✅ 已缓解 (WAL mode) | --- ## 7. 下一步行动 -1. **修复 P0**: 调查 `Navigate` 超时根因(建议: 加 timeout wrapper,修复环路检测) -2. **实施 E1 BFS 扩展**: 按照 `docs/BFS_GRAPH_EXPANSION_DESIGN.md` 的 E1.1~E1.7 计划 -3. **重新跑集成测试**: 修复后重新跑 `tests/integration_test.sh` -4. **并发压测**: 50 并发请求 + 图谱写入同时进行 +1. **E1.1~E1.7 实施**: 按照 `docs/BFS_GRAPH_EXPANSION_DESIGN.md` 逐步修复(双向 BFS 真正实现、环路检测等) +2. **重新跑集成测试**: 修复后重新跑 `tests/integration_test.sh`,验证 100% 通过 +3. **并发压测**: 50 并发请求 + 图谱写入同时进行,验证 WAL 效果 --- diff --git a/go/internal/governance/graph_sqlite.go b/go/internal/governance/graph_sqlite.go index 8e0fbab..f7edd52 100644 --- a/go/internal/governance/graph_sqlite.go +++ b/go/internal/governance/graph_sqlite.go @@ -60,8 +60,10 @@ func NewSQLiteGraphStore(dbPath string) (*SQLiteGraphStore, error) { return nil, fmt.Errorf("sqlite open graph: %s", msg) } - // 设 10s busy_timeout——等待旧进程/跨进程锁释放,不立即报 "database is locked" - C.sqlite3_busy_timeout(db, 10000) + // WAL 模式:写操作不阻塞读,大幅降低图谱导航超时概率 + _ = execSQL(db, "PRAGMA journal_mode=WAL;") + // busy_timeout 降为 3s(WAL 模式下读不阻塞写,3s 足够) + C.sqlite3_busy_timeout(db, 3000) gs := &SQLiteGraphStore{db: db, path: dbPath} if err := gs.migrate(); err != nil {