Q4M のコンパクションをノンブロッキングにする話

  1. Q4M には、キューファイルを定期的に圧縮するコンパクションという処理がある
  2. コンパクションが走ってる間は INSERT も queue_wait も固まる
  3. コンパクションの実行時間は、キューに滞留してるデータサイズに依存 *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