学习让我快乐

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

C 语言: Call to a function without a prototype

上周我一同事找我看一个很有意思的问题, 一个 bool 返回值函数总是返回 true. 简化为如下例子: // 1.c bool _is_valid_jsonb_with_schema() { // 简化后的例子, 实际 _is_valid_jsonb_with_schema 的逻辑有点复杂. return false; } // 2.c void is_valid_js...

从 fetch_add(0) 说起

在写完 C++ memory order: load(SeqCst) VS fetch_add(0, SeqCst) 这篇文章之后, 随着知识的进一步积累的, 一种不踏实感油然而生, 尤其是在收到一封感谢邮件之后: I notice that you have an interesting blog post regarding why fetch_add(0) is used ra...

Spanner: Becoming a SQL System

即上一篇 关于 Spanner 的若干猜测 之后, 继续跟进了 Spanner 另一篇论文 “Spanner: Becoming a SQL System”, 同样这篇文章不是论文介绍文章, 而是对论文一些我感觉模糊的地方所做的猜测. 非常欢迎/希望一起交流一下. 3.1 Distributed query compilation Spanner 中 SQL 优化过程, 当 Spanne...

C++ 的心智负担 -- Integral promotion

我个人习惯于将自己对 C++ 的经验分为三类: 纯粹的知识点, 喜好的代码风格, 以及心智负担; 在心智负担这一类中又记录了心智负担能否被编译器检测出来, 以及对应的编译选项及工具; 从我目前的笔记大小来看, C++ 确实是一个心智负担包袱很大的语言了== 这里介绍一下我记录的其中一个心智负担. 在我将 tokio 完整地移植到 C++ 作为 C++20 coroutine 运行时之后, ...

基于 FlameGraph 的内存泄漏检测

在进一步深入了解 FlameGraph 时, 可以看到火焰图作为一种通用工具, 不单单可以用于 cpu 热点展示, 还可以用与探测 diskio, memory 等热点消耗情况. 其中在 memory 上的功能引起我的兴趣, 在我日常值班线上巡检过程中, 遇到的不少 memory 使用持续上涨但不知所由的情况, 此时需要设置个环境变量开启 jemalloc profile 功能之后重启实例,...

在 tokio 上几个失败尝试

问题定义 最近在入门了 linux cfs scheduler, pelt, load balance 这些之后, 忍不住想以 tokio code base 为基础实践一下这几种操作的威力; 希望是能为 hologres 的 holo os 提提速, 详细细节可参考论文: Hologres builds a scheduling framework, referred to as...

linux 中的 pelt

本文基于 linux 5.16, 本文不是 linux pelt 入门介绍, 而是我在了解完 pelt 之后一些猜测推断与整理, 希望能与大家交流化解下我的迷惑. 本文使用的 task group 结构如下所示: task_struct se pelt 对于一个单独的 task_struct pe pelt 计算, 当前内核采用的公式是: \[{w_n * t_n * y ^ ...

C++ memory order: load(SeqCst) VS fetch_add(0, SeqCst)

在阅读 tokio 代码时, 发现一个很奇怪的地方, fetch_add(0): let state = State(self.state.fetch_add(0, SeqCst)); 就很好奇为啥不是直接 load(SeqCst), 还要 fetch_add(0) 一把? 翻了下修改历史, 背后原来是有故事的, 简单来说就是这块代码一开始就是 load(SeqCst) 的, 后来发现...

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...