一定時間経過したqueryは自動的に停止するにしたい

はじめまして、kei-qと申します。

REDASH_ADHOC_QUERY_TIME_LIMIT を設定することで一定時間経過したqueryが停止することを期待したのですが、振る舞いを見ているとredashのUI上ではerrorと表示されるものの、MySQLのprocesslistを見る限り生き残っているように見えます。
長時間実行されるqueryで問題になったことがあるので、一定時間経過したら完全に停止するようにしたいです。もしご存じの方がいましたら教えていただけると助かります。

念のためqueryを明示的にcancelした場合も確認したのですが、MySQLには KILL が発行されているようで、cancelしたあとにprocesslistを確認したところちゃんと後始末されているようです

動作確認環境

  • version : Version: 8.0.0+b32245
  • datasource : MySQL

確認方法

  1. REDASH_ADHOC_QUERY_TIME_LIMIT を設定
  • 今回は適当に30秒ほど
  1. redashからMySQLのdatasourceを選択し、 select sleep(60); を実行する
  2. 30秒後にUI上で Error running query: Query exceeded Redash query execution time limit. が表示されることを確認する
  3. select command, time, state from information_schema.PROCESSLIST where Command = 'Query'; を実行し、UI上ではerrorになったqueryに対応するprocessが残っていることを確認する
  4. sleep予定の60秒後にsleepのprocessが停止したことを確認する
1 Like

@kei-q こちら詳細な再現手順の提供ありがとうございます。

いただいた手順を元に確認してみます。

@kei-q いただいた手順で再現できました。

ざっと確認しただけなので確実性にかけるのですが run_query で SoftTimeLimitExceeded が発生した際に、キャンセル処理が呼ばれていないため、Celery のタスクとしては終了しているものの、MySQL のプロセスは残ったままになっていると思われます。

こちらの挙動にも関わってくるのですが、Redash はジョブキューを現在の Celery から RQ へ移行を進めていますので、Celery 由来のこの問題は修正されずに RQ へ移行する可能性が高いです。
もし、この問題に対する対応が急ぎ必要であれば、解決策としてはご自身でパッチを当てていただくなどの対処になるかと思います。

私の方では、master ブランチの実装を確認し、もし同じ問題が残っているようであれば、なんらかの方法で対処できないか、検討してみます。

長くなってしまいましたが、フォーラムでの共有ありがとうございました!

1 Like

@ariarijp
素早い対応助かります。ありがとうございます。

この問題に対する対応が急ぎ必要であれば、解決策としてはご自身でパッチを当てていただくなどの対処になるかと思います。

承知です。今回の件で周辺コードは少し読めるようになったので、RQへの移行があることを踏まえて運用を考えてみようと思います。

1 Like