refactor(storage): MemTable 更名为 Engine,跳表拆出独立文件 - #272
Conversation
该类型持有 active/dirty 两张跳表、一组 SSTable(sst 字段)、字节级背压信用,并驱动 flush 与 compaction 两个后台协程——它是完整的 LSM 引擎,而不是一张内存表。名字与职责 不符会误导读者:想找存储引擎的人找不到,看到 MemTable 的人以为它只管内存。 真正的内存表是 SkipList,随之从同一文件拆到 skiplist.go:它是一个不加锁的有序数据结构, 并发由持有者统一同步,与 flush / compaction / SSTable 无关。engine.go 与 skiplist.go 的职责因此各自单一(436 / 175 行)。 不改的:配置项(MaxMemTableSize、MemTableMaxInflightBytes、MaxMemTableLevel、 MaxMemTableP)与指标名(SetMemTableGauges、memtable_inflight_bytes)。它们对外可见, 且描述的确实是 memtable 那一部分,改名只会破坏既有配置与观测。 拆分中两处文档注释被错误地挂到了相邻类型上(Engine 顶着 SkipList 的说明),已重写为各自 准确的描述,并补上双表为何能让 flush 在锁外进行。测试文件随之更名 engine_test.go / engine_semantics_test.go。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (12)
📝 WalkthroughWalkthroughChangesThe storage implementation is renamed from Storage engine migration
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related issues
Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🐯 BanGD 数据库内核评审整体风险:🟢 低 变更总结:这是一个纯粹的重命名/重组 PR:把原 从架构看,此 PR 不改变任何运行时行为——跳表方法只是原样搬移、类型名机械替换,未动同步语义、磁盘格式、WAL 或隔离级别。结论是「纯结构重组」,逻辑正确性可通过既有测试(含 -race)覆盖。风险集中在改名可能遗留的引用未同步(如注释/局部变量仍叫 MemTable)、
架构问题(共 2 项)
普通问题(共 3 项)💡 [建议 · 命名一致性]
💡 [建议 · 命名一致性]
💡 [建议 · 命名一致性]
本次评审消耗 token:共 208745 tokens(输入 192375,输出 4338,缓存命中 12032,缓存写入 0)|维度 [concurrency, memory, lock, storage, performance]|补充阅读周边文件 [storage/sstable.go, storage/wal.go]|对抗式复核 3 票/条,过滤疑似误报 0 条 |
删掉那层纯转发的
Engine空壳后暴露出的真问题:真正的引擎一直叫MemTable。它到底持有什么
再加上
getFromSSTables/FlushToSSTable/CompactSSTable—— 这是完整的 LSM 引擎,不是一张内存表。名字与职责不符会双向误导:想找存储引擎的人找不到,看到MemTable的人以为它只管内存。对照 Badger 的
DB{mt, imm, lc}、Pebble 的DB{mu.mem, mu.versions}——引擎持有内存表与层级,而不是反过来由内存表持有一切。改了什么
MemTable→Engine,构造器NewMemTable→NewEngine。SkipList,从同一文件拆到skiplist.go:它是一个不加锁的有序数据结构,并发由持有者统一同步,与 flush / compaction / SSTable 无关。两个文件职责因此各自单一(engine.go436 行 /skiplist.go175 行)。engine_test.go与engine_semantics_test.go。刻意不改的
配置项
MaxMemTableSize/MemTableMaxInflightBytes/MaxMemTableLevel/MaxMemTableP,以及指标名SetMemTableGauges/memtable_inflight_bytes。它们对外可见(配置文件、观测日志),且描述的确实是 memtable 那一部分——改名只会破坏既有配置与监控,不会让谁更清楚。过程中的两处自我修正
Engine顶着SkipList的说明,SkipNode顶着旧MemTable的说明)。已重写为各自准确的描述,并补上「双表为何能让 flush 在锁外进行」这一关键设计理由。Engine文档里我一度写了「该类型此前叫 MemTable」——这正是我两个 PR 前刚清理掉的「注释叙述历史」。已改为陈述当前的区分(内存表是 SkipList,Engine 是持有它们的整条链路),历史留在 git 里。验证
go build ./...(含-tags pprof)、go vet ./...、go test -race ./...、gofmt全绿;scripts/bench.sh实跑通过。🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Engineinterface.Refactor
Tests