Etherpad-lite: Backend Postgres - erreur: la colonne "valeur" est de type jsonb mais l'expression est de type texte

Créé le 8 sept. 2020  ·  29Commentaires  ·  Source: ether/etherpad-lite

Décrivez le bogue
Non-concordance de schéma lors de tout type d'insertions.

erreur: la colonne "valeur" est de type jsonb mais l'expression est de type texte

Reproduire
Utilisez les dernières sources et postgres. Essayé avec v12 et v13.

Comportement prévisible
Faire l'insertion sans erreur.

Captures d'écran
etherpad_1 | [2020-09-08 20: 37: 50.541] [ERROR] console - erreur: la colonne "value" est de type jsonb mais l'expression est de type text
etherpad_1 | à Parser.parseErrorMessage (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
etherpad_1 | à Parser.handlePacket (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
etherpad_1 | à Parser.parse (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
etherpad_1 | à Socket.stream.on (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
etherpad_1 | sur Socket.emit (events.js: 198: 13)
etherpad_1 | à Socket.EventEmitter.emit (domain.js: 448: 20)
etherpad_1 | à addChunk (_stream_readable.js: 288: 12)
etherpad_1 | à readableAddChunk (_stream_readable.js: 269: 11)
etherpad_1 | à Socket.Readable.push (_stream_readable.js: 224: 10)
etherpad_1 | à TCP.onStreamRead [en lecture] (interne / stream_base_commons.js: 94: 17)

Bureau (veuillez compléter les informations suivantes):
N / A

Smartphone (veuillez compléter les informations suivantes):
N / A

Contexte supplémentaire
Cela a été testé avec des conteneurs docker.

Serious Bug

Commentaire le plus utile

Merci @JohnMcLear , exécuter ce qui suit l'a fait fonctionner à nouveau:

alter table "store" alter column "value" type text;

Tous les 29 commentaires

C'est principalement un problème où j'ai utilisé la dernière source alors que j'aurais dû utiliser une version.

J'ai essayé cela avec 1.8.4 et je peux confirmer que je n'obtiens pas cette erreur. J'ai mis à jour le problème en conséquence.

Sauf que la 1.8.5 inclut ce bogue, alors oups.

Corrigé dans c8361a211a1e6bfbbc006933f48d48ca51857c71

Corrigé dans c8361a2

J'ai toujours ça.

image

Avez-vous git pull puis bin / run.sh?

Vous devrez mettre à jour ueber et bin / run.sh le fera. N'utilisez pas fastrun

Ouais, je trouve toujours bin/run.sh .
Il est mis à jour en "ueberdb2": "^0.5.2"

Screenshot_20200910_103721

Les tests passent très bien.

Pouvez-vous essayer un nouveau pg dB plz? Je veux voir si le commit précédent a cassé votre base de données.

Pouvez-vous essayer un nouveau pg dB plz? Je veux voir si le commit précédent a cassé votre base de données.

bien sûr, laissez-moi essayer.

Pouvez-vous essayer un nouveau pg dB plz? Je veux voir si le commit précédent a cassé votre base de données.

En fait, en raison de mon environnement de développement, j'obtiens une nouvelle base de données pg à chaque build.
image
image

Ensuite, Peep Travis config pour voir comment nous créons la base de données pour les tests ueberdb. Vous voudrez que le repo ueber dB ne soit pas ici

Semble-t-il que nous devrions utiliser le repo ci-dessous?
https://github.com/ether/ueberDB#dirtyref

dirtyref est fusionné dans master. Utilisez master

Salut, j'ai également ce problème sur 1.8.5. Pouvez-vous rouvrir ce problème jusqu'à ce qu'une solution soit trouvée? (il est donc plus facile de le trouver!)
Merci!

cc @Gared

J'ai toujours ce problème, même changer pour repo https://github.com/ether/ueberDB (master)

image

Pareil ici:

  • Les tampons ne se chargent pas (soit l'éternel «Chargement…» ou 502)
  • Le serveur échoue toutes les heures avec cette exception:
[2020-09-11 11:36:24.449] [ERROR] console - error: column "value" is of type jsonb but expression is of type text
    at Parser.parseErrorMessage (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:278:15)
    at Parser.handlePacket (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:126:29)
    at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:39:38)
    at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
    at Socket.emit (events.js:315:20)
    at Socket.EventEmitter.emit (domain.js:483:12)
    at addChunk (_stream_readable.js:295:12)
    at readableAddChunk (_stream_readable.js:271:9)
    at Socket.Readable.push (_stream_readable.js:212:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23)
[2020-09-11 11:36:24.463] [ERROR] console - TypeError: Cannot read property 'name' of null
    at Client._handleParseComplete (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/client.js:358:26)
    at Connection.emit (events.js:315:20)
    at Connection.EventEmitter.emit (domain.js:483:12)
    at /usr/local/var/etherpad/repo/src/node_modules/pg/lib/connection.js:109:12
    at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:40:17)
    at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
    at Socket.emit (events.js:315:20)
    at Socket.EventEmitter.emit (domain.js:483:12)
    at addChunk (_stream_readable.js:295:12)
    at readableAddChunk (_stream_readable.js:271:9)
  • Système d'exploitation: Ubuntu 18.04
  • settings.json :
{
  "dbSettings" : {
                   "user"    : "etherpad",
                   "host"    : "localhost",
                   "port"    : 5432,
                   "password": "xxx",
                   "database": "etherpad",
                 },
  "padOptions": {
    "noColors":         false,
    "showControls":     true,
    "showChat":         true,
    "showLineNumbers":  true,
    "useMonospaceFont": false,
    "userName":         false,
    "userColor":        false,
    "rtl":              false,
    "alwaysShowChat":   false,
    "chatAndUsers":     false,
    "lang":             "de-de"
  },
  "suppressErrorsInPadText": false,
  "requireSession": false,
  "editOnly": true,
  "sessionNoPassword": false,
  "minify": true,
  "maxAge": 21600,
  "abiword": null,
  "soffice": null,
  "tidyHtml": null,
  "allowUnknownFileEnds": true,
  "requireAuthentication": false,
  "requireAuthorization": false,
  "trustProxy": true,
  "disableIPlogging": true,
  "automaticReconnectionTimeout": 5,
  "users": {
    "admin": {
      "hash": "xxx",
      "is_admin": true
    }
  },
  "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
  "loadTest": false,
  "exposeVersion": false,
  "loglevel": "WARN",
  "logconfig" :
    { "appenders": [
        { "type": "console" }
      ]
    }
}
  • DB: postgresql 10 + 190ubuntu0.1
  • Schéma de base de données:
SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
CREATE FUNCTION public.ueberdb_insert_or_update(character varying, text) RETURNS void
    LANGUAGE plpgsql
    AS $_$ BEGIN   IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN     UPDATE store SET value = $2 WHERE key = $1;   ELSE     INSERT INTO store(key,value) VALUES( $1, $2 );   END IF;   RETURN; END; $_$;
ALTER FUNCTION public.ueberdb_insert_or_update(character varying, text) OWNER TO etherpad;
CREATE FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) RETURNS void
    LANGUAGE plpgsql
    AS $_$ BEGIN   IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN     UPDATE store SET value = $2 WHERE key = $1;   ELSE     INSERT INTO store(key,value) VALUES( $1, $2 );   END IF;   RETURN; END; $_$;
ALTER FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) OWNER TO etherpad;
SET default_tablespace = '';
SET default_with_oids = false;
CREATE TABLE public.store (
    key character varying(100) NOT NULL,
    value jsonb NOT NULL
);
ALTER TABLE public.store OWNER TO etherpad;
ALTER TABLE ONLY public.store
    ADD CONSTRAINT store_pkey PRIMARY KEY (key);

J'ai pris la route de recul. J'ai essayé de restaurer juste etherpad à 1.8.4 mais cela n'a pas fonctionné:

[2020-09-11 20:55:44.494] [ERROR] console - JSON-PROBLEM:[object Object]
[2020-09-11 20:55:44.495] [ERROR] console - (node:1) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)
    at /opt/etherpad-lite/src/node_modules/ueberdb2/CacheAndBufferLayer.js:169:24
    at Query.<anonymous> (/opt/etherpad-lite/src/node_modules/ueberdb2/postgres_common.js:99:5)
    at Query.handleReadyForQuery (/opt/etherpad-lite/src/node_modules/pg/lib/query.js:128:10)
    at Connection.<anonymous> (/opt/etherpad-lite/src/node_modules/pg/lib/client.js:247:19)
    at Connection.emit (events.js:198:13)
    at Connection.EventEmitter.emit (domain.js:448:20)
    at Socket.<anonymous> (/opt/etherpad-lite/src/node_modules/pg/lib/connection.js:134:12)
    at Socket.emit (events.js:198:13)
    at Socket.EventEmitter.emit (domain.js:448:20)
[2020-09-11 20:55:44.496] [ERROR] console - (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
[2020-09-11 20:55:44.496] [ERROR] console - (node:1) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

J'ai donc également restauré un dump pgsql et maintenant 1.8.4 fonctionne à nouveau (ce qui n'est pas vraiment une surprise car il fonctionnait très bien).

raison: de 1.8.4 à 1.8.5, la valeur de la colonne passe de type text à jsonb.
Devrait être une version majeure ...

Existe-t-il un script de migration qui peut être appliqué?

Je vais juste revenir sur ces commits. Tout cela a été mal géré à mon humble avis.

Le journal des modifications dit «IMPORTANT: Cela corrige un problème grave avec postgresql dans la version 1.8.5» pour la version 1.8.6, mais j'ai mis à jour et j'obtiens toujours les exceptions mentionnées ci-dessus. J'ai maintenant remarqué ces exceptions, qui sont affichées immédiatement après le redémarrage du service:

[2020-09-19 17:47:45.482] [ERROR] console - JSON-PROBLEM:[object Object]                                    
[2020-09-19 17:47:45.496] [ERROR] console - (node:30613) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)                                                                         
    at /usr/local/var/etherpad/repo/src/node_modules/ueberdb2/lib/CacheAndBufferLayer.js:169:24
    at Query.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/ueberdb2/databases/postgres_common.js:99:5)
    at Query.handleReadyForQuery (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/query.js:122:12)
    at Client._handleReadyForQuery (/usr/local/var/etherpad/repo/src/node_modules/pg/lib/client.js:281:19)
    at Connection.emit (events.js:315:20)               
    at Connection.EventEmitter.emit (domain.js:483:12)          
    at /usr/local/var/etherpad/repo/src/node_modules/pg/lib/connection.js:109:12          
    at Parser.parse (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/parser.js:40:17)      
    at Socket.<anonymous> (/usr/local/var/etherpad/repo/src/node_modules/pg-protocol/dist/index.js:8:42)
[2020-09-19 17:47:45.497] [ERROR] console - (node:30613) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)    
[2020-09-19 17:47:45.497] [ERROR] console - (node:30613) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

@ c7hm4r votre base de données a-t-elle changé ou quelque chose? Si vous démarrez une nouvelle tarble / base de données, est-ce que tout va bien?

@JohnMcLear Lors du redémarrage d'Etherpad 1.8.6 avec une base de données vide, un nouveau schéma est créé et il semble fonctionner sans exception.

Quand je compare le nouveau schéma avec l'ancien, je reçois ce qui suit:

diff --git a/etherpad_schema.sql b/etherpad_schema_new.sql
index 9baf5f4..ad3c08b 100644
--- a/etherpad_schema.sql
+++ b/etherpad_schema_new.sql
@@ -41,17 +41,6 @@ CREATE FUNCTION public.ueberdb_insert_or_update(character varying, text) RETURNS

 ALTER FUNCTION public.ueberdb_insert_or_update(character varying, text) OWNER TO etherpad;

---
--- Name: ueberdb_insert_or_update_jsonb(character varying, jsonb); Type: FUNCTION; Schema: public; Owner: etherpad
---
-
-CREATE FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) RETURNS void
-    LANGUAGE plpgsql
-    AS $_$ BEGIN   IF EXISTS( SELECT * FROM store WHERE key = $1 ) THEN     UPDATE store SET value = $2 WHERE key = $1;   ELSE     INSERT INTO store(key,value) VALUES( $1, $2 );   END IF;   RETURN; END; $_$;
-
-
-ALTER FUNCTION public.ueberdb_insert_or_update_jsonb(character varying, jsonb) OWNER TO etherpad;
-
 SET default_tablespace = '';

 SET default_with_oids = false;
@@ -62,7 +51,7 @@ SET default_with_oids = false;

 CREATE TABLE public.store (
     key character varying(100) NOT NULL,
-    value jsonb NOT NULL
+    value text NOT NULL
 );

La question est donc la suivante: quand le type de colonne a changé et comment migrer / inverser cela?

J'ai configuré des mises à jour automatiques pour mon instance Etherpad à partir de la branche principale.

@ c7hm4r @qsuscs était l'auteur des commits incriminés. J'espère qu'il prend une part de responsabilité ici et qu'il aide :)

https://github.com/ether/ueberDB/commit/b9e786e2c8753f4cbbe09d3695a92a1a03904ead#diff -f1b8245dd259fa912c33cb2db527f609R31 est la déclaration alternative.

  var updateValueColumnType = "ALTER TABLE store " +
    "ALTER COLUMN value " +
    "TYPE jsonb " +
    "USING value::jsonb";

On pourrait supposer que changer jsonb en texte le ferait?

Merci @JohnMcLear , exécuter ce qui suit l'a fait fonctionner à nouveau:

alter table "store" alter column "value" type text;

@ c7hm4r pas de soucis, j'espère que la poignée de personnes que cela affecte trouveront ce fil et exécuteront cette commande., Merci d'avoir écrit et testé! :) Je serais prêt à prendre un PR pour réparer si vous ou l'auteur original le vouliez. J'ai d'autres tâches en ce moment qui sont prioritaires.

Cette page vous a été utile?
0 / 5 - 0 notes