Преглед на файлове

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

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

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

影响: Analyzer 之前会显示已删除的 order 表(无索引),
修复后正确过滤已删除表.
yl32940 преди 1 месец
родител
ревизия
2e5ed75662

+ 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
 }

BIN
analyzer/analyzer.exe


BIN
demo/full_test/free_pages_view.png


BIN
demo/full_test/free_pages_view2.png


BIN
demo/full_test/heap_pages_view.png


BIN
demo/full_test/heap_pages_view2.png


BIN
fulltest.db