diff --git a/CHANGELOG.md b/CHANGELOG.md index e15632421fb..e2ac5d598e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ * [FEATURE] Added the flag `-alertmanager.api-concurrency` to configure alert manager api concurrency limit. #5412 * [FEATURE] Store Gateway: Add `-store-gateway.sharding-ring.keep-instance-in-the-ring-on-shutdown` to skip unregistering instance from the ring in shutdown. #5421 * [FEATURE] Ruler: Support for filtering rules in the API. #5417 +* [FEATURE] Compactor: Add `-compactor.ring.tokens-file-path` to store generated tokens locally. #5432 * [ENHANCEMENT] Distributor/Ingester: Add span on push path #5319 * [ENHANCEMENT] Support object storage backends for runtime configuration file. #5292 * [ENHANCEMENT] Query Frontend: Reject subquery with too small step size. #5323 diff --git a/docs/blocks-storage/compactor.md b/docs/blocks-storage/compactor.md index cdc1c02faf1..5d0bb5b4cf2 100644 --- a/docs/blocks-storage/compactor.md +++ b/docs/blocks-storage/compactor.md @@ -268,6 +268,11 @@ compactor: # CLI flag: -compactor.ring.instance-interface-names [instance_interface_names: | default = [eth0 en0]] + # File path where tokens are stored. If empty, tokens are not stored at + # shutdown and restored at startup. + # CLI flag: -compactor.ring.tokens-file-path + [tokens_file_path: | default = ""] + # Timeout for waiting on compactor to become ACTIVE in the ring. # CLI flag: -compactor.ring.wait-active-instance-timeout [wait_active_instance_timeout: | default = 10m] diff --git a/docs/configuration/config-file-reference.md b/docs/configuration/config-file-reference.md index b2ea9f086c1..c4b9eee50ba 100644 --- a/docs/configuration/config-file-reference.md +++ b/docs/configuration/config-file-reference.md @@ -1942,6 +1942,11 @@ sharding_ring: # CLI flag: -compactor.ring.instance-interface-names [instance_interface_names: | default = [eth0 en0]] + # File path where tokens are stored. If empty, tokens are not stored at + # shutdown and restored at startup. + # CLI flag: -compactor.ring.tokens-file-path + [tokens_file_path: | default = ""] + # Timeout for waiting on compactor to become ACTIVE in the ring. # CLI flag: -compactor.ring.wait-active-instance-timeout [wait_active_instance_timeout: | default = 10m] diff --git a/pkg/compactor/compactor_ring.go b/pkg/compactor/compactor_ring.go index c6ba61b29fa..10077408dd0 100644 --- a/pkg/compactor/compactor_ring.go +++ b/pkg/compactor/compactor_ring.go @@ -31,6 +31,7 @@ type RingConfig struct { InstanceInterfaceNames []string `yaml:"instance_interface_names"` InstancePort int `yaml:"instance_port" doc:"hidden"` InstanceAddr string `yaml:"instance_addr" doc:"hidden"` + TokensFilePath string `yaml:"tokens_file_path"` // Injected internally ListenPort int `yaml:"-"` @@ -63,6 +64,7 @@ func (cfg *RingConfig) RegisterFlags(f *flag.FlagSet) { f.StringVar(&cfg.InstanceAddr, "compactor.ring.instance-addr", "", "IP address to advertise in the ring.") f.IntVar(&cfg.InstancePort, "compactor.ring.instance-port", 0, "Port to advertise in the ring (defaults to server.grpc-listen-port).") f.StringVar(&cfg.InstanceID, "compactor.ring.instance-id", hostname, "Instance ID to register in the ring.") + f.StringVar(&cfg.TokensFilePath, "compactor.ring.tokens-file-path", "", "File path where tokens are stored. If empty, tokens are not stored at shutdown and restored at startup.") // Timeout durations f.DurationVar(&cfg.WaitActiveInstanceTimeout, "compactor.ring.wait-active-instance-timeout", 10*time.Minute, "Timeout for waiting on compactor to become ACTIVE in the ring.") @@ -98,6 +100,7 @@ func (cfg *RingConfig) ToLifecyclerConfig() ring.LifecyclerConfig { lc.JoinAfter = 0 lc.MinReadyDuration = 0 lc.FinalSleep = 0 + lc.TokensFilePath = cfg.TokensFilePath // We use a safe default instead of exposing to config option to the user // in order to simplify the config. diff --git a/pkg/compactor/compactor_ring_test.go b/pkg/compactor/compactor_ring_test.go index 0519367c04a..25e99316144 100644 --- a/pkg/compactor/compactor_ring_test.go +++ b/pkg/compactor/compactor_ring_test.go @@ -41,6 +41,7 @@ func TestRingConfig_CustomConfigToLifecyclerConfig(t *testing.T) { cfg.InstancePort = 10 cfg.InstanceAddr = "1.2.3.4" cfg.ListenPort = 10 + cfg.TokensFilePath = "testFilePath" // The lifecycler config should be generated based upon the compactor // ring config @@ -52,6 +53,7 @@ func TestRingConfig_CustomConfigToLifecyclerConfig(t *testing.T) { expected.Port = cfg.InstancePort expected.Addr = cfg.InstanceAddr expected.ListenPort = cfg.ListenPort + expected.TokensFilePath = cfg.TokensFilePath // Hardcoded config expected.RingConfig.ReplicationFactor = 1