Skip to main content
  1. Posts/

Leveldb 源码分析 02: 文件抽象

·1 min·
leveldb source-code
Tech Enthusiast running out of Coffee.
Table of Contents

Leveldb 文件抽象
#

leveldb 是一个面向磁盘的存储系统,因此文件管理、操作的重要性不言而喻。由于 C++ 标准库中的文件实现是依托答辩,因此 leveldb 选择自己抽象文件。

leveldb 的文件抽象很值得学习,将文件按照不同的用途使用不同的类表示,底层都指向文件描述符,通过 base 类在不同的平台上进行了实现。

Append 写缓冲
#

append 没有采用直写文件的方式,而是增加了一个缓冲区

  • 写入优先写缓冲区,一旦缓冲区满 flush 到文件
  • 规避了 os page cache,每次写文件都是 fsync

实现细节

  • windows 和 posix 的写文件抽象内部都分配了一个 64kb 的 buffer
  • 一次写入可以完全写满缓冲区则返回,否则
    • 部分写入缓冲区的内容需要 flush 到磁盘,此时缓冲区为空,尝试缓冲区是否满足剩余内容,如果可以则写入返回
    • 否则认为这是一个较大的写入,不在写缓冲区,而是直写到文件

Related

Leveldb 源码分析 01: 基本元素
·3 mins
leveldb source-code
Leveldb 源码分析 02: Memtable
·14 mins
leveldb source-code
Leveldb 源码分析 03: WAL
·8 mins
leveldb source-code
Leveldb 源码分析 04: Write 操作
·6 mins
leveldb source-code
Leveldb 源码分析 05: SSTable
·12 mins
leveldb source-code
Leveldb 源码分析 06: Compaction
·17 mins
leveldb 源码分析