-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FIX: node-tree-killのエラー処理のミスを修正 #2061
Conversation
const enginePid = engineProcess.pid; | ||
if (enginePid == undefined) { | ||
log.error(`ENGINE ${engineId}: Pid is ${enginePid}`); | ||
return undefined; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
エンジンが起動した場合pid
がundefined
になることはありえませんが万が一そうなっていたら既にキルされているとみなすことにします。
engineProcess.pid != undefined && treeKill(engineProcess.pid);
で処理するとその万が一が起きたとき処理が止まります。
また、例外を投げると結局ここに戻ってきて無限ループになるはずです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
なるほどです!!
エラーメッセージの方をもうちょっと分かりやすくさせてください!
ちょっと別で提案してみます!
865408d
to
6b66b28
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!
コメントの部分だけ適用してマージさせていただきます!!
ちなみにこれってちゃんと理解しておきたいのですが、エラーハンドリングは本来コールバックじゃないとダメなのにtry catchしていた、というところが問題認識であってそうでしょうか?
この辺りの終了シーケンスはかなり微妙な部分が残っていると思うので助かります。。
結構抜本的な変更も必要だと感じています。ちょっと大掛かりになってしまうかもですが、もしご興味あったらissueなどで問題指摘していただけると助かります 🙇
(もし可能でしたら、「こうしたらいいかも」と終了シーケンスを考えてくださるとめちゃくちゃ嬉しいです!!)
何かしらの理由でnode-tree-killでエンジンのキルが不可能になっている場合無限ループに陥るリスクが残っています。
これってtreeKillが、プロセスのキルに失敗しているのに正常終了した場合でしょうか?
これを考慮するのであれば、例えば5秒間ぐらいプロセスがキルされたかどうかを確認して、されてなかったらrejectするみたいな処理を書けばもしかしたら大丈夫かも・・・?
その通りです。
自分が不安視しているのは voicevox/src/backend/electron/main.ts Lines 1023 to 1065 in 595d108
voicevox/src/backend/electron/main.ts Lines 513 to 550 in 595d108
これを単純に書くと flowchart TD
A[befor-quit発火] --> B{エンジンの終了の確認}
B -- エンジンが全てキル -->終了
B -- キルされていないエンジンがある -->C["event.preventDefault();"]
C --> D[エンジンキル]
D -- "app.quit()" -->A
となりループから抜けられなくなるのではと。 |
@sabonerune 可能性はもしかしたら低いのかもしれませんが、まあプロセスキルはかなり大事なところなので、しっかりしてあげたいかもしれません。 もし実装するなら「キルしたけど言うことを聞かなかった」フラグを管理する形が良さそう。 ただそうすると次は死活判定を誤ってしまいがちになりそうなので、 で、可能であればテスト書きたいですね。。。 ・・・と、結構入り組みますが、もしよかったら @sabonerune さん実装にチャレンジしてみませんか・・・? あ!分からなかったら放送内で説明もできます!! |
内容
node-tree-kill
のエラー処理が間違っていると思います。現在、エンジンのキルは
try-chatch
を使用しています。voicevox/src/backend/electron/manager/engineManager.ts
Lines 437 to 442 in 0fb559d
しかし
node-tree-kill
のWindowsでの処理はchild_process.exec()
でtaskkill
コマンドを呼び出しているためchild_process.exec()
には成功したがtaskkill
のコマンドに失敗した場合resolve
もreject
も呼ばれないため処理が停止してしまいます。https://github.com/pkrumins/node-tree-kill/blob/cb478381547107f5c53362668533f634beff7e6e/index.js#L29
その他
node-tree-kill
で処理が停止することはなくなりますが何かしらの理由でnode-tree-kill
でエンジンのキルが不可能になっている場合無限ループに陥るリスクが残っています。