Global stats to reduce tracker request for unreliable trackers

This commit is contained in:
shortcutme 2018-08-26 22:58:27 +02:00
parent 867cf478b1
commit 71d05a6fc2
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE

View file

@ -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: