Skip to content

R2通信障害時の再試行・書込み成否処理と起動時待機を改善する #8

Description

@gui-ace

確認した問題

現行fork 1ac6e716384b のS3互換ストレージで、次の障害耐性の不足を確認しました。座標計算のPR #7とは別件です。

  1. 起動時にWeb資材161個を同期的に再公開する。新旧JAR比較では、158個は同一で、残る3個も版番号の差分だけだった。
  2. URLConnectionSdkHttpClient.create() のcustomizerは何も設定せず、接続/読取りタイムアウトは0。独立プロセスの模擬HTTPSで確認済み。
  3. 同じ模擬HTTPSでSocketTimeoutExceptionを発生させると、SDKはS3ExceptionではなくUncheckedIOExceptionを送出する。ストレージ側は主にS3Exceptionしか捕捉しない。
  4. JsonFileClientUpdateComponent.FileProcessorは、予期しない例外で終了するとpending解除に到達しないため、以後の更新が再スケジュールされなくなる懸念がある。タイムアウト追加だけの修正は不十分。
  5. 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へテスト書込みをしていない。

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions