def __init__(self, downloader, connection): SingleDownloadHelperInterface.__init__(self) self.downloader = downloader self.connection = connection self.choked = True self.interested = False self.active_requests = [] self.measure = Measure(downloader.max_rate_period) self.peermeasure = Measure(downloader.max_rate_period) self.raw_have = Bitfield(downloader.numpieces) self.have = Bitfield(downloader.numpieces) self.last = -1000 self.last2 = -1000 self.example_interest = None self.backlog = 2 self.ip = connection.get_ip() self.guard = BadDataGuard(self) self.app_mode = globalConfig.get_mode() self.white_list = None self.black_list = None self.app_mode = globalConfig.get_mode() if self.app_mode == 'node': source_node = globalConfig.get_value('source_node') support_nodes = globalConfig.get_value('support_nodes') if not globalConfig.get_value('allow_peers_download'): self.white_list = set() if source_node is not None and globalConfig.get_value( 'allow_source_download'): self.white_list.add(source_node[0]) if len(support_nodes) and globalConfig.get_value( 'allow_support_download'): self.white_list.update([addr[0] for addr in support_nodes]) else: self.black_list = set() if source_node is not None and not globalConfig.get_value( 'allow_source_download'): self.black_list.add(source_node[0]) if len(support_nodes) and not globalConfig.get_value( 'allow_support_download'): self.black_list.update([addr[0] for addr in support_nodes]) if len(self.black_list) == 0: self.black_list = None if DEBUG: log('download::__init__: white_list', self.white_list, 'black_list', self.black_list) self.helper = downloader.picker.helper self.proxy_have = Bitfield(downloader.numpieces) self.short_term_measure = Measure(5) self.bad_performance_counter = 0
def live_invalidate_ranges(self, toinvalidateranges, toinvalidateset): if len(toinvalidateranges) == 1: s, e = toinvalidateranges[0] emptyrange = [False for piece in xrange(s, e + 1)] for d in self.downloads: newhave = d.have[0:s] + emptyrange + d.have[e + 1:] d.have = Bitfield(length=len(newhave), fromarray=newhave) else: s1, e1 = toinvalidateranges[0] s2, e2 = toinvalidateranges[1] emptyrange1 = [False for piece in xrange(s1, e1 + 1)] emptyrange2 = [False for piece in xrange(s2, e2 + 1)] for d in self.downloads: newhave = emptyrange1 + d.have[e1 + 1:s2] + emptyrange2 d.have = Bitfield(length=len(newhave), fromarray=newhave)
def reset_have(self): if DEBUG: print >> sys.stderr, 'Downloader::reset_have: before self.have:', self.have.toboollist( ) validhave = Bitfield(self.downloader.numpieces) for i in self.downloader.picker.get_valid_range_iterator(): if self.raw_have[i]: validhave[i] = True self.have = validhave if DEBUG: print >> sys.stderr, 'Downloader::reset_have: after self.have:', self.have.toboollist( )
def aggregate_and_send_haves(self): if self.picker.helper: if DEBUG: print >> sys.stderr, 'Downloader: aggregate_and_send_haves: helper None or helper conn' haves_vector = [None] * len(self.downloads) for i in range(0, len(self.downloads)): haves_vector[i] = self.downloads[i].have aggregated_haves = Bitfield(self.numpieces) for piece in range(0, self.numpieces): aggregated_value = False for d in range(0, len(self.downloads)): aggregated_value = aggregated_value or haves_vector[d][ piece] aggregated_haves[piece] = aggregated_value self.picker.helper.send_proxy_have(aggregated_haves)
def got_have_bitfield(self, have): if self.downloader.picker.am_I_complete() and have.complete(): if self.downloader.super_seeding: self.connection.send_bitfield(have.tostring()) self.connection.try_send_pex() def auto_close(): self.connection.close() self.downloader.add_disconnected_seed( self.connection.get_readable_id()) self.downloader.scheduler(auto_close, REPEX_LISTEN_TIME) return if DEBUGBF: st = time.time() self.raw_have = have if have.complete(): self.downloader.picker.got_seed() else: activerangeiterators = [] if self.downloader.picker.videostatus and self.downloader.picker.videostatus.live_streaming and self.downloader.picker.videostatus.get_live_startpos( ) is None: activeranges = have.get_active_ranges() if len(activeranges) == 0: activerangeiterators = [ self.downloader.picker.get_valid_range_iterator() ] else: for s, e in activeranges: activerangeiterators.append(xrange(s, e + 1)) else: activerangeiterators = [ self.downloader.picker.get_valid_range_iterator( skip_filter=True) ] if DEBUGBF: print >> sys.stderr, 'Downloader: got_have_field: live: Filtering bitfield', activerangeiterators if DEBUGBF: print >> sys.stderr, 'Downloader: got_have_field: live or normal filter' validhave = Bitfield(self.downloader.numpieces) for iterator in activerangeiterators: for i in iterator: if have[i]: validhave[i] = True self.downloader.picker.got_have(i, self.connection) if DEBUG: print >> sys.stderr, '>>>debug: got bitfield:', self.connection.get_ip( ), 'have', debug_format_have(have) print >> sys.stderr, '>>>debug: got bitfield:', self.connection.get_ip( ), 'validhave', debug_format_have(validhave) self.downloader.aggregate_and_send_haves() have = validhave if DEBUGBF: et = time.time() diff = et - st print >> sys.stderr, 'Download: got_have_field: took', diff self.have = have if self.downloader.endgamemode and not self.downloader.paused: for piece, begin, length in self.downloader.all_requests: if self.have[piece]: self.send_interested() break return self._check_interests()