From 2a886576a6771f947f44f3232da1f4fe277dd9e5 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 3 Dec 2014 08:34:15 +0100 Subject: [PATCH] Fix announce timers on Solaris (and others, given the right timing) (...) In the successfull case, we start the timer with NewTimer(0), then do a bunch of stuff during which time it can fire, then reset it with Reset(0). The result is that two timer firings are queued when we enter the select loop, so we do two announcements back to back and fail the tests. --- internal/discover/client_udp.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/internal/discover/client_udp.go b/internal/discover/client_udp.go index 79e5f6981..dee727a8a 100644 --- a/internal/discover/client_udp.go +++ b/internal/discover/client_udp.go @@ -91,16 +91,14 @@ func (d *UDPClient) Start(uri *url.URL, pkt *Announce) error { func (d *UDPClient) broadcast(pkt []byte) { defer d.wg.Done() - timer := time.NewTimer(0) conn, err := net.ListenUDP(d.url.Scheme, d.listenAddress) for err != nil { - timer.Reset(d.errorRetryInterval) l.Warnf("Global UDP discovery (%s): %v; trying again in %v", d.url, err, d.errorRetryInterval) select { case <-d.stop: return - case <-timer.C: + case <-time.After(d.errorRetryInterval): } conn, err = net.ListenUDP(d.url.Scheme, d.listenAddress) } @@ -108,18 +106,16 @@ func (d *UDPClient) broadcast(pkt []byte) { remote, err := net.ResolveUDPAddr(d.url.Scheme, d.url.Host) for err != nil { - timer.Reset(d.errorRetryInterval) l.Warnf("Global UDP discovery (%s): %v; trying again in %v", d.url, err, d.errorRetryInterval) select { case <-d.stop: return - case <-timer.C: + case <-time.After(d.errorRetryInterval): } remote, err = net.ResolveUDPAddr(d.url.Scheme, d.url.Host) } - timer.Reset(0) - + timer := time.NewTimer(0) for { select { case <-d.stop: