diff --git a/CHANGELOG.md b/CHANGELOG.md index c1804e5a0cb..e75c17b4db4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## master / unreleased +* [CHANGE] Retention period should now be a multiple of periodic table duration #1564 * [FEATURE] Add option to use jump hashing to load balance requests to memcached #1554 * [FEATURE] Add status page for HA tracker to distributors #1546 diff --git a/pkg/chunk/table_manager.go b/pkg/chunk/table_manager.go index 52b8534fdff..3f9d8b6269d 100644 --- a/pkg/chunk/table_manager.go +++ b/pkg/chunk/table_manager.go @@ -2,6 +2,7 @@ package chunk import ( "context" + "errors" "flag" "fmt" "sort" @@ -126,6 +127,15 @@ type TableManager struct { // NewTableManager makes a new TableManager func NewTableManager(cfg TableManagerConfig, schemaCfg SchemaConfig, maxChunkAge time.Duration, tableClient TableClient, objectClient BucketClient) (*TableManager, error) { + + if cfg.RetentionPeriod != 0 { + // Assume the newest config is the one to use for validation of retention + indexTablesPeriod := schemaCfg.Configs[len(schemaCfg.Configs)-1].IndexTables.Period + if indexTablesPeriod != 0 && cfg.RetentionPeriod%indexTablesPeriod != 0 { + return nil, errors.New("retention period should now be a multiple of periodic table duration") + } + } + return &TableManager{ cfg: cfg, schemaCfg: schemaCfg, diff --git a/pkg/chunk/table_manager_test.go b/pkg/chunk/table_manager_test.go index e2704669ce2..a6951d7ab8f 100644 --- a/pkg/chunk/table_manager_test.go +++ b/pkg/chunk/table_manager_test.go @@ -691,4 +691,9 @@ func TestTableManagerRetentionOnly(t *testing.T) { {Name: chunkTablePrefix + "3", ProvisionedRead: read, ProvisionedWrite: write}, }, ) + + // Test table manager retention not multiple of periodic config + tbmConfig.RetentionPeriod++ + _, err = NewTableManager(tbmConfig, cfg, maxChunkAge, client, nil) + require.Error(t, err) }