手把手教你成为 TiDB 的 Contributor
一、背景
最近笔者在 asktug 回答问题的时候发现,在 6.5.0 版本出现了几个 显示未启动必要组件 NgMonitoring
的问题贴。经过排查发现,是 ngmonitoring.toml 中的配置文件出现了问题。文件中的 endpoints 应该是以逗号分隔的,但是却写成了以空格分隔的情况,所以才导致了报错。
临时的解决方案就是手动修改配置文件,并 restart prometheus。
(这里借用一下原帖中的截图)
原帖地址:
使用 TiUP 部署的集群显示集群中未启动必要组件 NgMonitoring
二、修复 bug
前面已经发现问题了,先简单分析一下,这里是配置文件出现问题了,那么大概率是需要到 TiUP 的仓库中去修复 bug。所以笔者就到 github 中找到了 TiUP 仓库。
tiup 仓库地址:pingcap/tiup: A component manager for TiDB (github.com)
首先笔者需要知道出问题的具体代码在哪,所以笔者先根据文件中的注释进行查找。
这个配置文件与 ngmonitoring.toml 完全吻合,点进去查看,笔者发现这里使用的变量名是PDAddrs
继续使用 PDAddrs
进行查找,看看代码中是如何给 PDAddrs
赋值的。在结果中排除掉路径中带有 template
关键字的文件,发现只有路径为 pkg/cluster/spec/monitoring.go
的文件最符合。
查看代码后发现,NgMonitoringConfig
数据结构正是存储 ngmonitoring.toml 文件中数据的结构,变量 pds
正是出现 bug 的地方了。
笔者梳理了一下这里的逻辑:代码中首先定义了变量 pds
为 string 类型的切片,通过解析 PDServers 变量,把一个或者多个 PDServers 的信息用 append 函数加入到 pds 中,然后把 pds 赋值给 ngcfg。根据这个逻辑,笔者猜测:pds 增加元素之后,数据存储的方式就已经是用空格分隔了。之后,笔者就写了一个简单的 go 的代码,来还原 bug。
输出结果:
根据结果笔者发现,不管是数组还是切片,在 go 的结果中,都是用空格进行分隔的。这个时候笔者脑袋里又出现一个疑问,如果是因为切片存储数据导致的问题,那之前的 tiup 版本为什么没有同样的问题出现呢?
于是笔者翻了上一个 tiup 版本(1.11.1)的代码:
根据数据结构定义,能看到 1.11.3 版本中的 PDAddrs 是 string 类型的。而且赋值部分的代码有了很大的改变,所以可以认定是部分代码优化重构之后,数据结构发生改变导致的 bug。这样就好解决了,笔者只需要把 pds 中的元素改成逗号分隔并传入到 PDServers 中就行了。所以变更如下:
三、提交代码
首先需要把 TiUP 项目 Fork 到自己的仓库中,点击这个地方:
然后到自己的仓库中,使用在线的 vscode 进行代码编写及代码提交:
代码修改完毕之后,填写好修改的 bug 信息,然后提交并推送:
之后到自己的 TiUP 仓库中,创建一个 pr :
写好相关信息直接提交即可。第一次参与 TiDB 开源项目需要签署 CLA 贡献者许可协议,留意 PR 中机器人的提示就行。
最后就等待反馈,比如有人会告诉你更好的写法,或者是更好的解决方案,或者直接把 PR 合并到了 master。
到这里,一个开源项目的 bug 修复就已经完成了。
四、总结
由于笔者是第一次参与开源项目,整个过程花费了一些时间去摸索。所以在这里记录了自己成为 Contributor 的全过程,给想要为开源项目尽一份力的同学一个参考,为开源社区贡献自己的一份力量。
PS:第一次为 TiDB 开源项目做出自己的贡献还是非常令人激动的。在此感谢原厂大佬在我的 PR 基础上给了代码优化的建议。
作者介绍:caiyfc,来自神州数码钛合金战队,是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有 TiDB 高级资格证书,并活跃于 TiDB 开源社区,是官方认证合作伙伴。目前已为 10+ 客户提供了专业的 TiDB 交付服务,涵盖金融、证券、物流、电力、政府、零售等重点行业。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/bc8e7bd9a50eb7cee11d127ba】。文章转载请联系作者。
评论