# Garbage collection

Garbage Collection (GC) is the process for removing "unnecessary" blobs from a
device. It is usually performed to free up disk space so that new ephemeral
packages can be resolved or to OTA (which internally makes use of package
resolution).

## How to trigger

GC is implemented by pkg-cache, which exposes the functionality via [fuchsia.space/Manager.GC][src_gc_fidl].

It can be triggered manually by running `fx shell pkgctl gc`.

It is automatically triggered (if necessary) at various points during OTA by the
[system-updater][src_system_updater_gc].

It is automatically triggered (if necessary) by the [system-update-checker][src_system_update_checker_gc],
which is the update checker used by engineering builds.

## The algorithm

The [current algorithm][src_pkg_cache_implementation] is based on the design
proposed by the [Open Package Tracking RFC][rfc_0217].


### Definitions

* **[Base packages][src_base_packages]**
  * The "base" or "system_image" package (identified by hash in the boot
  arguments) and the packages listed (by hash) in its `data/static_packages`
  file.
  * Generally intended to be the minimal set of packages required to run a
  particular configuration.
* **[Cache packages][src_cache_packages]**
  * The packages listed (by hash) in the "base" package's
    `data/cache_packages.json` file.
  * Conceptually packages that we would like to use without networking but still want the
    option to ephemerally update.
* **[Open packages][src_root_dir_cache]**
  * Packages whose package directories are [currently being served][src_pkg_cache_open_packages]
    by pkg-cache
* **[Writing index][src_writing_index]**
  * Packages whose blobs are currently being written as part of a resolve
* **[Retained index][src_retained_index]**
  * Packages that were/will be downloaded during OTA and are used during the OTA
    process or are necessary for the next system version.
  * [Manipulated][src_retained_index_fidl] by the
    [system-updater][src_system_updater_retained] during the OTA process to meet
    the OTA storage requirements.
* **Package blobs**
  * All the blobs required by a package.
  * The meta.far and content blobs, plus the package blobs of all subpackages,
    recursively.
  * As a result of this definition, protecting a package from GC protects all of
    its subpackages. The subpackages, as packages themselves, may or may not be
    protected independently of protection provided by a superpackage.

### Implementation

1. Fail if the current boot partition has not been marked healthy, to avoid
   deleting blobs needed by the previous system in case of fallback
2. Determine the set of all resident blobs, `Br`
3. Lock the Writing and Retained indices
4. Determine the set of all protected blobs, `Bp`, which is the package blobs of
   all of the following packages:
  * Base packages
  * Cache packages
  * Open packages
  * Writing index packages
  * Retained index packages
5. Delete the blobs of the set difference `Br - Bp`
6. Unlock the Writing and Retained indices


[rfc_0217]: /docs/contribute/governance/rfcs/0217_open_package_tracking.md

[src_gc_fidl]: https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.space/space.fidl;l=18;drc=4eae0501e94a15718fea7e2410b55ef0e0fef979
[src_system_updater_gc]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/system-updater/src/update.rs;l=1254;drc=f183b2bad311eb09c2be4d72411ddfd8e8db6e63
[src_system_update_checker_gc]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/system-update-checker/src/check.rs;l=178;drc=f183b2bad311eb09c2be4d72411ddfd8e8db6e63
[src_pkg_cache_implementation]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/pkg-cache/src/gc_service.rs;l=52;drc=c33e19363ac233f6be9d8cb9df460fc0e30551ad
[src_base_packages]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/pkg-cache/src/base_packages.rs;l=36;drc=d7e51f5a7d6b09dcc24b684aa19ccda7eb6c0757
[src_cache_packages]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/lib/system-image/src/cache_packages.rs;l=16;drc=156eb8041a38d097e146c99f54fcb06aaa3c7fe6
[src_retained_index]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/pkg-cache/src/index/retained.rs;l=14;drc=e3239bddfc70bc7076a1c54f97f2408a95a4b207
[src_retained_index_fidl]: https://cs.opensource.google/fuchsia/fuchsia/+/main:sdk/fidl/fuchsia.pkg/cache.fidl;l=292;drc=905c18c5ba0899a26963cb9dc5fcf1343068c0cc
[src_writing_index]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/pkg-cache/src/index/writing.rs;l=21;drc=fe32c41fc7cec966080646c47cb1f4ff1874452f
[src_system_updater_retained]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/system-updater/src/update.rs;l=1402;drc=f183b2bad311eb09c2be4d72411ddfd8e8db6e63
[src_root_dir_cache]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/lib/package-directory/src/root_dir_cache.rs;l=45;drc=a507f17eb78a603033c068d1f7f0d4d05c28cf20
[src_pkg_cache_open_packages]: https://cs.opensource.google/fuchsia/fuchsia/+/main:src/sys/pkg/bin/pkg-cache/src/main.rs;l=187;drc=3adb26a7b1c4589755132a1fe3b918b6128bac6f
