GPT as innodb master 向GPT学习innodb。虽然我还不清楚他回答的到底是不是正确的,但是看上去还是蛮正确的。 感觉只需要几句prompt GPT4就变成innodb大师了。 粘一下我和他的对话记录,我的目的是想知道Innodb有没有类似ARIES中提到的CLR机制。
GPT as innodb master 向GPT学习innodb。虽然我还不清楚他回答的到底是不是正确的,但是看上去还是蛮正确的。 感觉只需要几句prompt GPT4就变成innodb大师了。 粘一下我和他的对话记录,我的目的是想知道Innodb有没有类似ARIES中提到的CLR机制。
C++ Coroutines 这个文章算是一个个人的笔记,想简单记录一下Coroutine相关的细节,以便后续回忆。如果想从头学习coroutine的话,我更推荐这个系列,本文也是从这个系列中摘取一些关键点记录而已。 Awaiter A type that supports the co_await operator is called an Awaitable type. An Awaiter type is a type that implements the three special methods tha…
async_simple Coroutine 简单看看async simple的coroutine的实现。 async_simple的coroutine是通过Lazy<T>实现的,即每一个Coroutine的返回值都是Lazy<T>,然后我们可以通过co_await Lazy来等待一个coroutine的返回值。 所以这里要关注的有两个点,一个是Lazy是怎么开始执行一个coroutine的,即关注Lazy的promise_type,另一个就是在coroutine内去co_await一个La…
WAL 简单看一下RocksDB的WAL SyncWAL 接口处有一个叫SyncWAL的函数,作用是把当前的日志同步到盘上。 相关的数据结构有一个deque<LogWriterNumber>,以及一个锁叫做log_write_mutex_。 其中LogWriterNumber中保存了log filter number,log writer,一个标识当前日志正在进行Sync的标记,以及pre_sync_size,代表在调用Sync之前的已经写入当前日志的数据大小,这里注释是说这个值会被记录在Manifes…
async_simple Future/Promise 概览 简单看看async_simple的Future/Promise。注意这里不会关注coroutine/uthread部分 Future/Promise这块和folly,以及seastar的接口都是类似的,之后可以再写一下他们实现上的区别。 简单来说,就是Promise可以获取一个对应的Future,对应生产者和消费者。然后Future可以通过then(Func &&func)来创建一个continuation,表示在这个future获取到结…
RocksDB WritePath概览 简单过一遍RocksDB前台的写链路。 忽略这些,从下面的第一张写链路图开始看。。 DB::Put 没给CF的话会用DefaultCF 构造一个WriteBatch,把key,value,以及column family塞进去 这里有个Comparator的timestamp size,还不知道是干啥的 DBImpl::Write 先走到没有Callback的版本 然后有一堆InvalidArg的检查。disable memtable先不看,pipelined write先不看…
LevelDB Recover 过一遍LevelDB的Recover流程。 DB::Open DBImpl::Recover 给当前的db上锁。防止有什么并发的OpenDB之类的。 看看有没有CurrentFile,没有的话打开一个新的DB。 VersionSet::Recover 读取Current,找到Manifest文件。 读取Manifest,重放VersionEdit。 如果Manifest过大,或者是重新将Manifest文件通过Append的方式打开的时候失败了,就会放弃Reuse Manifest。…
LevelDB Read 读链路主要分为两个,一个是点读,一个是RangeScan。 点读的接口是Get DBImpl::Get ref住当前的mem table,immmutable mem table,以及version 先读mem table,再读immutable memtable,最后调version->Get() 读完后更新统计信息,可能触发SeekCompaction Unref 读MemTable的时候会构建LookupKey。这是因为写入MemTable的时候会用一个varint作为leng…
LevelDB Compaction Compaction分为MinorCompaction和MajorCompaction。我们就直接叫Flush Memtable和Compaction SST。 LevelDB的Immutable memtable只能由一个。Flush Memtable优先级比较高,因为会影响前台写链路。 Flush memtable的调用点为CompactMemTable()。有两个调用点,不过都是后台线程做Compaction,所以不会出现并发Compaction的情况。 调用链路如下: …
RocksDB-1 HyperClockCache 接口 目前有两类Cache。分别是LRUCache,以及HyperClockCache。(还有一个CompressedSecondaryCache,注释中写是experimental的,就不看了。) 两种CacheOptions都会继承一个ShardedCacheOptions,说明都是分shard的cache 比较有意思的是RocksDB支持一个叫SecondaryCache的东西,是在In-memory Cache和磁盘层中间的又一层Cache,有点Cache…