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

追加エンジンのポートが切り替わっても接続するポートが切り替わらない #1310

Closed
1 of 3 tasks
sabonerune opened this issue May 8, 2023 · 3 comments · Fixed by #1352
Closed
1 of 3 tasks

Comments

@sabonerune
Copy link
Contributor

不具合の内容

追加エンジンのデフォルトポートが何かしらの理由で切り替わっても接続を試みるポートがデフォルトのままになっています。
これによりエンジン起動中のまま無限ロードになってしまいます。
#1308 とは異なりこの現象は初回起動時でも発生します。

現象・ログ

fetchEngineInfos(): EngineInfo[] {
const additionalEngineInfos = this.fetchAdditionalEngineInfos();
return [...this.defaultEngineInfos, ...additionalEngineInfos];
}

上記のコードが原因で
// 代替ポートを設定
engineInfo.host = `http://${engineInfoUrl.hostname}:${altPort}`;

engineInfo.hostの代入が反映されていない?
(詳細は未検証)

再現手順

追加エンジンのポートを何かしらの手段で塞いで起動する。

期待動作

実際に起動したポートに接続をして起動する。

VOICEVOXのバージョン

b49c3b5 以降

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux

その他

Windows以外確認していませんがコード的にすべての環境で起こると思います。

起動時に追加エンジンのみポートの切り替えが起こるとタイトルバーに追加エンジンのポートが表示されまるでVOICEVOXのポートが追加エンジンの代替ポートであるように表示されてしまいます。

@madosuki
Copy link
Contributor

madosuki commented May 9, 2023

試したみた感じでは確かにfetchEngineInfosの仕様に起因していると思いました。
デフォルトエンジンの方はメンバ変数として保持されているので変更が反映されますが、追加エンジンのInfoについてはfetchEngineInfosを実行する度に毎回生成し直しているので、変更が反映されないのだと思います。

@Hiroshiba
Copy link
Member

Hiroshiba commented May 9, 2023

コード眺めて色々把握しました! たぶんポートが切り替わらない点については問題点が2つほどありそうです。
1つは @madosuki さんの言う通りadditionalEngineInfosが再作成されている点、もう1つがVuex側にengineInfosが渡された後にポート変更が行われうる点です。

そもそも今ポートの流れはこうなっています。

  • 起動
    • defaultEngineInfosメンバー変数がEngineManagerコンストラクタで作成される
    • start関数
      • fetchEngineInfos
      • createWindow
        • Vuex側からメインプロセスのengineInfos(.port)をENGINE_INFOSでget
          • fetchEngineInfos(ここで別のadditionalEngineInfosが作成されてしまう)
      • runEngineAll
        • メインプロセス側のengineInfos内のport変更
  • エンジン再起動
  • (ちなみに)アプリ再起動
    • killEngineAll
    • window閉じる
    • start関数

また、エンジン再起動時は変更後のportが入ったengineInfoが参照されるので、元のポートに戻ろうとしない気がします。

この解決策は色々ありますが、個人的には↓の3つ(+1)の変更を行うのが良いのかなと思いました!

  • engineInfoには「デフォルトのポート」を持つようにする(名前もportからdefaultPortとかに変えておく)
  • altPortInfosをVuex.stateに保存可能にしてリアクティブにする(ポート変更検知のため)
  • Vuexからエンジンにリクエストするとき、engineInfo.portではなく、デフォルトポートとaltPortInfosを使ってリクエスト先のportを求めるようにする
  • オプション:メインプロセス側のengineInfoを変更不可にしておく(事故防止のため)

他の方法としてはadditionalEngineInfoをメンバ変数にしてportを破壊的に変更するなどがあるのですが、それはそれでマルチエンジン追加時にアプリを再起動させないといけなかったりの仕様変更が生じそうな気がしました。
であれば、engineInfoは不変な値ということにし、変更される可能性があるportだけ別管理するのが良いのかなと思った次第です。

@Hiroshiba
Copy link
Member

Hiroshiba commented May 19, 2023

あるいは、すべてのエンジンを起動し始める前に、すべてのエンジンでポートスキャンしてportを固定してからエンジンを起動し始める、というのもありかもです。
(こっちのほうがすっきりしそう)

  1. 全EngineInfoを作成(defaultPortは埋まっていて、portにはとりあえずdefaultPortが入る)
  2. 全エンジンで起動できそうなポートをスキャン、EngineInfo.port要素をを破壊的変更
  3. UI起動
  4. 全エンジン起動

みたいな感じとか・・・!

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

Successfully merging a pull request may close this issue.

3 participants