確認した問題
現行fork 1ac6e716384b のS3互換ストレージで、次の障害耐性の不足を確認しました。座標計算のPR #7とは別件です。
- 起動時にWeb資材161個を同期的に再公開する。新旧JAR比較では、158個は同一で、残る3個も版番号の差分だけだった。
URLConnectionSdkHttpClient.create() のcustomizerは何も設定せず、接続/読取りタイムアウトは0。独立プロセスの模擬HTTPSで確認済み。
- 同じ模擬HTTPSでSocketTimeoutExceptionを発生させると、SDKはS3ExceptionではなくUncheckedIOExceptionを送出する。ストレージ側は主にS3Exceptionしか捕捉しない。
- JsonFileClientUpdateComponent.FileProcessorは、予期しない例外で終了するとpending解除に到達しないため、以後の更新が再スケジュールされなくなる懸念がある。タイムアウト追加だけの修正は不十分。
- IsoHDPerspectiveの通常/昼タイルおよびDynmapWorld.processZoomFileがMapStorageTile.writeの戻り値を確認せず、失敗時も更新通知・次段ズーム処理へ進む。描画完了件数だけではR2上の完備性を保証できない。
運用中にS3の内部エラー応答が通常JSONとズーム画像に発生し、ある更新JSONだけが10分以上古い状態になった。対象JSONは162バイトで、大きな画像だけの問題ではない。ゲームTPS低下は観測していない。プロバイダー内部エラーの根本原因は未確定。
対応方針 / 受け入れ条件
- S3通信に接続/読取りの上限を設定する。ただし全操作の厳密な総所要時間上限とは区別する。
- UncheckedIOExceptionを含む通信例外でJSON更新ワーカーが永久停止しないことをテストする。
- 書込み成功前に成功扱いの通知や次段ズームへ進めない。失敗対象を失わず、上限・バックオフ付きで再試行し、無限ループや過剰リクエストを避ける。
- 再試行で古いJSONが新しい状態を上書きしない。最新状態へ集約する既存方針を維持する。
- 起動時Web資材は安全な差分公開を検討する。成功確認前のキャッシュ確定は禁止。資材欠落の復旧、版番号一致、初回全公開を保証する。
- 読取りキャッシュの長期化、TLS検証の緩和、ゲーム全体のJVM通信設定変更で回避しない。
- 模擬S3で遅延、読取りタイムアウト、接続失敗、内部エラー、復帰、同一キーの新旧更新を検証する。
- 標準Spigot/MC26をビルド・検証し、隔離検証後に限定的な本番反映へ進む。現時点で追加JARの本番反映は行っていない。
- 既に失敗したズーム画像の回復手順も含める。無条件の全域再生成や既存タイル削除はしない。
検証範囲
本番用JARを使った独立プロセス検証であり、稼働Minecraftへのデバッガ接続は使っていない。通信失敗の模擬には偽HttpsURLConnectionを使い、R2へテスト書込みをしていない。
確認した問題
現行fork
1ac6e716384bのS3互換ストレージで、次の障害耐性の不足を確認しました。座標計算のPR #7とは別件です。URLConnectionSdkHttpClient.create()のcustomizerは何も設定せず、接続/読取りタイムアウトは0。独立プロセスの模擬HTTPSで確認済み。運用中にS3の内部エラー応答が通常JSONとズーム画像に発生し、ある更新JSONだけが10分以上古い状態になった。対象JSONは162バイトで、大きな画像だけの問題ではない。ゲームTPS低下は観測していない。プロバイダー内部エラーの根本原因は未確定。
対応方針 / 受け入れ条件
検証範囲
本番用JARを使った独立プロセス検証であり、稼働Minecraftへのデバッガ接続は使っていない。通信失敗の模擬には偽HttpsURLConnectionを使い、R2へテスト書込みをしていない。