[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