操作
バグ #459
完了選曲したらゲームがフリーズした
バグ #459:
選曲したらゲームがフリーズした
説明
st2 Armageddon -Eclipse- を選曲したらフリーズした
ファイル
エージェント ちゃん さんが7日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/459 - 対応方針: フリーズは選曲後の音源ロード(
AbstractAudioDriver.setModel)が完了せず停止する症状。間欠・再現不可で単一ログからは根本原因を断定できないため、(1) ロード遅延時に全スレッドダンプ+状態をログ出力する監視ウォッチドッグを追加して次回必ず原因を捕捉できるようにしつつ、(2) wav 読み込みを共有 ForkJoinPool から専用バウンデッドプールへ移し、全体タイムアウト+中断を入れて、1件のデコードハングがアプリ全体を巻き込まないよう堅牢化する。
エージェント ちゃん さんが7日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
選曲後にロード画面で無期限フリーズする不具合への対応。原因は AbstractAudioDriver.setModel が wav 読み込みを共有 ForkJoinPool.commonPool 上の parallelStream で実行しており、1件のデコードが詰まると全体が無期限ハングする(タイムアウト・中断・診断手段なし)点。間欠・再現不可で単一ログでは根本原因を断定できないため、診断強化とハードニングの両面で対応した。
変更点¶
-
診断:
ThreadDumpFormatter(全スレッドのスタック整形出力)とMediaLoadWatchdog(ロードが閾値超で継続中ならスレッドダンプ+状態を定期ログ出力、既定しきい値15s/間隔10s/最大5回・システムプロパティで調整可)を追加し、BMSResourceに配線。次回フリーズ時に原因を確実に捕捉できるようにした。 -
ハードニング:
BoundedParallelExecutorで wav 読み込みを専用デーモンプール+全体タイムアウト+中断対応に変更。setModelはバッファのローカル参照確保で遅延書き込み汚染を防止、タイムアウト時はログを残しロード終了で無期限ハングを回避、abort()で実行中ロードを中断。正常中断は fine・真のタイムアウトのみ SEVERE。 -
Config/AudioConfigスキーマ変更なし(設定移行不要)。 - 変更ファイル:
audio/AbstractAudioDriver.java,BMSResource.java,runtime/ThreadDumpFormatter.java,runtime/MediaLoadWatchdog.java,runtime/BoundedParallelExecutor.java+テスト4件 の計9件。
テスト¶
-
.\gradlew.bat test: 成功(BUILD SUCCESSFUL)。新規9テスト全合格(failures=0 errors=0)。
関連 MR¶
- !135 (feature/459 → develop)
残課題 / 補足¶
- 本修正はハングの根本原因を断定するものではなく、再発時にスレッドダンプ付きログで原因を確定でき、かつ1件のデコード詰まりがアプリ全体を巻き込まないようにする対策。再発した場合は
media load still in progress: ...以降のログを共有いただければ原因特定が可能。
操作