浏览代码

fix: DropTable 后 Flag(0x80) 未持久化到磁盘

根因: Drop() 通过 SavePage(走BufferPool) 标记表为已删除,
但 DropTable 最后调用 ClearCache() 直接清空缓存,
导致脏页中的 Flag=0x80 修改丢失, 重启后已删除的表重新出现.

修复: 在 ClearCache() 前调用 FlushBufferPool() 刷盘,
确保 Drop 标记写入磁盘.

影响: Analyzer 之前会显示已删除的 order 表(无索引),
修复后正确过滤已删除表.
yl32940 1 月之前
父节点
当前提交
2e5ed75662
共有 7 个文件被更改,包括 2 次插入 和 1 次删除
  1. 2 1
      DB/core/db.go
  2. 二进制
      analyzer/analyzer.exe
  3. 二进制
      demo/full_test/free_pages_view.png
  4. 二进制
      demo/full_test/free_pages_view2.png
  5. 二进制
      demo/full_test/heap_pages_view.png
  6. 二进制
      demo/full_test/heap_pages_view2.png
  7. 二进制
      fulltest.db

+ 2 - 1
DB/core/db.go

@@ -160,7 +160,8 @@ func (db *DB) DropTable(name string) error {
 	db.header.TableCount--
 	_ = db.file.WriteHeader(db.header)
 	db.updateTime()
-	// 回收页后再次清除缓存, 防止 stale 数据
+	// 先刷盘再清缓存, 防止 Drop 中标记的 Flag(0x80) 丢失
+	db.file.FlushBufferPool()
 	db.file.ClearCache()
 	return nil
 }

二进制
analyzer/analyzer.exe


二进制
demo/full_test/free_pages_view.png


二进制
demo/full_test/free_pages_view2.png


二进制
demo/full_test/heap_pages_view.png


二进制
demo/full_test/heap_pages_view2.png


二进制
fulltest.db