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 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:
|
||||||
|
|
Loading…
Reference in a new issue