夜天之书 #63 上游优先的故事 2 atomic

前排提示,本文全文长 1.6w 字,由十个故事组成。出于微信公众号的展示特点,我将其切成若干个部分分开推送。如果想要单页读完全部内容,请点击阅读原文跳转网页,网页展示有目录,可以快速导航。

atomic

这个例子是我在 Golang 生态的参与。不同于上一个例子,我在 contribute back 相关改动的时候并没有急切的下游需求,只是我在使用的过程里发现上游有可以做得更好的地方,于是就顺手实现了。首先讲这个例子是因为 uber-go/atomic[1] 的参与经历给了我一个催发布的定型文。

我应该是在迁移 TiDB 测试的时候,发现了部分代码使用了 Golang 早期只有操作指针的函数的 atomic 库。这种代码要求操作对应的变量必须都用 atomic 库提供的方法,一旦直接访问就有破坏一致性的风险。在其他语言的实现里,往往都会有原子类型,例如 Java 里的 AtomicInteger 和 AtomicReference 类,来保证所有操作都是在原子类型的方法上的,也就避免了应用逻辑上是 atomic int64 但是只能定义成 int64 的问题。

我从其他开发者那里得知了 Uber 的 atomic 库提供了原子类型定义,马上就愉快的用上了。在使用的过程里,虽然没有实际的需求,但是从完整性上我发现 Uber 的 atomic 库没有定义 uintptr 和 unsafe.Pointer 对应的原子类型,而 Golang 的 atomic 库函数里有操作相应类型的函数。因为闲暇时候我也是写点代码打发时间,所以我先提交 issue 询问维护者添加这两个原子类型是否合适,得到肯定的答案之后就顺手实现了一个补丁提交。

•Shall we add support of uintptr and Pointer?[2]•uintptr, unsafe_pointer: implement[3]

因为改动很简单,所以几轮 review 过后 24 小时内就合并了。

不过,不像 Spotless 通过自动化发布流水线,合并补丁之后基本一天内就可以从 Maven 中央资源库引用新版本,大部分的项目包括 Uber 的 atomic 库都需要人来触发或完成发布流程的。非自动化的发布的节奏,Apache Pulsar 和 Apache Flink 这样的项目会有一个相对稳定的发布周期,并且社群成员能够从文档上看到发布的时间规则,因此我也能知道大致什么时间会发布新版本,而且急也没用。但是有些项目开发活动并不活跃,它们会倾向于开发一段时间后“差不多了就发布”。

虽然 go.mod 其实允许直接引用一个 commit 标识的版本,但是我出于软件工程的最佳实践,我当时认为只有已经正式发布的版本里包括了我的更改,这个 contribution 才算正式完成。于是我用下面这段话向维护者请求发布一个包含我的改动的新版本:

@abhinav is there a release cycle or trigger description. I may hurry a bit but it is the nature a developer want to know how and when the work released :P

维护者表示他们确实是“差不多了就发布”的风格,但是很乐意在当周就发布一个包含我的改动的新版本。实际上,一天以后就发布了 v1.8.0 版本。

这段经历不仅带给我一个日后重复使用的催发布定型文,也是在偶然之后提醒我可以更加积极地与维护者沟通:如果你有什么需求,为什么要假设其他人不接受,而不是试着问一下呢?

一个有趣的后续是,目前 Golang 最新的 1.19 版本包含了从 Uber 的 atomic 库“借鉴”的原子类型[4]。虽然我很好奇他们为什么只选取了一部分类型,比如没有包括 float 和 duration 等类型,但是我发现我写的 Uintptr 类型也被包含其中。尽管 Golang 的作者并没有在代码里说明这段代码是来自 Uber 的 atomic 库的,或许是因为他们觉得这是平凡的实现,在具体的方法集合上也有裁剪,但是 Golang 的开发者都知道是怎么回事(笑)。

References

[1] uber-go/atomic: https://github.com/uber-go/atomic
[2] Shall we add support of uintptr and Pointer?: https://github.com/uber-go/atomic/issues/88
[3] uintptr, unsafe_pointer: implement: https://github.com/uber-go/atomic/pull/90
[4] 原子类型: https://pkg.go.dev/sync/atomic#pkg-types

猜你喜欢

转载自blog.csdn.net/weixin_44723515/article/details/127255641
63