[Debtorrent-commits] r12 - in /debtorrent/trunk/DebTorrent: BT1/Storage.py BT1/StorageWrapper.py download_bt1.py

camrdale-guest at users.alioth.debian.org camrdale-guest at users.alioth.debian.org
Thu Apr 26 18:49:45 UTC 2007


Author: camrdale-guest
Date: Thu Apr 26 18:49:45 2007
New Revision: 12

URL: http://svn.debian.org/wsvn/debtorrent/?sc=1&rev=12
Log:
Modified StorageWrapper to support variable-piece sizes

Modified:
    debtorrent/trunk/DebTorrent/BT1/Storage.py
    debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py
    debtorrent/trunk/DebTorrent/download_bt1.py

Modified: debtorrent/trunk/DebTorrent/BT1/Storage.py
URL: http://svn.debian.org/wsvn/debtorrent/debtorrent/trunk/DebTorrent/BT1/Storage.py?rev=12&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/BT1/Storage.py (original)
+++ debtorrent/trunk/DebTorrent/BT1/Storage.py Thu Apr 26 18:49:45 2007
@@ -32,7 +32,7 @@
     pass
 
 class Storage:
-    def __init__(self, files, piece_lengths, datalength, doneflag, config,
+    def __init__(self, files, piece_lengths, doneflag, config,
                  disabled_files = None):
         # can raise IOError and ValueError
         self.files = files

Modified: debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py
URL: http://svn.debian.org/wsvn/debtorrent/debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py?rev=12&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py (original)
+++ debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py Thu Apr 26 18:49:45 2007
@@ -64,17 +64,20 @@
         return self.state
 
 
-class StorageWrapper: # TODO change piece_size to piece_lengths array
+class StorageWrapper:
     def __init__(self, storage, request_size, hashes, 
-            piece_size, finished, failed, 
+            piece_sizes, datalength, finished, failed, 
             statusfunc = dummy_status, flag = fakeflag(), check_hashes = True,
             data_flunked = lambda x: None, backfunc = None,
             config = {}, unpauseflag = fakeflag(True) ):
         self.storage = storage
         self.request_size = long(request_size)
         self.hashes = hashes
-        self.piece_size = long(piece_size)
-        self.piece_length = long(piece_size)
+        self.piece_sizes = piece_sizes
+        self.piece_begins = [0l]
+        for i in xrange(1,len(piece_sizes)):
+            self.piece_begins[i] = self.piece_begins[i-1] + self.piece_sizes[i-1]
+        self.datalength = datalength
         self.finished = finished
         self.failed = failed
         self.statusfunc = statusfunc
@@ -94,9 +97,9 @@
         self.bgalloc_active = False
         self.total_length = storage.get_total_length()
         self.amount_left = self.total_length
-        if self.total_length <= self.piece_size * (len(hashes) - 1):
+        if self.total_length <= self.datalength - self.piece_sizes[-1]:
             raise ValueError, 'bad data in responsefile - total too small'
-        if self.total_length > self.piece_size * len(hashes):
+        if self.total_length > self.datalength:
             raise ValueError, 'bad data in responsefile - total too big'
         self.numactive = [0] * len(hashes)
         self.inactive_requests = [1] * len(hashes)
@@ -345,7 +348,8 @@
         if not self.holes:
             return False
         self.numholes = float(len(self.holes))
-        self.alloc_buf = chr(0xFF) * self.piece_size
+        # TODO determine if this is a huge waste of memory (160MB)
+        self.alloc_buf = chr(0xFF) * max(self.piece_sizes)
         if self.alloc_type == 'pre-allocate':
             self.bgalloc_enabled = True
             return True
@@ -416,17 +420,14 @@
         if self.config.get('alloc_rate',0) < 0.1:
             self.config['alloc_rate'] = 0.1
         self.backfunc( self._bgalloc,
-              float(self.piece_size)/(self.config['alloc_rate']*1048576) )
+              (float(self.datalength)/float(len(self.hashes)))/(self.config['alloc_rate']*1048576) )
 
 
     def _waspre(self, piece):
-        return self.storage.was_preallocated(piece * self.piece_size, self._piecelen(piece))
+        return self.storage.was_preallocated(self.piece_begins[piece], self._piecelen(piece))
 
     def _piecelen(self, piece):
-        if piece < len(self.hashes) - 1:
-            return self.piece_size
-        else:
-            return self.total_length - (piece * self.piece_size)
+        return self.piece_sizes[piece]
 
     def get_amount_left(self):
         return self.amount_left
@@ -504,7 +505,7 @@
 
     def write_raw(self, index, begin, data):
         try:
-            self.storage.write(self.piece_size * index + begin, data)
+            self.storage.write(self.piece_begins[index] + begin, data)
             return True
         except IOError, e:
             self.failed('IO Error: ' + str(e))
@@ -780,7 +781,7 @@
 
     def read_raw(self, piece, begin, length, flush_first = False):
         try:
-            return self.storage.read(self.piece_size * piece + begin,
+            return self.storage.read(self.piece_begins[piece] + begin,
                                                      length, flush_first)
         except IOError, e:
             self.failed('IO Error: ' + str(e))

Modified: debtorrent/trunk/DebTorrent/download_bt1.py
URL: http://svn.debian.org/wsvn/debtorrent/debtorrent/trunk/DebTorrent/download_bt1.py?rev=12&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/download_bt1.py (original)
+++ debtorrent/trunk/DebTorrent/download_bt1.py Thu Apr 26 18:49:45 2007
@@ -464,7 +464,7 @@
         self.choker.set_round_robin_period(
             max( self.config['round_robin_period'],
                  self.config['round_robin_period'] *
-                           (self.datalength / len(self.piece_lengths)) / 200000 ) )
+                           (float(self.datalength) / len(self.piece_lengths)) / 200000 ) )
         self.rerequest_complete()
         self.finfunc()
 
@@ -514,7 +514,7 @@
 
         try:
             try:
-                self.storage = Storage(self.files, self.piece_lengths, self.datalength
+                self.storage = Storage(self.files, self.piece_lengths,
                                        self.doneflag, self.config, disabled_files)
             except IOError, e:
                 self.errorfunc('trouble accessing files - ' + str(e))




More information about the Debtorrent-commits mailing list