54 lines
3.1 KiB
Markdown
54 lines
3.1 KiB
Markdown
# v0.2.1 生产加固方案
|
||
|
||
## 核心原则
|
||
- **所有新增测试方法必须确保不会导致 CI 卡死**(无 setTimeout/setInterval 泄漏,无 fake-indexeddb 滥用,无无限循环)
|
||
- 优先级 P0 → P1 → P2 顺序执行
|
||
|
||
## P0 — Critical(4项)
|
||
|
||
1. **Memory 引擎事务回滚修复** — `src/engine/memory.ts` 的事务快照机制已存在但 TransactionManager 未正确调用。修复 `src/transaction/index.ts` 在 rollback 时调用引擎层 rollback。
|
||
|
||
2. **WAL CRC 校验验证** — `src/engine/aria/wal/log.ts` decodeAllRecords 跳过 CRC,恢复时验证 CRC 不匹配则丢弃 + 告警。
|
||
|
||
3. **Hybrid 引擎提交顺序** — `src/hybrid/index.ts` commit 先写磁盘再写内存,磁盘失败回滚内存。
|
||
|
||
4. **SSTableReader rangeScan 边界条件** — 修复多 block 场景下 startBlockIdx/endBlockIdx 可能越界。
|
||
|
||
## P1 — High(6项)
|
||
|
||
5. **ColumnDef 约束激活** — `src/table/schema.ts` checkFieldType 中激活 min/max/maxLength 校验。配套新增 schema 测试(纯同步,不会卡死)。
|
||
|
||
6. **查询结果上限** — `DatabaseConfig` 增加 `maxRowsPerQuery` 默认 10000,所有引擎 find() 中截断。测试用 memory 引擎(纯同步)。
|
||
|
||
7. **`onError` 回调接入** — `src/core.ts` CRUD 操作 catch 块调用 `this.config.onError`。测试用 jest.fn() 验证(同步断言)。
|
||
|
||
8. **OPFS 引擎基础测试** — 补 5 个测试:open/close、createTable、insert、find、count。由于 OPFS 浏览器专属,测试用内存 fallback mock 方式,避免 jsdom 不具备 OPFS 导致卡死。
|
||
|
||
9. **MVCC gc() 定期调用** — AriaEngine `checkpointManager.tick()` 后每 N 次 op 调用一次 gc()。测试用 MVCC 单元测试(纯同步)。
|
||
|
||
10. **SSTable `get()` 返回 null 兜底** — 已修复(P0-4包含)
|
||
|
||
## P2 — Medium(6项)
|
||
|
||
11. **LZ4 压缩修复 + 正确性测试** — 修复 compress/decompress 往返 bug,补 3 个往返正确性测试。**注意**:测试数据量控制在 500 字节以内,避免大循环。纯同步测试。
|
||
|
||
12. **debug 模式** — `DatabaseConfig` 加 `debug: boolean`,console.debug 输出关键操作日志。
|
||
|
||
13. **RESTRICT 外键行为修正** — cascadeDelete 检测到引用行时抛 `FOREIGN_KEY_VIOLATION` 而非静默保留孤儿。
|
||
|
||
14. **浏览器兼容表** — README 补充 Chrome 80+/Firefox 80+/Safari 14+/Edge 80+ 支持声明。
|
||
|
||
15. **React/Vue 集成去 @ts-nocheck** — 移除注释,补充完整类型声明。(测试仅验证编译不验证运行时,避免 jsdom 缺失 hooks 导致卡死)
|
||
|
||
16. **SQL 多语句防护** — Parser 检测到多余分号后还有有效 token 时报 `PARSE_ERROR`。
|
||
|
||
## 严禁事项(新增测试必须遵守)
|
||
|
||
- ❌ 不使用 `setTimeout`/`setInterval` 除非配合 `jest.useFakeTimers()`
|
||
- ❌ 不使用 `fake-indexeddb` 进行多轮 open/close/reopen
|
||
- ❌ 不创建 IndexedDB 连接后不关闭
|
||
- ❌ 不使用 `done()` 回调模式
|
||
- ❌ 不对大数据集(>1000条)做 O(n²) 操作
|
||
- ✅ 优先使用 async/await + Memory Backend
|
||
- ✅ Mock 代替真实浏览器 API
|
||
- ✅ 每个 afterEach 确保资源清理 |