MCPcopy
hub / github.com/grafana/dskit / FinalAdvertiseAddr

Method FinalAdvertiseAddr

kv/memberlist/tcp_transport.go:398–452  ·  view source on GitHub ↗

FinalAdvertiseAddr is given the user's configured values (which might be empty) and returns the desired IP and port to advertise to the rest of the cluster. (Copied from memberlist' net_transport.go)

(ip string, port int)

Source from the content-addressed store, hash-verified

396// the rest of the cluster.
397// (Copied from memberlist' net_transport.go)
398func (t *TCPTransport) FinalAdvertiseAddr(ip string, port int) (net.IP, int, error) {
399 var advertiseAddr net.IP
400 var advertisePort int
401 if ip != "" {
402 // If they've supplied an address, use that.
403 advertiseAddr = net.ParseIP(ip)
404 if advertiseAddr == nil {
405 return nil, 0, fmt.Errorf("failed to parse advertise address %q", ip)
406 }
407
408 advertisePort = port
409 } else {
410
411 switch t.cfg.BindAddrs[0] {
412 case zeroZeroZeroZero:
413 // Otherwise, if we're not bound to a specific IP, let's
414 // use a suitable private IP address.
415 var err error
416 ip, err = sockaddr.GetPrivateIP()
417 if err != nil {
418 return nil, 0, fmt.Errorf("failed to get interface addresses: %v", err)
419 }
420 if ip == "" {
421 return nil, 0, fmt.Errorf("no private IP address found, and explicit IP not provided")
422 }
423
424 advertiseAddr = net.ParseIP(ip)
425 if advertiseAddr == nil {
426 return nil, 0, fmt.Errorf("failed to parse advertise address %q", ip)
427 }
428 case colonColon:
429 inet6Ip, err := netutil.GetFirstAddressOf(nil, t.logger, true)
430 if err != nil {
431 return nil, 0, fmt.Errorf("failed to get private inet6 address: %w", err)
432 }
433
434 advertiseAddr = net.ParseIP(inet6Ip)
435 if advertiseAddr == nil {
436 return nil, 0, fmt.Errorf("failed to parse inet6 advertise address %q", ip)
437 }
438 default:
439 // Use the IP that we're bound to, based on the first
440 // TCP listener, which we already ensure is there.
441 advertiseAddr = t.tcpListeners[0].Addr().(*net.TCPAddr).IP
442 }
443
444 // Use the port we are bound to.
445 advertisePort = t.GetAutoBindPort()
446 }
447
448 level.Debug(t.logger).Log("msg", "FinalAdvertiseAddr", "advertiseAddr", advertiseAddr.String(), "advertisePort", advertisePort)
449
450 t.setAdvertisedAddr(advertiseAddr, advertisePort)
451 return advertiseAddr, advertisePort, nil
452}
453
454func (t *TCPTransport) setAdvertisedAddr(advertiseAddr net.IP, advertisePort int) {
455 t.advertiseMu.Lock()

Calls 6

GetAutoBindPortMethod · 0.95
setAdvertisedAddrMethod · 0.95
GetFirstAddressOfFunction · 0.92
ErrorfMethod · 0.80
StringMethod · 0.65
LogMethod · 0.45