tidb 源码研究分析日常碰到的 bug
作者: 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. 照官网的源码阅读攻略开始研究
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 了。。。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/b9eebb7a5f3c092c2c50662af】。文章转载请联系作者。
评论