学习让我快乐

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

rust 究竟是怎么模式匹配的

最近用 rust 重写了之前用 go 写的一个锁等待图生成工具, 这个小玩意会读取收集 Greenplum 当前锁信息, 并生成对应的锁等待图, 可用来大幅加速线上问题的排查. 不幸的是, 之前用 go 写出之后, 不小心把源码弄丢了, 导致我们目前只有 binary 能用. 导致了在使用过程中很多想加的小功能都整不了了. 正巧这次借着 rust 的机会重新实现了下这个功能, 此间过程中也加...

GP slice 自适应调度

众所周知, 在执行时, gp 会将查询进行分层处理, 每一层也便是一个 slice, slice 之间通过 motion 节点来完成数据交互. 当前 gp 总会将 slice 调度到集群中每一个计算节点上进行运行. 这其实并不是一个最合适的选择. 以如下查询为例, 在一个共有 3 个 primary segment 的集群中生成了如下查询计划. 可以看到, slice1 总共只会吐出 ...

从 C++20 标准来看 memory order: 1

接 从 C++20 标准来看 memory order:0 在 c++20 标准中, 与 memory order 有关的章节主要集中在 6.9.1 Sequential execution, 6.9.2 Multi-threaded executions and data races, 31.4 Order and consistency 中. 要想精确掌握 memory order, ...

从 C++20 标准来看 memory order: 0

早在 2016 年, 我就想熟练掌握 memory order. 当时还想着 c++ memory order 这么重要的概念, 一定对其有着最精确, 不能有丝毫歧义的理解. 所以就想着从 c++ 标准文档这个第一手资料入手学习. 悲剧的是当时就怎么都读不懂, 就是每一个字都认识, 合在一起就不知啥意思这种地步. 于是不得不匆匆收尾, 留下了 C++11-原子操作 这么个虎头虎脑的总结. 现...

当分区表遇到了继承

资深 pg 玩家踏出来的坑

TL;DR Greenplum 基于 PG 继承机制实现了分区表机制, 但未做好与手动创建的继承关系之间的处理. 导致了当两者混用时可能会出现各种意想不到的情况. Long Story 就在刚刚, 我在享受我美好周末的时候. 忽然被拉到了一个电话会议中. 有一个用户 CREATE INDEX 总是失败, 而且很严重, 会触发 coredump. 一阵头大, 毕竟最近一次版本是我发布的,...

AS2CFG - 为汇编生成控制流图

糟糕! 8月只剩最后一天啦! 而我的文章还是一篇没写 最近在忙于一个非常有意思的事情, 以至于没有时间搞出一篇正经点的文章, 草稿站里倒是有了几篇草稿, 今天抓着 8 月的尾巴更新一篇. (P.S. 王吓吓终于睡着啦.!! 早在很久以前, 具体一点说, 应该是在 2018 年 12 月 2 日看完 编译器设计 这本书时, 我就想着搞点什么东西出来, 来作为一次总结与回顾. 我就想啊想啊,...

PG 中的 SubPlan, ReScan

之前在尝试为 ADB PG 加入弹性调度 能力, 在调试期间, 曾经遇到一个非常诡异的 bug, 结果时对时不对. 当时触发这个 bug 的查询非常复杂, 使用了大量的子查询, 所以一度让我怀疑是不是弹性调度未做好子查询情况下的适配. 所以当时便去看了下 PG/GP 中子查询的优化执行链路, 最终发现是因为 double 类型精度问题导致地正常现象 :-(! 这篇文章试图从子查询在编译之后的...

一次'失败'的尝试

前言 这个工作的起因是因为某一天在回家的路上我忽然想到了 java 中的 BufferedInputStream. BufferedInputStream 通过为底层各种 InputStream 引入了缓冲区的能力使得读取底层 InputStream 的效率大幅度提升. 那么这个能不能类比到 PG 中呢, 也即能不能引入一个 buffered plan node, buffered pla...

让查询执行动画起来

先看下整个效果 此时对应的查询计划如下: 很显然, 限于黑框框的表现能力, 动画的效果还是很简陋的. 这里最适合的是与配套的前端页面集成起来才够炫酷. 就像 GPCC 那样. 实际上在我第一眼看到 GPCC 中查询执行的动画效果之后, 就一直非常好奇这一效果究竟是如何实现的. 奈何 GPCC 并不开源, 再加上当时技术储备尚且不够, 一直没能如愿, 直到今天. 实际上在对 GP ...

不见了的千分之一行

最近在基于之前提出的一个 POC 设想 GP 存储计算分离的一种实现 为我们 ADB PG OSS 外表加入弹性调度的能力. 当前如果一个查询使用了 OSS 外表, 那么在执行时针对该 OSS 外表的 Foreign Scan 算子总会被调度到所有计算节点上运行, 这里每个计算节点都会分配到, 且只会分配到 1 个 Foreign Scan 算子. 从而来起到一个并行 Foreign Sca...

UDP 与 GRO, GSO

不知道是不是因为 GSO, GRO 是 Linux 新增特性的原因, 在 google 上找了半天都没有找到一篇详细的介绍如何使用 GSO/GRO 的文章, 最后从 Linux 内核中与 GSO/GRO 相关的 testcase 中窥到了一丝信息, 总结如下. 另外由于 GSO 是 5.0 新加的特性, 而且手头上也没有 linux 5.0 的机器, 所以如下总结并未实际验证过… GSO,...

GP 存储计算分离的一种实现

效果 和 presto 中将执行计划切分为多个 Stage 一样, GP 也会将执行计划切分为多个 Slice, 每一个 slice 表示着执行的一个阶段. 在优化阶段, 在 PG 优化器的基础之上, GP 会根据表数据的分布策略在合适的地方加入 Motion 节点, Motion 节点用来根据需要对数据进行重分布. 在优化结束, 执行计划确定了之后, GP 会遍历 plan tree, ...

GP udpifc interconnect 两三事

GP interconnect 层, 对上提供了一种可靠有序的数据传输方式, 在查询执行中计算节点之间通过 GP interconnect 层来完成所需的数据交互. 当前 GP 中 interconnect 主要有两种实现: tcp, udpifc. 其中 tcp 便是直接基于 TCP 搭建; udpifc 则是基于 UDP 协议实现, 在 UDP 基础之上加入了 ACK, 重传等机制来实现...