Etherpad-lite: التعامل مع اتصال قاعدة البيانات بأمان غير متوفر

تم إنشاؤها على ١٢ نوفمبر ٢٠٢٠  ·  5تعليقات  ·  مصدر: ether/etherpad-lite

صف الخلل
عندما يكون اتصال قاعدة البيانات بوحدة تخزين الواجهة الخلفية غير متاح (تم اختباره باستخدام postgres) ، يستمر الخادم في التعطل بدلاً من الإبلاغ بأمان عن مشكلات اتصال قاعدة البيانات.

لإعادة إنتاج
خطوات إعادة إنتاج السلوك:

  1. إيقاف خادم قاعدة البيانات (postgres)
  2. ابدأ etherpad
  3. قم بزيارة بعض الصفحات التي تحتاج إلى اتصال قاعدة البيانات (أي لوحة يجب أن تفعل ، في حالتي ، يتم تشغيلها أيضًا عند عرض /admin/plugins
  4. انظر الخطأ

سلوك متوقع
رجوع رشيق لعرض بعض رسائل خطأ الواجهة الأمامية ، ولكن استمر في العمل على الرغم من هذا النقص في اتصال قاعدة البيانات.

السلوك الفعلي

[2020-11-12 22:13:05.858] [ERROR] console - error: column "value" is of type jsonb but expression is of type text
    at Parser.parseErrorMessage (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:278:15)
    at Parser.handlePacket (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:126:29)
    at Parser.parse (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:39:38)
    at Socket.stream.on (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
    at Socket.emit (events.js:198:13)
    at Socket.EventEmitter.emit (domain.js:448:20)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at Socket.Readable.push (_stream_readable.js:224:10)
    at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
[2020-11-12 22:13:05.858] [INFO] console - Stopping Etherpad...
[2020-11-12 22:13:05.876] [ERROR] console - TypeError: Cannot read property 'name' of null
    at Client._handleParseComplete (/home/etherpad/etherpad-lite/src/node_modules/pg/lib/client.js:358:26)
    at Connection.emit (events.js:198:13)
    at Connection.EventEmitter.emit (domain.js:448:20)
    at parse (/home/etherpad/etherpad-lite/src/node_modules/pg/lib/connection.js:109:12)
    at Parser.parse (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/parser.js:40:17)
    at Socket.stream.on (/home/etherpad/etherpad-lite/src/node_modules/pg-protocol/dist/index.js:8:42)
    at Socket.emit (events.js:198:13)
    at Socket.EventEmitter.emit (domain.js:448:20)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)

سياق إضافي

Etherpad version
Version number: 1.8.6
Latest available version: 1.8.6
Git sha: 6a8563e

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

أوه تحقق من ارتباطات التراجع. كان هناك خطأ في ارتكاب خطأ في وقت سابق كان مرتبطًا على ما أعتقد ..

ال 5 كومينتر

+1 هذا.

https://github.com/ether/ueberDB لاستخراج قاعدة بياناتنا راجع للشغل. هذه ليست مجرد مشكلة PG ، بل تؤثر على جميع قواعد البيانات.

سأقبل العلاقات العامة ، ولست متأكدًا من المكان الأفضل لإصلاحه ، وأعتقد أن ueberdb ينبعث بشكل كبير عند فقد db.

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

تجدر الإشارة إلى أن Etherpad مصمم ليموت عند الخطأ ، فنحن نحاول ألا نبقي الأمور على قيد الحياة ولكننا نفشل. لقد كان قرار تصميم مبكرًا أتى ثماره جيدًا لأنه أجبرنا على جعل Etherpad مستقرًا (ish) .. ستحاول البرامج النصية لبدء تشغيل Etherpad إعادة تشغيل Etherpad وإعادة إنشاء اتصال db ، فأنا لا أعارض كيفية قيامنا بالأشياء ولكن أشعر أنه في حالة اختفاء قاعدة البيانات ، يجب أن يكون واضحًا جدًا أن Etherpad يفشل بسبب اختفاء قاعدة البيانات.

لا أعتقد أن هذه مشكلة اتصال. يبدو أن column <name> is of type jsonb but expression is of type text أمر شائع إلى حد ما يحدث عندما تقوم البرامج الوسيطة بإعداد معلمات الاستعلام بطرق غير متوقعة. يتم إنشاء العمود كـ JSONB ، ولكن عندما يستخدم منشئ الاستعلام شيئًا مثل JSON.encode ، يتم استنتاج النوع على أنه سلسلة ويتم ربط المعلمة كنوع TEXT أو VARCHAR ("اختلاف الأحرف" في رسائل الخطأ).
يبدو أن هذا يمكن أن يكون أيضًا مشكلة عند تخزين سلاسل أو مصفوفات بدلاً من الكائنات التي تحتوي عليها؟

تم العثور على مثال عشوائي عبر Google ، لا يتعلق بهذا المشروع: https://github.com/jeremydaly/data-api-client/issues/27#issuecomment -584701957

أوه تحقق من ارتباطات التراجع. كان هناك خطأ في ارتكاب خطأ في وقت سابق كان مرتبطًا على ما أعتقد ..

لقد لاحظت للتو - يبدو أننا حصلنا على CREATE TABLE مع jsonb بداخله ، الإصدار الموجود في node_modules هو text بالفعل. FWIW لدينا أيضًا ueberdb_insert_or_update() مع وسيطة نصية ، ولم يتبق أحد مثقلًا ...

فقط للتأكد قبل أن أقوم بتحويله ، النص هو ما يفترض أن يكون (في الوقت الحالي)؟

بعد التحويل إلى نص يبدو أن كل شيء يعمل:

ALTER TABLE storage ALTER COLUMN value TYPE text USING value::text;
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات