LevelDB 初始化的 UML图(未完结, 里面有点小复杂)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Petershusheng/article/details/83959223

LevelDB 初始化的 UML图

Iq80DBFactory DbImpl MemTable DbLock Logs 静态检查cpu是否64位(因为32位容易用完虚拟地址空间) open()初始化数据库配置 设置key的比较器internalKeyComparator 初始化内存表(跳跃表实现) 定义并创建压缩的线程池 设置表缓存tableCache 锁定数据库的目录 化并回复当前版本号 读取db文件来, 设置内存的最新版本编号 创建日志对象 清理无用文件 向压缩的线程池提交压缩任务 Iq80DBFactory DbImpl MemTable DbLock Logs

levelDB 的 put 方法:

DB DbImpl log MemTable put()数据 检查后台线程是否有异常(后台压缩线程) 创建重入锁 检查内存以确保有足够的内存空间(makeRoomForWrite()复杂) 设置本次的开始序列号sequenceBegin和最大序列号sequenceEnd 将数据写入日志文件 更新内存表(把put()的key和value更新到memTable) DB DbImpl log MemTable

makeRoomForWrite()检查并确保内存充足(涉及到核心的内存和文件压缩逻辑)

Created with Raphaël 2.2.0 makeRoomForWrite() 检查是否持有当前线程的重入锁? 允许延迟并且当前版本的 level0的文件数超过了文件数的软限制? 释放重入锁并睡眠1ms以让出cpu给压缩线程 非强制并且内存表的内存使用< 写缓存的大小? 结束 不可变内存仍未释放 线程等待唤醒 当前版本的 level0的文件数大于最大限制数12 关闭当前日志对象并新起一个log 固化当前内存为不可变内存, 并重新分配可变内存 取消强制压缩的限制(force=false) 提交压缩任务到压缩的线程池 yes no yes no yes no yes no yes no

上面提交压缩任务的执行的方法是:maybeScheduleCompaction(), 实现如下:

Created with Raphaël 2.2.0

猜你喜欢

转载自blog.csdn.net/Petershusheng/article/details/83959223