首页 文章 精选 留言 我的

精选列表

搜索[编译],共10000篇文章
优秀的个人博客,低调大师

分布式数据库DDL的编译与执行

DDL是数据定义语言,用于定义和管理SQL 数据库中的所有对象的语言,常用的命令有:create,drop,alter等。通常来说,浪潮云溪数据库DDL语句的流程主要分为四个部分,分别是逻辑计划生成,物理计划生成,计划执行和schemachange。本文主要介绍逻辑计划生成,物理计划生成和计划执行。 - 逻辑计划生成 - 逻辑计划生成主要是生成一个planNode逻辑计划节点,每一条SQL都会有自己的planNode,以create table为例,该SQL生成的planNode中包含有CREATETABLE statement信息例如表名,有该表所属数据库的信息,还有该表的列的信息等。planNode生成后将其记录到planner的curplan(curplan有当前计划的属性,包含抽象语法树,planNode,子查询计划等)里,主要流程如下图所示。 以create table语句为例,构建逻辑计划主要是进行memo的构建以及RBO和CBO优化(memo是用来存储查询计划森林的一种数据结构)。首先会初始化一个优化计划的上下文optPlanningCtx,里面会初始化优化器并记录是否使用memo cache进行memo的缓存复用,而这也是DDL与DML语句之间的区别,DDL语句不会复用memo。 构建memo会调用builder的build()方法,对于不同的DDL语句,会调用不同的方法去构建逻辑计划。Create table语句会调用buildCreateTable,构建outScope,主要是生成语句的表达式expr记录在outScope里,最终记录到memo里面。而对于其他的DDL语句则会调用tryBuildOpaque,然后通过ConstructOpaqueDDL函数构建memo的expr。 Memo构建完以后就是进行优化,通过Optmize()函数进入进行RBO和CBO优化,而DDL语句不会进行优化,这也是与DML语句的区别,DML会将优化完的memo加入缓存。然后就是进行逻辑计划planNode的构建,DDL语句中,create语句会执行buildCreateTable进行ConstructCreateTable构建createTableNode,而drop和alter语句则会执行buildOpaque,通过ConstructOpaque返回所对应的planNode,最后将构建好的planNode封装到planTop里面,并且如果是DDL语句会在planTop的flags里面置planFlagIsDDL。 - 物理计划生成 - 逻辑计划生成后,就会根据逻辑计划生成物理计划,主要的流程如下图所示。 在生成物理计划之前会先判断语句是否需要分布式执行,DDL不会进行分布式执行,会生成一个本地的PlanningCtx(PlanningCtx 包含在单个查询的整个规划过程中使用和更新的数据)。如果SQL语句有子句的话,则会调用PlanAndRunSubqueries函数先执行子句。DDL语句会进入到wrapPlan进行物理计划的生成。在wrapPlan中会深度优先遍历planNode树,找到第一个支持DistSQL processor的planNode然后在该planNode上递归DistSQL优化,如果有等效的 DistSQL 处理器调用createPlanForNode生成物理计划。 函数首先判断当前planNode的类型,调用对应的函数为planNode创建物理计划(如indexJoinNode会调用createPlanForIndexJoin),DDL则会递归调用wrapPlan将planNode包起来继续处理(wrapPlan只包装节点本身而不包括孩子节点)。然后,调用shouldPlanTestMetadata函数判断是否需要进行元数据处理,如果需要则添加相关信息)。然后再进行创建planNodeToRowSource(该结构体),如果被包裹的planNode是flow中的第一个node,且语句类型是RowsAffected(返回受影响行的计数的语句)则可以使用fast path,planNode子树若支持DistSQL优化会在被优化后连接到wrapper。返回wrapper后,为物理计划添加LocalProcessor和LocalProcessorIndexes的元素,LocalProcessors数组包含了所有的planNodeToRowSource,即被包裹的planNode,记录物理计划的ResultTypes。 每当添加新的PhysicalPlan时,都需要覆写ResultRouters,我们将只需要一个result router,由于local processor不是分布式的,确保p.ResultRouters只有一个元素,最后填充计划的endpoints就进入执行流程。 - 执行 - 执行过程的主要流程如下图所示。 StartExec是具体执行planNode的方法,根据构建的物理计划对表描述符进行操作。StartExec会先对commend遍历(以alter table为例,commend是一个表修改操作的切片),在遍历中获取集群版本信息,检查在当前版本中是否支持添加列的类型,若支持则为true,反之报错;接着按照计划中的列定义信息生成列描述符,若添加的列是主键或含有唯一性约束,还会生成索引描述符,将这些描述符会包装成一个个mutation并添加到表描述符的Mutations字段里;然后根据表、mutation等信息创建一个job,job也是通过系统表system.jobs进行维护,这个job是用来触发及跟踪schema change执行,接着将含有mutations的表描述通过batch更新到系统表"descriptor"里。 执行流程中最主要的结构体就是batch,表描述符会存在batch里面,通过writeTableDescToBatch函数,在该函数里面,首先判断这个表如果不是一个新的表,需要将表的version+1,然后会验证表描述符格式是否良好,调用addUncommittedTable函数,这允许事务在绕过表租赁机制的情况下查看自己的修改,最后是将表描述符的KV写入到batch里面。batch构建完以后就执行batchRequest。 在执行流程结束后,如果需要数据回填的话,则进入到online schema change流程回填数据然后写入系统表完成执行流程,如果不需要的话,则在执行算子的时候就将数据写入到系统表中完成执行流程。

优秀的个人博客,低调大师

LFS-从源代码编译自己的操作系统(1)

以 ubuntu 系统为宿主机 1 安装宿主机 1.1 使用ubuntu 试用模式 1.1.1 下载ubuntu 镜像下载 1.1.2 安装虚拟机 补充try ubuntu截图 1.1.3 替换镜像源 Ubuntu 的软件源配置文件是 /etc/apt/sources.list。将系统自带的该文件做个备份,将该文件替换为下面内容 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-security main restricted universe multiverse # 预发布软件源,不建议启用 # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-proposed main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ impish-proposed main restricted universe multiverse 1.2 安装依赖 1.2.1 检查依赖 cat > version-check.sh << "EOF" #!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 MYSH=$(readlink -f /bin/sh) echo "/bin/sh -> $MYSH" echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash" unset MYSH echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3- bison --version | head -n1 if [ -h /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2 diff --version | head -n1 find --version | head -n1 gawk --version | head -n1 if [ -h /usr/bin/awk ]; then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"; elif [ -x /usr/bin/awk ]; then echo awk is `/usr/bin/awk --version | head -n1` else echo "awk not found" fi gcc --version | head -n1 g++ --version | head -n1 grep --version | head -n1 gzip --version | head -n1 cat /proc/version m4 --version | head -n1 make --version | head -n1 patch --version | head -n1 echo Perl `perl -V:version` python3 --version sed --version | head -n1 tar --version | head -n1 makeinfo --version | head -n1 # texinfo version xz --version | head -n1 echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c if [ -x dummy ] then echo "g++ compilation OK"; else echo "g++ compilation failed"; fi rm -f dummy.c dummy EOF bash version-check.sh 常见结果 bash, version 5.1.8(1)-release /bin/sh -> /usr/bin/dash ERROR: /bin/sh does not point to bash Binutils: version-check.sh: line 10: ld: command not found version-check.sh: line 11: bison: command not found yacc not found Coreutils: 8.32 diff (GNU diffutils) 3.8 find (GNU findutils) 4.8.0 version-check.sh: line 24: gawk: command not found /usr/bin/awk -> /usr/bin/mawk version-check.sh: line 34: gcc: command not found version-check.sh: line 35: g++: command not found grep (GNU grep) 3.7 gzip 1.10 Linux version 5.13.0-19-generic (buildd@lgw01-amd64-013) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #19-Ubuntu SMP Thu Oct 7 21:58:00 UTC 2021 version-check.sh: line 39: m4: command not found version-check.sh: line 40: make: command not found GNU patch 2.7.6 Perl version='5.32.1'; Python 3.9.7 sed (GNU sed) 4.7 tar (GNU tar) 1.34 version-check.sh: line 46: makeinfo: command not found xz (XZ Utils) 5.2.5 version-check.sh: line 49: g++: command not found g++ compilation failed 1.2.2 安装配置 ERROR: /bin/sh does not point to bash # 调整默认sh指向 dpkg-reconfigure dash 其它软件直接apt安装即可 apt install bison gawk gcc g++ make texinfo 再次检查结果 bash, version 5.1.8(1)-release /bin/sh -> /usr/bin/bash Binutils: (GNU Binutils for Ubuntu) 2.37 bison (GNU Bison) 3.7.6 /usr/bin/yacc -> /usr/bin/bison.yacc Coreutils: 8.32 diff (GNU diffutils) 3.8 find (GNU findutils) 4.8.0 GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1) /usr/bin/awk -> /usr/bin/gawk gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0 g++ (Ubuntu 11.2.0-7ubuntu2) 11.2.0 grep (GNU grep) 3.7 gzip 1.10 Linux version 5.13.0-19-generic (buildd@lgw01-amd64-013) (gcc (Ubuntu 11.2.0-7ubuntu2) 11.2.0, GNU ld (GNU Binutils for Ubuntu) 2.37) #19-Ubuntu SMP Thu Oct 7 21:58:00 UTC 2021 m4 (GNU M4) 1.4.18 GNU Make 4.3 GNU patch 2.7.6 Perl version='5.32.1'; Python 3.9.7 sed (GNU sed) 4.7 tar (GNU tar) 1.34 texi2any (GNU texinfo) 6.7 xz (XZ Utils) 5.2.5 g++ compilation OK 2 LFS准备 2.1 设置分区 2.1.1 分区规划 swap 2G / 剩余 2.1.2 使用fdisk分区 fdisk /dev/vda # 以下为交互输入 g # 改磁盘格式为gpt n # 新建分区,后面相同 回车 回车 +2G n 回车 回车 回车 w #保存修改 2.1.3 格式化分区 # swap mkswap /dev/vda1 # / mkfs,ext4 /dev/vda2 2.2 设置工作目录 2.2.1 设置LFS变量 export LFS=/mnt/lfs 2.2.2 后续如果关机重新进入,记得执行检查命令 echo $LFS 2.2.3 挂载分区 # 创建挂载 / 分区 mkdir -pv $LFS mount -v -t ext4 /dev/vda2 $LFS # 启动swap分区 /sbin/swapon -v /dev/vda1 2.3 获取源代码 2.3.1 创建源代码目录 mkdir -v $LFS/sources chmod -v a+wt $LFS/sources 2.3.2 源代码下载地址 ftp://ftp.lfs-matrix.net/pub/lfs/ (Los Angeles, CA, USA, 200Mbps) http://ftp.lfs-matrix.net/pub/lfs/ (Los Angeles, CA, USA, 200Mbps) ftp://ftp.osuosl.org/pub/lfs/ (Corvallis, OR, USA, 100Mbps) http://ftp.osuosl.org/pub/lfs/ (Corvallis, OR, USA, 100Mbps) http://mirror.jaleco.com/lfs/pub/ (Washington, DC, USA, 1 Gbps)

优秀的个人博客,低调大师

Go 编译器已默认启用 -G=3,支持泛型

Go 项目代码仓库昨日提交和合并的一个 PR 显示,Go 语言已在 cmd/compile 中默认启用 -G=3。 根据描述,此 PR 将 cmd/compile 的 -G flag 的默认值从 0 改为 3,因此可以使用新的 types2 类型检查器并支持类型参数,即启用了对泛型的支持。旧的类型检查器仍然可以通过-gcflags=all=-G=0 使用。该变更还更新了回归测试工具,主要是出于对默认行为变化的考虑(例如,types2 类型检查器已知的变更)。 不过,-G=0 模式目前仍在测试中。 其实上周 Go 1.17 发布时,开发者就发现泛型代码已被合并: HN 上的相关讨论:https://news.ycombinator.com/item?id=28253692

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册