leveldb的Compaction线程
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
1. leveldb的Compaction全局线程
在leveldb中,有一个全局的后台线程BGThread,用于数据库的MinorCompact与MajorCompact。
重点关注“全局线程”:
这个标识着无论一个进程打开多少个leveldb库,该Compact线程只有一个;
如果在一个程序中,打开了许多库在读写,多个库都触发了MinorCompact,那么这些MinorCompact将在Compact线程中依次执行;
也因为是全局线程,所以需要触发minorcompact的db线程,把db的this指针传递给Compact线程中来。
基于此,来看一下代码上的实现:
2. 任务Schedule部分,建立了一个创建一次的全局子线程
通过started_backgroud_thread_来标识是否已创建;
定义了一个std::thread backgroud_thread,并detach掉,形成一个全局的子线程;
把任务函数与参数放入到backgroud_work_queue_中;
void WindowsEnv::Schedule(void (*background_work_function)(void* background_work_arg),void* background_work_arg) {background_work_mutex_.Lock();// Start the background thread, if we haven't done so already.if (!started_background_thread_) {started_background_thread_ = true;std::thread background_thread(WindowsEnv::BackgroundThreadEntryPoint, this);background_thread.detach();}// If the queue is empty, the background thread may be waiting for work.if (background_work_queue_.empty()) {background_work_cv_.Signal();}background_work_queue_.emplace(background_work_function, background_work_arg);background_work_mutex_.Unlock();
}
3. 任务线程执行部分,不断的从队列中取任务函数与参数,并执行任务函数
从backgroud_work_queue_中取出任务函数与参数,执行函数;
其中为了避免queue中一直没有数据一直取的情况,使用了一个backgroupd_work_cv来在为空时等待;
static void BackgroundThreadEntryPoint(WindowsEnv* env) {env->BackgroundThreadMain();
}
void WindowsEnv::BackgroundThreadMain() {while (true) {background_work_mutex_.Lock();// Wait until there is work to be done.while (background_work_queue_.empty()) {background_work_cv_.Wait();}assert(!background_work_queue_.empty());auto background_work_function = background_work_queue_.front().function;void* background_work_arg = background_work_queue_.front().arg;background_work_queue_.pop();background_work_mutex_.Unlock();background_work_function(background_work_arg);}
}
4. 在需要触发Compact的地方,传入任务函数BGWork与当前库的指针
调用MaybeScheduleCompaction,在其中判定一个需要Compact的场景,排除掉一些不需要发起Compact的场景:
- 已经在执行Compact的场景除外;
- 已经关闭完毕的场景除外;
- 该数据库后台已经有问题的场景除外;
- 没有需要Compact的场景除外:没有待执行的Minorcompact+也没有待执行的手动Compaction+没有待执行的size-compaction/file-compaction;
void DBImpl::MaybeScheduleCompaction() {mutex_.AssertHeld();if (background_compaction_scheduled_) {// Already scheduled}else if (shutting_down_.load(std::memory_order_acquire)) {// DB is being deleted; no more background compactions}else if (!bg_error_.ok()) {// Already got an error; no more changes}else if (imm_ == nullptr && manual_compaction_ == nullptr &&!versions_->NeedsCompaction()) {// No work to be done}else {background_compaction_scheduled_ = true;env_->Schedule(&DBImpl::BGWork, this);}
}
4. 任务函数BGWork又做了什么呢?
BGWork是一层包装,直接调用数据db参数的方法BackgroundCall;
- 里面又检查了一次数据库已经关闭的场景和数据库任务出错情况,因为从任务排到队列中,到排到任务执行,可能是要等一段时间的,在这个过程中,也可能条件改变了。
- 接着执行BackgroundCompaction来做该db的Compaction;
- 做完Compaction之后,把background_compaction_scheduled设定为false,以允许MaybeScheduleCompaction再次进入;
- 接着就调用MaybeScheduleCompaction函数,再检查一边这个数据有没有待compaction内容未做完,例如这一次只做了MinorCompact,还有MajorCompact要做,再次去排队等执行;
- 然后再来标识库的db后台任务项当前执行完了,发送一个信号background_work_finished_signal_;
background_work_finished_signal_这个信号量通常用来通知写线程或关闭线程,通知该db的后台一项任务做完了,通知等待线程可以继续向后执行了。
void DBImpl::BGWork(void* db) {reinterpret_cast<DBImpl*>(db)->BackgroundCall();
}void DBImpl::BackgroundCall() {MutexLock l(&mutex_);assert(background_compaction_scheduled_);if (shutting_down_.load(std::memory_order_acquire)) {// No more background work when shutting down.}else if (!bg_error_.ok()) {// No more background work after a background error.}else {BackgroundCompaction();}background_compaction_scheduled_ = false;// Previous compaction may have produced too many files in a level,// so reschedule another compaction if needed.MaybeScheduleCompaction();background_work_finished_signal_.SignalAll();
}
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
相关文章:
leveldb的Compaction线程
个人随笔 (Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 1. leveldb的Compaction全局线程 在leveldb中,有一个全局的后台线程BGThread,用于数据库的MinorCompact与MajorCompact。 重点关注“全局线程”: 这个标识着无论一个进程打开…...
邪恶的想法冒出,立马启动python实现美女通通下
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 完整源码、python资料: 点击此处跳转文末名片获取 当我在首页刷到这些的时候~ 我的心里逐渐浮现一个邪念:我把这些小姐姐全都采集,可以嘛? 答案当然是可以的~毕竟就我这技术,…...
蓝桥杯刷题冲刺 | 倒计时18天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态(包括边…...
经典算法面试题——Java篇-附带赠书活动,评论区随机选取一人赠书
目录 一.图书推荐 二.说一下什么是二分法?使用二分法时需要注意什么?如何用代码实现? 三.什么是插入排序?用代码如何实现? 四.什么是冒泡排序?用代码如何实现? 五.什么是斐波那契数列&#…...
支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了
支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了 熟悉RT-Thread和瑞萨MCU的朋友都知道,当前RT-Thread仓库的主线代码是不支持RA2E1这个BSP的。刚好,最近我在联合瑞萨推广一个叫《致敬未来的攻城狮计划》,使用的就是RA2E1开发板&…...
【C语言进阶】 12. 假期测评①
day01 1. 转义字符的判断 以下不正确的定义语句是( ) A: double x[5] {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] {‘\x10’, ‘\xa’, ‘\8’}; C: char c1[] {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[53]{0, 1, 3, 5, 7, 9}; 【答案解析】 B 本…...
给程序加个进度条吧,1行Python代码,快速添加~
大家好,这里是程序员晚枫。 你在写代码的过程中,有没有遇到过以下问题? 已经写好的程序,想看看程序执行的进度? 在写代码批量处理文件的时候,如何显示现在处理到第几个文件了? 👆…...
常见的Keil5编译报错及其原因和解决方法
以下是几种常见的Keil5编译报错及其原因和解决方法: "Error: L6218E: Undefined symbol"(未定义符号错误) 这通常是由于缺少对应的库文件或者代码中有未声明的变量或函数引起的。解决方法是检查相应的库文件是否已正确添加到工程中…...
Django 实现瀑布流
需求分析 现在是 "图片为王"的时代,在浏览一些网站时,经常会看到类似于这种满屏都是图片。图片大小不一,却按空间排列,就这是瀑布流布局。 以瀑布流形式布局,从数据库中取出图片每次取出等量(7 …...
传输层协议----UDP/TCP
文章目录前言一、再谈端口号端口号的划分认识知名端口号(Well-Know Port Number)两个问题nestatpidof二、UDP协议UDP协议端格式UDP的特点面向数据报UDP的缓冲区UDP使用注意事项基于UDP的应用层协议二、TCP协议TCP协议段格式可靠性问题确认应答(ACK)机制流量控制六个标志位PSHUG…...
教你如何快速在Linux中找到某个目录中最大的文件
工作中经常会有查看某个目录下最大的文件的需求,比如在运维工作中,发现某个系统或功能不工作了,经排查发现是服务器空间满了…那么接下来就需要清理一下临时文件或者日志文件,或者其他不需要的文件,那么就会想要查看一…...
Java二叉树面试题讲解
Java二叉树面试题讲解🚗1.检查两颗树是否相同🚕2.另一颗树的子树🚙3.二叉树最大深度🚌4.判断一颗二叉树是否是平衡二叉树🚎5.对称二叉树🚓6.获取树中结点个数🚑7.判断一个树是不是完全二叉树&am…...
rancher2.6进阶之nfs动态创建pv配置
添加NFS client provisioner 动态提供K8s后端存储卷 1.1.前提说明 1.1.1.说明 NFS client provisioner 利用 NFS Server 给 Kubernetes 作为持久存储的后端,并且动态提供PV。 默认 rancher 2 的存储类中的提供者不包含NFS,需要手动添加;添加方式有两种: 1)从应用商店直接安…...
快速上手vue elementUI好看的登录界面
这是一个非常非常适合新手的vue登录界面,总体来说美观大气,axios那部分没有发,有需要的大家可以自己进行二次开发,继续编写。 用到了技术栈有 vue/cli 5.07 element-ui 2.15.9 适合入门级新手,展示下页面 emmm验证码…...
Vue趣味【Vue3+Element Plus+Canvas实现一个简易画板;支持导出为图片】
目录🌟前言🌟粉丝先看🌟创建Vue3项目🌟引入Element Plus🌟实现代码(详细注释)🌟写在最后🌟JSON包里写函数,关注博主不迷路🌟前言 哈喽小伙伴们&a…...
【Spring Cloud Alibaba】2.服务注册与发现(Nacos安装)
文章目录环境要求简介安装Nacos源码安装Docker安装数据库配置访问服务我们要搭建一个Spring Cloud Alibaba项目就绕不开Nacos,阿里巴巴提供的Nacos组件,可以提供服务注册与发现和分布式配置服务,拥有着淘宝双十一十几年的流量经验,…...
深度学习 Day28——利用Pytorch实现好莱坞明星识别
深度学习 Day28——利用Pytorch实现好莱坞明星识别 文章目录深度学习 Day28——利用Pytorch实现好莱坞明星识别一、前言二、我的环境三、前期工作1、导入依赖项设置GPU2、导入数据集3、划分数据集四、调用官方的VGG16模型五、训练模型1、编写训练函数2、编写测试函数3、设置动态…...
Android中使用FCM进行消息推送
Firebase Cloud Message 的介绍 Firebase Cloud Message(FCM)是由Google推出的一种云端消息推送服务,它是由Google推出的Google Cloud Messaging(GCM)服务的升级版。在2016年5月,Google宣布将Google Cloud Messaging重命名为Firebase Cloud Message,作为Firebase的一部…...
从 X 入门Pytorch——BN、LN、IN、GN 四种归一化层的代码使用和原理
Pytorch中四种归一化层的原理和代码使用前言1 Batch Normalization(2015年提出)Pytorch官网解释原理Pytorch代码示例2 Layer Normalization(2016年提出)Pytorch官网解释原理Pytorch代码示例3 Instance Normalization(2…...
Windows环境下实施域名访问的一些小知识
文章目录 前言一、windows域名访问流程二、网络域名访问配置设置DNS未正确设置DNS的结果三、本地hosts设置本地hosts本地hosts的优先机制本地hosts的内部访问次序示例一示例二总结前言 作为一种常见的操作系统,windows系统具有其特殊的域名访问管理机制。了解其访问机制,将有…...
**基于Python实现脉冲神经网络:从理论到代码的创新实践**在深度
基于Python实现脉冲神经网络:从理论到代码的创新实践 在深度学习飞速发展的今天,传统人工神经网络(ANN)已难以满足对生物可解释性和能效比更高的需求。而**脉冲神经网络(Spiking Neural Networks, SNN)**作…...
内存暴涨却查无踪迹?Python对象生命周期管理的7个致命盲区,现在不看明天宕机!
第一章:Python智能体内存管理的核心原理Python智能体(如基于LangChain、LlamaIndex构建的Agent)在运行过程中并非仅依赖语言模型推理,其内存管理机制直接决定状态持久性、上下文感知能力与多轮交互一致性。核心在于Python对象生命…...
FigmaCN:消除语言壁垒的中文界面本地化解决方案
FigmaCN:消除语言壁垒的中文界面本地化解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN FigmaCN是一款专为中文设计师打造的浏览器插件,通过3800条人工校…...
技术破局:B端拓客号码核验的痛点突围与行业新生态,氪迹科技法人股东 核验筛选系统,阶梯式价格
在B端拓客进入“精准致胜”的新时代,线索质量直接决定拓客成效,而号码核验作为筛选有效线索的“第一道门槛”,其服务水平直接影响拓客团队的投入回报与运营效率。当下,随着AI拓客技术的普及,号码核验已渗透到电销、金融…...
将Windows 10打造成局域网精准时钟源:NTP服务器配置全攻略
1. 为什么需要局域网NTP服务器? 最近在帮朋友调试一个实验室的监控系统时,遇到了一个典型的时间不同步问题。十几台设备记录的视频时间戳相差从几秒到几分钟不等,排查故障时简直像在玩拼图游戏。这种场景在中小型办公网络、实验室环境特别常见…...
别再只用Dice Loss了!结合Focal Loss解决钢材缺陷分割中的小目标难题(附PyTorch代码)
突破小目标分割瓶颈:Focal Loss与Dice Loss的黄金组合实践 在工业质检领域,钢材表面缺陷分割任务常面临两个核心挑战:毫米级点状缺陷的漏检与复杂纹理背景下的误报。传统Dice Loss虽能缓解类别不平衡问题,但当遇到像素占比不足0.1…...
Windows平台APK安装技术深度解析:APK-Installer架构设计与实践指南
Windows平台APK安装技术深度解析:APK-Installer架构设计与实践指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK-Installer是一款专为Windows平台设计…...
【图像计数】基于matlab GUI图像处理颗粒自动计数【含Matlab源码 15231期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
保姆级教程:用Java SpringBoot实现钉钉机器人自动回复@消息(附完整源码)
企业级钉钉机器人开发实战:SpringBoot实现智能消息处理 最近在帮一家电商公司搭建内部工单系统时,遇到了一个典型需求:当员工在钉钉群里机器人提交问题时,需要自动识别用户身份并回复处理进度。这个看似简单的功能,在…...
国行Mac用户必看:Xcode 26 AI助手完整配置指南(含DeepSeek接入教程)
国行Mac开发者实战:解锁Xcode 26 AI助手的全链路解决方案 当苹果在WWDC24上演示Xcode 26的AI代码补全功能时,现场开发者发出的惊叹声至今仍在耳边回响。作为深耕iOS开发多年的技术顾问,我完全理解这种兴奋——AI辅助编程正在彻底改变我们的工…...
