Skip to content

Commit c92f1f6

Browse files
committed
Address PR feedback.
1. If we receive multiple ipv4 addresses, ensure that we convert them all to multiaddrs and store them in the peerstore. 2. Ensure we don't allocate a new resolver on every tick. Instead reuse this by storing it in our mdns type. 3. Attempt choosing a port.
1 parent a238ddb commit c92f1f6

File tree

1 file changed

+32
-30
lines changed

1 file changed

+32
-30
lines changed

p2p/discovery/mdns.go

+32-30
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ type Notifee interface {
3434
}
3535

3636
type mdnsService struct {
37-
server *mdns.Server
38-
host host.Host
39-
tag string
37+
server *mdns.Server
38+
service *mdns.Resolver
39+
host host.Host
40+
tag string
4041

4142
lk sync.Mutex
4243
notifees []Notifee
@@ -48,14 +49,19 @@ func NewMdnsService(ctx context.Context, peerhost host.Host, interval time.Durat
4849
// TODO: dont let mdns use logging...
4950
golog.SetOutput(ioutil.Discard)
5051

51-
port := 4001
52+
port := 42424
5253
myid := peerhost.ID().Pretty()
5354

5455
info := []string{myid}
5556
if serviceTag == "" {
5657
serviceTag = ServiceTag
5758
}
5859

60+
resolver, err := mdns.NewResolver(nil)
61+
if err != nil {
62+
log.Error("Failed to initialize resolver:", err)
63+
}
64+
5965
// Create the mDNS server, defer shutdown
6066
server, err := mdns.Register(myid, serviceTag, "", port, info, nil)
6167
if err != nil {
@@ -64,6 +70,7 @@ func NewMdnsService(ctx context.Context, peerhost host.Host, interval time.Durat
6470

6571
s := &mdnsService{
6672
server: server,
73+
service: resolver,
6774
host: peerhost,
6875
interval: interval,
6976
tag: serviceTag,
@@ -81,14 +88,8 @@ func (m *mdnsService) Close() error {
8188
}
8289

8390
func (m *mdnsService) pollForEntries(ctx context.Context) {
84-
8591
ticker := time.NewTicker(m.interval)
8692
for {
87-
resolver, err := mdns.NewResolver(nil)
88-
if err != nil {
89-
log.Error("Failed to initialize resolver:", err)
90-
}
91-
9293
//execute mdns query right away at method call and then with every tick
9394
entriesCh := make(chan *mdns.ServiceEntry, 16)
9495
go func(results <-chan *mdns.ServiceEntry) {
@@ -102,7 +103,7 @@ func (m *mdnsService) pollForEntries(ctx context.Context) {
102103
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
103104
defer cancel()
104105

105-
if err := resolver.Browse(ctx, m.tag, "local", entriesCh); err != nil {
106+
if err := m.service.Browse(ctx, m.tag, "local", entriesCh); err != nil {
106107
log.Error("mdns lookup error: ", err)
107108
}
108109
close(entriesCh)
@@ -123,9 +124,6 @@ func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) {
123124
// pull out the txt
124125
info := strings.Join(e.Text, "|")
125126

126-
// addripv4 potential issue
127-
log.Debugf("Handling MDNS entry: %s:%d %s", e.AddrIPv4[0], e.Port, info)
128-
129127
mpeer, err := peer.IDB58Decode(info)
130128
if err != nil {
131129
log.Warning("Error parsing peer ID from mdns entry: ", err)
@@ -137,25 +135,29 @@ func (m *mdnsService) handleEntry(e *mdns.ServiceEntry) {
137135
return
138136
}
139137

140-
maddr, err := manet.FromNetAddr(&net.TCPAddr{
141-
IP: e.AddrIPv4[0],
142-
Port: e.Port,
143-
})
144-
if err != nil {
145-
log.Warning("Error parsing multiaddr from mdns entry: ", err)
146-
return
147-
}
138+
for _, ipv4 := range e.AddrIPv4 {
139+
log.Debugf("Handling MDNS entry: %s:%d %s", ipv4, e.Port, info)
148140

149-
pi := pstore.PeerInfo{
150-
ID: mpeer,
151-
Addrs: []ma.Multiaddr{maddr},
152-
}
141+
maddr, err := manet.FromNetAddr(&net.TCPAddr{
142+
IP: ipv4,
143+
Port: e.Port,
144+
})
145+
if err != nil {
146+
log.Warning("Error parsing multiaddr from mdns entry: ", err)
147+
return
148+
}
153149

154-
m.lk.Lock()
155-
for _, n := range m.notifees {
156-
go n.HandlePeerFound(pi)
150+
pi := pstore.PeerInfo{
151+
ID: mpeer,
152+
Addrs: []ma.Multiaddr{maddr},
153+
}
154+
155+
m.lk.Lock()
156+
for _, n := range m.notifees {
157+
go n.HandlePeerFound(pi)
158+
}
159+
m.lk.Unlock()
157160
}
158-
m.lk.Unlock()
159161
}
160162

161163
func (m *mdnsService) RegisterNotifee(n Notifee) {

0 commit comments

Comments
 (0)