Discourse Assign - サイトをダウンさせるバグ

Discourse Assign を使用できるグループのサイト設定を変更したところ、更新ボタンを押した際に深刻な問題が発生し、サイト全体がダウンしてしまいました。

その後、Discourse Assign を無効にしたところサイトは復旧しましたが、再度 Discourse Assign を有効にするとサイトがダウンしてしまい、Discourse Assign プラグインのサイト設定を変更することができません。

エラーログを確認したところ、以下の 2 つのエラーが記録されていました。

ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR:  invalid input syntax for integer: "patently-staff"
LINE 1: ...RE "group_users"."user_id" = 1 AND (groups.id in ('patently-...
                                                             ^
: SELECT  1 AS one FROM "groups" INNER JOIN "group_users" ON "groups"."id" = "group_users"."group_id" WHERE "group_users"."user_id" = 1 AND (groups.id in ('patently-staff')) LIMIT 1)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.0.2/lib/patches/db/pg.rb:69:in `async_exec_params'

および:

Failed to handle exception in exception app middleware : PG::InvalidTextRepresentation: ERROR:  invalid input syntax for integer: "patently-staff"
LINE 1: ...RE "group_users"."user_id" = 1 AND (groups.id in ('patently-...
                                                             ^
: SELECT  1 AS one FROM "groups" INNER JOIN "group_users" ON "groups"."id" = "group_users"."group_id" WHERE "group_users"."user_id" = 1 AND (groups.id in ('patently-staff')) LIMIT 1

あなたのインスタンスで discourse-assign プラグインは最新ですか?それとも、以前にプラグインをフォークしましたか?discourse-assign プラグインには 7 月に 変更 が加えられており、これはあなたが遭遇しているエラーに関連しているようです。

「いいね!」 2

こんにちは、ペナルさん。確かに最新だったと思います。プラグインも含め、私は定期的にすべてを更新しています。

復元するしかないかもしれません。最後のバックアップは、そのサイト設定を変更する前のものでした。

こんにちは、@jerry0 さん、

ログによると、プラグインは最新バージョンのようです。現在、どの Discourse バージョンを実行されていますか?

「いいね!」 2

最新、現在は 2.4.0.beta4

なるほど、わかりました。設定を変更したのは、beta4 へのアップデートの前ですか、それとも後ですか?

どうやら自動マイグレーションが設定の更新に失敗したようです。なぜそうなったのか調査します。念のため、プラグインを有効にする前にサーバーを再起動してみましたか?もしこれで解決しない場合は、手動で問題を修正するための Ruby スクリプトを提供しますので、お知らせください。

「いいね!」 1

@Roman ありがとうございます。

アップデート前に発生しました。新しい設定を追加する際に奇妙なことが起こり、新しいグループ名を「追加」する前に緑色のチェックマークを押してしまったのだと思います。

その方法がわかりません(なお、OP で「無効化/有効化」と言ったのは誤りだったかもしれません。私が意図したのは、プラグインを追加するために app.yml ファイル内の git clone URL をコメントアウトしたことでした)。yml ファイルにプラグインを追加すると、サイトが即座にクラッシュしてしまいます(以前は有効化されていました)。そのため、サイトに入って無効に設定することができません。私の理解が間違っているのでしょうか?

必要になるかもしれません。ぜひお願いしたいです。

差し支えなければ、設定を手動で変更する前に、もう一点確認させてください。

以下のコードを Rails コンソール内で実行し、出力結果をお知らせいただけますか?

DB.query_single(<<~SQL
  SELECT site_settings.value FROM site_settings WHERE site_settings.name = 'assign_allowed_on_groups'
SQL
).first.to_s.split('|')

これにより、設定値のマイグレーションに失敗したかどうかを確認できます。

コンソールにアクセスするには:

  • Discourse フォルダに cd します
  • ./launcher enter app を実行してコンテナに入ります
  • rails c を実行して Rails コンソールを開きます
「いいね!」 3

レスポンスは

=> [“patently-staff”]

「いいね!」 1

ありがとう、ジェリー。

確かに何か問題が起きているようだ。原因を調べてみる。

スクリプトは以下の通り:


group_id = Group.where(name: 'patently-staff').pluck(:id).join('|')

DB.exec("UPDATE site_settings SET value='#{group_id}' WHERE site_settings.name = 'assign_allowed_on_groups'")

これを実行すれば、プラグインを再度有効化できるはずです。

「いいね!」 7

完璧、成功しました :grin: @Roman さん、ありがとうございます。さらにサポートが必要な場合は、お知らせください。

「いいね!」 1

こんにちは、Roman さん。
当サイトでも 2.4.0beta4 へのアップグレード後、discourse-assign プラグインで同様の問題が発生しています。

この問題は、LDAP 経由でログインするユーザーにのみ発生します(LDAP 接続には “GitHub - jonmbake/discourse-ldap-auth: Discourse plugin to enable LDAP/Active Directory authentication. · GitHub” を使用しています)。

DB.query への応答は以下の通りです:
=> [“staff”]
しかし、“Group.where(name: ‘staff’).pluck(:id).join(‘|’)” は “” を返します。

参考までに:バージョン “2.4.0.beta1 +203” では応答は同様ですが、LDAP 経由でのログインは可能でした(LDAP バージョン 0.4.0、assign バージョン 0.1)。

ご支援をよろしくお願いいたします。
ありがとうございます、
Frank

こんにちは @diwr さん、

そのクエリによると、staff という名前のグループは存在しません。名前を変更されたのでしょうか?

以下を実行して確認できます:Group.where(id: 3).pluck(:name)

staff グループの名前が変更されている場合、マイグレーションが正常に動作しない可能性があります。本日内に確認いたします。

「いいね!」 2

@Roman さん、ありがとうございます。

どうやら「team」に名前が変更されたようです。
今からどうすればよいでしょうか?

グループ名として「team」を指定してスクリプトを実行できます。

「いいね!」 4

@Roman さん
ありがとうございます。
値を設定した後、"./launcher rebuild app"を実行する必要がありましたが、その後うまくいきました。

「いいね!」 6