Discovery service refactoring

This commit is contained in:
2023-12-06 08:56:42 +03:00
parent 7864272baa
commit cf00cfaab6

View File

@@ -24,10 +24,10 @@ func (d DiscoverySet) NewNodes() NewNodes {
res := make(chan string, 20)
for _, discovery := range d {
go func(v *Discovery) {
for node := range v.Nodes() {
go func(discovery *Discovery) {
for node := range discovery.Nodes() {
if len(res) == cap(res) {
panic("discovery set nodes not reading!")
panic("nodes from discovery set not reading!")
}
res <- node
@@ -72,8 +72,8 @@ func NewDiscovery(iFace net.Interface, log *zap.Logger, discoverPort uint16, opt
return nil, fmt.Errorf("get interface address: %w", err)
}
broadcast := net.IP(make([]byte, 4))
var ownAddr net.IP
broadcastIP := net.IP(make([]byte, 4))
var ownIP net.IP
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok {
@@ -83,35 +83,40 @@ func NewDiscovery(iFace net.Interface, log *zap.Logger, discoverPort uint16, opt
}
for i := range ip4 {
broadcast[i] = ip4[i] | ^ipnet.Mask[i]
broadcastIP[i] = ip4[i] | ^ipnet.Mask[i]
}
ownAddr = ipnet.IP
ownIP = ipnet.IP
break
}
}
if broadcast.To4() == nil {
if broadcastIP.To4() == nil {
return nil, fmt.Errorf("no broadcast address")
}
portString := strconv.Itoa(int(discoverPort))
if ownIP.To4() == nil {
return nil, fmt.Errorf("no own address")
}
conn, err := net.ListenPacket("udp4", broadcast.String()+":"+portString)
broadcastAddrString := broadcastIP.String() + ":" + strconv.Itoa(int(discoverPort))
conn, err := net.ListenPacket("udp4", broadcastAddrString)
if err != nil {
return nil, fmt.Errorf("listen packet: %w", err)
}
udpAddr, err := net.ResolveUDPAddr("udp4", broadcast.String()+":"+portString)
udpAddr, err := net.ResolveUDPAddr("udp4", broadcastAddrString)
if err != nil {
return nil, fmt.Errorf("resolve udp address: %w", err)
}
d := Discovery{
log: log.With(zap.Stringer("broadcast_address", broadcast)),
log: log.With(zap.Stringer("broadcast_address", broadcastIP)),
nodes: make(Nodes),
newNode: make(chan string, 20),
ownAddr: ownAddr.To4(),
newNodesCh: make(chan string, 20),
ownAddr: ownIP.To4(),
conn: conn,
broadcastAddr: udpAddr,
broadcastInterval: defaultBroadcastInterval,
@@ -130,7 +135,7 @@ type Discovery struct {
mu sync.Mutex
nodes Nodes
newNode chan string
newNodesCh chan string
ownAddr net.IP
conn net.PacketConn
@@ -164,7 +169,7 @@ func (d *Discovery) Start(ctx context.Context, wg *sync.WaitGroup) {
d.log.Warn("close connection", zap.Error(err))
}
close(d.newNode)
close(d.newNodesCh)
return
@@ -228,12 +233,12 @@ func (d *Discovery) addNode(addr string) {
if _, ok := d.nodes[addr]; !ok {
d.log.Info("new node address", zap.String("address", addr))
d.nodes[addr] = struct{}{}
d.newNode <- addr
d.newNodesCh <- addr
}
d.mu.Unlock()
}
func (d *Discovery) Nodes() NewNodes {
return d.newNode
return d.newNodesCh
}