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)
| 396 | // the rest of the cluster. |
| 397 | // (Copied from memberlist' net_transport.go) |
| 398 | func (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 | |
| 454 | func (t *TCPTransport) setAdvertisedAddr(advertiseAddr net.IP, advertisePort int) { |
| 455 | t.advertiseMu.Lock() |