Skip to content

Commit b8712a0

Browse files
author
Asim
committed
1 parent 9d85cf2 commit b8712a0

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

Diff for: client.go

+23-3
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ func newClient() (*client, error) {
150150

151151
// Close is used to cleanup the client
152152
func (c *client) Close() error {
153+
log.Printf("[INFO] mdns: Closing client %v", *c)
153154
c.closeLock.Lock()
154155
defer c.closeLock.Unlock()
155156

@@ -158,7 +159,6 @@ func (c *client) Close() error {
158159
}
159160
c.closed = true
160161

161-
log.Printf("[INFO] mdns: Closing client %v", *c)
162162
close(c.closedCh)
163163

164164
if c.ipv4UnicastConn != nil {
@@ -243,6 +243,9 @@ func (c *client) query(params *QueryParam) error {
243243
case *dns.PTR:
244244
// Create new entry for this
245245
inp = ensureName(inprogress, rr.Ptr)
246+
if inp.complete() {
247+
continue
248+
}
246249

247250
case *dns.SRV:
248251
// Check for a target mismatch
@@ -252,25 +255,37 @@ func (c *client) query(params *QueryParam) error {
252255

253256
// Get the port
254257
inp = ensureName(inprogress, rr.Hdr.Name)
258+
if inp.complete() {
259+
continue
260+
}
255261
inp.Host = rr.Target
256262
inp.Port = int(rr.Port)
257263

258264
case *dns.TXT:
259265
// Pull out the txt
260266
inp = ensureName(inprogress, rr.Hdr.Name)
267+
if inp.complete() {
268+
continue
269+
}
261270
inp.Info = strings.Join(rr.Txt, "|")
262271
inp.InfoFields = rr.Txt
263272
inp.hasTXT = true
264273

265274
case *dns.A:
266275
// Pull out the IP
267276
inp = ensureName(inprogress, rr.Hdr.Name)
277+
if inp.complete() {
278+
continue
279+
}
268280
inp.Addr = rr.A // @Deprecated
269281
inp.AddrV4 = rr.A
270282

271283
case *dns.AAAA:
272284
// Pull out the IP
273285
inp = ensureName(inprogress, rr.Hdr.Name)
286+
if inp.complete() {
287+
continue
288+
}
274289
inp.Addr = rr.AAAA // @Deprecated
275290
inp.AddrV6 = rr.AAAA
276291
}
@@ -288,7 +303,6 @@ func (c *client) query(params *QueryParam) error {
288303
inp.sent = true
289304
select {
290305
case params.Entries <- inp:
291-
default:
292306
}
293307
} else {
294308
// Fire off a node specific query
@@ -326,7 +340,13 @@ func (c *client) recv(l *net.UDPConn, msgCh chan *dns.Msg) {
326340
return
327341
}
328342
buf := make([]byte, 65536)
329-
for !c.closed {
343+
for {
344+
c.closeLock.Lock()
345+
if c.closed {
346+
c.closeLock.Unlock()
347+
return
348+
}
349+
c.closeLock.Unlock()
330350
n, err := l.Read(buf)
331351
if err != nil {
332352
log.Printf("[ERR] mdns: Failed to read packet: %v", err)

Diff for: server.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,13 @@ func (s *Server) recv(c *net.UDPConn) {
107107
return
108108
}
109109
buf := make([]byte, 65536)
110-
for !s.shutdown {
110+
for {
111+
s.shutdownLock.Lock()
112+
if s.shutdown {
113+
s.shutdownLock.Unlock()
114+
return
115+
}
116+
s.shutdownLock.Unlock()
111117
n, from, err := c.ReadFrom(buf)
112118
if err != nil {
113119
continue

Diff for: server_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func TestServer_Lookup(t *testing.T) {
2323

2424
entries := make(chan *ServiceEntry, 1)
2525
found := false
26+
doneCh := make(chan struct{})
2627
go func() {
2728
select {
2829
case e := <-entries:
@@ -40,6 +41,7 @@ func TestServer_Lookup(t *testing.T) {
4041
case <-time.After(80 * time.Millisecond):
4142
t.Fatalf("timeout")
4243
}
44+
close(doneCh)
4345
}()
4446

4547
params := &QueryParam{
@@ -52,6 +54,7 @@ func TestServer_Lookup(t *testing.T) {
5254
if err != nil {
5355
t.Fatalf("err: %v", err)
5456
}
57+
<-doneCh
5558
if !found {
5659
t.Fatalf("record not found")
5760
}

0 commit comments

Comments
 (0)