垃圾收集 (GC) 是指從裝置移除「不必要」的 Blob。通常是為了釋出磁碟空間,以便解析新的暫時性套件,或是為了 OTA (內部會使用套件解析)。
如何觸發
GC 由 pkg-cache 實作,透過 fuchsia.pkg.garbagecollector/Manager.GC 公開功能。
執行 fx shell pkgctl gc 即可手動觸發。
在 OTA 期間,系統更新程式會在各個時間點自動觸發這項作業 (如有必要)。
system-update-checker 會在必要時自動觸發這項作業,這是工程建構版本使用的更新檢查工具。
演算法
目前的演算法是以開放式包裹追蹤 RFC 提案的設計為基礎。
定義
- 基本套裝組合
- 「base」或「system_image」套件 (由啟動引數中的雜湊值識別),以及
data/static_packages檔案中列出的套件 (由雜湊值識別)。 - 通常是指執行特定設定所需的最低套件組合。
- 「base」或「system_image」套件 (由啟動引數中的雜湊值識別),以及
- 快取套件
- 「base」套件
data/cache_packages.json檔案中列出的套件 (依雜湊)。 - 從概念上來說,我們希望使用的套件不需要網路,但仍希望能夠暫時更新。
- 「base」套件
- 開啟套裝組合
- 撰寫索引
- 目前正在寫入 Blob 的套件 (屬於解析程序的一部分)
- 保留索引
- 套件 Blob
- 套件所需的所有 Blob。
- meta.far 和內容 Blob,以及所有子套件的套件 Blob (以遞迴方式)。
- 根據這項定義,保護套件免於遭到垃圾收集,也會保護其所有子套件。子套件本身可能受到保護,也可能不受超級套件提供的保護措施保護。
實作
- 如果目前的開機磁碟分割區未標示為正常,則會失敗,以免刪除先前系統需要的 Blob,以防回溯
- 判斷所有常駐 Blob 的集合
Br - 鎖定「寫入」和「保留」索引
- 找出所有受保護的 Blob 集合
Bp,也就是下列所有套件的套件 Blob:- 基本套裝方案
- 快取套件
- 開啟套件
- 編寫索引套件
- 保留的索引套件
- 刪除集合差異的 Blob
Br - Bp - 解鎖「寫入」和「保留」索引