メガトピックに属する投稿がある場合、「すべての投稿を削除」が実行できません

コミュニティで問題が発生しています。特定のユーザーの「すべての投稿を削除」ができません。私の確認では、これは投稿数の多い古いアカウントにのみ発生しているようです。新しいアカウントではこの問題は見られません。

サイト設定を確認し、「すべての投稿を削除」の制限を10,000に引き上げました。

現在、約900件の投稿を持つユーザーの削除を試みています。そのユーザーは匿名化を望んでおらず、アカウントと投稿が削除されない場合は法的措置を取るつもりだと脅しています。「すべて削除」ボタンを押すと、約1分後に次のメッセージが表示されます。

ブラウザのコンソールでは、投稿に対して502エラーが発生しているのが確認できます。
image

サーバーのログを確認したところ、削除を試みた後に以下のエラーが表示されていました。

TypeError: undefined is not an object (evaluating ‘s.users’)
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver/t/topic/64828/2502

問題の原因を特定できる場所(ログなど)はありますか?

「いいね!」 1

管理画面 > ログ > エラーログに移動してみてください。その後、再度投稿を削除してみてください。問題の原因となっている投稿のログエントリが表示されるはずです。

「いいね!」 4

このエラーは、すべての投稿を削除しようとした後にログに表示されます:

TypeError: undefined is not an object (evaluating 's.users')
Url: https://myserver.com/assets/ember_jquery-d430881a3fb1403871256e5a02423c4b20a78793685e92088613ca9a701baf88.js
Line: 9
Column: 8994
Window Location: https://myserver.com/t/topic/64828/2502
「いいね!」 1

エラーダイアログが表示される前に、いくつかの投稿(約5件)が削除されていることに気づきました。これが関連するかどうかはわかりません。

はい、あなたの投稿をより注意深く読むべきでした。

ID 64828 のトピックで失敗しているようです。このトピックに投稿を作成したユーザーはいますか?

申し訳ありませんが、よく確認したところ、そのエラーは別の問題に関連しているようです。
現在はこれが出ており、リクエストのタイムアウトが原因ではないかと推測しています。

image

API リクエストから削除を試みましたが、UI と同様だと思われます。

Discourse インストール環境の API を呼び出す小さなアプリを作成しました。バッチ処理ではなく、投稿を個別に削除する方式です。そのため、700 件の投稿に対しては 700 回の API 呼び出しが発生します。最も効率的な方法ではありませんが、役立ちました。

問題のある投稿が 20 件あることがわかりました。「すべて削除」機能は、これらのいずれかに到達すると停止し、それ以上削除できないようです。何らかの理由で API はこれらの投稿を削除できませんでした。現在、モデレーターが通常行うように、投稿に移動して削除ボタンをタップすることで、大部分を手動削除しました。

まだ API でも通常の方法でも削除できないものが約 5 件残っています。それらの間に類似点は見当たりません。巨大なトピックにあるものもあれば、小さなトピックにあるものもあります。返信で、いいねがついていたり、画像が含まれていたりするものもあれば、そうでないものもあります。標準的な UI を通じて削除しようとすると、次のエラーダイアログが表示されます:

一部のユーザーから、自分の投稿を削除しようとした際に同じダイアログが表示されたとの報告がありました。ほとんどがモバイル端末を使用しているため、接続の問題或其他の要因によるものかと推測していましたが、別の原因かもしれません。

手動で削除を試みると、次のログが表示されます:
23

ご意見やご提案があればお聞かせください。

問題のある投稿5件はすべて、2つの大きなトピック内にあります。これら2つのトピックは最近、規模があまりにも大きくなりすぎたため閉鎖されました。一方のトピックには5万5千件の投稿があり、もう一方には1万7千件の投稿があります。このような巨大なトピック内の投稿が削除される際に、多くの処理が行われており、それが何らかのタイムアウトを引き起こしているのではないかと推測していますが、これは単なる推測に過ぎません。

「いいね!」 1

現在、問題が発生しています。これらの大規模なトピック内の投稿を削除できず、トピック自体も削除できません。どちらも 502 ゲートウェイエラーのダイアログで終わってしまいます。

:叫び:

コンソールを使ってこれらの投稿5件を削除してみましたか?

./launcher enter app
rails c
Post.find(THE_POST_ID).destroy
「いいね!」 2

はい、それで解決しました!私は Ruby や Rails の知識はまったくないのですが、次のように1つのコマンドで複数の投稿を連鎖的に削除できます。

Post.find(POST1_ID).destroy; Post.find(POST2_ID).destroy

将来的に投稿がいくつか詰まってしまう場合に、この方法を使うかもしれません。同じようにトピックも削除することは可能で、かつ安全でしょうか?

一般的に、Discourse の投稿はハード削除ではなく、ソフト削除(論理削除)されます。destroy コマンドを使用すると、データベースから完全に削除されてしまいますが、今回は削除しようとした投稿が非常に長いトピックに属していたため、このコマンドの使用を余儀なくしました。

投稿にもトピックにも、この方法の使用は推奨しません。一度削除すると復元することはできず、私の理解では、本番環境のサイトのデータベースに対して作業することになります。何か問題が起きた場合、サイト全体が破損するリスクがあります。ただし、destroy コマンドを使用したい場合は自由にお使いください。このようなコマンドを使用する場合は、必ずバックアップを取得してください。

トピックを完全に削除するには、以下を実行してください。

Topic.find(THE_TOPIC_ID).destroy
「いいね!」 1

この種のパフォーマンスの問題 :arrow_up: を回避するために、メガトピックの作成を防止する設定も導入しました。詳細は The MEGATOPIC: public good, or public menace? をご覧ください。

「いいね!」 2

アドバイスありがとうございます。予想通りでしたので、destroy コマンドは最終手段としてのみ使用します。

通常、投稿はソフトデリートされるため、単にレコードを削除するだけでなく、多くの他の処理も行っているようです。これが、メガトピックから投稿を削除する際にうまくいかない理由でしょうか。処理が多すぎてタイムアウトしてしまうのでしょうか?

リスクのあるコンソールコマンドに頼らずにこの問題を解決する方法があれば、ぜひ知りたいです。

ありがとうございます。トピック数の上限を2500に変更しました。以前、ユーザーから上限の撤廃を求める声があり、それが巨大トピックの発生につながりました。しかし、巨大トピックはフォーラムにとって好ましくありません。ピーク時に多くの人々がそのトピックに返信した際、サーバーのパフォーマンスが深刻な影響を受けました。そのため、その事態を防ぐためにトピックを閉鎖しましたが、現在もこれらの巨大トピックが残っており、他の問題を引き起こしています。

最もシンプルな解決策は、いくつかのモデレーターが作業を開始し、メガトピックを複数のトピックに分割(その後クローズ)することです。例えば:

  • :lock:[メガトピックのタイトル] パート1
  • :lock:[メガトピックのタイトル] パート2
  • :lock:[メガトピックのタイトル] パート3
  • :lock:[メガトピックのタイトル] パート[…]
  • :unlock:[メガトピックのタイトル] パート10

各パートは自動的に前後のパートとリンクされるため、ユーザーはナビゲーションに困ることはなく、パフォーマンスの問題も確実に解決できます。

確かに、これは退屈な作業ですが、55,000件や17,000件の投稿を持つトピックが完全に無意味である理由の一つでもあります。誰もそれらを読まないからです。

「いいね!」 4

まさにこの用途のために、新しい機能(サイト設定)が用意されています!

「いいね!」 4