Global stats to reduce tracker request for unreliable trackers
This commit is contained in:
parent
867cf478b1
commit
71d05a6fc2
1 changed files with 19 additions and 2 deletions
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue