|
|
@@ -50,16 +50,18 @@ const (
|
|
|
// 提供介绍 (newHeader 传空串), 头页 Comment 区默认写入本文案 —— 拿到一个
|
|
|
// .db 文件的人从头页就能读到这个库是什么版本、有什么能力。
|
|
|
//
|
|
|
- // 约束: 必须 ≤ HeaderPage.Comment 的容量 (PageSize4K-844 = 3252 字节),
|
|
|
- // 超长会在编译期由 header_page.go 的断言挡住? 不会 — 是 newHeader 运行期报错。
|
|
|
+ // 约束: 必须 ≤ HeaderPage.Comment 的容量 (PageSize4K - 332 = 3764 字节),
|
|
|
+ // 超长会在运行期由 newHeader 报错。
|
|
|
// 改版本时同步更新本文案。
|
|
|
- VersionComment = `TsDB2 (VRTX) 格式版本 v11 — 功能与修复:
|
|
|
-· HeaderPage 重排: FreePageEnd 紧邻 FreePageStart, 字段 8 字节对齐零填充; Comment 扩为 3252B 介绍区
|
|
|
+ VersionComment = `TsDB2 (VRTX) 格式版本 v12 — 功能与修复:
|
|
|
+· v12 引擎级修复: Windows LockFileEx 锁偏移从 0 改为 EOF+1 — 原锁偏移 0 被 NTFS 按 4KB 页粒度落锁, 整个头页被锁死, ReadHeader 读到零数据, RecoverWAL 整个空转; 现已避开所有有效页, 跨进程互斥语义不变
|
|
|
+· v12 引擎级修复: writeHeaderLocked 加 bp.UpdatePage(0, buf[:]) — 原 WriteAt(0) 绕过缓冲池, Close 时 bp.Flush 把陈旧 FirstWAL 缓存写回去覆盖 RecoverWAL 刚落盘的干净头页
|
|
|
+· v11 头页字段重排 (v11 库不兼容, 需重建): FreePageEnd 紧邻 FreePageStart, 字段 8 字节对齐零填充; Comment 扩为 3764B 介绍区
|
|
|
+· BufferPool 采样时间戳 LRU: atomic 时间戳替代双向链表 (cache-hit 路径全程 RLock+atomic, 无写锁), 32 采样淘汰干净页 (池子 ≤ 32 精确 LRU, > 32 近似 LRU), 脏页永不淘汰
|
|
|
· 查询执行器: IN 走索引 / 二级索引批量回表 / ORDER BY+LIMIT 流式 top-k / Select 投影下推
|
|
|
-· BufferPool 真 LRU + 读缓存; WAL 提交链优化; 无唯一索引表 Update 跳过预检序列化
|
|
|
· 复合索引处理器 = SBT B+ 树, 分量不限 8 字节
|
|
|
· 正确性: 事务/崩溃恢复的页回收时序 (删空页延迟还链), VACUUM 重建保真 (索引名/类型/NULL), ORM 查询错误传播
|
|
|
-· 结构: RowStoreHandler 能力接口, table_*.go / query_*.go / btree 生命周期拆分`
|
|
|
+· 常量管理: FileLockByteCount / MaxBufferPoolCapacity / BlobChainMax 等硬编码集中 const.go 管理`
|
|
|
|
|
|
// PageSize 数据页大小 (16KB) — 索引页、数据页、WAL 页统一使用
|
|
|
PageSize uint32 = 4096 * 4
|