Q4M のコンパクションをノンブロッキングにする話
- Q4M には、キューファイルを定期的に圧縮するコンパクションという処理がある
- コンパクションが走ってる間は INSERT も queue_wait も固まる
- コンパクションの実行時間は、キューに滞留してるデータサイズに依存 *1
第2点のうち、INSERT が固まっちゃうのは、ウェブアプリから INSERT してるようなケースで良くないので、コンパクション中も INSERT (のみ) 可能にしようかなと思ってる。
たぶん、コードの変更は以下でいいと思うのでメモ。
- compaction 中は info->mutex と wrlock(rwlock) を保持している
- SELECT, UPDATE は rwlock を rdlock してる
- queue_end (erase_owned) も同様
- queue_abort と切断 (reset_ovwer) は rwlock を取っていない ⇒ ロックするように変更
- compaction 中に info->mutex を開放するように
- compaction 中に定期的に insert 待ちキューをチェックして writer_do_append
以下、要検討。
- 手動で compaction 処理を開始できるとうれしいかも
- (安定性を重視するユーザーむけに) 従来の方式と切り替えられるとうれしい
*1:10MB/sec とかなのかなー maybe