来月ぐらいにはGo 1.7がリリースされそうなのですが、CONTRIBUTORSに名前が載せられそう( https://github.com/golang/go/blob/release-branch.go1.7/CONTRIBUTORS#L915 )なので記念エントリです。
内容自体は、4月にあったGoCon 2016 Spring( http://gocon.connpass.com/event/27521/ )での発表済みです。
tl;dr
- 一部のディストリの最新版でlinux/386でビルドしたバイナリが起動すらできない、というバグがあった
- 問題はruntimeのアセンブラ部分だったけど、なんとかパッチ書けた
- パッチ提出→コードレビュー→やりとり→マージまで、3日程度とスムーズに進行できた
- Gerritを初めて使ったけど、GitHubとはまた違った思想を感じられて面白い
コントリビュート成功までの流れ
- Amazon Linux 2016.03 (Linux Kernel 4.4.5)では、
CONFIG_MODIFY_LDT_SYSCALL
が無効にされており、Golangのlinux/386で起動時に利用しているmodify_ldt
が使えなくなり、全てのGolangのlinux/386バイナリが起動不能にmodify_ldt
の無効化はセキュリティ強化のためらしい
- ぼちぼち困っている人がいる https://github.com/golang/go/issues/14795
対処
modify_ldt
ではなく、set_thread_area
を利用するように- めっちゃアセンブラのところを触る必要がある
- https://github.com/golang/go/blob/master/src/runtime/sys_linux_386.s
- ちなみに2009年ぐらいから変化していない箇所。最近ちょっと手が入っているけど、基本は2009年のまま
- GDT(Global Descriptor Table)からLDT(Local Descriptor Table)を切り出してくるためのシステムコール
- GDTとは
set_thread_area
もLinux3.18とLinux3.19で仕様が変わっている- Golangでのアセンブラの書き方
Golangのレビュープロセス
- コントリビュートの方法は丁寧なドキュメントがある https://golang.org/doc/contribute.html
- git-codereviewというサブコマンドが用意されてる
- 基本的には1コミットにすべて集約して、GitHubで言うところのPull Request相当に
- レビューシステムは Gerrit を利用している
- 1コミットに集約されたものにコメントをつける → コミットを更新する、の繰り返し
- 過去のコミットとそれへのコメントも見易い
- 慣れるとGithub Pull Request方式よりよい、という人もいるらしい
- 行単位にコメントする際に、最初はDraftとして保存されて、全部入力し見直したあとで確定できるのは確かに便利
- UI的には装飾がすくなくて、とにかく密度高め
- 参考: Gerrit vs Github: https://gist.github.com/mbbx6spp/70fd2d6bf113b87c2719