From a32a6c89fe5b94d6a8f45bd1316b0e19b23749e1 Mon Sep 17 00:00:00 2001 From: Zach Leslie Date: Fri, 3 May 2024 17:32:41 +0000 Subject: [PATCH] Require empty tenant deletion to be enabled in the config --- integration/poller/poller_test.go | 18 ++++++++++++++++++ tempodb/blocklist/poller.go | 20 +++++++++++++------- tempodb/config.go | 3 ++- tempodb/tempodb.go | 15 ++++++++------- 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/integration/poller/poller_test.go b/integration/poller/poller_test.go index 5b689bfec4b..35c6ebe15d7 100644 --- a/integration/poller/poller_test.go +++ b/integration/poller/poller_test.go @@ -324,6 +324,7 @@ func TestTenantDeletion(t *testing.T) { r := backend.NewReader(rr) w := backend.NewWriter(ww) + // Tenant deletion is not enabled by default blocklistPoller := blocklist.NewPoller(&blocklist.PollerConfig{ PollConcurrency: 3, TenantIndexBuilders: 1, @@ -352,6 +353,23 @@ func TestTenantDeletion(t *testing.T) { _, _, err = blocklistPoller.Do(l) require.NoError(t, err) + tennants, err = r.Tenants(ctx) + t.Logf("tennants: %v", tennants) + require.NoError(t, err) + require.Equal(t, 1, len(tennants)) + + // Create a new poller with tenantion deletion enabled + blocklistPoller = blocklist.NewPoller(&blocklist.PollerConfig{ + PollConcurrency: 3, + TenantIndexBuilders: 1, + EmptyTenantDeletionAge: 100 * time.Millisecond, + EmptyTenantDeletionEnabled: true, + }, OwnsEverythingSharder, r, cc, w, logger) + + // Again + _, _, err = blocklistPoller.Do(l) + require.NoError(t, err) + tennants, err = r.Tenants(ctx) t.Logf("tennants: %v", tennants) require.NoError(t, err) diff --git a/tempodb/blocklist/poller.go b/tempodb/blocklist/poller.go index ec7d4e26f62..90a1f9d9a59 100644 --- a/tempodb/blocklist/poller.go +++ b/tempodb/blocklist/poller.go @@ -75,13 +75,14 @@ var ( // Config is used to configure the poller type PollerConfig struct { - PollConcurrency uint - PollFallback bool - TenantIndexBuilders int - StaleTenantIndex time.Duration - PollJitterMs int - TolerateConsecutiveErrors int - EmptyTenantDeletionAge time.Duration + PollConcurrency uint + PollFallback bool + TenantIndexBuilders int + StaleTenantIndex time.Duration + PollJitterMs int + TolerateConsecutiveErrors int + EmptyTenantDeletionAge time.Duration + EmptyTenantDeletionEnabled bool } // JobSharder is used to determine if a particular job is owned by this process @@ -468,6 +469,11 @@ func (p *Poller) tenantIndexPollError(idx *backend.TenantIndex, err error) error // deleteTenant will delete all of a tenant's objects if there is not a tenant index present. func (p *Poller) deleteTenant(ctx context.Context, tenantID string) error { + // If we have not enabled empty tenant deletion, do nothing. + if !p.cfg.EmptyTenantDeletionEnabled { + return nil + } + level.Info(p.logger).Log("msg", "deleting tenant", "tenant", tenantID) if p.cfg.EmptyTenantDeletionAge == 0 { diff --git a/tempodb/config.go b/tempodb/config.go index 4e4671e812f..ce1578ec57d 100644 --- a/tempodb/config.go +++ b/tempodb/config.go @@ -53,7 +53,8 @@ type Config struct { BlocklistPollJitterMs int `yaml:"blocklist_poll_jitter_ms"` BlocklistPollTolerateConsecutiveErrors int `yaml:"blocklist_poll_tolerate_consecutive_errors"` - EmptyTenantDeletionAge time.Duration `yaml:"empty_tenant_deletion_age"` + EmptyTenantDeletionEnabled bool `yaml:"empty_tenant_deletion_enabled"` + EmptyTenantDeletionAge time.Duration `yaml:"empty_tenant_deletion_age"` // backends Backend string `yaml:"backend"` diff --git a/tempodb/tempodb.go b/tempodb/tempodb.go index 0dbd6ed9910..4dbfbb39460 100644 --- a/tempodb/tempodb.go +++ b/tempodb/tempodb.go @@ -509,13 +509,14 @@ func (rw *readerWriter) EnablePolling(ctx context.Context, sharder blocklist.Job level.Info(rw.logger).Log("msg", "polling enabled", "interval", rw.cfg.BlocklistPoll, "blocklist_concurrency", rw.cfg.BlocklistPollConcurrency) blocklistPoller := blocklist.NewPoller(&blocklist.PollerConfig{ - PollConcurrency: rw.cfg.BlocklistPollConcurrency, - PollFallback: rw.cfg.BlocklistPollFallback, - TenantIndexBuilders: rw.cfg.BlocklistPollTenantIndexBuilders, - StaleTenantIndex: rw.cfg.BlocklistPollStaleTenantIndex, - PollJitterMs: rw.cfg.BlocklistPollJitterMs, - TolerateConsecutiveErrors: rw.cfg.BlocklistPollTolerateConsecutiveErrors, - EmptyTenantDeletionAge: rw.cfg.EmptyTenantDeletionAge, + PollConcurrency: rw.cfg.BlocklistPollConcurrency, + PollFallback: rw.cfg.BlocklistPollFallback, + TenantIndexBuilders: rw.cfg.BlocklistPollTenantIndexBuilders, + StaleTenantIndex: rw.cfg.BlocklistPollStaleTenantIndex, + PollJitterMs: rw.cfg.BlocklistPollJitterMs, + TolerateConsecutiveErrors: rw.cfg.BlocklistPollTolerateConsecutiveErrors, + EmptyTenantDeletionAge: rw.cfg.EmptyTenantDeletionAge, + EmptyTenantDeletionEnabled: rw.cfg.EmptyTenantDeletionEnabled, }, sharder, rw.r, rw.c, rw.w, rw.logger) rw.blocklistPoller = blocklistPoller