mini-lsm通关笔记Week3Day7
恭喜你!你成功了!在上一章中,您使您的LSM引擎具有多版本的能力,并且用户可以使用事务API与您的存储引擎进行交互。在本周末,我们将实现存储引擎的一些简单但重要的特性。欢迎来到Mini-LSM的第3周零食时间!
在本章中,我们将提取我们的合并垃圾回收逻辑,成为合并过滤器。
目前,我们的合并将简单地保留watermark 上方的密钥和watermark 下方的密钥的最新版本。我们可以在合并过程中添加一些魔术,帮助用户自动收集一些未使用的数据,作为后台作业。
考虑一个案例,用户使用Mini-LSM来存储数据库表。表中的每一行都以表名为前缀。例如:
table1_key1 -> row
table1_key2 -> row
table1_key3 -> row
table2_key1 -> row
table2_key2 -> row
现在用户执行DROP TABLE table1
。引擎需要清理从table1
开始的所有数据。
实现目标的方法有很多。Mini-LSM的用户可以扫描所有以table1
开头的键,并请求引擎删除它。但是,扫描一个非常大的数据库可能会很慢,并且它将生成与现有键相同数量的删除墓碑。因此,scan-and-delete
不会释放被删除的表所占用的空间——相反,它会向引擎中添加更多的数据,并且只有当墓碑到达引擎的底层时才能回收空间。
或者,他们可以创建列族(我们将在《TBD》章节中讨论这个问题)。它们将每个表存储在一个列族中,这是一个独立的LSM状态,当用户drop table时,直接删除列族对应的SST文件。
在本课程中,我们将实现第三种方法:合并过滤器。合并过滤器可以在运行时动态添加到引擎中。在合并的过程中,如果找到了与合并过滤器匹配的key,我们可以在后台默默的移除它。因此,用户可以将prefix=table1
的合并过滤器附加到引擎上,在合并过程中,所有这些键都将被移除。
Task 1-Compaction Filter
在此任务中,您需要修改:
src/compact.rs
您可以在
LsmStorageInner::compaction_filters
中迭代所有的合并过滤器。如果watermark
下面的键的第一个版本与合并过滤器匹配,只需将其删除,而不是将其保留在SST文件中。要运行测试用例,请执行以下操作:
cargo x copy-test --week 3 --day 7 cargo x scheck
您可以假设用户不会获得前缀过滤器范围内的键。并且,它们不会扫描前缀范围内的键。因此,当用户请求前缀过滤器范围内的键(即未定义的行为)时,返回错误的值是可以的。
先计算是否在前缀过滤器中:
let mut is_not_in_filter = true;
if !compaction_filters.is_empty() {
for filter in &compaction_filters {
match filter {
CompactionFilter::Prefix(x) => {
if iter.key().key_ref().starts_with(x) {
is_not_in_filter = false;
break;
}
}
}
if !is_not_in_filter {
break;
}
}
}
在所有设置first_key_below_watermark
为true
前,加上is_not_in_filter
变量的判断。
if same_as_last_key {
if !first_key_below_watermark && key.ts() <= watermark && is_not_in_filter { // 【修改】新增is_not_in_filter判断
first_key_below_watermark = true;
} else if key.ts() <= watermark {
...
}
} else if key.ts() <= watermark && is_not_in_filter { // 【修改】新增is_not_in_filter判断
first_key_below_watermark = true;
} else {
...
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战