-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: introduce background gc into SwonDisk #41
Conversation
并发控制应该没那么复杂,分层设计要求lower layer不会对upper layer有感知或依赖。因此只需要L4暴露一个“等待compaction完成”的API,在L5执行GC前调用一下即可,不需要在L4再去感知或等待跟GC有关的行为,和L5相关的都放在callback中完成
注意第4步和第5步需要考虑不会破坏当前系统本身提供的安全性,需要放在一个TX中执行
应该是将经由第3步后得到的有效块们统一读出来,有效块数量可能不足一个segment
前台GC只需要在一次write完判断是否触发即可
需要修正一下命名歧义,只有 |
5328e65
to
d0c9319
Compare
GC Draft
在目前的 GC 设计方案中,核心是 GCWorker,完成 Victim 的选择,数据的迁移,索引的更新。
数据布局
为了统计空间利用率和完成数据的迁移,引入了 Chunk 的概念,定义的大小为 1024 Block,与写入 Log 的大小一致. ChunkInfo 定义结构如下:
目前设计有点冗余,对应结构如下:
valid_block, free_space 需要持久化,通过 TxLog 来实现,其他的内容可以在重启时自动计算恢复,bitmap 为一个引用,无需持久化
Victim
目前定义为一个 trait,支持了贪心和循环扫描两种策略,后续可进行扩展
并发控制
GcWorker 目前会 stop the world:
TODO:GC 并不会等待所有的 IO 完成后再开始,因此 GC 会和 GC 开始前还未完成的 IO 产生一定程度的并发,如何解决?
GcWorker
GcWorker 通过 DiskInner 创建,以独立后台线程的方式运行,目前以定时的方式周期性启动 Background GC,根据
VictimPolicy
选出对应的 Victim,对其中的数据完成迁移,将旧空间设置为空,最终更新ReverseIndex
和LogicalBlockTable
。结构如下:目前仅支持周期性 Background GC,当前定义了前台 GC 的功能,但暂时未与前台读写集成(Condvar or Channel?)
TODO: 目前后台线程依赖于 std::thread:: sleep,后续需要支持跨平台
数据迁移
WATERMARK
,默认值为 16,在循环中如果某一次没选出 Victim 则终止