Skip to content

過去のイベント削除で残った孤児 R2 オブジェクトの掃除 #482

Description

@kojira

背景

#424 で、イベント削除時に写真・動画・表紙画像・景品画像の R2 実体を消すようにした。ただし #424 より前に削除されたイベントの実体は残ったままで、新しい経路は過去分を拾わない(削除時に D1 から列挙する方式なので、行が既に無いものは辿れない)。

同じことが、退会 purge の下書きイベント削除(#424 で塞いだ)と、途中で R2 側が失敗して孤児になった分にも当てはまる。#424 は「孤児は回復可能・参照切れは回復不能」という向きを選んでいるので、孤児を後から掃く経路が対になって初めて設計が閉じる

何をすればよいか

イベント配下の4プレフィックスを列挙し、D1 に対応する行が無いものを消す:

  • event-images/{eventId}event_image に行が無ければ孤児
  • event-photos/{eventId}/{photoId} / event-videos/{eventId}/{photoId}(+ -poster)… event_photo に行が無ければ孤児
  • prize-images/{prizeId}/{...}event_prize.image_key に一致が無ければ孤児

キーから id が読めるので、R2 の list と D1 の突き合わせだけで判定できる(オブジェクトの中身は要らない)。

見積もりと注意

  • 1回では終わらない。 R2 の list は1ページ1000件で、サブリクエスト上限(1リクエスト50)に当たる。退会 purge (退会(アカウント削除)機能 #244) と同じく、消費したサブリクエスト数を積算して打ち切り、カーソルを次回に持ち越す形になる。
  • cron 枠が無い。 Workers Free の cron は埋まっているので、リマインダー (リマインダーcronをGitHub Actionsスケジュールに変更(Workers Free の cron 5個制限) #129) や purge (退会(アカウント削除)機能 #244) と同じく GitHub Actions の定時実行から叩く口になる見込み。
  • 一度きりでよいなら、常設のジョブではなく手動スクリプト+dry-run で足りる可能性がある。まず 実際の孤児の量を数えてから、常設ジョブにするか一回限りにするかを決めたい。数え上げは削除を伴わないので安全に先行できる。
  • 誤削除が一番怖い。 アップロード直後(行を書く前)のオブジェクトを孤児と誤判定しないよう、一定時間より古いものだけを対象にする猶予が要る。

前提

#424(PR 進行中)が入っていること。判定に使うキーの組み立ては apps/server/src/lib/mediaCleanup.ts に集約済みなので、掃除側もそこを使う。

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