選択した解雇の予期せぬ動作

5月に新しい機能が追加されました https://meta.discourse.org/t/selective-dismissal-of-new-and-unread-topics/191641/1。最近、Discourse を最新版にアップグレードしました。コードとデータベースのログを確認したところ、「新規トピックをすべて既読にする」で個別に選択せずに(つまり、一括で既読にする)場合、リクエストパラメータに tracked = false しか渡さず、reset-new の他のパラメータは渡していないようです。

image

PR の変更点を確認すると、topic_scope を決定しようとする際に、以下の場所まで到達しているようです FEATURE: Allow selective dismissal of new and unread topics (#12976) · discourse/discourse@7a79bd7 · GitHub

topic_ids を渡していないため、if 文をスキップし、自動的に 989 行目にジャンプしてしまいます。

私たちは比較的大規模な Discourse サーバーを運用していますが、すべてのトピックを対象とするという考え方は非常にコストがかかります。クエリは基本的に以下を生成します。

LEFT JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = xxx WHERE "topics"."deleted_at" IS NULL AND "topics"."id" IN (1, ... 1000000) AND (topics.created_at >= 'date') AND (topic_users.last_read_post_number IS NULL) AND (topics.archetype <> 'private_message') ORDER BY topics.created_at DESC LIMIT 500

IN 句には、100 万個以上のトピックのほぼすべてが含まれていると考えています。

一括選択のデフォルトを、すべての可能なトピックにデフォルトするのではなく、トピック ID を渡すように変更することは可能でしょうか?

@martin 通知でご迷惑をおかけしました。上記のリンク先コミットがあなたによってプッシュされたもののようです。

これが私たちが直面している問題の根本原因として妥当かどうか、確認していただけないでしょうか?「すべて新規を無視」のデフォルトケースにおいて、クエリに非常に大きなフィルタリスト(約100万のトピックID)が含まれていることが確認されています。(当社のフォーラムには膨大な数のDiscourseトピックがホストされています)

Discourseチームにこの問題への優先度がなければ、修正のためのPR作成をお手伝いすることもできますが、影響を受けているのは当社だけではない可能性が高く、また一部のお客様のデータベースパフォーマンスにも影響を及ぼしているかもしれません。

@forkythetoy さん、@Hooksmith さん、この件にご指摘いただきありがとうございます。メタサイトでもこれが非常に大きなクエリであることを確認しました。本日は修正を作成します。これは、ユーザーの「新規」リストに表示されるトピックの ID のみを参照するように変更するだけで済み、過去に存在したすべてのトピック を対象にする必要がなくなります。パッチが完成したら、ここで報告します。

本日はこの修正をマージしました: