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_watermarktrue前,加上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 {
    ...
}
posted @   余为民同志  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示