Skip to content

音声合成失敗時のキャッシュ汚染を修正#42

Merged
MORIMORI0317 merged 3 commits into
TeamFelNull:developfrom
yuu1111:fix/tts-cache-failure-poisoning
Jun 6, 2026
Merged

音声合成失敗時のキャッシュ汚染を修正#42
MORIMORI0317 merged 3 commits into
TeamFelNull:developfrom
yuu1111:fix/tts-cache-failure-poisoning

Conversation

@yuu1111

@yuu1111 yuu1111 commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

音声合成に失敗したテキストが、Bot再起動まで永久に無音になる問題(キャッシュ汚染)を修正する。updateQueue() が該当メッセージをスキップするためBot全体は停止しないが、繰り返し使う定型句が一度のタイムアウト等で無言化していた。

失敗時のキャッシュ汚染修正

  • 失敗Futureの居残り解消: 例外完了した CompletableFuturelocalCaches に残り続け、同一 (エンジン+テキスト+話者) ハッシュが永久失敗していた問題を修正。whenComplete で例外時に条件付き remove し再合成を可能にする
  • 空音声のキャッシュ防止: 合成結果が空 (0バイト) の場合はキャッシュせず例外として扱う
  • useLockの解放漏れ修正: ロード失敗時に CachedVoiceTrackLoader.dispose() を呼び useLock を解放。これがないと useLockCount が減らず、空キャッシュがタイムアウト破棄もされず残っていた
  • グローバルキャッシュのロック確実化: lock/unlock を try/finally で囲み、途中例外時のロックリークを防ぐ (将来のRedis実装向け)
  • LocalCache.dispose の逆ロジック修正: 削除"成功"時に例外を投げていた条件を、削除"失敗"時のみに修正
  • 例外の握りつぶし解消: キャッシュ破棄時の例外を exceptionally でログ出力

破棄と再生成の競合修正 (追加)

  • キャッシュファイルの世代衝突修正: 決定論的だったローカルキャッシュファイルパス (<hash>) を世代番号付き (<hash>-<世代>) に変更。TTL破棄中の dispose()delete が、同一キーで再生成された新世代のファイルを削除してしまう競合を防ぐ
  • グローバルキャッシュ ヒット経路の空データ検証: 既存の空検証は新規合成パスのみだったため、gca.get が既存の空エントリ (旧バージョンや別インスタンスが残した0バイト) を返すヒット経路でも Files.write 直前に検証を追加
  • テスト容易化: ファイルパス構築を副作用のない static メソッド localCacheFile へ切り出し、キャッシュフォルダ削除を伴わずに命名規則を検証可能にする

テスト

  • CacheManagerTest を追加。世代番号が異なれば一意なパスを返すこと、ファイル名がキーのハッシュを接頭辞に持つことを検証

yuu1111 added 3 commits June 2, 2026 09:31
合成に失敗したテキストが再起動まで無音になる問題を修正する。

- 例外完了したFutureをlocalCachesから除去し再合成を可能にする
- 空音声をキャッシュせず例外として扱う
- ロード失敗時にuseLockを解放しタイムアウト破棄を機能させる
- グローバルキャッシュのlock/unlockをtry/finallyで確実化
- LocalCache.disposeの削除判定の逆ロジックを修正
- キャッシュ破棄時の例外を握りつぶさずログ出力する
振る舞いは変えずに内部構造を整理する。

- createLocalCacheをcreateViaGlobalCache/createViaLocalSourceに分割
- 空音声チェックをEMPTY_AUDIO_MESSAGE定数とvalidateNonEmptyに集約
- CachedVoiceTrackLoaderのloadTackをloadTrackに改名
決定論的だったローカルキャッシュファイルパスを世代番号付きにし、disposeのdeleteが新世代のファイルを削除する競合を防止。あわせてグローバルキャッシュのヒット経路でも空データ検証を行うよう修正し、パス構築をstaticメソッドへ切り出して副作用なしでテスト可能にした。
@MORIMORI0317 MORIMORI0317 merged commit f2541cf into TeamFelNull:develop Jun 6, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants