Redash でクエリの実行は redis の queue を通して celery にて実行されているようです、この celery で実行している処理が不慮の事故で死んでしまうと Redash の画面上ではずっと IN PROGRESS 状態として残ってしまうという問題がありました。これを削除するためにやったことのメモです。
最初は Database (PostgreSQL) に入ってるのかなと思ったけど、それらしきレコードは見つかりませんでした
List of relations Schema | Name | Type | Owner --------+---------------------------+-------+-------- public | access_permissions | table | redash public | alembic_version | table | redash public | alert_subscriptions | table | redash public | alerts | table | redash public | api_keys | table | redash public | changes | table | redash public | dashboards | table | redash public | data_source_groups | table | redash public | data_sources | table | redash public | events | table | redash public | groups | table | redash public | notification_destinations | table | redash public | organizations | table | redash public | queries | table | redash public | query_results | table | redash public | query_snippets | table | redash public | users | table | redash public | visualizations | table | redash public | widgets | table | redash
それでは redis だろうと `redis-cli keys \*` でキーの一覧を出してみる
data_source:schema:1 data_source:schema:2 data_source:schema:3 data_source:schema:4 data_source:schema:5 data_source:schema:6 data_source:schema:7 data_source:schema:8 data_source:schema:9 data_source:schema:10 _kombu.binding.celery _kombu.binding.celeryev _kombu.binding.celery.pidbox _kombu.binding.queries _kombu.binding.scheduled_queries _kombu.binding.schemas new_version_available query_task_trackers:done redash:status schemas sq:executed_at celery-task-meta-UUID <-- いろんな UUID で沢山 query_task_tracker:UUID <-- いろんな UUID で沢山
UUID はログから分かっていたので keys *UUID* を試してみたら
query_task_tracker:164b9632-40a5-4af4-8500-21022b06215d というのがあった。
中身は JSON でこんなのが入ってました。
{ "username": "user@example.com", "retries": 0, "started_at": 1527501588.652453, "task_id": "164b9632-40a5-4af4-8500-21022b06215d", "created_at": 1527501564.920558, "updated_at": 1527501588.652842, "state": "executing_query", "query_id": 91, "run_time": null, "scheduled": false, "scheduled_retries": 0, "data_source_id": 2, "query_hash": "2b0cc6eac4188b1b0097b02b9d4f1f6e" }
でも IN PROGRESS のリストにこの情報が出るってことはこの key=value だけじゃなくてどこかにこの key を持ったリストのようなデータがあるはず、ということで redis-cli monitor で redis に対してどんなリクエストが発行されてるかを眺めてみました。
上に並べた keys * のリストは IN PROGRESS のクエリがない状態なので存在しませんが、monitor コマンドで確認したら query_task_trackers:in_progress というキーがありました。名前からしてこれですね。
さて、query_task_trackers:in_progress の型は何だろうか?
そんな場合は type コマンドで確認できます。これは zset でした。
> type query_task_trackers:in_progress zset
zset のリストを全部取り出すには次の様に zrange で 0 から -1 までと指定します
> zrange query_task_trackers:in_progress 0 -1
この zset から当該の task 情報を削除すれば良さそうなので zrem で消します
> zrem query_task_trackers:in_progress query_task_tracker:164b9632-40a5-4af4-8500-21022b06215d
めでたしめでたし。
Redis の調査には「Redis に保存されてる値を見ようと思った時に覚えておきたい redis コマンド | そんなこと覚えてない」が大変参考になりました。