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

#1267 のリファクタリング + ポートの割り当て可能の判定を修正 #1317

Merged
merged 12 commits into from
Jun 2, 2023

Conversation

wappon28dev
Copy link
Contributor

内容

#1267 のリファクタリングとポートの割り当てが可能かどうかの判定を修正します.

具体的には以下のことを行います:

  1. メインエンジンの altPort をタイトルバーに表示する
    現状, デフォルトエンジンに関係なく, 0 番目のエンジンの代替ポートを表示しているのでそれを改善する.
    → ref: #1310: その他

  2. PortManager を整理 (余計なインスタンスを生成しないようにする)
    → ref: #1267: コメント

  3. getProcessIdFromPort の整理 (os での分岐, stdout の命名をどうにかする)
    → ref: #1267: コメント

  4. ポートの割り当てが可能かどうかの判定を修正 (windows)
    エディターを落としたあとすぐに起動すると, TCP の状態が TIME_WAIT になっているので, 他のプロセスが使用していて割り当て不可と判定してしまうのを修正します.
    ref: 実際にポートが使用されていなくてもTIME_WAIT状態のポートを使用中と判定してしまう #1307

関連 Issue

ref: #1267, #1310
fix: #1307

スクリーンショット・動画など

なし

その他

あまりにも diff が大きい場合, メンテナーさんが大変になってしまうので, もしそうなったら分割したいと思います!
(いじるファイル数は少ないはず…!)

- トースト通知のタイミングも調整した
- ウィンドウタイトルの値もwatchした
@wappon28dev wappon28dev marked this pull request as ready for review May 18, 2023 17:44
@wappon28dev wappon28dev requested a review from a team as a code owner May 18, 2023 17:44
@wappon28dev wappon28dev requested review from Hiroshiba and removed request for a team May 18, 2023 17:44
@wappon28dev wappon28dev changed the title WIP: #1267 のリファクタリング + ポートの割り当て可能の判定を修正 #1267 のリファクタリング + ポートの割り当て可能の判定を修正 May 18, 2023
@wappon28dev
Copy link
Contributor Author

レビューの準備ができました! なにか気になる箇所があればお教えください…!

Copy link
Member

@sevenc-nanashi sevenc-nanashi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

とりあえずレビューしてみました。(携帯からなのでまだ動かせてません)学校終わったら動かしてみます。

src/background/portManager.ts Outdated Show resolved Hide resolved
src/views/EditorHome.vue Show resolved Hide resolved
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

リファクタリングありがとうございます!!!
PortManagerが分解されてかなり読みやすくなっているように感じました!!


コード範囲外なのでこちらに1つコメントです。

2箇所にawait store.dispatch("GET_ALT_PORT_INFOS");がありますが、どちらもエンジン再起動時に通らなそうです。(アプリ起動時には2回通りますが)

代わりにPOST_ENGINE_STARTの一番最初に実行すれば大丈夫だと思います!

POST_ENGINE_START: {
async action({ state, dispatch }, { engineIds }) {

ちなみにこれは初回エンジン起動とエンジン再起動の処理を共通化するために作った関数です。

あとは実行順序の問題(UI起動しちゃってからrunEngineしちゃう)がありますが、これはここの2行を逆にすると問題が軽くなる・・・はずです・・・!
全EngineInfoと全AltInfoPortsが揃ってからUIを起動することになるはず。
追加エンジンのInfoが2回作られる問題は解決しませんが)

@sevenc-nanashi @sabonerune
↑の2行の逆転、問題ないはずなのですが、なにか問題ありそうか思い当たるところあったりされませんか・・・ 😇

src/background/portManager.ts Outdated Show resolved Hide resolved
src/background/portManager.ts Outdated Show resolved Hide resolved
src/background/portManager.ts Outdated Show resolved Hide resolved
src/background/portManager.ts Outdated Show resolved Hide resolved
src/store/engine.ts Outdated Show resolved Hide resolved
src/store/engine.ts Outdated Show resolved Hide resolved
src/components/MenuBar.vue Outdated Show resolved Hide resolved
src/components/MenuBar.vue Outdated Show resolved Hide resolved
@sabonerune
Copy link
Contributor

sabonerune commented May 20, 2023

↑の2行の逆転、問題ないはずなのですが、なにか問題ありそうか思い当たるところあったりされませんか・・・ 😇

多分エディタの表示が遅くなる以外の問題はないと思います。

気づいたのですがrunEngineAllはasync functionですが内部の処理に一切の非同期処理が存在しないため全てのエンジンの起動が終わるまでメインプロセスはブロックされます。
その結果GET_ENGINE_INFOS内のEngineInfoの取得はエンジンの起動が終わるまでブロックされるのでどんなにエンジンの起動が遅くても現状のままでも偶然エンジンの起動が終わってから取得できるみたいです。

@Hiroshiba
Copy link
Member

Hiroshiba commented May 20, 2023

@sabonerune エディタの表示が遅くなるのはその通りなので、影響を見てみたいですねぇ。。デフォルトエンジン1つしかない場合でも最悪1秒くらい変わる可能性ありそう。ま、まあ最初二音声合成できるまでの待機時間は変わらないはず。

後半に関して、おっとなるほどという感じです!
よくある言語仕様だと、await中に何かしらの処理(GET_ENGINE_INFOSのipc通信とか)が来るとそちらが先に処理される気がします。(runEngineAll内で10秒くらいsleepするとわかりそう)
じゃあなんでEngineInfoが取得できるのかというと、EngineInfoはrunEngineAllが実行される前から作成されているからだと思います!
そもそもrunEngineAllを呼ばなくてもちゃんと取得できるはず。

@wappon28dev
Copy link
Contributor Author

wappon28dev commented May 20, 2023

2行の逆転のところ以外は, レビューを反映しました! (逆転させて良いのかな…?)
また何か気になることがあればお教えください!

src/views/EditorHome.vue Outdated Show resolved Hide resolved
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2行の逆転のところ以外は, レビューを反映しました! (逆転させて良いのかな…?)
また何か気になることがあればお教えください!

厳密には逆転させないとダメなはず・・・!
たぶんですが、今のままだとrunEngineAll関数の最初に10秒sleepしたりすると(エンジン起動に時間がかかった場合を想定)ポート変更が取得できない・・・はず!

- !isVuexReady を上に
- 2行のとこ反転
@Hiroshiba
Copy link
Member

Hiroshiba commented May 26, 2023

LGTMと書く前に念のためチェックしてみたのですが、自分の環境だと設定→エンジンモードを切り替えるとポートが変更されました・・・。
そもそもここはエンジンが自動再起動するのですが、どうやら一瞬だけWAIT_CLOSEになっているようでした。
(restart関数の中でkillしたあと10msec待ってエンジン起動開始させたらポート変更されませんでした。)

メニューボタンからのエンジン再起動はポート変更なしで実行できました。
コード読んだ感じ再起動処理はほぼ一緒なので、なぜこの違いが出るのかは全く分かりません・・・。

ど、どうしましょう。。律儀にやる場合はWAIT_CLOSEだった場合はリトライとかが考えられそうですが。。。
(結構差分がすでに大きいので、一旦この挙動はissueにして、こちらのプルリクエストはマージできると嬉しいかもです!)

@wappon28dev
Copy link
Contributor Author

wappon28dev commented May 27, 2023

Re: #1317 (comment)

なるほど… エンジンモードの切り替えにもエンジンの再起動があるのか…
気づかなかったです. モード切り替えのときのみ, 一瞬 CLOSE_WAIT になるんですね.
確かに, CLOSE_WAIT のときは, 少しタイムアウトを待ってみても良いかもしれないですね. (ref: 下図)

1

具体的なリトライ時間は, 後に議論しましょう! Issue 作っておきます.

マージについては, こちらの準備はOKです!

Footnotes

  1. 信頼性のある通信を実現するTCPプロトコル - @​IT より

@Hiroshiba
Copy link
Member

モード切り替えのときのみ, 一瞬 CLOSE_WAIT になるんですね

理由がほんとに謎で、コード読んだ感じ差としてはawaitがあるかどうかくらいに見えるんですが、それで違いが出るとは思えず…

図もありがとうございます、とても勉強になります!!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ほぼLGTMなのですが1つ問題ありそうだったのでコメントしました!

src/background/portManager.ts Outdated Show resolved Hide resolved
- basePortを定義したのに全然使われてなかったので使った
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!!!!!

ほんとに他分野に渡る知識が必要で難しいリファクタリングだと思います、取り組んでくださって本当にありがとうございます!!

@sevenc-nanashi さん、 @sabonerune さん、もし気になるところあればコメントいただけると心強いです・・・!!

- ここまで来たらURLを引数に渡しても良いかもと思った
@sabonerune
Copy link
Contributor

sabonerune commented May 31, 2023

気になった点というと一度ポートの変更が起こるとエンジンを再起動する度にその再起動でポートが切り替わらなくても通知が出ることですね。
エンジンが再起動する度にデフォルトのポートに戻る挙動にするならこれでもいいような気がしますが維持されるのなら通知が過剰のような気がします。
ただ、エンジンの再起動はそこまで頻繁にすることではないからそこまで気にすることででもない?

もう一つ気になったことというより今更気づいたことなのですがWindowsで時々発生する[Errno 13] error while attempting to bind on address ('127.0.0.1', 50021): アクセス許可で禁じられた方法でソケットにアクセスしようとしました。に対処できない点です。
これはnetstatにも出てこない上にエディタから見るとエンジンは起動自体はするが強制終了してしまうという挙動になるので結構面倒そうですね…

wappon28dev and others added 2 commits June 2, 2023 00:41
Co-authored-by: sabonerune <102559104+sabonerune@users.noreply.github.com>
@Hiroshiba
Copy link
Member

@sabonerune ポートが使えない系にも対処するの、issue建ててみました!

@Hiroshiba
Copy link
Member

ポートやTCP周りの知識に詳しくなれました!!!
リファクタリング本当にありがとうございます!!
PRレビューもありがとうございます!!!

多分大丈夫だと思うのでマージします!

@Hiroshiba Hiroshiba merged commit ccf3ff0 into VOICEVOX:main Jun 2, 2023
@Hiroshiba
Copy link
Member

自動クローズされなかったのでテスト

fix: #1307

@Hiroshiba
Copy link
Member

fix #1307

@Hiroshiba
Copy link
Member

間違えていました。。

fix #1317

@Hiroshiba
Copy link
Member

。。。。

fix #1326

@Hiroshiba
Copy link
Member

・・・よくわかりませんでした!!!

@wappon28dev wappon28dev deleted the refactor/pr-1267 branch June 4, 2023 05:40
@wappon28dev
Copy link
Contributor Author

マージありがとうございました!!! 私もポート周りに詳しくなれて嬉しいです.
またご機会あれば contribute したいと思います. よろしくお願いします!


そこまで重要ではないですが, おそらくお読み飛ばされている conversion: #1317 (comment)

@sevenc-nanashi
Copy link
Member

自動クローズされなかったのでテスト

fix: #1307

自動クローズはPRの最初のメッセージに書かないといけないはず?
後から設定するなら右の方のDevelopmentですね

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
4 participants