0%

0. 前言 & 踩坑记录·

大半年没有更新过博文,忙着毕设,春招,实习,秋招一系列事情,一直在鸽。最近算是有点时间来充充电了。学生时代还剩下最后一年,跨专业后CS课还有相当多没补,立个flag,未来一年把cmu15445(数据库), mit6824(分布式), cs16c(计组)(cs16c待定,可能会换成18447)课程+lab/proj补完,6.828(操作系统)则看情况了,OS理论知识是有的,希望自己有时间能够实现一个小OS吧。

okk,闲话到此,今天简单聊聊CMU15445+proj环境搭建+proj0.

阅读全文 »

近期重学CMake,为后续的开发做点准备。遇到PUBLIC|PRIVATE和INTERFACE三个关键字不是很理解,搜索了一些资料,最后发现这篇文章说得比较浅显易懂。

CMake: Public VS Private VS Interface

本文在他的基础上,加上了一些实际验证的例子。

阅读全文 »

至此,我们已经基本分析完整个leveldb,本文给出leveldb中的各组件的默认大小。

  • log 文件,由一系列的32kb物理块组成。

  • manifest 文件,目前来看未限制其大小,但是在系统Open时,有一次机会重新**(文件大小超过2M)**开辟一个新的manifest,并移除旧文件。这部分在ReuseManifest函数中有体现:

阅读全文 »

前面我们已经分析完了Put操作,本篇再来看看Delete操作。 在leveldb中,一次Delete并不是去找到原kv数据然后从数据库中删除,而是将Delete看成一种特殊的Put,标志某个key已经被删除。

阅读全文 »

上文我们说了leveldb的Put操作。简单来说就是先向log写入一条记录,用于保证本条记录的持久性,然后向memtable插入本条记录。当然这个过程还可能牵涉到compaction,但从宏观上就是这么简单的两步。

今天我们再来谈谈leveldb的Get操作。

阅读全文 »

前面系列的文章,将leveldb整个系统分成了多个模块讲解,从这篇文章开始,我们讲解leveldb的各个对用户提供的API,将前面的各个组件贯穿起来。这篇文章首先讲解Put操作

阅读全文 »

DBIter·

Leveldb数据库的MemTable和sstable文件的存储格式都是InternalKey(userkey, seq, type) => uservalue。 DBIter把同一个userkey在DB中的多条记录合并为一条,综合考虑了userkey的序号、删除标记、和写覆盖等等因素。DBIter只会把userkey最新(seq最大的就是最新的,相同userkey的老记录(seq较小的)不会让上层看到)的一条记录展现给用户,另外如果这条最新的记录是删除类型,则会跳过该记录,否则,遍历时会把已删除的key列举出来。

阅读全文 »