1
2
2
0
专栏/.../

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

 tidb菜鸟一只  发表于  2024-07-14

源码阅读

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模式跑起来

image.png

然后开始执行对应bug的sql

image.png

查看日志:

image.png

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

image.png

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

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

其中对应内容是这样的

image.png

对于 DECIMAL 类型的列

  • 检查精度 (GetFlen())、小数位数 (GetDecimal()) 是否发生变化,以及是否从有符号改为无符号 (toUnsigned != originUnsigned)。
  • 如果任何一个条件不满足,返回 true,表示需要进行数据重组或变更。

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

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

image.png

image.png

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

1
2
2
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论