Jelajahi Sumber

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

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

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

影响: Analyzer 之前会显示已删除的 order 表(无索引),
修复后正确过滤已删除表.
yl32940 1 bulan lalu
induk
melakukan
2e5ed75662
7 mengubah file dengan 2 tambahan dan 1 penghapusan
  1. 2 1
      DB/core/db.go
  2. TEMPAT SAMPAH
      analyzer/analyzer.exe
  3. TEMPAT SAMPAH
      demo/full_test/free_pages_view.png
  4. TEMPAT SAMPAH
      demo/full_test/free_pages_view2.png
  5. TEMPAT SAMPAH
      demo/full_test/heap_pages_view.png
  6. TEMPAT SAMPAH
      demo/full_test/heap_pages_view2.png
  7. TEMPAT SAMPAH
      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
 }

TEMPAT SAMPAH
analyzer/analyzer.exe


TEMPAT SAMPAH
demo/full_test/free_pages_view.png


TEMPAT SAMPAH
demo/full_test/free_pages_view2.png


TEMPAT SAMPAH
demo/full_test/heap_pages_view.png


TEMPAT SAMPAH
demo/full_test/heap_pages_view2.png


TEMPAT SAMPAH
fulltest.db