✓=レビュー済 ○=未レビュー ⚠=Suspect(複数同時表示あり。IDクリックで詳細へ)
| グループ | REQ | ARCH | SPEC | TST | IMPL |
|---|---|---|---|---|---|
| MAINT | REQ010 ✓ 期限切れキャッシュの削除、孤立Blobファイルのガベージコレクション、時間ベースの一括削除(prune)等のメンテナンス操作ができること。 | ARCH010 ✓ ## コンポーネント構成 ```mermaid graph TD A[MaintenanceService] -->|操作集約| B[TaskDBBase... | SPEC020 ✓ ## インターフェース ```python class MaintenanceService: def clean_garbage(self, gra... | TST020 ✓ ## 目的 `MaintenanceService` は CLI やダッシュボードからのシステム管理操作を仲介するサービス層である。タスク詳細の表示ミスは運用... | IMPL020 ✓ ## 実装概要 `MaintenanceService` クラスがDBとBlobストレージ間の整合性チェック、 期限切れキャッシュの削除、孤立ファイルの検出と... |
| リンク方向 | カバー数 | カバー率 | 未カバー |
|---|---|---|---|
| ARCH → REQ | 1 / 1 | 100.0% | — |
| SPEC → ARCH | 1 / 1 | 100.0% | — |
| TST → SPEC | 1 / 1 | 100.0% | — |
| IMPL → SPEC | 1 / 1 | 100.0% | — |
期限切れキャッシュの削除、孤立Blobファイルのガベージコレクション、時間ベースの一括削除(prune)等のメンテナンス操作ができること。
親: —
子: ARCH010
graph TD
A[MaintenanceService] -->|操作集約| B[TaskDBBase]
A -->|操作集約| C[BlobStorageBase]
A -->|自動実行| D[Probabilistic Eviction]
| コンポーネント | 責務 | インターフェース |
|---|---|---|
| MaintenanceService | DBとストレージを跨ぐクリーンアップ操作のファサード | clean_garbage(), prune() |
| TaskDBBase | 参照カウントや期限切れレコードの提供 | get_blob_refs(), delete_expired() |
| BlobStorageBase | 物理ファイルの列挙と削除 | list_keys(), delete() |
sequenceDiagram
participant Service as MaintenanceService
participant DB as TaskDB
participant Storage as BlobStorage
Service->>DB: get_blob_refs()
DB-->>Service: 有効な参照リスト (Whitelist)
Service->>Storage: list_keys()
Storage-->>Service: 全ファイルリスト
Service->>Service: 差分抽出 (孤立ファイルの特定)
Service->>Storage: delete(orphan_keys)
Note over Service: 猶予期間 (grace_period) を考慮して削除
| 技術領域 | 選定 | 理由 |
|---|---|---|
| 削除ポリシー | ホワイトリスト方式 | DBに記録がないBlobを削除対象とすることで、データの整合性を担保 |
| 競合防止 | 更新時刻確認 (mtime) | 保存中のファイルを誤って消さないよう、一定時間経過した孤立のみ削除 |
| 実行頻度 | 確率的オートエビクション | 書き込み時に低確率でGCをキックし、手動メンテなしでの健康度を維持 |
親: REQ010
子: SPEC020
class MaintenanceService:
def clean_garbage(self, grace_period: int = 3600) -> GarbageStats: ...
def prune(self, days: int, func_name: str | None = None) -> int: ...
def clear(self, func_name: str | None = None) -> int: ...
clean_garbage)delete_expired() でDBから古いタスクを除去blob_key とストレージ内の全ファイルを比較grace_period 以上経過したものを削除| パラメータ | デフォルト | 説明 |
|---|---|---|
grace_period |
3600 |
孤立Blobを削除するまでの猶予期間(秒)。並行実行中の保存を保護する |
days |
なし | prune で削除対象とする経過日数 |
clear(func_name) は前方一致ではなく、完全一致(または glob)で判定する。親: ARCH010
MaintenanceService は CLI やダッシュボードからのシステム管理操作を仲介するサービス層である。タスク詳細の表示ミスは運用者の誤判断を招き、メンテナンス操作の不備はデータの意図しない削除に繋がる。
None が返却され、例外が送出されないこと親: SPEC020
子: —
MaintenanceService クラスがDBとBlobストレージ間の整合性チェック、
期限切れキャッシュの削除、孤立ファイルの検出といったガベージコレクション(GC)を担当。
主にCLIの beautyspot gc コマンドから呼び出される。
対象となる DB (TaskDBMaintenable) とストレージ (BlobStorageMaintenable) を受け取り、
複数のフェーズに分けてクリーンアップを実行する。
clean_garbage() は以下の順序で安全にGCを実行する:
1. 期限切れDBレコードの削除
2. Blobストレージの一時ファイル(.spot_tmp)のクリーンアップ
3. 孤立したBlobファイル(DBに存在しないファイル)の特定
4. 孤立ファイルの削除
5. 空ディレクトリの剪定
実行中のタスクがBlobを書き込んだ直後で、まだDBにメタデータが保存されていない
タイミングでGCが走ると、必要なファイルが孤立と誤認されるリスクがある。
これを防ぐため、orphan_grace_seconds(デフォルト60秒)より新しいファイルは
孤立判定から除外する設計とした。
scan_garbage() は、ストレージの全キーを列挙し、
DBの get_blob_keys() との差分を取ることで行うscan_orphan_projects() も提供されるreferences: src/beautyspot/maintenance.py
親: SPEC020
子: —