fix: SQLite WAL mode 解决图谱导航超时问题
- 启用 PRAGMA journal_mode=WAL(写操作不阻塞读) - busy_timeout 从 10s 降至 3s(WAL 模式下锁竞争大幅减少) - 更新 eval_results.md 缺陷状态(P0 已修复)
This commit is contained in:
parent
40a8c9edee
commit
48e33039a0
|
|
@ -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 效果
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue