背景
#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 の突き合わせだけで判定できる(オブジェクトの中身は要らない)。
見積もりと注意
前提
#424(PR 進行中)が入っていること。判定に使うキーの組み立ては apps/server/src/lib/mediaCleanup.ts に集約済みなので、掃除側もそこを使う。
背景
#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 の突き合わせだけで判定できる(オブジェクトの中身は要らない)。
見積もりと注意
前提
#424(PR 進行中)が入っていること。判定に使うキーの組み立ては
apps/server/src/lib/mediaCleanup.tsに集約済みなので、掃除側もそこを使う。