重大なエラー:ユーザー名変更によりユーザーが破損しました

あるユーザー xxx のリクエストにより、ユーザー名を変更しました。そのユーザーは、 inactive なユーザー名 yyy を取得したいとのことでした。そのため、まず inactive なユーザー名 yyyyyy1 のような別の名前に変更し、その後、そのユーザーのユーザー名を xxx から yyy に変更しました。

この時点で、まずユーザーが投稿できなくなり、ログに以下のエラーが表示されました。

Job exception: PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_username_lower" DETAIL: Key (username_lower)=(mina) already exists.

ユーザー名を以前のものに戻そうとしましたが、すべての履歴が失われてしまいました。いったいどこで何が間違っていたのでしょうか?

@tshenry さん、これを再現できますか?

今ではプロフィールページさえ開けません。その間、何か対処法はありますか?

今、あなたが示した手順を進めています。見つかったことは後ほどお知らせします。

ところで、なぜこのユーザー (username_lower)=(mina) でエラーが発生しているのか分かりません。私はこれに対して変更を加えたことがなく、 inactive なユーザーのようです。しかし、そのプロフィールでも奇妙な挙動が見られます。通知ページを開くと、404 エラーが表示されます。

はい、手順を実行しました。もし私の手順と異なる点があれば、お知らせください。

ユーザーは以下の2名です:

  • xxx(アクティブなアカウント)
  • yyy(非アクティブなアカウント)
  1. yyyyyy1 に変更
    xxxyyy に変更
    :white_check_mark: 私では成功しました)

  2. 新しい yyy アカウントで投稿を試みる
    :white_check_mark: 私では成功しました)

  3. yyyxxx に戻す
    :white_check_mark: 私では成功しました。ユーザーの履歴は失われませんでした)

全体を通じて問題は発生しませんでした。ただし、ユーザー管理ページからユーザー名を変更した後、「公開プロフィールを表示」ボタンが正しいユーザーに移動するには、ページを再読み込みする必要がある点にご注意ください。

/admin/logs/staff_action_logs を確認し、記録されたユーザー名の変更がすべて妥当かどうかご確認ください。リストされているユーザー名のアバターをクリックすると、それぞれの現在の正しいユーザーページに移動します。

はい、アイコンをクリックするとその人のページに移動します。ただし、そのページがどうやら非アクティブなようです。例えば、その人のメールアドレスを表示したり、そのアカウントになりすましたりできません:

私がこれまでにやったことは以下の通りです:

このレポートで見た内容によると、まず fatemehfatemeh12 に変更しました。次に fatemeh_baghdadifatemeh に変更しました。しばらくすると、そのユーザーから投稿できないと連絡が来ました。そこで、ユーザー名変更のプロセスに何か問題があったのではないかと思い、これまで使われていないユーザー名に変更しようと試みました。そこで、fatemeh(元々は fatemeh_baghdadi)を fatemeh74 に変更しました。すると、その履歴が完全に消去されているのを確認し、動揺しました。そこで、fatemeh74 を最初の状態に戻すため fatemeh_baghdadi に変更し、さらに fatemeh_baghdadi から fatemeh_baghdadi5 に変更しましたが、状況は改善されませんでした。現在、fatemeh74fatemeh_baghdadi5 という 2 つの異なるユーザーが存在しており、理論的には 1 人であるはずですが、実際には 2 人になっており、片方は正しく動作していないようです。

一生懸命ついていこうとしています。とても奇妙な状況のようですね!

「履歴が完全に消去された」とおっしゃったときの意味をもう少し詳しく説明していただけますか?fatemeh_baghdadi5 のプロフィールのアクティビティセクションに、いくつかのトピックや返信がリストされているはずです。

もしそうであるなら、それらの投稿は現在 fatemeh74 アカウントに関連付けられているのでしょうか?それらはサイトのどこかに存在し、特定のユーザーに関連付けられているはずです。匿名ユーザーの立場からは、あなたのサイト上に fatemeh74 というユーザー名を持つユーザーを見つけることができません。

EnsureDbConsistency というバックグラウンドジョブがあり、12 時間ごとに実行されます。Sidekiq から手動でトリガーするか、あるいは次の 12 時間で自動的に修正されるのを待つのも一案かもしれません。

もし実際には 2 つのアカウントが本来は 1 つであるべきだと判明した場合、それらをマージ できるはずです。ただし、その前に必ずバックアップを取得することをお勧めします。

すべてに直接アクセスできない状況では何が起きているのかを理解するのは非常に難しいですが、きっと解決できることを願っています!

ユーザー名を変更した時点では、その人のプロフィールページに投稿などが表示されていませんでした。しかし、しばらくすると正常に戻りました。ただ、現在 fatemeh74 というアカウント(実際には正しい人物のようです)は、やや非アクティブな状態です。つまり、ご覧の通りプロフィールページは表示されませんが、投稿や他の情報は残っています。例えば以下の通りです:

https://talk.zabanshenas.com/t/topic/29066/3?u=hnaseri

実際には二つのアカウントは別物です。メールアドレスと ID を確認しましたが、完全に異なります。ただし、私がユーザー名を変更した手順に従えば、これらは同じであるはずであり、実際には二つのユーザーが存在してはいけないはずです。

これは具体的にどこにありますか?

例を投稿いただきありがとうございます。確かに懸念される点です。

/sidekiq/scheduler に一覧表示されています。試してみる価値はありますが、あなたが刚刚投稿された内容から判断すると、より根本的な問題があるかもしれません。

残念ながらおっしゃる通りです。私の問題は解決しませんでした。

@tshenry 最初の単語の大文字・小文字の違いのみで、完全に同じユーザー名が二つ存在しても問題ないでしょうか?

これが問題の原因に関連している可能性があると私は思います。

それは興味深いご指摘ですね!

ユーザー名は事実上大文字小文字を区別しないため、同じユーザー名を持つユーザーを2人作成することはできません。しかし、以下の通りです:

fatemeh12を検索すると、2つの異なるユーザー名が表示されているように見えます。これは本来あり得ないはずの現象です(私は再現できませんでした)。どちらも同じプロフィールに遷移するようです。

次にどうすべきか見当がつきません。明日のこの時間までに誰か反応がなければ、新しいアイデアを持つ誰かを探し当ててみます。その間に、関連すると思われる追加情報が見つかりましたら、投稿してください。

今のところ私が理解しているのは以下の通りです:最初のステップで、ユーザー名を空けるために fatemehfatemeh12 に変更しようとしました。しかし、すでに Fatemeh12 というユーザー名が存在していたため、実際には fatemehfatemeh12 に変更することは許可されなかったはずです。ところが、不思議と変更が許可され、それ以降データベースが壊れてしまいました。

@tshenry 何か見つかりましたか?現在、以前消えていたユーザー fatemeh74 がなぜか復活しています。ただし、正確な仕組みはわかりません。今後このようなことが起きないよう確認したいので、大文字と小文字の違いがある同じユーザー名が存在する理由と、Discourse がそのようなことを防げない理由を知りたいです。私の Discourse はすでに最新バージョンに更新されています。

こんにちは :wave: それは素晴らしいですね。時間が経ってからバックグラウンドジョブが解決策として機能することを期待していました。おそらく、それが起こったのだと思います。

私はこれについてさらに調査する機会がありませんでした。当社はデータベースへのアクセス権を持っていないため、ホスト型のお客様以外に対しては、このように深く調査することはできません。

これがこの問題の最初の発生事例であり、私はその動作を再現することができません。これはあなたのインスタンスにおける特殊なケースだと推測しています。今後、同様の事例が発生しないか注意深く監視していきます。もし万が一を恐れるなら、ユーザー名を変更する前に、同じユーザー名を持つ人がいないか再度確認することをお勧めします。

問題の特定に役立つのであれば、データベースのコピーを送付することに問題ありません。

私は何もしていませんが、ユーザーが再び破損してしまいました :expressionless: 。データベースに明らかに何か問題があります。

私たちも長期間、この同じ問題に直面しています。データベースがこのような状態になった経緯を再現する方法はありませんが、定期的に、リネームの猶予期間中にユーザーが自分自身を重複した名前に変更してしまうか、あるいは管理者によるリネームでも同様の問題が発生しています。

私たちは Unicode ユーザー名を使用しておらず、これは時として非常に問題となります。特に、外部ポリシーサービスのために強く依存している Patreon プラグインの同期ジョブが、この問題によって頻繁に中断されてしまいます。