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

RocksDB代码分析——Flush流程

时间:2024-09-28 13:38:49浏览次数:1  
标签:调用 VersionBuilder 流程 RocksDB Flush Rep flush ColumnFamilyData DBImpl

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

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

DBImpl::BGWorkFlush中调用了DBImpl::BackgroundCallFlush

DBImpl::BackgroundCallFlush中先上DB锁,然后调用DBImpl::BackgroundFlush,最后再调用DBImpl::MaybeScheduleFlushOrCompaction

DBImpl::BackgroundFlush中先调用DBImpl::PopFirstFromFlushQueueDBImpl::flush_queue_中取出FlushRequest flush_req(唯一的取出者),从中再取出ColumnFamilyData。再把这些ColumnFamilyData放进bg_flush_args,作为DBImpl::FlushMemTablesToOutputFiles的参数。DBImpl::flush_queue_里的FlushRequest的来源见:{% post_link Storage/"RocksDB代码分析——写入流程" %}。最后再将这些ColumnFamilyDataUnrefAndTryDelete

DBImpl::FlushMemTablesToOutputFiles中,如果不是atomic_flush(默认),那么一定只有一个要flush的MemTable。把ColumnFamilyData拿出来,作为参数传给DBImpl::FlushMemTableToOutputFile

构造FlushJob flush_job
flush_job.PickMemTable(),把MemTable的VersionEdit存在FlushJob::edit_里。
flush_job.Run,也就是调用FlushJob::Run

调用FlushJob::WriteLevel0Table

db_mutex_->Unlock();
BuildTable
db_mutex_->Lock();
edit_->AddFile。这个edit_实际上是MemTable的VersionEdit

调用MemTableList::TryInstallMemtableFlushResults

将被flush的memory table的flush_completed_标记为true
从老到新把所有flush_completed_的immutable memory table的VersionEdit存进edit_list,然后通过VersionSet::LogAndApply commit这些edit,里面调用VersionSet::ProcessManifestWrites

调用VersionBuilder::Apply,里面调用VersionBuilder::Rep::Apply,里面调用VersionBuilder::Rep::ApplyFileAddition,最终将file_number存到VersionBuilder::Rep::levels_[level].added_files里。
调用VersionBuilder::SaveTo,里面调用VersionBuilder::Rep::SaveTo,里面调用VersionBuilder::Rep::SaveSSTFilesTo,先对VersionBuilder::Rep::levels_[level].added_files排序,L0的SSTable用NewestFirstBySeqNo排序,其他的用BySmallestKey排序,然后跟老version里已有的SSTable merge到一个新的version。

ColumnFamilyData作为参数调用DBImpl::InstallSuperVersionAndScheduleWork

因为把MemTable写入到L0层之后总是会想要把这些SSTable给compact到L1层,所以接下来准备schedule compaction。
ColumnFamilyData作为参数调用DBImpl::SchedulePendingCompaction

ColumnFamilyData传给DBImpl::AddToCompactionQueue,从而将其加入到DBImpl::compaction_queue_中。

调用DBImpl::MaybeScheduleFlushOrCompaction
接下来的compaction流程看这里:

标签:调用,VersionBuilder,流程,RocksDB,Flush,Rep,flush,ColumnFamilyData,DBImpl
From: https://www.cnblogs.com/searchstar/p/18437453

相关文章

  • RocksDB代码分析——Compaction的输入文件的选择
    这里主要分析LevelCompactionBuilder::PickCompaction是如何选择输入文件的。SetupInitialFiles();找一个需要compact到下层的SSTfile。只会在score>=1的level里找。score的计算见VersionStorageInfo::ComputeCompactionScore({%post_linkStorage/'RocksDB代码分析——Compa......
  • RocksDB代码分析——Compaction流程
    这里从DBImpl::MaybeScheduleFlushOrCompaction开始讲起。DBImpl::MaybeScheduleFlushOrCompaction可能会scheduleDBImpl::BGWorkFlush和DBImpl::BGWorkCompaction。这里主要看Compaction。Flush部分见{%post_linkStorage/'RocksDB代码分析——Flush流程'%}DBImpl::BGWorkCo......
  • 微服务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中,除开【销售】外超常用的模块就是【采购】,企业可能不涉及生产和库存(贸易公司),甚至不涉及采购(服务业),但是一定会有基本的销售。本文中我们讲解销售模块的基本核心,即各个营销单据之间的转化关系。博主通过查看单据是否显示【营销单据】下新建的用户定义字段来......