صف الخلل
عندما يكون اتصال قاعدة البيانات بوحدة تخزين الواجهة الخلفية غير متاح (تم اختباره باستخدام postgres) ، يستمر الخادم في التعطل بدلاً من الإبلاغ بأمان عن مشكلات اتصال قاعدة البيانات.
لإعادة إنتاج
خطوات إعادة إنتاج السلوك:
/admin/plugins
سلوك متوقع
رجوع رشيق لعرض بعض رسائل خطأ الواجهة الأمامية ، ولكن استمر في العمل على الرغم من هذا النقص في اتصال قاعدة البيانات.
السلوك الفعلي
[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
+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;
التعليق الأكثر فائدة
أوه تحقق من ارتباطات التراجع. كان هناك خطأ في ارتكاب خطأ في وقت سابق كان مرتبطًا على ما أعتقد ..