【Leveldb】文件管理实现 操作系统相关文件实现Leveldb中关于文件的底层操作都在Env这个类中实现。其定义如下classLEVELDB_EXPORTEnv{public:Env();Env(constEnv)delete;Envoperator(constEnv)delete;virtual~Env();staticEnv*Default();virtualStatusNewSequentialFile(conststd::stringfname,SequentialFile**result)0;virtualStatusNewRandomAccessFile(conststd::stringfname,RandomAccessFile**result)0;virtualStatusNewWritableFile(conststd::stringfname,WritableFile**result)0;virtualStatusNewAppendableFile(conststd::stringfname,WritableFile**result);virtualboolFileExists(conststd::stringfname)0;virtualStatusGetChildren(conststd::stringdir,std::vectorstd::string*result)0;virtualStatusRemoveFile(conststd::stringfname);virtualStatusDeleteFile(conststd::stringfname);virtualStatusCreateDir(conststd::stringdirname)0;virtualStatusRemoveDir(conststd::stringdirname);virtualStatusDeleteDir(conststd::stringdirname);virtualStatusGetFileSize(conststd::stringfname,uint64_t*file_size)0;virtualStatusRenameFile(conststd::stringsrc,conststd::stringtarget)0;virtualStatusLockFile(conststd::stringfname,FileLock**lock)0;virtualStatusUnlockFile(FileLock*lock)0;virtualvoidSchedule(void(*function)(void*arg),void*arg)0;virtualvoidStartThread(void(*function)(void*arg),void*arg)0;virtualStatusGetTestDirectory(std::string*path)0;virtualStatusNewLogger(conststd::stringfname,Logger**result)0;virtualuint64_tNowMicros()0;virtualvoidSleepForMicroseconds(intmicros)0;};posix的实现在env_posix文件中。leveldb文件管理文件写文件写相关的类如下图所示WritableFile在操作系统打开的可写入文件默认实现为PosixWritableFile。log::Writer负责将wal和manifest的记录追加到打开的文件中。包括log记录的格式也是在这里组装的。BlockBuilder将按 key 排序的键值对进行前缀压缩并打包成特定格式的字节流。压缩后的格式------------------------------------------------------------- | Entry 1: [shared_len][unshared_len][value_len][key][value] | | Entry 2: [shared_len][unshared_len][value_len][key][value] | | Entry 3: ... | ------------------------------------------------------------- | Restart Array (重置点/重启点数组): | | [Restart 0 Offset (4B)] | | [Restart 1 Offset (4B)] | | ... | | [Num Restarts (4B)] | -------------------------------------------------------------TableBuilder::Rep涵盖了构建 SSTable 所需的选项、底座文件句柄、各种 Block 构建器以及状态标记。是一个数据集合提供给TableBuilder使用。TableBuilder主要用在compaction中将内存中的键值对构建并写入成符合 SSTable 格式的物理文件包括data block meta blockmeta index blockindex block。文件读SequentialFile顺序读文件的接口主要用在读取WAL或 MANIFEST文件中。log::Readerlog::Writer负责写入log::Reader负责读取。从WAL或 MANIFEST 文件中顺序读取并校验拼接日志记录。RandomAccessFile用于随机读取文件内容的接口。BlockSSTable 文件中单个 Block数据块/索引块的数据负责对block内键值对的顺序遍历与基于重启点的二分查找。Cache用于缓存SSTable 数据块。Table对应SSTable的类定义Table对象在打开时会将 SSTable 的 Index Block和 Filter Block加载并常驻内存从而加快读取 Data Block的速度。TableCache用于缓存已打开的 SSTable 文件对象及其底层文件句柄。