学习让我快乐

争于世, 不争于势;简洁, 高效, 赏心悦目

C++表达式求值顺序的一个小问题

在学习 hologres 代码的时候, 忽然发现一处直觉感觉不对的地方, 简化一下对应着如下代码块: #include <memory> #include <stdio.h> using namespace std; struct C2 { template <typename F> void finally(F f) { ...

开脑洞地为 rocksdb 引入 orc

问题定义 开发 KuiBaDB 的由头之一是想论证我自己脑补的一个列存模型, 这个列存模型受 hologres 论文中列存启发, 结合我自己的 PG 背景, 移除了 delete map, 转而为列存每一行加个 xmin, xmax 字段来表示行的事务信息, 从而可以判断行是否已经删除. 但在了解 Spanner 之后, 结合 KuiBaDB 开发经验, 对 PG 事务模型在高并发扩展性下...

关于 Spanner 的若干猜测

前言 Spanner 是之前就读过的论文, 但奈何当时对 PG 事务那一套, 快照, MVCC 比较推崇, 我在 KuiBaDB 中也完整地实现了事务, 快照, MVCC 这些概念, 根据这里实现得来的经验结合最近在 Hologres 接触到的新知识. 忽然意识到 PG 的事务模型可扩展性或许不是很好? 后续有空做几个试验测试下. 这篇文章不是 Spanner 介绍文章, 而是对 Span...

可能是最快的基于 io-uring 的异步 IO 框架

缘起 在 KuiBaDB 完成了初步的骨架搭建, 以及原型验证之后, 接下来要做的一个事情就是异步化改造, 毕竟 KuiBaDB 的出发点是基于 Hologres 论文实现一个开源的 Hologres, 而 Hologres 最主要的一个能力便是全异步化. 经过一番调研, KuiBaDB 准备使用 tokio 作为其异步运行时, 当然 tokio 与 Hologres 论文中提到的 HOS...

两阶段事务一个疑似问题

在排查完 消失的两阶段事务, 意识到社区已经修复了这个问题之后, 当时大概看了下修复姿势, 就抛之脑后了. 直到最近在实现 KuiBaDB xlog 写入以及 redo 链路时, 细细研究了下 PG 的 xlog 写入以及 recovery, 尤其是 timeline 相关的链路. 才意识到社区的修复好像有点问题. 如社区 PR 中所示, 社区对如上问题的修复主要是改变了 CreateCh...

深入浅出 KuiBaDB: 使用 SharedBuffer

在 2021-07-04 23:47 的时候, KuiBaDB 正式跑通了 COPY 链路, 第一次串通了 MVCC, SharedBuffer, Column Storage, SuperVersion 等模块. 本文是 “从 KuiBaDB SharedBuffer 到 Linux address_space” 系列第一篇. 截止目前为止, KuiBaDB 中最让我觉得有趣的便是 Sh...

深入浅出 KuiBaDB: Expression

前言 KuiBaDB 的表达式想解决之前在 PostgreSQL 中遇到的表达式相关的几个问题: 最高只支持 8byte 对齐. 之前做过基于 int128 的 decimal128 类型, int128 是 16byte 对齐, 因此编译器在某些场景下会生成一些要求 16byte 对齐, 但效率更高的指令. 但由于 pg 最高只支持 8byte 对齐, 即 decima...

深入浅出 KuiBaDB: State

前言 KuiBaDB 最开始的一个主要想法之一, 便是移除掉 PostgreSQL 中肆意泛滥的全局变量. 我个人认为, 全局变量的肆意使用违背了代码应所见即所得的直观性质, 以一个函数为例, 所见即所得意味着我们可以仅根据该函数的签名便可得知该函数可能依赖的状态, 该函数应在哪些上下文下才能调用等. 但在 PG 中, 在使用调用一个函数之前, 我们不得不了解下这个函数自身的实现, 这个函...

The KuiBaDB Column Storage

The KuiBaDB Column Storage is heavily inspired by ‘Hologres: A Cloud-Native Service for Hybrid Serving/Analytical Processing’ and rocksdb. The first prototype design was completed on October 7, 202...

消失的两阶段事务

大年三十, 忽然收到之前搭建的 gp 集群 mirror xlog 堆积的报警, 本来没太当回事, 以为又是想往常一样, 要么是 mirror replay wal 时太慢了, 要么是有个两阶段事务一直没有结束导致. 又忽然想到, 如果是两阶段事务一直没有结束, 那么 primary, mirror 应该要一起 xlog 堆积的. 所以八成是 mirror replay wal 又慢了. 但...

Greenplum 从自适应调度到 Concurrency Scaling

自去年提出了 Greenplum 自适应调度 的想法, 到最近把这套自适应调度推到我们线上, 这期间也对最初提出的想法又做了一系列加强, 也进一步加深了对 Greenplum 执行框架的理解. 关于 Greenplum 执行框架这里不在做过多介绍, 可以参阅之前的文章. 简单来说, 在优化结束, 执行计划确定了之后, GP 会遍历 plan tree, 之后以 Motion 节点为边界将执行...

Drop checker 与 PhantomData

在回家的路上时候, 忽然想到了 PhantomData.. 当时在囫囵吞枣地学习 rust 时对 PhantomData 只是一扫而过, 只是有印象说是, 应该根据语义来决定是否应该加 PhantomData. 比如 Iter 对外看上去就像是 &'a T 的容器, 所以 Iter 在定义上使用了 _marker: marker::PhantomData<&'a T&g...

最近遇到的有趣事情

C/C++ strict aliasing rule 之前在做某个项目时, 遇到了一个问题, 细细抽取之后, 得到最小可复现代码, 即如下代码在 gcc O2 时会得到错误的结果. #include <stdlib.h> #include <stdio.h> static inline int64_t GetScaleFromBits(int64_t bits)...