Jobs::SyncTopicUserBookmarked が無限ループでCPU使用率100%

ここ約18時間、サーバーのCPU使用率が100%近くになっています。

Sidekiqを見ると、同じ5つのジョブを実行中で忙しい状態です。

常に「Just now」の状態であり、それらの同じ3つのトピックIDを繰り返し実行しているようです。

Discourseを再起動してみましたが、状況は改善しませんでした。

関連があるか分かりませんが、3.3.3から3.3.4にアップデートしてから約24時間後に発生しました。app/jobs/regular/sync_topic_user_bookmarked.rb に最近の変更は見られず、3.3.4で関連しそうな変更も見つけられませんでしたが、コードベースには詳しくありません。

何が起こっているのか、何か手がかりはありますか?

これに関するアップデートです。タスクが繰り返し実行され続けている 3 つのトピック ID は、昨日、これが始まった頃に自動削除返信を有効にしたトピックであることがわかりました。これらはすべて非常に大きなトピックです。

トリガーはわかりましたが、繰り返されている SQL はバッチ処理を行っていないように見えるため、なぜ何度も繰り返し実行されるのかわかりません。

多数の返信を削除し続けている別のジョブによってトリガーされているのでしょうか。それとも、削除された投稿ごとに Jobs::SyncTopicUserBookmarked が実行されるのでしょうか。それともバグでしょうか。

大きなトピックの 1 つから自動削除を削除しましたが、そのトピック ID に対する Jobs::SyncTopicUserBookmarked の繰り返し呼び出しには影響がないようです。

SIDEKIQ_WORKERS を 2 に減らしたところ、しばらくしてキュー(保留中の多くの項目があった)がクリアされ、Jobs::SyncTopicUserBookmarked が実行されなくなりました… :thinking:

それを試す前に、以下のクエリが複数回同時に実行されているのに気づきました(同じトピック ID を使用していました):

SELECT bookmarks.user_id, COUNT(*)
INTO TEMP TABLE tmp_sync_topic_user_bookmarks
FROM bookmarks
LEFT JOIN posts ON posts.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Post'
LEFT JOIN topics ON (topics.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Topic') OR
 (topics.id = posts.topic_id)
WHERE (topics.id = 51303 OR posts.topic_id = 51303)
AND posts.deleted_at IS NULL AND topics.deleted_at IS NULL
GROUP BY bookmarks.user_id;

UPDATE topic_users
SET bookmarked = true
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.user_id = tmp_sync_topic_user_bookmarks.user_id AND
  topic_users.topic_id = 51303 AND
  tmp_sync_topic_user_bookmarks.count > 0;

UPDATE topic_users
SET bookmarked = false
FROM tmp_sync_topic_user_bookmarks
WHERE topic_users.topic_id = 51303 AND
  topic_users.bookmarked = true AND
  topic_users.user_id NOT IN (
    SELECT tmp_sync_topic_user_bookmarks.user_id
    FROM tmp_sync_topic_user_bookmarks
  );

DROP TABLE tmp_sync_topic_user_bookmarks;

PostgreSQL が複数のステートメントを単一のクエリでどのように実行するのかはっきりしませんが、もしそれが複数回同時に実行された場合、ループを引き起こす可能性はありますか?