首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Leveldb源码分析-九

2013-03-19 
Leveldb源码分析--96 SSTable之36.5 读取sstable文件6.5.1 类层次Sstable文件的读取逻辑在类Table中,其中

Leveldb源码分析--9

6 SSTable之3

6.5 读取sstable文件6.5.1 类层次

Sstable文件的读取逻辑在类Table中,其中涉及到的类还是比较多的,如图6.5-1所示。

Leveldb源码分析-九

图6.5-1

Table类导出的函数只有3个,先从这三个导出函数开始分析。其中涉及到的类(包括上图中为画出的)都会一一遇到,然后再一一拆解。

本节分析sstable的打开逻辑,后面再分析key的查找与数据遍历。

6.5.2 Table::Open()

打开一个sstable文件,函数声明为:

static Status Open(const Options& options, RandomAccessFile* file, uint64_tfile_size, Table** table);

这是Table类的一个静态函数,如果操作成功,指针*table指向新打开的表,否则返回错误。

要打开的文件和大小分别由参数file和file_size指定;option是一些选项;

下面就分析下函数逻辑:

S1 首先从文件的结尾读取Footer,并Decode到Footer对象中,如果文件长度小于Footer的长度,则报错。Footer的decode很简单,就是根据前面的Footer结构,解析并判断magic number是否正确,解析出meta index和index block的偏移和长度。

  ReadOptions opt;  BlockContents block;  ReadBlock(rep_->file, opt,filter_handle, &block);  if (block.heap_allocated)rep_->filter_data = block.data.data(); // 需要自行释放内存  rep_->filter = newFilterBlockReader(rep_->options.filter_policy, block.data);
以上就是sstable文件的读取操作,不算复杂。

热点排行