forked from proxmox-mirrors/proxmox-backup
Implements the garbage collection for datastores backed by an s3 object store. Take advantage of the local datastore by placing marker files in the chunk store during phase 1 of the garbage collection, updating their atime if already present. This allows us to avoid making expensive API calls to update object metadata, which would only be possible via a copy object operation. The phase 2 is implemented by fetching a list of all the chunks via the ListObjectsV2 API call, filtered by the chunk folder prefix. This operation has to be performed in batches of 1000 objects, given by the APIs response limits. For each object key, lookup the marker file and decide based on the marker existence and it's atime if the chunk object needs to be removed. Deletion happens via the delete objects operation, allowing to delete multiple chunks by a single request. This allows to efficiently lookup chunks which are not in use anymore while being performant and cost effective. Baseline runtime performance tests: ----------------------------------- 3 garbage collection runs were performed with hot filesystem caches (by additional GC run before the test runs). The PBS instance was virtualized, the same virtualized disk using ZFS for all the local cache stores: All datastores contained the same encrypted data, with the following content statistics: Original data usage: 269.685 GiB On-Disk usage: 9.018 GiB (3.34%) On-Disk chunks: 6477 Deduplication factor: 29.90 Average chunk size: 1.426 MiB The resutlts demonstrate the overhead caused by the additional ListObjectV2 API calls and their processing, but depending on the object store backend. Average garbage collection runtime: Local datastore: (2.04 ± 0.01) s Local RADOS gateway (Squid): (3.05 ± 0.01) s AWS S3: (3.05 ± 0.01) s Cloudflare R2: (6.71 ± 0.58) s After pruning of all datastore contents (therefore including DeleteObjects requests): Local datastore: 3.04 s Local RADOS gateway (Squid): 14.08 s AWS S3: 13.06 s Cloudflare R2: 78.21 s Signed-off-by: Christian Ebner <c.ebner@proxmox.com> Reviewed-by: Hannes Laimer <h.laimer@proxmox.com> Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> |
||
|---|---|---|
| .. | ||
| examples | ||
| src | ||
| Cargo.toml | ||