1--- 2title: "Retention of Tenant Data from Blocks Storage" 3linkTitle: "Retention of Tenant Data from Blocks Storage" 4weight: 1 5slug: tenant-retention 6--- 7 8- Author: [Allenzhli](https://github.com/Allenzhli) 9- Date: January 2021 10- Status: Proposed 11 12## Retention of tenant data 13 14## Problem 15 16Metric data is growing over time per-tenant, at the same time, the value of data decreases. We want to have a retention policy like prometheus does. In Cortex, data retention is typically achieved via a bucket policy. However, this has two main issues: 17 181. Not every backend storage support bucket policies 192. Bucket policies don't easily allow a per-tenant custom retention 20 21## Background 22 23### tenants 24When using blocks storage, Cortex stores tenant’s data in object store for long-term storage of blocks, tenant id as part of the object store path. We discover all tenants via scan the root dir of bucket. 25 26### runtime config 27Using the "overrides" mechanism (part of runtime config) already allows for per-tenant settings. See [runtime-configuration-file](https://cortexmetrics.io/docs/configuration/arguments/#runtime-configuration-file) for more details. Using it for tenant retention would fit nicely. Admin could set per-tenant retention here, and also have a single global value for tenants that don't have custom value set. 28 29## Proposal 30 31### retention period field 32 33We propose to introduce just one new field `RetentionPeriod` in the Limits struct(defined at pkg/util/validation/limits.go). 34 35`RetentionPeriod` setting how long historical metric data retention period per-tenant. `0` is disable. 36 37Runtime config is reloaded periodically (defaults to 10 seconds), so we can update the retention settings on-the-fly. 38 39For each tenant, if a tenant-specific *runtime_config* value exists, it will be used directly, otherwise, if a default *limits_config* value exists, then the default value will be used; If neither exists, do nothing. 40 41### Implementation 42 43A BlocksCleaner within the Compactor run periodically (which defaults to 15 minutes) and the retention logic will insert into it. The logic should compare retention value to block `maxTime` and blocks that match `maxTime < now - retention` will be marked for delete. 44 45Blocks deletion is not immediate, but follows a two steps process. See [soft-and-hard-blocks-deletion](https://cortexmetrics.io/docs/blocks-storage/compactor/#soft-and-hard-blocks-deletion) 46