概要
gracefulなfluentd.confの再読み込み、プラグイン自体で頑張るなら再読み込みしたい内容を外出しし、何らかのシグナル受け取った時に読み込み直しどうにかできた。
https://t.co/7bdqilzSP4
ただ、HUP受けた時に再起動しなくなった。なんでや…
— BASHさん (@bash0C7) 2014, 5月 4
やったこと
- gracefulに再読み込みしたい項目を外部ファイル化する
- 外部ファイル化した項目を使う部分をスレッド化する
- 何らかのシグナルを受け取った時に読み込み直して、依存する初期化処理をやりなおす
- 読み込み直す前にスレッドを殺して、読み込み直した後にスレッドを作り直す
実装
https://github.com/bash0C7/fluent-plugin-ruby_one_liner/blob/support_expernal_command_file/lib/fluent/plugin/out_ruby_one_liner.rb#L7
commandfile
に読み直したい外部ファイルのパスが入っています。
https://github.com/bash0C7/fluent-plugin-ruby_one_liner/blob/support_expernal_command_file/lib/fluent/plugin/out_ruby_one_liner.rb#L74
emit
ではキューに突っ込むだけにして、このスレッドでpopし外部ファイル化した項目(から作った処理)を動かしています。
https://github.com/bash0C7/fluent-plugin-ruby_one_liner/blob/support_expernal_command_file/lib/fluent/plugin/out_ruby_one_liner.rb#L20
SIGINTを受けたら、reload_commandfile!
を動かします。
https://github.com/bash0C7/fluent-plugin-ruby_one_liner/blob/support_expernal_command_file/lib/fluent/plugin/out_ruby_one_liner.rb#L67
reload_commandfile!
では読み込み直しとスレッドの作り直しをしています。スレッドがなくなってもキューで切り離しているので問題ありません。
問題点
他にもSIGINTで再読み込みってどうよとか色々ある。
— BASHさん (@bash0C7) 2014, 5月 4
trap掛ける場所、statでThread.new(&method(:run))した後のほうがよかったか
— BASHさん (@bash0C7) 2014, 5月 4
- HUP受けた時に再起動しなくなった。なんでや…