Etherpad-lite: Backend do Postgres - erro: a coluna "valor" é do tipo jsonb, mas a expressão é do tipo texto

Criado em 8 set. 2020  ·  29Comentários  ·  Fonte: ether/etherpad-lite

Descreva o bug
Esquema incompatível ao fazer qualquer tipo de inserções.

erro: a coluna "valor" é do tipo jsonb, mas a expressão é do tipo texto

Reproduzir
Use a fonte mais recente e o postgres. Tentei com v12 e v13.

Comportamento esperado
Para fazer a inserção sem erro.

Capturas de tela
etherpad_1 | [2020-09-08 20: 37: 50.541] [ERROR] console - erro: a coluna "valor" é do tipo jsonb, mas a expressão é do tipo texto
etherpad_1 | em Parser.parseErrorMessage (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
etherpad_1 | em Parser.handlePacket (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
etherpad_1 | em Parser.parse (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
etherpad_1 | em Socket.stream.on (/opt/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
etherpad_1 | em Socket.emit (events.js: 198: 13)
etherpad_1 | em Socket.EventEmitter.emit (domain.js: 448: 20)
etherpad_1 | em addChunk (_stream_readable.js: 288: 12)
etherpad_1 | em readableAddChunk (_stream_readable.js: 269: 11)
etherpad_1 | em Socket.Readable.push (_stream_readable.js: 224: 10)
etherpad_1 | em TCP.onStreamRead [as onread] (internal / stream_base_commons.js: 94: 17)

Desktop (preencha as seguintes informações):
N / D

Smartphone (preencha as seguintes informações):
N / D

Contexto adicional
Isso foi testado com contêineres docker.

Serious Bug

Comentários muito úteis

Obrigado @JohnMcLear , executar o seguinte fez com que funcionasse novamente:

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

Todos 29 comentários

Este é principalmente um problema em que usei a fonte mais recente quando deveria ter usado uma versão.

Tentei fazer isso com 1.8.4 e posso confirmar que não recebo esse erro. Eu atualizei o problema de acordo.

Exceto 1.8.5 inclui esse bug, então ops.

Corrigido em c8361a211a1e6bfbbc006933f48d48ca51857c71

Fixo em c8361a2

Eu ainda entendo isso.

image

Você fez o pull e bin / run.sh?

Você precisará atualizar o ueber e bin / run.sh fará isso. Não use fastrun

Sim, eu sempre invoco bin/run.sh .
Ele é atualizado para "ueberdb2": "^0.5.2"

Screenshot_20200910_103721

Os testes estão passando bem.

Você pode tentar um novo pg dB plz? Quero ver se o commit anterior quebrou seu banco de dados.

Você pode tentar um novo pg dB plz? Quero ver se o commit anterior quebrou seu banco de dados.

claro, deixe-me tentar.

Você pode tentar um novo pg dB plz? Quero ver se o commit anterior quebrou seu banco de dados.

Na verdade, devido ao meu ambiente de desenvolvimento, estou recebendo um novo pg db em cada compilação.
image
image

Em seguida, config Peep Travis para ver como criamos o banco de dados para os testes ueberdb. Você vai querer o repositório ueber dB não aqui

Parece que devemos usar o repositório abaixo?
https://github.com/ether/ueberDB#dirtyref

dirtyref é mesclado com o master. Use master

Olá, também tenho este problema no 1.8.5. Você pode reabrir este problema até que uma solução seja encontrada? (então é mais fácil encontrá-lo!)
Obrigado!

cc @Gared

Ainda tenho esse problema, mesmo mude para repo https://github.com/ether/ueberDB (mestre)

image

O mesmo aqui:

  • Pads não estão carregando ("Carregando ..." eterno ou 502)
  • O servidor falha a cada hora com esta exceção:
[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 banco de dados:
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);

Peguei a estrada de volta. Tentei reverter apenas o etherpad para 1.8.4, mas não funcionou:

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

Então, eu restaurei um dump do pgsql também e agora 1.8.4 funciona novamente (o que não é realmente uma surpresa, já que estava funcionando perfeitamente).

motivo: de 1.8.4 para 1.8.5, o valor da coluna é alterado do tipo texto para jsonb.
Deve ser um grande lançamento ...

Existe um script de migração que pode ser aplicado?

Vou apenas reverter esses commits. Isso tudo foi IMHO mal tratado.

O log de alterações diz "IMPORTANTE: Isso corrige um problema grave com o postgresql no 1.8.5" para 1.8.6, mas eu atualizei e ainda obtenho as exceções mencionadas acima. Agora notei essas exceções também, que são geradas imediatamente após a reinicialização do serviço:

[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 seu banco de dados mudou ou algo assim? Se você iniciar um novo tarble / banco de dados, tudo bem?

@JohnMcLear Ao reiniciar o Etherpad 1.8.6 com um banco de dados vazio, um novo esquema é criado e parece funcionar sem exceções.

Quando comparo o novo esquema com o antigo, fico com o seguinte:

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

Portanto, a questão é: quando o tipo da coluna mudou e como migrar / reverter isso?

Eu configurei atualizações automáticas para minha instância Etherpad a partir do branch master.

@ c7hm4r @qsuscs foi o autor dos commits ofensivos. Espero que ele assuma alguma responsabilidade aqui e ajude :)

https://github.com/ether/ueberDB/commit/b9e786e2c8753f4cbbe09d3695a92a1a03904ead#diff -f1b8245dd259fa912c33cb2db527f609R31 é a declaração de alteração.

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

Alguém poderia supor que mudar jsonb para texto resolveria?

Obrigado @JohnMcLear , executar o seguinte fez com que funcionasse novamente:

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

@ c7hm4r não se preocupe, espero que o punhado de pessoas que isso afeta encontre este tópico e execute aquele comando. Obrigado por escrever e testar! :) Eu estaria disposto a fazer um PR para consertar se você ou o autor original quisessem. Tenho outras tarefas no momento que são prioritárias.

Esta página foi útil?
0 / 5 - 0 avaliações