Plugin verursacht Fehler während des Rebuilds

Heute habe ich versucht, meine Discourse-Installation von 2.9.0.beta9 auf 2.9.0.beta10 zu aktualisieren. Aber das ist furchtbar schiefgegangen.

  1. Mein erster Versuch war auf der Konsole
cd /var/discourse
sudo git pull
sudo ./launcher rebuild app

Dies brach schließlich mit der folgenden Meldung irgendwo in der Mitte aller Protokolle ab:

PG::InvalidParameterValue: ERROR:  cannot extract elements from a scalar
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'

Ich konnte das Forum einfach wiederherstellen, indem ich das alte Image startete (das noch vorhanden war).

  1. Mein zweiter Versuch erfolgte über die Webkonsole (/admin/upgrade). Aber dieser scheiterte schließlich an der gleichen Art von Fehler: ERROR: cannot extract elements from a scalar. Als ich zum Upgrade-Panel zurückkehrte, wurde mir mitgeteilt, dass alle Komponenten erfolgreich aktualisiert wurden. Aber nach einem Neustart des Containers warf der Server nun einen HTTP 500-Fehler :frowning_face:

  2. Ich habe eine Neuinstallation auf einem separaten Rechner durchgeführt und von Grund auf neu begonnen. Ich konnte die Beta10-Version installieren, aber der Versuch, aus einem Backup wiederherzustellen, verursachte genau den gleichen Fehler!

Gibt es jemanden da draußen, der helfen könnte?

Ich habe die Abfrage gefunden, die sie zum Stocken bringt

INSERT INTO question_answer_votes (post_id, user_id, created_at)
	SELECT
	  X.post_id AS post_id,
	  (X.value->>'user_id')::int AS user_id,
	  (X.value->>'created_at')::timestamp AS created_at
	FROM (
	  SELECT
	    post_id,
	    jsonb_array_elements(value::jsonb) AS value
	  FROM post_custom_fields WHERE name = 'vote_history'
	) AS X
	WHERE (X.value->>'action') != 'destroy'
	ORDER BY (X.value->>'created_at')::timestamp DESC
	ON CONFLICT DO NOTHING

Wenn ich das richtig verstehe, passiert das, weil die psql-Funktion jsonb_array_elements ein Array erwartet, aber einen NULL-Wert erhält.

Es gab ein paar Berichte darüber:

Ich glaube, es könnte damit zusammenhängen, dass das Pavilion Question/Answer Plugin zuvor installiert war?

Ich werde sehen, ob ich jemanden dazu bringen kann, sich das genauer anzusehen. :+1:

Wir verwenden dieses Plugin: https://github.com/angusmcleod/discourse-question-answer.

  • Es scheint mit dem Pavilion Question and Answer Plugin verwandt zu sein.
  • Es ist ein Fork des discourse/discourse-upvotes Plugins.
1 „Gefällt mir“

Um nur zur Überprüfung, welche Plugins haben Sie in Ihrer app.yml?

1 „Gefällt mir“

Die Website, die ich gesehen habe, hatte eine Reihe von Post Custom Fields, die eine Reihe von Zeichenketten enthielten, die mehrmals kodiert waren, so dass sie unbrauchbar waren.

Einige Lösungen, in absteigender Reihenfolge der Komplexität:

  • das Plugin nicht mehr verwenden (und vielleicht zu den neuen Upvotes wechseln)
  • alle löschen
  • die schlechten löschen
  • diese Felder bearbeiten, um die Daten wieder in gültige JSON-Zeichenketten umzuwandeln.

Die Website, die ich gesehen habe, hatte seit Jahren alte, fehlerhafte Daten. Dies scheint ein Fehler zu sein, der vor Jahren existierte und erst jetzt entdeckt wird.

Es wäre vielleicht möglich, Code zu schreiben, um die kaputten JSON-Zeichenketten zu reparieren, aber ich konnte in 10 Minuten nicht sehen, wie das geht.

Siehe Question Answer Plugin - #301 by pfaffman für Beispiele

2 „Gefällt mir“

Ich hatte auch daran gedacht, aber ein kurzer Blick auf Angus’ Fork zeigt, dass anscheinend keine Datenmigrationen durchgeführt wurden.
https://github.com/angusmcleod/discourse-question-answer/compare/main...discourse:discourse-upvotes:main

Dies fühlt sich wie eine Datenkontamination von alten Q&A-Posts an, wie Sie sagten. Ich finde es auch lustig, dass dies jetzt auftaucht, da diese Migration vom November 2021 stammt – ich nehme an, das liegt daran, dass JayJay erst jetzt auf den neuen Plugin umsteigt? Auf jeden Fall werden wir uns diese Migration noch einmal ansehen.

1 „Gefällt mir“
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/unfoldingWord-dev/discourse-mermaid.git
          - git clone https://github.com/angusmcleod/discourse-question-answer.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-staff-notes.git
          - git clone https://github.com/discourse/discourse-graphviz.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-yearly-review.git
          - git clone https://github.com/discourse/discourse-saved-searches.git

1 „Gefällt mir“

@nat Ich wechsle überhaupt nicht zum neuen Plugin. Ich arbeite immer noch mit dem Satz von Plugins, den wir seit geraumer Zeit haben.

Mindestens jeden Monat führen wir unsere Updates durch, es ist also nicht so, dass es eine große Lücke zwischen den Versionen gibt.

2 „Gefällt mir“

Nur als kleiner Hinweis am Rande des Frage-Antwort-Problems gibt es jetzt auch einen Ersatz für vorgefertigte Antworten:

Und ich glaube, es gibt jetzt auch eine #offizielle Mermaid-Theme-Komponente:

1 „Gefällt mir“

Danke. Ich werde mich darum kümmern, nachdem mein ursprüngliches Problem behoben ist :smile:

1 „Gefällt mir“

Wenn ich das Plugin entfernen würde, würde das Wiederherstellen des Backups immer noch die fehlerhafte Abfrage ausführen.
Daher müsste ich sowohl das Plugin als auch jede Tabelle + Abfrage entfernen, die von diesem Plugin verwendet wird.
Woher wüsste ich die beteiligten Tabellen?

Haben Sie die Zeile für das Plugin auskommentiert und einen erneuten Build versucht, um dies zu bestätigen?

2 „Gefällt mir“

Ich werde das jetzt versuchen. Ich habe die Datei dump.sql, die Teil des Backups ist, durchgesehen, und es gibt keine Erwähnung einer question_answer_* Tabelle. Das gibt mir Hoffnung…

1 „Gefällt mir“

Ich hatte Erfolg mit meinem Scratch-System!

  • Plugin deaktiviert
  • sudo ./launcher rebuild app
  • Backup wiederhergestellt

Ich werde nun an meinem Live-System arbeiten. Ich halte Sie auf dem Laufenden.

1 „Gefällt mir“

Die korrupten Daten befinden sich in der Tabelle PostCustmField. Wenn Sie das Plugin jedoch nicht haben, wird versucht, diese Daten nicht in die neue Tabelle zu migrieren.

Das Problem ist nicht die Migration selbst, sondern dass die Daten irgendwann in der Vergangenheit beschädigt wurden. Sie sind kaputt, aber sie sind auf eine Weise kaputt gegangen, die jahrelang unbemerkt blieb. Ich denke, dass vielleicht jeder neue Upvote sie weiter beschädigt hat. Eine sinnvolle Lösung könnte darin bestehen, die beschädigten Daten zu ignorieren, sie vielleicht als beschädigt zu markieren (vielleicht das benutzerdefinierte Feld umbenennen), damit zukünftige Migrationen sie ignorieren könnten und jemand sie nach Belieben von Hand reparieren könnte.

2 „Gefällt mir“

Erfolg auch im Live-Betrieb. Das Plugin wurde deaktiviert, und wir konnten fortfahren.
Ich frage mich immer noch, warum ich dieses Problem nicht früher bemerkt habe. Wie gesagt, jeden Monat aktualisieren wir routinemäßig alle unsere Systeme, daher hätte ich dieses Problem früher sehen müssen.

Wie könnte ich selbst eine Verbindung zur Discourse-DB herstellen, um zu überprüfen, was in der Tabelle post_custom_fields steht?

@Jaap-Jan_Swijnenburg Es tut mir leid, dass Sie ein Problem hatten.

Dem würde ich Ihnen respektvoll widersprechen :slight_smile:

Das alte QnA-Plugin verwendete standardmäßige Discourse-Typumwandlung für benutzerdefinierte Felder, die dazu dient, dieses Feld in JSON umzuwandeln. Aber das funktioniert in einigen Fällen (wie diesem) einfach nicht, weshalb man (idealerweise) Formatprüfungen einbauen muss, wenn man mit benutzerdefinierten Discourse-Feldern arbeitet (insbesondere, wenn man mit ziemlich altem Code und Daten wie diesen arbeitet). Ich würde vorschlagen, dass das Upvotes-Plugin hier das tun muss, was tatsächlich die unmittelbare Fehlerquelle ist.

Sie können das Data Explorer-Plugin verwenden, um zu überprüfen, was Sie dort haben.

Nun, ich gebe Ihnen da meistens Recht und ich denke, wir sind uns einig. Ich denke, es stimmt, dass die Migration funktioniert, wenn die Daten nicht beschädigt sind. Wir sind uns einig, dass es, wenn die Daten beschädigt sind, gnädiger fehlschlagen sollte, als es jetzt der Fall ist.

Ja, aber die Daten wurden wahrscheinlich vor Jahren beschädigt (das ist bei der Website, die ich kenne, der Fall), aber Sie haben es nicht bemerkt, weil es nicht katastrophal fehlgeschlagen ist. Ich bin mir ziemlich sicher, dass die Upvotes nicht wie erwartet verwaltet wurden, aber niemand hat es bemerkt.

Ich würde es von Rails aus tun, so etwas wie:

./launcher enter app
rails c

Dann so etwas wie:

all_votes=PostCustomField.where(name: "vote_history")
likely_broken_votes=PostCustomField.where(name: "vote_history").where("value like '\\\"%'")

Nur die ID und die Daten anzeigen:

all_votes.pluck(:id,:value)

Eine einzelne pcf abrufen:

pcf=PostCustomField.find(1234)

Korrigieren

pcf.value='the stuff you really want in it'
pcf.save

Was hier passiert, ist Folgendes:

  1. Manche Leute haben eine sehr alte Version des Frage-Antwort-Plugins mit meinem persönlichen GitHub-Benutzernamen in der Repository-URL in ihrer app.yml-Datei.

  2. Ich habe das QnA-Plugin vor Jahren an paviliondev übertragen. GitHub leitet Repository-URLs um, wenn sie übertragen werden, sodass die alten URLs mit meinem persönlichen Benutzernamen weiterhin funktionierten.

  3. Jahre später hat Pavilion das Frage-Antwort-Plugin an Discourse übertragen. Discourse behielt zunächst den Namen discourse-question-answer bei.

  4. Vor ein paar Monaten habe ich meinen eigenen Fork des Plugins erstellt, das in discourse gehostet wird, während es noch discourse-question-answer hieß.

  5. Leute mit sehr alten Links zum QnA-Plugin, die meinen persönlichen GitHub-Account enthielten, klonten nun meinen neuen Fork des erheblich aktualisierten discourse-question-answer, das in discourse gehostet wird. Mit anderen Worten, ein sehr alter Link zeigte nun auf einen Fork eines neuen Plugins. Trotz der vergangenen Jahre hätte ich das vorhersehen sollen, daher bitte ich um Entschuldigung. Ich habe diesen Fork entfernt.

  6. Discourse hat den Namen von discourse-question-answer in discourse-upvotes geändert. Diese Namensänderung hatte keine wesentlichen Auswirkungen auf Ihren Fall @Jaap-Jan_Swijnenburg, aber sie ist der Grund, warum Sie jetzt (unerwartet) einen Fork dieses Repos klonen.

  7. Eine Migration in discourse/discourse-upvotes (ehemals discourse-question-answer) geht davon aus, dass die Spalte value in post_custom_fields JSON-typsicher ist.

  8. Alte Daten, die vom Plugin erstellt wurden, als es angusmcleod/discourse-question-answer war (vor Jahren), wurden vom HasCustomFields-Concern in discourse/discourse nicht als gültiges JSON gespeichert. Ich vermute, dass diese Daten wahrscheinlich bevor die JSON-Typüberprüfung vor 4 Jahren hinzugefügt wurde hinzugefügt wurden (Es ist in Ausnahmefällen immer noch möglich, ungültiges JSON in benutzerdefinierten Feldern zu haben, die als JSON registriert sind).

Daher:

  1. Wenn Leute mit der (jahrealten) angusmcleod/discourse-question-answer-URL in ihrer app.yml ihr Discourse aktualisieren, wird die Migration in der neuen Version des Plugins geklont, die Migration läuft und erstellt möglicherweise diesen Fehler.

Es gibt ein paar Lösungen dafür:

  1. @Jaap-Jan_Swijnenburg In Ihrem Fall müssen Sie nur den Verweis auf mein altes QnA-Plugin entfernen, und Sie können Ihre Website neu erstellen. Das ist alles; nichts weiter. Sieht so aus, als hätten Sie das bereits getan :+1:

  2. Die Migration des Plugins discourse/discourse-upvotes könnte aktualisiert werden, um Nicht-JSON-Werte in der Spalte value in post_custom_fields zu verarbeiten.

Ich möchte darauf hinweisen, dass 2 auch den zusätzlichen Fall von Personen abdecken würde, die tatsächlich von einer alten Version des QnA-Plugins zu discourse-upvotes wechseln möchten. In diesem Fall wird die Migration ausgeführt und schlägt fehl, wenn Einträge in der Spalte value von post_custom_fields kein gültiges JSON sind.

5 „Gefällt mir“