From 71d05a6fc215ad962508f13573b8025028dbd1fb Mon Sep 17 00:00:00 2001 From: shortcutme Date: Sun, 26 Aug 2018 22:58:27 +0200 Subject: [PATCH] Global stats to reduce tracker request for unreliable trackers --- src/Site/SiteAnnouncer.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Site/SiteAnnouncer.py b/src/Site/SiteAnnouncer.py index 7c81548e..959dc5ac 100644 --- a/src/Site/SiteAnnouncer.py +++ b/src/Site/SiteAnnouncer.py @@ -6,6 +6,7 @@ import urllib2 import struct import socket import re +import collections from lib import bencode from lib.subtl.subtl import UdpTrackerClient @@ -16,12 +17,13 @@ import gevent from Plugin import PluginManager from Config import config import util -from Debug import Debug class AnnounceError(Exception): pass +global_stats = collections.defaultdict(lambda: collections.defaultdict(int)) + @PluginManager.acceptPlugins class SiteAnnouncer(object): @@ -79,6 +81,15 @@ class SiteAnnouncer(object): trackers = self.getAnnouncingTrackers(mode) + if len(trackers) == 1: + tracker = trackers[0] + tracker_stats = global_stats[tracker] + # Reduce the announce time for trackers that looks unreliable + if tracker_stats["num_error"] > 5 and tracker_stats["time_request"] > time.time() - 60 * min(30, tracker_stats["num_error"]): + if config.verbose: + self.site.log.debug("Tracker %s looks unreliable, announce skipped (error: %s)" % (tracker, tracker_stats["num_error"])) + return + if config.verbose: self.site.log.debug("Tracker announcing, trackers: %s" % trackers) @@ -163,6 +174,7 @@ class SiteAnnouncer(object): last_status = self.stats[tracker]["status"] self.stats[tracker]["status"] = "announcing" self.stats[tracker]["time_request"] = time.time() + global_stats[tracker]["time_request"] = time.time() if config.verbose: self.site.log.debug("Tracker announcing to %s (mode: %s)" % (tracker, mode)) if mode == "update": @@ -188,6 +200,8 @@ class SiteAnnouncer(object): self.stats[tracker]["time_last_error"] = time.time() self.stats[tracker]["num_error"] += 1 self.stats[tracker]["num_request"] += 1 + global_stats[tracker]["num_request"] += 1 + global_stats[tracker]["num_error"] += 1 self.updateWebsocket(tracker="error") return False @@ -200,6 +214,8 @@ class SiteAnnouncer(object): self.stats[tracker]["time_status"] = time.time() self.stats[tracker]["num_success"] += 1 self.stats[tracker]["num_request"] += 1 + global_stats[tracker]["num_request"] += 1 + global_stats[tracker]["num_error"] = 0 if peers is True: # Announce success, but no peers returned return time.time() - s @@ -239,7 +255,8 @@ class SiteAnnouncer(object): else: tracker.peer_port = 0 tracker.connect() - tracker.poll_once() + if not tracker.poll_once(): + raise AnnounceError("Could not connect") tracker.announce(info_hash=hashlib.sha1(self.site.address).hexdigest(), num_want=num_want, left=431102370) back = tracker.poll_once() if not back: