Etherpad-lite: 利用できないデータベース接続を適切に処理する

作成日 2020年11月12日  ·  5コメント  ·  ソース: ether/etherpad-lite

バグを説明する
バックエンドストレージへのデータベース接続が利用できない場合(postgresでテスト済み)、サーバーはデータベース接続の問題を適切に報告するのではなく、クラッシュし続けます。

再現するには
動作を再現する手順:

  1. データベースサーバーを停止します(postgres)
  2. イーサパッドを開始
  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

最も参考になるコメント

ああ、元に戻されたコミットを確認してください。 しばらく前に悪いpgコミットがあったと思います。

全てのコメント5件

これを+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;
このページは役に立ちましたか?
0 / 5 - 0 評価