MariaDB に PR を出してみた

経緯

ダイレクトマーケティング?が飛んで来て、内容がガチでやるだけっぽい雰囲気だったのでとりあえず開発環境を準備してやってみることにしました。(元同僚なノリでメンション来てます。「別の元同僚が PR 出してくれた」的なツイートをファボったら白羽の矢が立った感じです。)

準備

まず GitHub で fork します。 今回はそのまま fork すると mihyaeru21/server になってわかりにくかったので mihyaeru21/MariaDB に名前を変更してみました。

ビルドするために公式のドキュメントに従っていろいろ入れていきます。 手元の環境が WSL2 上の Ubuntu 20.04 なので Ubuntu 向けの情報を参照しています。 説明だと 10.3 だけど現在のデフォルトブランチが 10.9 なので、ところどころ置き換えてやっていきます。

1
2
3
4
5
6
$ sudo apt install software-properties-common devscripts equivs
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ sudo add-apt-repository --update --yes --enable-source 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.9/ubuntu '$(lsb_release -sc)' main'
$ sudo apt build-dep mariadb-10.9
Reading package lists... Done
E: Unable to find a source package for mariadb-10.9

先生(@NayutaYanagisaw)に聞いたところ、 10.9 をビルドする分には 10.8 のやつでも問題ないとのことなので以下に変更してやり直しました。

1
2
$ sudo add-apt-repository --update --yes --enable-source 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.8/ubuntu '$(lsb_release -sc)' main'
$ sudo apt build-dep mariadb-10.8

これは通りました。

fork したリポジトリを落してきてビルドするスクプトを実行してみました。

1
2
3
$ ghq get -p mihyaeru21/MariaDB
$ # 該当ディレクトリに移動
$ ./debian/autobake-deb.sh

無事にビルドできましたが、実行後に大量に diff が生み出されていました。バージョン的な変更も入っていたのでリリース用のスクリプトなのかもしれません。詳しくは見ていないです。

先生の記事では以下のようにやっていました。

1
2
3
$ mkdir mariadb-server/bld && cd $_
$ cmake -DCMAKE_BUILD_TYPE=Debug ..
$ cmake --build . --config Debug -j 4

自分の環境に合わせて以下で実行しました。こっちの方がかなり速く完了します。やっぱ ./debian/autobake-deb.sh はビルド以外にもいろいろやっているようです。

1
2
3
$ mkdir build && cd $_
$ cmake ..
$ cmake --build . --config Debug -j 16

今回のチケット

チケットは https://jira.mariadb.org/browse/MDEV-28364 です。

「Fix Version/s:」が 10.10 なので 10.10 ブランチで作業します。

1
$ git checkout -t origin/10.10

変更を入れる前にビルドできることを確認するためにあらためてビルドしておきます。

1
2
$ cmake ..
$ cmake --build . --config Debug -j 16

今回は無駄なコードを削除するタスクでした。対象を検索してみると修正箇所は3箇所だけでした。

1
2
3
4
5
6
7
8
9
$ rg SPIDER_HAS_EXPR_CACHE_ITEM
storage/spider/spd_db_conn.cc
7938:#ifdef SPIDER_HAS_EXPR_CACHE_ITEM

storage/spider/spd_db_include.h
36:#define SPIDER_HAS_EXPR_CACHE_ITEM

storage/spider/spd_db_mysql.cc
6390:#ifdef SPIDER_HAS_EXPR_CACHE_ITEM

10.10 の時点では常に #define SPIDER_HAS_EXPR_CACHE_ITEM される状態になっているので #ifdef 内部を残すように #ifdef を削除すれば OK でした。

その後、変更によって壊れていないことを確認するために再度ビルドして通ることを確認しました。ちなみに、おかしくなっている場合にちゃんとコケることも確認してみました。

1
$ cmake --build . --config Debug -j 16

テストも動かしてみようかと一瞬思ったのですが CI で実行しているのでそっちに任せることにしました。

PR へ

今回作った PR は https://github.com/MariaDB/server/pull/2150 です。

PR を作ったら CLAassistant というボットからコメントがついて、CLA に同意しろという内容でした。そんなに OSS 活動をしていなかったので「なんぞや」と思ったのですが大きいプロジェクト(企業のやつ?)だとよくあるっぽいです。

選択肢としては以下の2つがあったのですが、とくにこだわりはないのでおすすめっぽい1つ目の「MariaDB Contributor Agreement」にしました。

CLA の方の手続きを終えると CI が動き始めました。今回の PR では base branch の時点でコケるようになっていたタイミングだったので1つ通らなかったですが、それがわかっていたのでマージしてもらいました。

感想

案外楽に環境を整えてコードをいじるところまで辿り着けました。ドキュメントがしっかりしていると参入?障壁が低いなーという感想です。仕事でもちゃんとドキュメントを書いていかないと……。

コードをいじるときは Neovim で ccls を使ってみたのですが設定がうまくできていないのか、コードジャンプがあまり良い感じに動きませんでした。原因調査するよりはタスクを完了させたかったので深追いはしていないです。もうすこし本格的にいじる機会があればちゃんと追ってみようかなと思います。