Etherpad-lite: Backend de Postgres - error: la columna "valor" es de tipo jsonb pero la expresión es de tipo texto

Creado en 8 sept. 2020  ·  29Comentarios  ·  Fuente: ether/etherpad-lite

Describe el error
Falta de coincidencia de esquema al realizar cualquier tipo de inserciones.

error: la columna "valor" es de tipo jsonb pero la expresión es de tipo texto

Reproducir
Utilice la última fuente y postgres. Probé con v12 y v13.

Comportamiento esperado
Hacer la inserción sin error.

Capturas de pantalla
etherpad_1 | [2020-09-08 20: 37: 50.541] Consola [ERROR] - error: la columna "valor" es de tipo jsonb pero la expresión es de tipo texto
etherpad_1 | en Parser.parseErrorMessage (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
etherpad_1 | en Parser.handlePacket (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
etherpad_1 | en Parser.parse (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
etherpad_1 | en Socket.stream.on (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
etherpad_1 | en Socket.emit (events.js: 198: 13)
etherpad_1 | en Socket.EventEmitter.emit (dominio.js: 448: 20)
etherpad_1 | en addChunk (_stream_readable.js: 288: 12)
etherpad_1 | en readableAddChunk (_stream_readable.js: 269: 11)
etherpad_1 | en Socket.Readable.push (_stream_readable.js: 224: 10)
etherpad_1 | en TCP.onStreamRead [como onread] (internal / stream_base_commons.js: 94: 17)

Escritorio (complete la siguiente información):
N / A

Smartphone (complete la siguiente información):
N / A

Contexto adicional
Esto se probó con contenedores Docker.

Serious Bug

Comentario más útil

Gracias @JohnMcLear , ejecutar lo siguiente hizo que funcionara nuevamente:

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

Todos 29 comentarios

Esto es principalmente un problema en el que usé la última fuente cuando debería haber usado una versión.

Probé esto con 1.8.4 y puedo confirmar que no recibo este error. He actualizado el problema en consecuencia.

Excepto que 1.8.5 incluye este error, así que ¡vaya!

Corregido en c8361a211a1e6bfbbc006933f48d48ca51857c71

Corregido en c8361a2

Todavía lo entiendo.

image

¿Git pull y luego bin / run.sh?

Necesitará actualizar ueber y bin / run.sh lo hará. No uses fastrun

Sí, siempre se me ocurre bin/run.sh .
Se actualiza a "ueberdb2": "^0.5.2"

Screenshot_20200910_103721

Las pruebas están pasando bien.

¿Puedes probar un nuevo pg dB plz? Quiero ver si el compromiso anterior rompió su base de datos.

¿Puedes probar un nuevo pg dB plz? Quiero ver si el compromiso anterior rompió su base de datos.

seguro, déjame intentarlo.

¿Puedes probar un nuevo pg dB plz? Quiero ver si el compromiso anterior rompió su base de datos.

En realidad, debido a mi entorno de desarrollo, obtengo un nuevo pg db en cada compilación.
image
image

Luego Peep Travis config para ver cómo creamos la base de datos para las pruebas de ueberdb. Querrá que el repositorio de ueber dB no esté aquí

¿Parece que deberíamos usar el siguiente repositorio?
https://github.com/ether/ueberDB#dirtyref

dirtyref se fusiona con master. Utilice master

Hola, también tengo este problema en 1.8.5. ¿Puede volver a abrir este problema hasta que se encuentre una solución? (¡para que sea más fácil encontrarlo!)
¡Gracias!

cc @Gared

Todavía tengo este problema, incluso cambio al repositorio https://github.com/ether/ueberDB (maestro)

image

Igual que aquí:

  • Las almohadillas no se cargan (ya sea eterna "Cargando ..." o 502)
  • El servidor falla cada hora con esta excepción:
[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)
  • SO: 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
  • Esquema de base de datos:
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);

Tomé el camino de retroceso. Intenté revertir solo etherpad a 1.8.4 pero no funcionó:

[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.

Así que también restauré un volcado de pgsql y ahora 1.8.4 funciona nuevamente (lo cual no es realmente una sorpresa ya que había estado funcionando bien).

motivo: de 1.8.4 a 1.8.5 el valor de la columna se cambia de tipo texto a jsonb.
Debería ser un lanzamiento importante ...

¿Existe un script de migración que se pueda aplicar?

Solo voy a revertir estas confirmaciones. En mi humilde opinión, todo esto fue mal manejado.

El registro de cambios dice "IMPORTANTE: Esto soluciona un problema grave con postgresql en 1.8.5" para 1.8.6, pero he actualizado y aún obtengo las excepciones mencionadas anteriormente. Ahora también noté estas excepciones, que se generan inmediatamente después del reinicio del servicio:

[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, ¿

@JohnMcLear Cuando reinicia Etherpad 1.8.6 con una base de datos vacía, se crea un nuevo esquema y parece funcionar sin excepciones.

Cuando comparo el nuevo esquema con el anterior, obtengo lo siguiente:

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
 );

Entonces la pregunta es: ¿Cuándo ha cambiado el tipo de columna y cómo migrar / revertir eso?

Configuré actualizaciones automáticas para mi instancia de Etherpad desde la rama maestra.

@ c7hm4r @qsuscs fue el autor de las confirmaciones ofensivas. Espero que se responsabilice y ayude :)

https://github.com/ether/ueberDB/commit/b9e786e2c8753f4cbbe09d3695a92a1a03904ead#diff -f1b8245dd259fa912c33cb2db527f609R31 es la declaración alter.

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

¿Uno asumiría que cambiar jsonb a texto lo haría?

Gracias @JohnMcLear , ejecutar lo siguiente hizo que funcionara nuevamente:

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

@ c7hm4r no se preocupe, con suerte el puñado de personas que esto afecta encontrará este hilo y

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

muxator picture muxator  ·  7Comentarios

julpec picture julpec  ·  9Comentarios

dessalines picture dessalines  ·  7Comentarios

kpcyrd picture kpcyrd  ·  8Comentarios

zeer15398376 picture zeer15398376  ·  9Comentarios