[D-02][medium] 写队列关闭不安全且缺少非事务执行接口:停机时可能 panic,清理后无法执行 wal_checkpoint #28

Closed
opened 2026-09-30 13:56:57 +08:00 by nixevol · 1 comment
Owner

编号:D-02 严重级:medium 工作线:存储、配置、命令行与部署(internal/store、internal/config、cmd/nixmsg 命令、deploy) 来源:总审查人核实
依赖:无 被依赖:L-03 (#22)、C-03 (#34)

结论与统一方案

本条为 L-03(停机)与 C-03(清理后 checkpoint)提供存储层能力,由存储线统一实现,避免两条线同时改 internal/store/queue.go:

  1. 关闭安全(审查 P-06 第 4 点,原文附在 L-03):db.Close() 现在会关闭写队列的数据通道,而 WakePush、重推计时器、未等待退出的消息循环可能还在 Queue.Do 里向它发送,导致 panic。改为不关闭数据通道,只关闭 stop 通道(或用读写锁保护);关闭之后 Do 返回新的 ErrQueueClosed。
  2. 非事务执行接口(审查 M-05 第 3 点,原文附在 C-03):DEVELOPMENT 7.6 要求清理后执行 PRAGMA wal_checkpoint(TRUNCATE),它不能在事务里执行,而写入只能走写队列的事务。新增在写 goroutine 上执行非事务语句的接口,例如 Checkpoint(ctx),可顺带支持 PRAGMA optimize。

改动文件

internal/store/queue.go、db.go。

与其他问题的交互 / 冲突说明

L-03、C-03 依赖本条;与 D-01 同文件,存储线内顺序合入。

验收与测试

  • 并发 Do 与 Close 1000 次无 panic,关闭后 Do 返回 ErrQueueClosed。
  • 执行 Checkpoint 后 WAL 文件大小回落。

复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。

**编号**:D-02 **严重级**:medium **工作线**:存储、配置、命令行与部署(internal/store、internal/config、cmd/nixmsg 命令、deploy) **来源**:总审查人核实 **依赖**:无 **被依赖**:L-03 (#22)、C-03 (#34) ### 结论与统一方案 本条为 L-03(停机)与 C-03(清理后 checkpoint)提供存储层能力,由存储线统一实现,避免两条线同时改 `internal/store/queue.go`: 1. **关闭安全**(审查 P-06 第 4 点,原文附在 L-03):`db.Close()` 现在会关闭写队列的数据通道,而 WakePush、重推计时器、未等待退出的消息循环可能还在 `Queue.Do` 里向它发送,导致 panic。改为不关闭数据通道,只关闭 stop 通道(或用读写锁保护);关闭之后 `Do` 返回新的 `ErrQueueClosed`。 2. **非事务执行接口**(审查 M-05 第 3 点,原文附在 C-03):DEVELOPMENT 7.6 要求清理后执行 `PRAGMA wal_checkpoint(TRUNCATE)`,它不能在事务里执行,而写入只能走写队列的事务。新增在写 goroutine 上执行非事务语句的接口,例如 `Checkpoint(ctx)`,可顺带支持 `PRAGMA optimize`。 ### 改动文件 `internal/store/queue.go`、`db.go`。 ### 与其他问题的交互 / 冲突说明 L-03、C-03 依赖本条;与 D-01 同文件,存储线内顺序合入。 ### 验收与测试 - 并发 `Do` 与 `Close` 1000 次无 panic,关闭后 `Do` 返回 `ErrQueueClosed`。 - 执行 `Checkpoint` 后 WAL 文件大小回落。 --- <sub>复审基线:main `4059a15`(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。</sub>
nixevol added the P2-mediumlane/storereview-2026-09-30 labels 2026-09-30 13:56:57 +08:00
Author
Owner

已合入 origin/main 0c9b459。落地提交 57c2f70 fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题 (#28)。

已合入 origin/main `0c9b459`。落地提交 `57c2f70` fix: 修复写队列 busy 恢复、关闭安全、备份与配置构建问题 (#28)。
Sign in to join this conversation.