首页 > 其他分享 >RocksDB代码分析——Compaction流程

RocksDB代码分析——Compaction流程

时间:2024-09-28 13:38:11浏览次数:1  
标签:PickCompaction 流程 RocksDB Compaction output path DBImpl compaction

这里从DBImpl::MaybeScheduleFlushOrCompaction开始讲起。

DBImpl::MaybeScheduleFlushOrCompaction可能会scheduleDBImpl::BGWorkFlushDBImpl::BGWorkCompaction。这里主要看Compaction。Flush部分见 {% post_link Storage/'RocksDB代码分析——Flush流程' %}

DBImpl::BGWorkCompaction中调用了DBImpl::BackgroundCallCompaction

DBImpl::BackgroundCallCompaction中先锁住DBImpl::mutex_,保护DB元数据,然后调用DBImpl::BackgroundCompaction,然后调用DBImpl::MaybeScheduleFlushOrCompaction,我的理解是compaction完成之后下一层可能过大了,这样就需要做新的compaction。DBImpl::BackgroundCallCompaction返回的时候会自动把DBImpl::mutex_给释放掉。

DBImpl::BackgroundCompaction中:

  • 如果不是prepicked compaction,那么:

调用DBImpl::PickCompactionFromQueuecompaction_queue_里取出一个ColumnFamilyData *cfd
调用cfd->PickCompaction,得到Compaction *,作为要做的任务。

ColumnFamilyData::PickCompaction调用compaction_picker_->PickCompaction
ColumnFamilyData::compaction_picker_是在ColumnFamilyData的构造函数里根据ioptions_.compaction_style赋值的。

struct AdvancedColumnFamilyOptions {
 // The compaction style. Default: kCompactionStyleLevel
 CompactionStyle compaction_style = kCompactionStyleLevel;

所以我们假设ColumnFamilyData::compaction_picker_LevelCompactionPicker,即假设ColumnFamilyData::PickCompaction调用的compaction_picker_->PickCompaction其实是LevelCompactionPicker::PickCompaction
LevelCompactionPicker::PickCompaction调用LevelCompactionBuilder::PickCompaction

选择输入文件:{% post_link Storage/'RocksDB代码分析——Compaction的输入文件的选择' %}
调用LevelCompactionBuilder::GetCompaction构造Compaction对象。

将要返回的Compaction *中的score会被设置为start level的score。
Compaction的构造函数中调用Compaction::MarkFilesBeingCompacted将输入文件标记为being_compacted,防止出现一边compaction一边上面compact到输入层的情况。
调用VersionStorageInfo::ComputeCompactionScore重新计算各层的score。除了Level 0,其他层的score等于没有在compact的file的compensated_file_size除以该层的最大字节数。只有score>=1的层才会被选择作为compaction的start level,见LevelCompactionBuilder::SetupInitialFiles({% post_link Storage/'RocksDB代码分析——Compaction的输入文件的选择' %})。file的compensated_file_sizeVersionStorageInfo::ComputeCompensatedSizes中计算得到。

  • 如果是prepicked compaction,那么就将prepicked_compaction->compaction作为要做的compaction任务。

DBImpl::BackgroundCompaction中,取出compaction任务后:

  • 如果是最底层的compaction,而且不是prepicked compaction,那么就把priority改成BOTTOM,并且设置成prepicked_compaction,然后schedule DBImpl::BGWorkBottomCompaction,这个函数其实最后还是回到了DBImpl::BackgroundCompaction。这其实就相当于推迟bottom level的compaction。

  • 如果是prepicked compaction,或者不是最底层的compaction,那么:

构造CompactionJob compaction_job,其中FSDirectory* output_directory被设置成GetDataDir(c->column_family_data(), c->output_path_id())
mutex_.Unlock(),执行compaction_job.Run(),再mutex_.Lock()DBImpl::mutex_最开始是在DBImpl::BackgroundCallCompaction里锁住用来保护数据库元数据的,这里要执行耗时操作了,所以暂时把锁放开。
compaction_job.Install

CompactionJob::InstallCompactionResults

先把输入文件删掉:compaction->AddInputDeletions(edit);
再把输出文件加上:edit->AddFile

Compaction::ReleaseCompactionFiles,将输入文件的being_compacted标志清除。

CompactionJob::output_directory

它决定了compaction的结果应该放到哪个文件夹中。这里探究一下它是怎么确定的。

构造CompactionJob时,FSDirectory* output_directory被设置成GetDataDir(c->column_family_data(), c->output_path_id())

c->output_path_id()返回的是Compaction::output_path_id_。它是从Compaction的构造函数的参数来的。

假如compaction任务(Compaction)是通过cfd->PickCompaction得到的。根据前面的分析,这些compaction任务默认是由LevelCompactionBuilder::GetCompaction构造的,其中output_path_id: GetPathId(ioptions_, mutable_cf_options_, output_level_)

/*
 * Find the optimal path to place a file
 * Given a level, finds the path where levels up to it will fit in levels
 * up to and including this path
 */
uint32_t LevelCompactionBuilder::GetPathId(
    const ImmutableCFOptions& ioptions,
    const MutableCFOptions& mutable_cf_options, int level) {

大意就是检查ImmutableCFOptions::cf_paths的每个cf_path,直到找到某个path能放下要compact到的那个level。

这个ImmutableCFOptions的来源见{% post_link Storage/'RocksDB代码分析——各种option的传递' %}

标签:PickCompaction,流程,RocksDB,Compaction,output,path,DBImpl,compaction
From: https://www.cnblogs.com/searchstar/p/18437451

相关文章

  • 微服务JSR303解析部署使用全流程
    目录1、什么是JSR303校验2、小试牛刀【2.1】添加依赖【2.2】添加application.yml配置文件修改端口【2.3】创建实体类User【2.4】创建控制器【2.5】创建启动类【注意】不必创建前端页面3、规范返回值格式:3.1添加ResultCode工具类3.2添加Result类3.3添加ValidationEx......
  • 开源电商系统启航电商ERP系统几个核心流程的设计说明
    1、订单拉取流程开放平台拉取订单模块消息队列订单处理模块拉取订单请求订单数据发送订单通知......
  • 智慧充电平台/充电桩管理系统/小程序/APP的开发流程
    智慧充电平台开发方案旨在打造一个集充电设施管理、用户服务、数据分析与优化于一体的综合性平台,以提升电动汽车充电的便捷性和效率。以下是一个详细的开发方案概述:一、需求分析‌市场与用户调研‌:了解当前电动汽车充电市场的现状、发展趋势。收集用户对充电设施的需求、使......
  • 智慧停车道闸管理系统开发流程
    智慧停车管理平台开发方案是一个综合性的项目,旨在通过技术手段优化停车资源的分配和管理,提升停车效率和用户体验。以下是一个详细的开发方案概述:一、需求分析‌市场与用户调研‌:首先进行市场调研,了解当前智慧停车市场的现状、用户需求、竞争对手情况等信息。同时,通过问卷调......
  • Android拨号流程
    Android拨号流程是一个涉及多个组件和层级的复杂过程,从用户点击拨号按钮开始,直到电话被拨出并显示在通话界面上。以下是Android拨号流程的主要步骤:1.用户交互阶段用户通过Dialer应用(如Phone应用)的拨号界面输入电话号码,并点击拨号按钮。这一操作会触发DialpadFragment中的onClick事......
  • 【免费领51CTO博客定制咖啡杯】agent智能体开发流程
    1、激励策略的设计在“自我激励心灵大师”的开发过程中,设计有效的激励策略是关键。智能体通过分析用户的目标和情绪状态,提供定制化的建议。例如,对于需要提高效率的用户,智能体提供时间管理和目标设定的建议。2、用户情绪挑战用户在实际使用过程中会遇到各种情绪挑战,如焦虑或挫败感。......
  • MFi认证办理流程及费用
    MFi认证是苹果公司(AppleInc.)对其授权配件厂商生产的外置配件的一种标识使用许可,全称为“MadeforiPhone/iPod/iPad”,是苹果公司“madeforiPhone”、“madeforiPod”、“madeforiPad”的英文缩写。MFi认证定义是苹果公司为了保证其配件产品的质量和兼容性,对连接iPod、iPhone......
  • SAP B1 流程实操 - 营销单据采购部分(上)
    背景在SAPB1中,除开【销售】外超常用的模块就是【采购】,企业可能不涉及生产和库存(贸易公司),甚至不涉及采购(服务业),但是一定会有基本的销售。本文中我们讲解销售模块的基本核心,即各个营销单据之间的转化关系。博主通过查看单据是否显示【营销单据】下新建的用户定义字段来......
  • 无线打气泵方案应用开发流程
    在方案开发中,充气效率是无线打气泵PCBA方案开发中的关键问题。一般通过优化电路设计和控制算法,可以实现高效的气体压缩和快速的充气效果。另外,选择合理的电机驱动器和传感器等元器件能够提高打气泵的功率和效率,减少充气时间,使得方案更具优化效果。下面就来简单聊下无线打......
  • 等保托管怎么样,流程是什么样的?
    随着信息技术的快速发展,网络安全问题愈发凸显。为了保护信息系统的安全,国家推出了网络安全等级保护制度(简称“等保”),企业在面对这一制度的同时,也逐渐意识到等保托管的重要性。等保托管旨在通过专业的安全服务,提高企业信息系统的安全防护能力,确保其在运行过程中的安全性和合规性......