diff --git a/pkg/compactor/compactor_ring.go b/pkg/compactor/compactor_ring.go index 02813bc86d..be1f128827 100644 --- a/pkg/compactor/compactor_ring.go +++ b/pkg/compactor/compactor_ring.go @@ -7,7 +7,8 @@ package compactor import ( "flag" - "fmt" + "net" + "strconv" "time" "github.com/go-kit/log" @@ -64,7 +65,7 @@ func (cfg *RingConfig) ToBasicLifecyclerConfig(logger log.Logger) (ring.BasicLif return ring.BasicLifecyclerConfig{ ID: cfg.Common.InstanceID, - Addr: fmt.Sprintf("%s:%d", instanceAddr, instancePort), + Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), HeartbeatPeriod: cfg.Common.HeartbeatPeriod, HeartbeatTimeout: cfg.Common.HeartbeatTimeout, TokensObservePeriod: cfg.ObservePeriod, diff --git a/pkg/distributor/distributor_ring.go b/pkg/distributor/distributor_ring.go index 4e32f596b3..810811239e 100644 --- a/pkg/distributor/distributor_ring.go +++ b/pkg/distributor/distributor_ring.go @@ -1,7 +1,8 @@ package distributor import ( - "fmt" + "net" + "strconv" "github.com/go-kit/log" "github.com/grafana/dskit/ring" @@ -26,7 +27,7 @@ func toBasicLifecyclerConfig(cfg util.CommonRingConfig, logger log.Logger) (ring return ring.BasicLifecyclerConfig{ ID: cfg.InstanceID, - Addr: fmt.Sprintf("%s:%d", instanceAddr, instancePort), + Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), HeartbeatPeriod: cfg.HeartbeatPeriod, HeartbeatTimeout: cfg.HeartbeatTimeout, TokensObservePeriod: 0, diff --git a/pkg/experiment/metastore/discovery/kuberesolver.go b/pkg/experiment/metastore/discovery/kuberesolver.go index 94c2bf47d1..54f358642a 100644 --- a/pkg/experiment/metastore/discovery/kuberesolver.go +++ b/pkg/experiment/metastore/discovery/kuberesolver.go @@ -2,7 +2,9 @@ package discovery import ( "fmt" + "net" "net/url" + "strconv" "strings" "sync" @@ -103,7 +105,7 @@ func convertEndpoints(e kuberesolver2.Endpoints, ti targetInfo) []Server { raftServerId := fmt.Sprintf("%s.%s.%s.svc.cluster.local.:%d", podName, ti.service, ti.namespace, port.Port) servers = append(servers, Server{ - ResolvedAddress: fmt.Sprintf("%s:%d", addr.IP, port.Port), + ResolvedAddress: net.JoinHostPort(addr.IP, strconv.Itoa(port.Port)), Raft: raft.Server{ ID: raft.ServerID(raftServerId), Address: raft.ServerAddress(raftServerId), diff --git a/pkg/scheduler/schedulerdiscovery/ring.go b/pkg/scheduler/schedulerdiscovery/ring.go index 617de6e6ae..82ffea17cb 100644 --- a/pkg/scheduler/schedulerdiscovery/ring.go +++ b/pkg/scheduler/schedulerdiscovery/ring.go @@ -3,7 +3,8 @@ package schedulerdiscovery import ( - "fmt" + "net" + "strconv" "github.com/go-kit/log" "github.com/grafana/dskit/kv" @@ -42,7 +43,7 @@ func toBasicLifecyclerConfig(cfg util.CommonRingConfig, logger log.Logger) (ring return ring.BasicLifecyclerConfig{ ID: cfg.InstanceID, - Addr: fmt.Sprintf("%s:%d", instanceAddr, instancePort), + Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), HeartbeatPeriod: cfg.HeartbeatPeriod, HeartbeatTimeout: cfg.HeartbeatTimeout, TokensObservePeriod: 0, diff --git a/pkg/scheduler/schedulerdiscovery/ring_test.go b/pkg/scheduler/schedulerdiscovery/ring_test.go index 389638af04..4353ddf842 100644 --- a/pkg/scheduler/schedulerdiscovery/ring_test.go +++ b/pkg/scheduler/schedulerdiscovery/ring_test.go @@ -3,7 +3,8 @@ package schedulerdiscovery import ( - "fmt" + "net" + "strconv" "testing" "time" @@ -22,7 +23,7 @@ func TestRingConfig_DefaultConfigToBasicLifecyclerConfig(t *testing.T) { expected := ring.BasicLifecyclerConfig{ ID: cfg.SchedulerRing.InstanceID, - Addr: fmt.Sprintf("%s:%d", cfg.SchedulerRing.InstanceAddr, cfg.SchedulerRing.InstancePort), + Addr: net.JoinHostPort(cfg.SchedulerRing.InstanceAddr, strconv.Itoa(cfg.SchedulerRing.InstancePort)), HeartbeatPeriod: cfg.SchedulerRing.HeartbeatPeriod, HeartbeatTimeout: cfg.SchedulerRing.HeartbeatTimeout, TokensObservePeriod: 0, @@ -50,7 +51,7 @@ func TestRingConfig_CustomConfigToBasicLifecyclerConfig(t *testing.T) { // ring config expected := ring.BasicLifecyclerConfig{ ID: "test", - Addr: "1.2.3.4:10", + Addr: net.JoinHostPort(cfg.SchedulerRing.InstanceAddr, strconv.Itoa(cfg.SchedulerRing.InstancePort)), HeartbeatPeriod: 1 * time.Second, HeartbeatTimeout: 10 * time.Second, TokensObservePeriod: 0, @@ -62,3 +63,25 @@ func TestRingConfig_CustomConfigToBasicLifecyclerConfig(t *testing.T) { require.NoError(t, err) assert.Equal(t, expected, actual) } + +func TestRingConfig_AddressFamilies(t *testing.T) { + cfg := Config{} + flagext.DefaultValues(&cfg) + + t.Run("IPv4", func(t *testing.T) { + cfg.SchedulerRing.InstanceAddr = "1.2.3.4" + cfg.SchedulerRing.InstancePort = 10 + actual, err := toBasicLifecyclerConfig(cfg.SchedulerRing, log.NewNopLogger()) + require.NoError(t, err) + assert.Equal(t, "1.2.3.4:10", actual.Addr) + }) + + t.Run("IPv6", func(t *testing.T) { + cfg.SchedulerRing.InstanceAddr = "::1" + cfg.SchedulerRing.InstancePort = 10 + cfg.SchedulerRing.EnableIPv6 = true + actual, err := toBasicLifecyclerConfig(cfg.SchedulerRing, log.NewNopLogger()) + require.NoError(t, err) + assert.Equal(t, "[::1]:10", actual.Addr) + }) +} diff --git a/pkg/storegateway/gateway_ring.go b/pkg/storegateway/gateway_ring.go index 35827c95b7..e4bbc4787a 100644 --- a/pkg/storegateway/gateway_ring.go +++ b/pkg/storegateway/gateway_ring.go @@ -2,7 +2,8 @@ package storegateway import ( "flag" - "fmt" + "net" + "strconv" "time" "github.com/go-kit/log" @@ -109,7 +110,7 @@ func (cfg *RingConfig) ToLifecyclerConfig(logger log.Logger) (ring.BasicLifecycl return ring.BasicLifecyclerConfig{ ID: cfg.Ring.InstanceID, - Addr: fmt.Sprintf("%s:%d", instanceAddr, instancePort), + Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), Zone: cfg.InstanceZone, HeartbeatPeriod: cfg.Ring.HeartbeatPeriod, HeartbeatTimeout: cfg.Ring.HeartbeatTimeout, diff --git a/pkg/validation/exporter/ring.go b/pkg/validation/exporter/ring.go index 27a0e78792..0ec672ce77 100644 --- a/pkg/validation/exporter/ring.go +++ b/pkg/validation/exporter/ring.go @@ -6,6 +6,8 @@ import ( "context" "flag" "fmt" + "net" + "strconv" "time" "github.com/go-kit/log" @@ -74,7 +76,7 @@ func (c *RingConfig) toBasicLifecyclerConfig(logger log.Logger) (ring.BasicLifec return ring.BasicLifecyclerConfig{ ID: c.Ring.InstanceID, - Addr: fmt.Sprintf("%s:%d", instanceAddr, instancePort), + Addr: net.JoinHostPort(instanceAddr, strconv.Itoa(instancePort)), HeartbeatPeriod: c.Ring.HeartbeatPeriod, HeartbeatTimeout: c.Ring.HeartbeatTimeout, TokensObservePeriod: 0,