Discourse Assign - un bug fait tomber le site

J’ai récemment modifié le paramètre du site concernant le(s) groupe(s) autorisé(s) à utiliser Discourse Assign. Quelque chose s’est très mal passé lorsque j’ai cliqué sur le bouton de mise à jour, ce qui a fait tomber l’ensemble du site.

J’ai depuis désactivé Discourse Assign, ce qui a permis de remettre le site en ligne, mais je ne parviens pas à faire fonctionner à nouveau Discourse Assign. Lorsque je le réactive, le site tombe à nouveau, et je ne peux pas modifier les paramètres du site pour le plugin Discourse Assign.

En examinant les journaux d’erreurs, j’en vois deux :

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'

Et :

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

Le plugin discourse-assign est-il à jour sur votre instance ? Ou peut-être avez-vous forké le plugin il y a quelque temps ? Il y a eu un changement dans le plugin discourse-assign en juillet qui semble pertinent par rapport aux erreurs que vous rencontrez.

2 « J'aime »

Salut Penar, je suis presque certain que c’était à jour, je mets régulièrement tout à jour, y compris les plugins.

Je pense que je vais devoir restaurer, la dernière sauvegarde datait d’avant que je modifie ce paramètre du site.

Bonjour @jerry0,

Selon les journaux, il semble que le plugin soit à jour. Quelle version de Discourse utilisez-vous ?

2 « J'aime »

Dernière version, actuellement 2.4.0.beta4

Hmm, je vois. Avez-vous modifié le paramètre avant ou après la mise à jour vers beta4 ?

Il semble que notre migration automatique n’ait pas réussi à mettre à jour votre paramètre. Je vais enquêter sur les raisons de cet échec. Avez-vous essayé de redémarrer le serveur avant d’activer le plugin, au cas où l’ancienne valeur aurait pu être mise en cache ? Faites-moi savoir si cela ne fonctionne pas, et je vous fournirai un script Ruby pour corriger manuellement le problème.

1 « J'aime »

Merci @Roman

C’est arrivé avant ma mise à jour. Quelque chose d’étrange s’est produit lorsque j’ai ajouté le nouveau paramètre ; je pense avoir appuyé sur la coche verte avant d’avoir « ajouté » le nouveau nom de groupe.

Je ne suis pas sûr de savoir comment faire cela (soit dit en passant, j’ai peut-être mal exprimé ce que je voulais dire par « désactivé/activé » dans mon message initial — ce que je voulais dire, c’est que j’ai commenté l’URL git clone dans le fichier app.yml pour ajouter le plugin). Lorsque j’ajoute le plugin dans le fichier yml, le site plante immédiatement (et il était précédemment activé), donc je ne peux pas y accéder pour le désactiver… sauf si j’ai mal compris votre message ?

Cela pourrait bien être nécessaire, et ce serait grandement apprécié.

Si cela ne vous dérange pas, je souhaiterais valider un point de plus avant de modifier manuellement le paramètre.

Pouvez-vous exécuter ce code dans une console Rails et me communiquer le résultat ?

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

Cela nous indiquera si nous avons échoué à migrer la valeur du paramètre.

Pour accéder à une console :

  • cd dans votre dossier Discourse
  • Entrez dans le conteneur en exécutant ./launcher enter app
  • Ouvrez une console Rails en exécutant rails c
3 « J'aime »

la réponse est

=> [“patently-staff”]

1 « J'aime »

Merci, Jerry.

Il y a effectivement quelque chose qui ne va pas ici. Je vais examiner la situation pour comprendre pourquoi cela se produit.

Voici le script :


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'")

Après avoir exécuté ce script, vous devriez pouvoir réactiver le plugin.

7 « J'aime »

Parfait, ça a fonctionné :grin: Merci @Roman. N’hésite pas à me dire si je peux t’apporter une aide supplémentaire.

1 « J'aime »

Bonjour Roman,

Nous rencontrons un problème similaire avec le plugin discourse-assign sur notre site après la mise à niveau vers la version 2.4.0beta4.

Le problème ne se manifeste que pour les utilisateurs se connectant via LDAP. (Nous utilisons « GitHub - jonmbake/discourse-ldap-auth: Discourse plugin to enable LDAP/Active Directory authentication. · GitHub » pour la connexion LDAP)

La réponse à la requête DB.query est :
=> [“staff”]
mais « Group.where(name: ‘staff’).pluck(:id).join(‘|’) » retourne “”.

D’ailleurs, sur la version « 2.4.0.beta1 +203 », les réponses sont similaires, mais la connexion via LDAP est possible. (version LDAP 0.4.0, version assign 0.1)

Toute aide est la bienvenue,
Merci,
Frank

Bonjour @diwr,

Selon cette requête, vous n’avez pas de groupe nommé staff. L’avez-vous peut-être renommé ?

Vous pouvez vérifier cela en exécutant : Group.where(id: 3).pluck(:name)

Je pense que la migration échouera si le groupe staff a été renommé. Je vais examiner cela aujourd’hui.

2 « J'aime »

Merci @Roman

Il semble que cela ait été renommé en « équipe ».
Que faire maintenant ?

Vous pouvez exécuter le script en utilisant “team” comme nom de groupe.

4 « J'aime »

@Roman
Merci beaucoup.
J’ai dû exécuter “./launcher rebuild app” après avoir défini la valeur, mais cela a fonctionné ensuite.

6 « J'aime »