Skip to content
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

add: サーバー終了コマンド・signal の仕様 #1248

Open
tarepan opened this issue May 15, 2024 · 8 comments
Open

add: サーバー終了コマンド・signal の仕様 #1248

tarepan opened this issue May 15, 2024 · 8 comments
Labels
機能向上 状態:設計 設計をおこなっている状態 要議論 実行する前に議論が必要そうなもの

Comments

@tarepan
Copy link
Contributor

tarepan commented May 15, 2024

内容

概要: サーバー終了コマンドとシグナル扱いの仕様を策定し実装したい

ref #1246
現在の VOICEVOX ENGINE は明確に定義されたエンジン終了コマンドが存在しない。
一方で各種 signal に対する実装依存の振る舞いが存在しており、ctrl+C で以前はサーバーが停止していた(graceful shutdown なのかは不明)。
実装依存の結果、ライブラリアップデートで挙動に変化があり、方針の明確化が必要になりつつある。

このような背景から、サーバー終了コマンドとシグナル扱いの仕様を策定・実装することを提案します。

Pros 良くなる点

  • 挙動明確化
  • 安全なシャットダウン

Cons 悪くなる点

無し

実現方法

  • 仕様策定
  • 実装

VOICEVOXのバージョン

0.19.1

@tarepan tarepan added 要議論 実行する前に議論が必要そうなもの 状態:必要性議論 必要性を議論している状態 labels May 15, 2024
@sevenc-nanashi
Copy link
Member

関係しそう: VOICEVOX/voicevox#1540

@tarepan tarepan changed the title 追加: サーバー終了コマンド・signal の仕様 add: サーバー終了コマンド・signal の仕様 May 17, 2024
@Hiroshiba
Copy link
Member

issue作成ありがとうございます!

一般的にどうするのがいいのか知らないんですよねー・・・。

もしかっちり設計するなら、まずはVOICEVOX ENGINEと似たようなAPI サーバーを建てるサービスを探してそのドキュメントを眺めてみるか、あるいはuvicornやfastapiやflaskやdjangoでどのような設計にするのがデファクトなのか調べるところかなのかなと思いました!

@tarepan
Copy link
Contributor Author

tarepan commented May 20, 2024

一般的にどうするのがいいのか

  • クライアントと独立したサーバーであれば、サーバーでの ctrl+C で graceful shutdown
  • クライアントに従属するサーバーであれば、クライアントからの POST /shutdown で graceful shutdown

が標準的な方針かと思います。

子プロセスでサーバーを立てると signal 送って殺すのが一般的ですが、ENGINE はプロセスに依存しない(遠隔サーバーでもOK)仕様なので、上記の方針が妥当と考えます。

かっちり設計するなら ... ドキュメントを眺めてみるか ... デファクトなのか調べる

👍️
丁寧に設計する場合の方針として賛成です。
実装例の情報をコツコツここに集約していきたいですね。

@tarepan tarepan added 状態:設計 設計をおこなっている状態 and removed 状態:必要性議論 必要性を議論している状態 labels May 20, 2024
@sabonerune
Copy link
Contributor

sabonerune commented May 21, 2024

Uvicorn 0.29.0の動作について書いておきます。
(ソースコードを軽く読んだだけなので間違っているかもしれません)

  • Uvicorn起動時にSIGINT SIGTERM SIGBREAKにハンドラが登録される(その際に済みハンドラは保存される)
  • Ctrl+C(SIGINT)でgraceful shutdown
  • SIGTERM(Windowsの場合Ctrl+Breakも)で強制シャットダウン
  • SIGTERM(Windowsの場合Ctrl+Break)でもgraceful shutdown(追記)
  • graceful shutdown中に再度Ctrl+Cが押されると強制シャットダウンに移行する
  • シャットダウン完了後保存されたハンドラが復元される
  • Uvicornが受け取ったシグナルを再度発生させる(KeyboardInterruptの原因)
  • Uvicronが終了する

0.28.1まではUvicornはハンドラの復元とシグナルの再発生を行わなかったようです。

@Hiroshiba
Copy link
Member

知見集めて行きたいですね!


@sabonerune

0.28.1まではUvicornはハンドラの復元とシグナルの再発生を行わなかったようです。

ここ気になるんですよね、なんで再発行するようにしたのか。
プルリクエストやissueに議論が残っているかもで、僕たちの方針決定の参考になるかもとか思いました。

@sabonerune
Copy link
Contributor

@Hiroshiba
この修正PRと元になったIssueです

どうやらKeyboardInterruptCancelledErrorをUvicornが潰してしまうため他のスレッド、プロセス、非同期タスクをキャンセルできなくなるというのが理由っぽい気がします。

@Hiroshiba
Copy link
Member

Hiroshiba commented May 24, 2024

@sabonerune なるほどです!! まあ、そりゃそうか・・・!

一応同じ視点に立って考えると、エンジン利用者側は別にKeyboardInterruptを検知したいわけじゃなさそうなので、VOICEVOX ENGINEが握り潰すのは問題ない気がしますね!
CancelledErrorは潰してしまうとダメそうだけど)

とはいえ間違えて ctrl+c を押してしまったことに気づかない場合とかもあるかもですし、なんで停止したのかのログを吐いてあげるのはいいかも?

@Hiroshiba
Copy link
Member

こちらですが、「uvicornがgraceful shutdownしたら正常終了する」が丸い気がしています。
実装するには、たしかuvicornがSIGINTやSIGTERMをraiseし直すので、またそのシグナルをキャッチし、uvicornがgracefulに終わったらしいことをどうにかして取得して、正常終了するかどうか決める感じかなと。
どうにかして取得というのが可能なのかは調べられてないです 🙇 )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
機能向上 状態:設計 設計をおこなっている状態 要議論 実行する前に議論が必要そうなもの
Projects
None yet
Development

No branches or pull requests

4 participants