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 struct
import socket import socket
import re import re
import collections
from lib import bencode from lib import bencode
from lib.subtl.subtl import UdpTrackerClient from lib.subtl.subtl import UdpTrackerClient
@ -16,12 +17,13 @@ import gevent
from Plugin import PluginManager from Plugin import PluginManager
from Config import config from Config import config
import util import util
from Debug import Debug
class AnnounceError(Exception): class AnnounceError(Exception):
pass pass
global_stats = collections.defaultdict(lambda: collections.defaultdict(int))
@PluginManager.acceptPlugins @PluginManager.acceptPlugins
class SiteAnnouncer(object): class SiteAnnouncer(object):
@ -79,6 +81,15 @@ class SiteAnnouncer(object):
trackers = self.getAnnouncingTrackers(mode) 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: if config.verbose:
self.site.log.debug("Tracker announcing, trackers: %s" % trackers) self.site.log.debug("Tracker announcing, trackers: %s" % trackers)
@ -163,6 +174,7 @@ class SiteAnnouncer(object):
last_status = self.stats[tracker]["status"] last_status = self.stats[tracker]["status"]
self.stats[tracker]["status"] = "announcing" self.stats[tracker]["status"] = "announcing"
self.stats[tracker]["time_request"] = time.time() self.stats[tracker]["time_request"] = time.time()
global_stats[tracker]["time_request"] = time.time()
if config.verbose: if config.verbose:
self.site.log.debug("Tracker announcing to %s (mode: %s)" % (tracker, mode)) self.site.log.debug("Tracker announcing to %s (mode: %s)" % (tracker, mode))
if mode == "update": if mode == "update":
@ -188,6 +200,8 @@ class SiteAnnouncer(object):
self.stats[tracker]["time_last_error"] = time.time() self.stats[tracker]["time_last_error"] = time.time()
self.stats[tracker]["num_error"] += 1 self.stats[tracker]["num_error"] += 1
self.stats[tracker]["num_request"] += 1 self.stats[tracker]["num_request"] += 1
global_stats[tracker]["num_request"] += 1
global_stats[tracker]["num_error"] += 1
self.updateWebsocket(tracker="error") self.updateWebsocket(tracker="error")
return False return False
@ -200,6 +214,8 @@ class SiteAnnouncer(object):
self.stats[tracker]["time_status"] = time.time() self.stats[tracker]["time_status"] = time.time()
self.stats[tracker]["num_success"] += 1 self.stats[tracker]["num_success"] += 1
self.stats[tracker]["num_request"] += 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 if peers is True: # Announce success, but no peers returned
return time.time() - s return time.time() - s
@ -239,7 +255,8 @@ class SiteAnnouncer(object):
else: else:
tracker.peer_port = 0 tracker.peer_port = 0
tracker.connect() 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) tracker.announce(info_hash=hashlib.sha1(self.site.address).hexdigest(), num_want=num_want, left=431102370)
back = tracker.poll_once() back = tracker.poll_once()
if not back: if not back: