バグを説明する
バックエンドストレージへのデータベース接続が利用できない場合(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を
私はPRを受け入れます、それを修正するのに最適な場所がわかりません。dbが失われたときにprollyがueberdbを放出していると思います。
クライアントにメッセージをバブリングしたくないので、クライアントへの一般的なエラー、バックエンドログのエラーのクリア、データベースが復元されるまでメモリへのキャッシュ。問題は、データベースが復元されるまでキャッシュからメモリへのキャッシュに新しいロジックが必要になることです。データベースコネクタごとに、時間よりも大きな仕事になる可能性があります。
Etherpadはエラーで死ぬように設計されていることは注目に値します。私たちは物事を生き続けるのではなく、失敗するように努めています。 それはEtherpadを安定させることを余儀なくされたのでかなりうまくいった初期の設計決定でした。Etherpadの起動スクリプトはEtherpadを再起動してdb接続を再確立しようとします。データベースがなくなった場合、データベースがなくなったためにEtherpadが失敗していることは非常に明白なはずです。
これは接続の問題ではないと思います。 column <name> is of type jsonb but expression is of type text
は、ミドルウェアが予期しない方法でクエリパラメータを設定したときに発生するかなり一般的なことのようです。 列はJSONBとして作成されますが、クエリジェネレーターがJSON.encodeのようなものを使用する場合、タイプは文字列であると推測され、パラメーターはタイプTEXTまたはVARCHAR(エラーメッセージでは「文字が変化する」)としてバインドされます。
どうやらそれは、文字列や配列を含むオブジェクトの代わりにそれらを格納するときにも問題になる可能性がありますか?
このプロジェクトに関係のない、Google経由で見つかったランダムな例: https :
ああ、元に戻されたコミットを確認してください。 しばらく前に悪いpgコミットがあったと思います。
私はちょうど気づきました-jsonbを含むCREATETABLEを取得したようです、node_modulesのバージョンはすでにtext
です。 FWIWテキスト引数付きのueberdb_insert_or_update()
もあり、オーバーロードされたものは残っていません...
変換する前に確認するために、テキストは(今のところ)本来あるべきものですか?
テキストに変換した後、すべてが機能しているようです。
ALTER TABLE storage ALTER COLUMN value TYPE text USING value::text;
最も参考になるコメント
ああ、元に戻されたコミットを確認してください。 しばらく前に悪いpgコミットがあったと思います。