2
12
11
4
专栏/.../

手把手教你成为 TiDB 的 Contributor

 caiyfc  发表于  2023-04-21

一、背景

​ 最近笔者在 asktug 回答问题的时候发现,在 6.5.0 版本出现了几个 显示未启动必要组件 NgMonitoring 的问题贴。经过排查发现,是 ngmonitoring.toml 中的配置文件出现了问题。文件中的 endpoints 应该是以逗号分隔的,但是却写成了以空格分隔的情况,所以才导致了报错。

​ 临时的解决方案就是手动修改配置文件,并 restart prometheus。

(这里借用一下原帖中的截图)

图片

原帖地址:

使用 TiUP 部署的集群显示集群中未启动必要组件 NgMonitoring

v6.5.1 dashboard 异常

二、修复 bug

​ 前面已经发现问题了,先简单分析一下,这里是配置文件出现问题了,那么大概率是需要到 TiUP 的仓库中去修复 bug。所以笔者就到 github 中找到了 TiUP 仓库。

​ tiup 仓库地址:pingcap/tiup: A component manager for TiDB (github.com)

​ 首先笔者需要知道出问题的具体代码在哪,所以笔者先根据文件中的注释进行查找。

image.png

image-20230421112157758

​ 这个配置文件与 ngmonitoring.toml 完全吻合,点进去查看,笔者发现这里使用的变量名是PDAddrs

image-20230421112325112

​ 继续使用 PDAddrs 进行查找,看看代码中是如何给 PDAddrs 赋值的。在结果中排除掉路径中带有 template 关键字的文件,发现只有路径为 pkg/cluster/spec/monitoring.go 的文件最符合。

image-20230421112828632

​ 查看代码后发现,NgMonitoringConfig 数据结构正是存储 ngmonitoring.toml 文件中数据的结构,变量 pds 正是出现 bug 的地方了。

image-20230421113141656

​ 笔者梳理了一下这里的逻辑:代码中首先定义了变量 pds 为 string 类型的切片,通过解析 PDServers 变量,把一个或者多个 PDServers 的信息用 append 函数加入到 pds 中,然后把 pds 赋值给 ngcfg。根据这个逻辑,笔者猜测:pds 增加元素之后,数据存储的方式就已经是用空格分隔了。之后,笔者就写了一个简单的 go 的代码,来还原 bug。

import (
	"fmt"
)

func main() {
	data := [...]string{"one", "two", "three"}
	fmt.Println(data)

	pds := []string{}
	for i := 0; i < 10; i++ {
		pds = append(pds, fmt.Sprintf("\"127.0.0.1:4000\""))
	}
	fmt.Println(pds)

}

输出结果:

image-20230421115118988

​ 根据结果笔者发现,不管是数组还是切片,在 go 的结果中,都是用空格进行分隔的。这个时候笔者脑袋里又出现一个疑问,如果是因为切片存储数据导致的问题,那之前的 tiup 版本为什么没有同样的问题出现呢?

​ 于是笔者翻了上一个 tiup 版本(1.11.1)的代码:

image-20230421115733451

image-20230421120026501

​ 根据数据结构定义,能看到 1.11.3 版本中的 PDAddrs 是 string 类型的。而且赋值部分的代码有了很大的改变,所以可以认定是部分代码优化重构之后,数据结构发生改变导致的 bug。这样就好解决了,笔者只需要把 pds 中的元素改成逗号分隔并传入到 PDServers 中就行了。所以变更如下:

image-20230421135048491

三、提交代码

​ 首先需要把 TiUP 项目 Fork 到自己的仓库中,点击这个地方:

image-20230421135431181

​ 然后到自己的仓库中,使用在线的 vscode 进行代码编写及代码提交:

image-20230421135641332

​ 代码修改完毕之后,填写好修改的bug信息,然后提交并推送:

image-20230421135928065

​ 之后到自己的 TiUP 仓库中,创建一个 pr :

image-20230421140141515

​ 写好相关信息直接提交即可。第一次参与 TiDB 开源项目需要签署 CLA 贡献者许可协议,留意 PR 中机器人的提示就行。

​ 最后就等待反馈,比如有人会告诉你更好的写法,或者是更好的解决方案,或者直接把 PR 合并到了 master。

​ 到这里,一个开源项目的 bug 修复就已经完成了。

四、总结

​ 由于笔者是第一次参与开源项目,整个过程花费了一些时间去摸索。所以在这里记录了自己成为 Contributor 的全过程,给想要为开源项目尽一份力的同学一个参考,为开源社区贡献自己的一份力量。

PS:第一次为 TiDB 开源项目做出自己的贡献还是非常令人激动的。在此感谢原厂大佬在我的 PR 基础上给了代码优化的建议。

作者介绍:caiyfc,来自神州数码钛合金战队,是一支致力于为企业提供分布式数据库TiDB整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有TiDB高级资格证书,并活跃于TiDB开源社区,是官方认证合作伙伴。目前已为10+客户提供了专业的TiDB交付服务,涵盖金融、证券、物流、电力、政府、零售等重点行业。

2
12
11
4

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

评论
暂无评论