問題
Firebase Cloud FireStore にある30万件程度のデータを、Firebase Cloud Functions で5万件ずつ取得してごにょごにょしようと思ってたのですが、以下のようなエラーが発生して途中で処理が停止してしまっていました。
info: Execution took 599988 ms, finished with status: 'timeout'
もしくは、
info: Execution took 4093 ms, finished with status: 'crash'
また、10万件ほど処理が終わったタイミングで、以下の警告も表示されることがありました。
(node:38824) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: socket hang up
(node:38824) [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.
これが表示されると、新しく functionsの処理が再開され、合計3個並行して処理されるようになっていました。
Cloud Functionsのバージョン
v^0.8.1
対応
- タイムアウト制限をなくす
info: Execution took 599988 ms, finished with status: 'timeout'
ローカルだとタイムアウトが60秒なので、だいたい60秒経ったら止まっていました。
このタイムアウトの設定をなくしてあげると、処理が続くようになると教わり、やってみると60秒以上処理が続くようになりました。
~/.nvm/versions/node/v8.6.0/lib/node_modules/firebase-tools/node_modules/@google-cloud/functions-emulator/src/supervisor/supervisor.js
calculateTimeout (duration) {
// The default is 60 seconds
const DEFAULT = 60;
const MAX = 9 * 60;
}
をいじる。
しかし、発生回数は減りましたが、
info: Execution took 599988 ms, finished with status: 'timeout'
が消えることはありませんでした。
対応
Cloud Functions のバージョンをアップグレードする。
バージョンを、 v1.0.1 にあげました。
しかし、
info: Execution took 4093 ms, finished with status: 'crash'
が消えることはありませんでした。
対応
Fix bug where asynchronous operations inside emulated functions resulted in 500 statuses and "socket hangup" errors.
とあるので、以下の警告をなくせることを期待して、firebase-toosをアップグレード。
(node:38824) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: socket hang up
これが表示されることはなくなったかもしれない!
でも、以下のエラーのせいで最後まで処理されない!
info: Execution took 4093 ms, finished with status: 'crash'
解決策
Cloud Functions の emulator だから動かない説。
本番環境にアップして動かしてみたら、30万件処理された。
まとめ
Cloud Functions の emulator には限界がある。