Etherpad-lite: Серверная часть Postgres - ошибка: столбец «значение» имеет тип jsonb, но выражение имеет тип текста.

Созданный на 8 сент. 2020  ·  29Комментарии  ·  Источник: ether/etherpad-lite

Опишите ошибку
Несоответствие схемы при любых вставках.

ошибка: столбец «значение» имеет тип jsonb, но выражение имеет тип текста

Воспроизводить
Используйте последний источник и postgres. Пробовал с v12 и v13.

Ожидаемое поведение
Сделать вставку без ошибок.

Скриншоты
etherpad_1 | [2020-09-08 20: 37: 50.541] [ОШИБКА] консоль - ошибка: столбец «значение» имеет тип jsonb, но выражение имеет тип текста
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 | в 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 [как onread] (internal / stream_base_commons.js: 94: 17)

Рабочий стол (заполните следующую информацию):
NA

Смартфон (заполните следующую информацию):
NA

Дополнительный контекст
Это было протестировано с контейнерами докеров.

Serious Bug

Самый полезный комментарий

Спасибо @JohnMcLear , запуск следующего снова заставил его работать:

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

Все 29 Комментарий

В основном это проблема, когда я использовал последний исходный код, хотя должен был использовать выпуск.

Я пробовал это с 1.8.4 и могу подтвердить, что не получаю этой ошибки. Я обновил проблему соответствующим образом.

За исключением того, что в 1.8.5 есть эта ошибка, так что упс.

Исправлено в c8361a211a1e6bfbbc006933f48d48ca51857c71

Исправлено в c8361a2

Я все еще понимаю.

image

Вы git pull затем bin / run.sh?

Вам нужно будет обновить ueber, и bin / run.sh сделает это. Не используйте fastrun

Да, я всегда придумываю bin/run.sh .
Он обновлен до "ueberdb2": "^0.5.2"

Screenshot_20200910_103721

Тесты проходят нормально.

Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.

Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.

конечно, позволь мне попробовать.

Можете попробовать новый PG dB плз? Я хочу увидеть, не сломал ли предыдущий коммит вашу базу данных.

Фактически, из-за моей среды разработки я получаю новый pg db при каждой сборке.
image
image

Затем просмотрите конфигурацию Travis, чтобы увидеть, как мы создаем базу данных для тестов ueberdb. Вам понадобится репо ueber dB, которого здесь нет

Кажется, нам следует использовать репо ниже?
https://github.com/ether/ueberDB#dirtyref

dirtyref объединен с master. Используйте master

Привет, у меня тоже есть эта проблема с 1.8.5. Можете ли вы повторно открыть эту проблему, пока не будет найдено решение? (так проще найти!)
Благодаря!

cc @Gared

У меня все еще есть эта проблема, даже если я поменяю репо https://github.com/ether/ueberDB (master)

image

Тоже самое:

  • Пэды не загружаются (либо вечное "Loading…", либо 502)
  • Сервер выходит из строя каждый час за этим исключением:
[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)
  • ОС: 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" }
      ]
    }
}
  • БД: postgresql 10 + 190ubuntu0.1
  • Схема БД:
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);

Я пошел откатной дорогой. Я попытался откатить только etherpad до 1.8.4, но не вышло:

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

Итак, я восстановил дамп pgsql, и теперь 1.8.4 снова работает (что на самом деле не удивительно, поскольку он работал нормально).

причина: с 1.8.4 до 1.8.5 значение столбца изменено с типа text на jsonb.
Должен быть крупный релиз ...

Есть ли сценарий миграции, который можно применить?

Я просто собираюсь отменить эти коммиты. ИМХО, все это было плохо обработано.

В журнале изменений написано: «ВАЖНО: это устраняет серьезную проблему с postgresql в 1.8.5» для 1.8.6, но я обновился и все еще получаю исключения, упомянутые выше. Я также заметил эти исключения, которые выводятся сразу после перезапуска службы:

[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 ваша база данных изменилась или что-то в этом роде? Если вы запустите новый tarble / базу данных, все в порядке?

@JohnMcLear При перезапуске Etherpad 1.8.6 с пустой базой данных создается новая схема, которая работает без исключений.

Когда я сравниваю новую схему со старой, я получаю следующее:

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

Итак, вопрос: когда тип столбца изменился и как его перенести / отменить?

Я настроил автоматические обновления для своего экземпляра Etherpad из основной ветки.

@ c7hm4r @qsuscs был автором оскорбительных коммитов. Я надеюсь, что он возьмет на себя ответственность и поможет :)

https://github.com/ether/ueberDB/commit/b9e786e2c8753f4cbbe09d3695a92a1a03904ead#diff -f1b8245dd259fa912c33cb2db527f609R31 - альтернативный оператор.

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

Можно было бы предположить, что изменение jsonb на текст сделает это?

Спасибо @JohnMcLear , запуск следующего снова заставил его работать:

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

@ c7hm4r не беспокойтесь, надеюсь, горстка людей, которых это затронет, найдет эту ветку и выполнит эту команду. Спасибо за написание и тестирование! :) Я был бы готов принять PR, чтобы исправить, если бы вы или первоначальный автор захотели. В данный момент у меня есть другие приоритетные задачи.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги