Etherpad-lite: خلفية Postgres - خطأ: العمود "القيمة" من النوع jsonb لكن التعبير من نوع النص

تم إنشاؤها على ٨ سبتمبر ٢٠٢٠  ·  29تعليقات  ·  مصدر: ether/etherpad-lite

وصف الخطأ
عدم تطابق المخطط عند القيام بأي نوع من الإدخالات.

خطأ: العمود "القيمة" من النوع jsonb لكن التعبير من نوع النص

لإعادة إنتاج
استخدام أحدث مصدر و postgres. تمت تجربة الإصدارين 12 و 13.

سلوك متوقع
للقيام بالإدراج بدون خطأ.

لقطات
etherpad_1 | [2020-09-08 20: 37: 50.541] وحدة التحكم [ERROR] - خطأ: العمود "القيمة" من النوع 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 [as onread] (داخلي / stream_base_commons.js: 94: 17)

سطح المكتب (يرجى استكمال المعلومات التالية):
غير متوفر

الهاتف الذكي (يرجى استكمال المعلومات التالية):
غير متوفر

سياق إضافي
تم اختبار هذا مع حاويات الرصيف.

Serious Bug

التعليق الأكثر فائدة

شكرًا JohnMcLear ، تشغيل ما يلي جعله يعمل مرة أخرى:

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

ال 29 كومينتر

هذه في الغالب مشكلة استخدمت فيها أحدث مصدر عندما كان يجب علي استخدام إصدار.

لقد جربت هذا مع 1.8.4 ويمكنني أن أؤكد أنني لم أحصل على هذا الخطأ. لقد قمت بتحديث المشكلة وفقًا لذلك.

باستثناء 1.8.5 يتضمن هذا الخطأ ، لذلك يصيح.

ثابت في c8361a211a1e6bfbbc006933f48d48ca51857c71

ثابت في c8361a2

ما زلت أفهم ذلك.

image

هل قمت بسحب bin / run.sh؟

ستحتاج إلى تحديث ueber و bin / run.sh سيفعل ذلك. لا تستخدم Fastrun

نعم ، دائمًا ما أتوصل إلى bin/run.sh .
يتم تحديثه إلى "ueberdb2": "^0.5.2"

Screenshot_20200910_103721

الاختبارات تمر بشكل جيد.

يمكنك تجربة pg dB بلز جديد؟ أريد معرفة ما إذا كان الالتزام السابق قد عطّل قاعدة البيانات الخاصة بك.

يمكنك تجربة pg dB بلز جديد؟ أريد معرفة ما إذا كان الالتزام السابق قد عطّل قاعدة البيانات الخاصة بك.

بالتأكيد ، دعني أحاول.

يمكنك تجربة pg dB بلز جديد؟ أريد معرفة ما إذا كان الالتزام السابق قد عطّل قاعدة البيانات الخاصة بك.

في الواقع ، نظرًا لبيئة التطوير الخاصة بي ، أحصل على معدل pddb جديد على كل بناء.
image
image

ثم تكوين Peep Travis لمعرفة كيفية إنشاء قاعدة البيانات لاختبارات ueberdb. سترغب في عدم وجود مستودع ueber dB هنا

هل يبدو أنه يجب علينا استخدام الريبو أدناه؟
https://github.com/ether/ueberDB#dirtyref

تم دمج dirtyref في برنامج Master. استخدم master

مرحبًا ، لدي هذه المشكلة على 1.8.5 أيضًا. هل يمكنك إعادة فتح هذه المشكلة حتى يتم العثور على حل؟ (لذلك من الأسهل العثور عليه!)
شكر!

سي سي جاريد

ما زلت أواجه هذه المشكلة حتى تتغير إلى الريبو https://github.com/ether/ueberDB (رئيسي)

image

كذلك هنا:

  • الوسادات لا يتم تحميلها (إما "جارٍ التحميل ..." أو 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" }
      ]
    }
}
  • DB: 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 يتم تغيير قيمة العمود من نوع النص إلى jsonb.
يجب أن يكون إصدارًا رئيسيًا ...

هل هناك برنامج نصي للهجرة يمكن تطبيقه؟

سأقوم فقط بالعودة عن هذه الالتزامات. كان هذا كله IMHO معالجة سيئة.

يقول سجل التغيير "هام: هذا يعمل على إصلاح مشكلة خطيرة في 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 هل تغيرت قاعدة البيانات الخاصة بك أو شيء من هذا القبيل؟ إذا بدأت قاعدة بيانات / قاعدة بيانات جديدة ، فهل تسير الأمور على ما يرام؟

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 الخاص بي من الفرع الرئيسي.

كان @qsuscs c7hm4r مؤلف من يرتكب المخالفة. آمل أن يتحمل بعض المسؤولية هنا ويساعد :)

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 لا تقلق ، نأمل أن يجد عدد قليل من الأشخاص

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

dessalines picture dessalines  ·  7تعليقات

ddeenniiss picture ddeenniiss  ·  4تعليقات

rmader picture rmader  ·  6تعليقات

muxator picture muxator  ·  7تعليقات

kernelfreak picture kernelfreak  ·  9تعليقات