X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=tracker_scraper.go;h=863838ace478b622721a89364380d92957e497db;hb=5efb4dd9410e28bb2d6320268af4f98366be6508;hp=c18f21f858434d36b04e5bc0f05a5360074b34d6;hpb=ddd03362f8285cf7859d60178eb07ab56aa1d329;p=btrtrc.git diff --git a/tracker_scraper.go b/tracker_scraper.go index c18f21f8..863838ac 100644 --- a/tracker_scraper.go +++ b/tracker_scraper.go @@ -18,9 +18,10 @@ import ( // Announces a torrent to a tracker at regular intervals, when peers are // required. type trackerScraper struct { - u url.URL - t *Torrent - lastAnnounce trackerAnnounceResult + u url.URL + t *Torrent + lastAnnounce trackerAnnounceResult + lookupTrackerIp func(*url.URL) ([]net.IP, error) } type torrentTrackerAnnouncer interface { @@ -66,7 +67,13 @@ type trackerAnnounceResult struct { } func (me *trackerScraper) getIp() (ip net.IP, err error) { - ips, err := net.LookupIP(me.u.Hostname()) + var ips []net.IP + if me.lookupTrackerIp != nil { + ips, err = me.lookupTrackerIp(&me.u) + } else { + // Do a regular dns lookup + ips, err = net.LookupIP(me.u.Hostname()) + } if err != nil { return } @@ -74,6 +81,12 @@ func (me *trackerScraper) getIp() (ip net.IP, err error) { err = errors.New("no ips") return } + me.t.cl.rLock() + defer me.t.cl.rUnlock() + if me.t.cl.closed.IsSet() { + err = errors.New("client is closed") + return + } for _, ip = range ips { if me.t.cl.ipIsBlocked(ip) { continue @@ -105,7 +118,6 @@ func (me *trackerScraper) trackerUrl(ip net.IP) string { // Return how long to wait before trying again. For most errors, we return 5 // minutes, a relatively quick turn around for DNS changes. func (me *trackerScraper) announce(ctx context.Context, event tracker.AnnounceEvent) (ret trackerAnnounceResult) { - defer func() { ret.Completed = time.Now() }() @@ -136,22 +148,28 @@ func (me *trackerScraper) announce(ctx context.Context, event tracker.AnnounceEv me.t.cl.rLock() req := me.t.announceRequest(event) me.t.cl.rUnlock() - // The default timeout is currently 15s, and that works well as backpressure on concurrent - // access to the tracker. - //ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - //defer cancel() + // The default timeout works well as backpressure on concurrent access to the tracker. Since + // we're passing our own Context now, we will include that timeout ourselves to maintain similar + // behavior to previously, albeit with this context now being cancelled when the Torrent is + // closed. + ctx, cancel := context.WithTimeout(ctx, tracker.DefaultTrackerAnnounceTimeout) + defer cancel() me.t.logger.WithDefaultLevel(log.Debug).Printf("announcing to %q: %#v", me.u.String(), req) res, err := tracker.Announce{ - //Context: ctx, - HTTPProxy: me.t.cl.config.HTTPProxy, - UserAgent: me.t.cl.config.HTTPUserAgent, - TrackerUrl: me.trackerUrl(ip), - Request: req, - HostHeader: me.u.Host, - ServerName: me.u.Hostname(), - UdpNetwork: me.u.Scheme, - ClientIp4: krpc.NodeAddr{IP: me.t.cl.config.PublicIp4}, - ClientIp6: krpc.NodeAddr{IP: me.t.cl.config.PublicIp6}, + Context: ctx, + HttpProxy: me.t.cl.config.HTTPProxy, + HttpRequestDirector: me.t.cl.config.HttpRequestDirector, + DialContext: me.t.cl.config.TrackerDialContext, + ListenPacket: me.t.cl.config.TrackerListenPacket, + UserAgent: me.t.cl.config.HTTPUserAgent, + TrackerUrl: me.trackerUrl(ip), + Request: req, + HostHeader: me.u.Host, + ServerName: me.u.Hostname(), + UdpNetwork: me.u.Scheme, + ClientIp4: krpc.NodeAddr{IP: me.t.cl.config.PublicIp4}, + ClientIp6: krpc.NodeAddr{IP: me.t.cl.config.PublicIp6}, + Logger: me.t.logger, }.Do() me.t.logger.WithDefaultLevel(log.Debug).Printf("announce to %q returned %#v: %v", me.u.String(), res, err) if err != nil { @@ -181,7 +199,6 @@ func (me *trackerScraper) canIgnoreInterval(notify *<-chan struct{}) bool { } func (me *trackerScraper) Run() { - defer me.announceStopped() ctx, cancel := context.WithCancel(context.Background()) @@ -214,7 +231,6 @@ func (me *trackerScraper) Run() { me.t.cl.lock() wantPeers := me.t.wantPeersEvent.C() - closed := me.t.closed.C() me.t.cl.unlock() // If we want peers, reduce the interval to the minimum if it's appropriate. @@ -232,7 +248,7 @@ func (me *trackerScraper) Run() { } select { - case <-closed: + case <-me.t.closed.Done(): return case <-reconsider: // Recalculate the interval. @@ -243,7 +259,7 @@ func (me *trackerScraper) Run() { } func (me *trackerScraper) announceStopped() { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), tracker.DefaultTrackerAnnounceTimeout) defer cancel() me.announce(ctx, tracker.Stopped) }