Home

leveldb笔记之17:major compaction之筛选文件

继续接着上一篇笔记的结尾讲,这篇笔记介绍下筛选参与 major compaction 文件的过程,算是介绍 major compaction 的一个开端。 1. 当我们谈论筛选时,在谈论什么 leveldb 最为复杂的在 compaction,compaction 最为复杂的在 major compaction.面对磁盘上的众多 sstable 文件,应该怎么开始? 千里之行始于足下,首先需要找到最应该 compact 的一个文件。 “最应该”的判断条件,前面笔记已有介绍,有seek_compaction && size_compaction,分别从读取和文件大小两个维度来判断。 筛选出这个文件后,还需要考虑一系列问题: 如果在 level 0,由于该...

Read more

leveldb笔记之16:seek_compaction && size_compaction

major compaction 一个首要问题,就是要 compact 哪个文件。这个计算是在version完成的,与之相关的主要是两个属性allowed_seeks compaction_score。 1. seek_compaction 一个直观的想法是如果文件多次 seek 但是没有查找到数据,那么就应该被 compact 了,否则会浪费更多的 seek。用一次 compact 来解决长久空 seek 的问题,本质上,还是如何平衡读写的思想。 具体的,当一个新文件更新进入版本管理,计算该文件允许 seek 但是没有查到数据的最大次数,当超过该次数后,就应该 compact 该文件了。 对应到代码实现,是在VersionSet::Builder::Apply阶段:https...

Read more

leveldb笔记之15:minor compaction 之 version

这篇笔记讲下minor compaction过程中version是怎么生效的,算是对 minor compaction 介绍的补充。 imm_持久化为 sstable 文件后,文件的相关信息通过meta返回 { mutex_.Unlock(); //更新memtable中全部数据到xxx.ldb文件 //meta记录key range, file_size等sst信息 s = BuildTable(dbname_, env_, options_, table_cache_, iter, &meta); mutex_.Lock(); } struct FileMetaData { int refs; int allo...

Read more

leveldb笔记之14:version

上一篇笔记开始讲 minor compaction,对于 memtable 转化为 sstable 这个过程,在之前的笔记里都做了很多的铺垫,例如 MemTable/SSTable 的数据结构,写入/读取的整个流程等,因此理解起来应该不算复杂。不过其中涉及版本的操作,例如versions_->LogAndApply(&edit, &mutex_);,如果没有抓住 leveldb 里 version 相关的关键结构,很容易被绕晕。 这篇笔记,开始讲下 version. 1. 为什么要有版本管理 compaction 简言之,是一个新增与删除文件的过程。例如对于上一篇介绍的 minor compaction,是新增一个文件。对于 major compaction...

Read more

leveldb笔记之13:minor compaction

在level笔记开篇里,提到过Compaction这个过程,这是 leveldb 中最为复杂的一部分,从这篇笔记开始,介绍下 Compaction. compaction 分为两种:minor compaction 和 major compaction. minor compaction 相对简单一些,对应了MemTable持久化为sstable的过程。 1. 简介 DBImpl定义了两个MemTable: MemTable* mem_; MemTable* imm_ GUARDED_BY(mutex_); // Memtable being compacted 当size of mem_ <= options_.write_buffer_size时,数据都...

Read more

summary of <105 STL Algorithms in Less Than an Hour>

your browser does not support the video tag 1. WHY? STL algorithms can make code more expressive Avoid common mistakes Used by lots of people 2. THE WORLD OF C++ STL ALGORITHMS 2.1. LANDS of PERMUTATIONS 2.1.1. PROVINCE OF HEAPS make_heap push_heap pop_heap 2.1.2. SHORE OF SORTING sort partial_sort nth_element /...

Read more

如何同步网站文章到百家号

2019-02-25 udpate: 连着每天试了几次,每天都是不同的文章,一直返回成功,但是平台上就是看不到,建议还是手动发布图文,感兴趣的可以看下各个坑。 之前通过搜索资源平台提交数据到手百,还是很方便的。最近眼看着手百客户端逐渐下掉了熊掌号之前推送的文章,只留下了个人博客唯一一个入口。因此研究了下如何把网站文章自动同步到百家号。 具体可以参考开发者文档,提供了一个将富文本推送到百家号平台的机制。 文档本身还是很简单的,甚至有些简陋,可以参考这个例子. 这里主要介绍下几次留言咨询了解到的坑: content 必须是富文本格式 cover_imags 必须经过 json_encode,例如 python 代码:json.dumps(cover_images)...

Read more

protobuf之extension

最近看到的代码里, extension 字段使用越来越广泛,因此这篇笔记介绍下 extension 的使用。同时,protobuf反射详解里的 field 接口获取不到 extension 字段,因此也会介绍下关于 extension 的反射。 1. 使用 extension 用于解决字段扩展的场景,例如我们提供一个基础的 message,各个第三方都可以基于该 message 扩展新的字段,例如: // base.proto package base; message Link { optional string url = 1; extensions 1000 to 1050; } // third-party-1.proto package thirdparty1...

Read more