【深入浅出leveldb】文件类型与文件名

2023-11-03

【深入浅出leveldb】文件类型与文件名

leveldb运行一段时间后,系统中会产生一些文件,这些文件有哪些,各个文件又有什么作用,文件名怎么命名的呢?

本节来剖析这一块东东,代码在【db/filename.h】【 db/filename.cc】文件夹下面。

1.文件类型

总共有如下几种文件类型。

enum FileType {
  kLogFile,
  kDBLockFile,
  kTableFile,
  kDescriptorFile,
  kCurrentFile,
  kTempFile,
  kInfoLogFile  // Either the current one, or an old one
};
  • Log

LOG文件,以.log结尾,存储文件名是db/000003.log。

  • DBLock

该文件作为文件锁存在,文件名为LOCK,不保存任何东西。

  • DESCRIPTOR

这就是常说的manifest文件,以MANIFEST-开头。例如:db/MANIFEST-000002。

  • CURRENT

文件名就是CURRENT,里面的内容就是当前MANIFEST的文件名。

  • Temp

在使用新Manifest文件时,会创建一个dbtmp文件,然后rename成为真的,例如:db/000005.dbtmp。

  • INFO_LOG

文件名为LOG,当下次启动时,会以后缀LOG.old保存之前的LOG数据,新数据还会在LOG中。

2.文件名

FileNumber,每个文件会对应一个数字,且独一无二,不会出现MANIFEST-000002、000002.log这种情况,是全局递增的,

我们来看看MakeFileName。

static std::string MakeFileName(const std::string& dbname, uint64_t number,
                                const char* suffix) {
  char buf[100];
  std::snprintf(buf, sizeof(buf), "/%06llu.%s",
                static_cast<unsigned long long>(number), suffix);
  return dbname + buf;
}

在该函数中,会创建dbname+6位number+后缀组成的文件名。例如:testname=testdb,文件名可以是:testdb/000005.ldb。

ldb与sst都是sstable的有效后缀。

std::string TableFileName(const std::string& dbname, uint64_t number) {
  assert(number > 0);
  return MakeFileName(dbname, number, "ldb");
}

std::string SSTTableFileName(const std::string& dbname, uint64_t number) {
  assert(number > 0);
  return MakeFileName(dbname, number, "sst");
}

而manifest是单独实现,没有调用MakeFileName。

std::string DescriptorFileName(const std::string& dbname, uint64_t number) {
  assert(number > 0);
  char buf[100];
  std::snprintf(buf, sizeof(buf), "/MANIFEST-%06llu",
                static_cast<unsigned long long>(number));
  return dbname + buf;
}

在sstable、log、manifest的文件numer,均是来自versionset,version相关代码,我们后面分析,这一块是最复杂一块,特别晕。

只需记得,这几个来自versionset的next_file_number_ ,构造函数中初始化next_file_number_位2。

那1给谁了呢?

在NewDB函数中,有下面一行:

const std::string manifest = DescriptorFileName(dbname_, 1);

可以看到给了manifest。

但实际上,我们看到的大部分情况是MANIFEST-000002,因为在Open调用NewDB后,调用了VersionSet.Recover,其中有一行:

next_file = edit.next_file_number_;

所以又回到了2。

在Open函数中,后面移除了为1的manifest文件。

impl->RemoveObsoleteFiles(); 

此外,还有一个ParseFileName函数,当传递一个文件时,可以解析出number与type,例如:db/MANIFEST-000002,我们知道文件类型是kDescriptorFile,编号是2。

SetCurrentFile则是将更新一个新的CURRENT文件,它会将MANIFEST变为dbtmp文件,例如:db/MANIFEST-000002会变为db/000002.dbtmp,随后将MANIFEST-000002写入dbtmp文件中,如果写入成功,重命名为CURRENT文件,否则,删除掉即可。

最后,少讲了一个WriteStringToFileSync,这个后面说。

本节完~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深入浅出leveldb】文件类型与文件名 的相关文章

随机推荐

  • datetime.dt.day以及to_datetime函数讲解(Python时序量汇总)

    之前在别的博客记过pandas处理时间量的笔记 但是时间一长又忘了 所以决定另外写一篇记录下时序量的处理 1 关于pandas的to datetime函数的理解 参考 https blog csdn net qq 36523839 arti
  • MATLAB——数据及其运算

    MATLAB数值数据 数值数据类型的分类 1 整型 整型数据是不带小数的数 有带符号整数和无符号整数之分 表中列出了各种整型数据的取值范围和对应的转换函数 2 浮点型 浮点型数据有单精度 single 和双精度 double 之分 单精度型
  • 95-30-015-Channel-AbstractNioMessageChannel

    文章目录 1 概述 2 类图 2 1 继承关系 2 2 类图简介 3 内部类NioMessageUnsafe 3 1 read事件框架 1 概述 AbstractNioMessageChannel是底层数据为消息的NioChannel 在N
  • 动态规划入门之国王的金矿

    最近学习算法 对动态规划不太了解 使用的时候照搬转移方程式 知其然不知其所以然 今天看到一篇动态规划的教程 解释得非常通俗 原文在这里 动态规划入门教程 http blog csdn net woshioosm article detail
  • 并发编程--------JUC集合

    并发集合 一 ConcurrentHashMap 1 1 存储结构 ConcurrentHashMap是线程安全的HashMap ConcurrentHashMap在JDK1 8中是以CAS synchronized实现的线程安全 CAS
  • 不会“卷”,就会被淘汰?3招教你打破职场内卷焦虑

    内卷 这个词对大家来说都已经不新鲜了 时不时就会听到 人人皆在卷 万物皆可卷 从未出生那一刻的胎教到出生后的早教 从幼儿园开始的择校 一路 卷 到大学的名号 绩点 而职场内卷 是大家最熟悉的 战场 职场内卷是指在职场竞争中 为了争夺有限的资
  • 【目标检测】---- 正负样本匹配策略

    1 综述 无论是anchor box 还是anchor free 在训练计算类别 前背景损失时都需用到正负样本匹配 目前分为两大类 第一类 fixed label assignment 常用的主要有MaxIou ATSS focos 第二类
  • Docker loop volume VS direct LVM 选型和分析

    测试准备 测试目的 Docker在DeviceMapper这块支持两种存储模式 分别是docker默认的loop volume和Direct VLM 为了了解其中区别也是为了依据业务进行选型 所以选择了对二者进行性能测试 测试范围 性能指标
  • React 引入antd后启动项目时出现的警告信息

    Compiled with warnings Failed to parse source map webpack antd components config provider style index less URL is not su
  • windows不安装虚拟机如何使用Linux系统作为开发工具?

    哈喽 大家好 我是仲一 作为嵌入式开发程序员 常常需要在Linux环境下编译一些代码 安装虚拟机比较方便 但是 太占用内存了 性能不好的电脑开了一台虚拟机后 可能就干不了其他事情了 安装双系统也比较麻烦 常常需要重启电脑来完成系统的切换 今
  • RHCE第四次作业

    1 判新当前磁盘剩余空间是否有20G 如果小于20G 则将报警邮件发送给管理员 每天检查一次磁盘剩余空间 2 判web服务是否运行 1 查看进程的方式判断该程序是否运行 2 通过查看端口的方式判断该程序是否运行 如果没有运行 则启动该服务并
  • Leetcode刷题c++之575. 分糖果

    题目描述 定一个偶数长度的数组 其中不同的数字代表着不同种类的糖果 每一个数字代表一个糖果 你需要把这些糖果平均分给一个弟弟和一个妹妹 返回妹妹可以获得的最大糖果的种类数 示例 输入 candies 1 1 2 2 3 3 输出 3 解析
  • Python与Excel交互与处理

    一 Python与Excel交互的背景及意义 Excel是很多公司和个人在数据分析和处理中使用的工具 其可以通过公式和条件格式等功能 实现简单的数据分析和处理 但是对于复杂的数据分析和处理来说 Excel的局限性就很大 难以满足需求 而Py
  • Nginx 日志配置、日志切割、日志切割脚本

    文章目录 前言 一 access log 1 语法 2 基本用法 3 作用域 4 log format 自定义日志格式 二 error log 1 语法 2 基本用法 3 作用域 4 rewrite log 指令 三 Nginx变量 1 简
  • 地球人口承载力估计 解析和C++代码

    Description 假设地球上的新生资源按恒定速度增长 照此测算 地球上现有资源加上新生资源可供x亿人生活a年 或供y亿人生活b年 为了能够实现可持续发展 避免资源枯竭 地球最多能够养活多少亿人 Input 一行 包括四个正整数x a
  • docker存储管理及实例

    一 Docker存储概念 1 容器本地存储与Docke存储驱动 容器本地存储 每个容器都被自动分配了内部存储 即容器本地存储 采用的是联合文件系统 通过存储驱动进行管理 存储驱动 控制镜像和容器在 docker 主机上的存储和管理方式 容器
  • 【理解系统】查看Linux系统信息

    一 发行版版本号 方法 1 cat etc issue Ubuntu 18 04 LTS n l 方法 2 红帽系 lsb release a LSB Version core 4 1 amd64 core 4 1 noarch Distr
  • 数据结构java版之大O表示法

    大O表示法使用大写字母O 可以认为其含义为 order of 大约是 我们可以使用大O法来描述线性查找使用了O N 级时间 二分查找使用了O log N 级时间 向一个无序数组中插入使用了O 1 或常数级时间 下面的图总结了算法的运行时间
  • TCP网络编程整理总结

    1 每一个TCP套机字中都存在I O缓冲 该缓冲在创建套接字的时候自动生产 2 即使关闭套接字 I O缓冲中输出缓冲的遗留的数据也会继续传输 3 关闭套接字会导致I O缓冲中输入缓冲中遗留的数据丢失 4 tcp数据包header中的seq表
  • 【深入浅出leveldb】文件类型与文件名

    深入浅出leveldb 文件类型与文件名 leveldb运行一段时间后 系统中会产生一些文件 这些文件有哪些 各个文件又有什么作用 文件名怎么命名的呢 本节来剖析这一块东东 代码在 db filename h db filename cc