From 6313ff19b322a2801c633324bb0d77dc4f59b9a1 Mon Sep 17 00:00:00 2001 From: bendikro Date: Mon, 26 Nov 2012 00:23:00 +0100 Subject: [PATCH] Improved the speed of set_prioritize_first_last in torrent.py set_prioritize_first_last is rewritten for better performance, and is now only called when necessary. It should now properly set the priority for the beginning and end of each file in the torrent. --- deluge/core/torrent.py | 64 +++++++++---- deluge/tests/dir_with_6_files.torrent | Bin 0 -> 9630 bytes deluge/tests/test_torrent.py | 127 ++++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 20 deletions(-) create mode 100644 deluge/tests/dir_with_6_files.torrent create mode 100644 deluge/tests/test_torrent.py diff --git a/deluge/core/torrent.py b/deluge/core/torrent.py index ba6ec285a..c5fd81955 100644 --- a/deluge/core/torrent.py +++ b/deluge/core/torrent.py @@ -232,8 +232,13 @@ class Torrent(object): "max_upload_speed": self.set_max_upload_speed, "prioritize_first_last_pieces": self.set_prioritize_first_last, "sequential_download": self.set_sequential_download - } + + # set_prioritize_first_last is called by set_file_priorities, + # so remove if file_priorities is set in options. + if "file_priorities" in options: + del OPTIONS_FUNCS["prioritize_first_last_pieces"] + for (key, value) in options.items(): if OPTIONS_FUNCS.has_key(key): OPTIONS_FUNCS[key](value) @@ -296,26 +301,44 @@ class Torrent(object): def set_prioritize_first_last(self, prioritize): self.options["prioritize_first_last_pieces"] = prioritize - if self.handle.has_metadata(): - if self.options["compact_allocation"]: - log.debug("Setting first/last priority with compact " - "allocation does not work!") - return + if not prioritize: + # If we are turning off this option, call set_file_priorities to + # reset all the piece priorities + self.set_file_priorities(self.options["file_priorities"]) + return + if not self.handle.has_metadata(): + return + if self.options["compact_allocation"]: + log.debug("Setting first/last priority with compact " + "allocation does not work!") + return + # A list of priorities for each piece in the torrent + priorities = self.handle.piece_priorities() + prioritized_pieces = [] + ti = self.handle.get_torrent_info() + for i in range(ti.num_files()): + f = ti.file_at(i) + two_percent_bytes = int(0.02 * f.size) + # Get the pieces for the byte offsets + first_start = ti.map_file(i, 0, 0).piece + first_end = ti.map_file(i, two_percent_bytes, 0).piece + last_start = ti.map_file(i, f.size - two_percent_bytes, 0).piece + last_end = ti.map_file(i, max(f.size - 1, 0), 0).piece - paths = {} - ti = self.handle.get_torrent_info() - for n in range(ti.num_pieces()): - slices = ti.map_block(n, 0, ti.piece_size(n)) - for slice in slices: - if self.handle.file_priority(slice.file_index): - paths.setdefault(slice.file_index, []).append(n) + first_end += 1 + last_end += 1 + prioritized_pieces.append((first_start, first_end)) + prioritized_pieces.append((last_start, last_end)) - priorities = self.handle.piece_priorities() - for pieces in paths.itervalues(): - two_percent = int(0.02*len(pieces)) or 1 - for piece in pieces[:two_percent]+pieces[-two_percent:]: - priorities[piece] = 7 if prioritize else 1 - self.handle.prioritize_pieces(priorities) + # Creating two lists with priorites for the first/last pieces + # of this file, and insert the priorities into the list + first_list = [7] * (first_end - first_start) + last_list = [7] * (last_end - last_start) + priorities[first_start:first_end] = first_list + priorities[last_start:last_end] = last_list + # Setting the priorites for all the pieces of this torrent + self.handle.prioritize_pieces(priorities) + return prioritized_pieces, priorities def set_sequential_download(self, set_sequencial): self.options["sequential_download"] = set_sequencial @@ -372,7 +395,8 @@ class Torrent(object): log.warning("File priorities were not set for this torrent") # Set the first/last priorities if needed - self.set_prioritize_first_last(self.options["prioritize_first_last_pieces"]) + if self.options["prioritize_first_last_pieces"]: + self.set_prioritize_first_last(self.options["prioritize_first_last_pieces"]) def set_trackers(self, trackers): """Sets trackers""" diff --git a/deluge/tests/dir_with_6_files.torrent b/deluge/tests/dir_with_6_files.torrent new file mode 100644 index 0000000000000000000000000000000000000000..2c6b5fb020b31a7964a0a598eccec744c22cdfdc GIT binary patch literal 9630 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 juxCSZ