20
"github.com/hashicorp/raft"
21
"github.com/sirupsen/logrus"
25
type addressResolver interface {
27
NodeAddress(id string) string
30
type addrResolver struct {
35
NodeName2PortMap map[string]int
38
notResolvedNodes map[raft.ServerID]struct{}
41
func newAddrResolver(cfg *Config) *addrResolver {
43
addressResolver: cfg.AddrResolver,
44
RaftPort: cfg.RaftPort,
45
IsLocalCluster: cfg.IsLocalHost,
46
NodeName2PortMap: cfg.ServerName2PortMap,
47
notResolvedNodes: make(map[raft.ServerID]struct{}),
52
func (a *addrResolver) ServerAddr(id raft.ServerID) (raft.ServerAddress, error) {
53
addr := a.addressResolver.NodeAddress(string(id))
56
defer a.nodesLock.Unlock()
58
a.notResolvedNodes[id] = struct{}{}
59
return "", fmt.Errorf("could not resolve server id %s", id)
61
delete(a.notResolvedNodes, id)
63
if !a.IsLocalCluster {
64
return raft.ServerAddress(fmt.Sprintf("%s:%d", addr, a.RaftPort)), nil
68
return raft.ServerAddress(fmt.Sprintf("%s:%d", addr, a.NodeName2PortMap[string(id)])), nil
74
func (a *addrResolver) NewTCPTransport(
75
bindAddr string, advertise net.Addr,
76
maxPool int, timeout time.Duration, logger *logrus.Logger,
77
) (*raft.NetworkTransport, error) {
78
cfg := &raft.NetworkTransportConfig{
79
ServerAddressProvider: a,
82
Logger: NewHCLogrusLogger("raft-net", logger),
85
return raft.NewTCPTransportWithConfig(bindAddr, advertise, cfg)