写点什么

tidb 源码研究分析日常碰到的 bug

  • 2024-07-19
    北京
  • 本文字数:1165 字

    阅读完需:约 4 分钟

作者: tidb 菜鸟一只原文来源:https://tidb.net/blog/5f47e580

源码阅读

1. 首先安装 goland

下载地址:Other Versions - GoLand (jetbrains.com)


我安装的时 2023.2 版本,原因不多说,你也可以用最新版,30 天内免费,过期了买 license

2. 安装 go

下载地址:All releases - The Go Programming Language (google.cn)


最新版就可以

3. 下载 tidb 源码

下载地址:Releases · pingcap/tidb · GitHub


我下载的是 6.5.10,因为我正在用这个版本,你想研究哪个版本就下载哪个版本

4. 配置 goland

设置 -go-goroot 配置你下载的 go 安装的地址,我的是 F:\go\go


5. 配置完成之后会自动下载 modules dependencies

下载慢的话,打开 powershell 窗口设置 goproxy


$env:GOPROXY = “https://goproxy.io,direct”


重新打开 goland 等待下载完成


完成之后大概是这样的


6. 项目跑起来

找到 tidb-server 下的 main.go 文件


找到主函数



点击绿色的箭头,debug 模式跑起来


7. 本地连接 tidb-server

注意 root 是没有密码的,直接连接就行



连接成功之后,你会发现执行


SELECT * FROM INFORMATION_SCHEMA.`TIKV_REGION_STATUS`; 是无法查询到数据的,因为这个表必须要调用 pd 的 api 接口,而你的 pd api 并没有启动所以无法查询



而像这个就可以了,SELECT * FROM INFORMATION_SCHEMA.tables;


8. 照官网的源码阅读攻略开始研究

TiDB 源码阅读 | PingCAP

9. 发现 bug,进行调试

参考链接分区表 decimal 精度无法扩容 - TiDB 的问答社区 (asktug.com)


下载 6.5.0 版本的源码


然后按照上面的步骤开始调试,debug 模式跑起来



然后开始执行对应 bug 的 sql



查看日志:



最后发现是 ddl/ddl_api.go 对应内容



当执行列修改时,首先会检查是否需要改变列数据,具体的检查是通过 needChangeColumnData 函数来确定的。在这个函数中,如果检测到目标表是分区表(通过 t.Meta().Partition != nil 来判断),就会直接返回一个错误 ErrUnsupportedModifyColumn,提示不支持修改列。


而调用的 ddl/column.go 下面的函数 needChangeColumnData 呢


其中对应内容是这样的



对于 DECIMAL 类型的列


  • 检查精度 (GetFlen())、小数位数 (GetDecimal()) 是否发生变化,以及是否从有符号改为无符号 (toUnsigned != originUnsigned)。

  • 如果任何一个条件不满足,返回 true,表示需要进行数据重组或变更。


也就是说,当你执行 ALTER TABLE employees4 MODIFY COLUMN lid DECIMAL(20,4); 对一个分区表的 DECIMAL 字段进行变更时,只要你精度、小数位数、以及符号有变化,即表示需要数据重组(实际像我测试的情况应该是不需要重组的),而当你需要数据重组时,只要检测对应的表示分区表,直接会返回报错,table is partition table,不允许修改,这样就确定了这个 bug 的源头。


这时我们看下 6.5.10 版本的对应代码:




说明这个 bug 还在,这时就只能提个 issue 等待 tidb 人员修复这个 bug 了。。。


发布于: 16 分钟前阅读数: 4
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
tidb源码研究分析日常碰到的bug_TiDB 源码解读_TiDB 社区干货传送门_InfoQ写作社区