エラーログドリブン ソースコードリーディング(ただしMySQLに限る)
こんにちは、DBAです。
MySQLのソースコードを読んでみたい、だけどどこから始めればいいのかわからない…というお客様はいらっしゃらないでしょうか。そんな2年前の俺に贈るエントリーです。
まずはソースコードのタグジャンプが出来る何かを用意しておいた方が捗ります。俺はvim + GNU Globalでやっていますが、その前はgrep -irやfind . -exec grepでもなんとかなっていたので、なくても遅いだけでなんとかなるにはなります。
⇒ 人間とウェブの未来 - GNU GLOBALとvimで巨大なコードでも快適にコードリーディング
さて、たとえばこんなエラーログが吐かれることがあるじゃないですか。
141203 18:14:02 [Note] Stop asynchronous binlog_dump to slave (server_id: xxxx)
スレーブのI/Oスレッドが止まった時にマスターが吐くやつですね。意味はわかってもわからなくても取り敢えず何でもいいです。判ってるメッセージの方が楽ですけれど。
$ global -g "binlog_dump to slave" plugin/semisync/semisync_master_plugin.cc sql/sql_repl.cc
grep -rでもいいです。あまり長いので引っ掛けようとすると、案外コード上は2行になってたりするので引っかからない場合があります("Stop asynchronous binlog_dump to slave"では引っかからなかった)
取り敢えず名前からしてSemisyncプラグインっぽい semisync_master_plugin.cc を開いてみます。
..
93 int repl_semi_binlog_dump_end(Binlog_transmit_param *param)
94 {
95 bool semi_sync_slave= repl_semisync.is_semi_sync_slave();
96
97 sql_print_information("Stop %s binlog_dump to slave (server_id: %d)",
98 semi_sync_slave ? "semi-sync" : "asynchronous",
99 param->server_id);
100 if (semi_sync_slave)
101 {
102 /* One less semi-sync slave */
103 repl_semisync.remove_slave();
104 }
105 return 0;
106 }
..
相手がSemisync-masterがマスターにインストールされてて、接続しにきたスレーブでもSemisync-slaveがインストールされていたら、"asynchronous"の部分が"semi-sync"に書き換わるみたいですね。てことはSemisync-masterがインストールされてないマスターではこれ出ないのか。気にしたことなかった。
sql_repl.cc の方はどうでしょう…と思ったんですが、検索文字列が短すぎたようで、
..
478 if (global_system_variables.log_warnings > 1)
479 sql_print_information("Start binlog_dump to slave_server(%u), pos(%s, %lu)",
480 thd->server_id, log_ident, (ulong)pos);
..
"Start binlog_dump to slave_server"が引っかかってました(´・ω・`)
とはいえ、この"Start binlog_dump"のメッセージはlog_warningsが2以上の時にだけ出力することがわかりました。ウチの環境ではいつも出てるのは知ってましたが、log_warningsに依存するとは知らなかったでありますよ。
とかなんとか、"エラーログに吐かれるERRORやINFOはどこかにハードコードされているはず"というのを期待してソースコードを読み始めるおはなしでした。これを繰り返すとなんとなく構造体が持ってる情報とかなんとなくわかるようになってくるので、ぶっつけで読めるようになるんじゃないかと思います。
Have fun!!