r264 - 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
Fri Aug 17 19:54:11 UTC 2007
Author: camrdale-guest
Date: Fri Aug 17 19:54:11 2007
New Revision: 264
URL: http://svn.debian.org/wsvn/debtorrent/?sc=1&rev=264
Log:
On startup when saved state is not available, scan the directory for already downloaded files.
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=264&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/BT1/Storage.py (original)
+++ debtorrent/trunk/DebTorrent/BT1/Storage.py Fri Aug 17 19:54:11 2007
@@ -133,7 +133,7 @@
"""
def __init__(self, files, piece_lengths, doneflag, config,
- disabled_files = None):
+ enabled_files = None):
"""Initializes the Storage.
Initializes some variables, and calculates defaults for others,
@@ -147,8 +147,8 @@
@param doneflag: the flag that indicates when the program is to be shutdown
@type config: C{dictionary}
@param config: the configuration information
- @type disabled_files: C{list} of C{boolean}
- @param disabled_files: list of true for the files that are disabled
+ @type enabled_files: C{list} of C{boolean}
+ @param enabled_files: list of true for the files that are enabled
(optional, default is all files disabled)
"""
@@ -179,8 +179,8 @@
self.lock_while_reading = config.get('lock_while_reading', False)
self.lock = Lock()
- if not disabled_files:
- disabled_files = [True] * len(files)
+ if not enabled_files:
+ enabled_files = [False] * len(files)
for i in xrange(len(files)):
file, length = files[i]
@@ -215,9 +215,7 @@
cur_piece -= 1
piece_total -= self.piece_lengths[cur_piece]
self.file_pieces.append((start_piece, end_piece))
- if disabled_files[i]:
- l = 0
- else:
+ if enabled_files[i]:
if exists(file):
l = getsize(file)
if l > length:
@@ -234,6 +232,8 @@
h.close()
self.mtimes[file] = getmtime(file)
self.tops[file] = l
+ else:
+ l = 0
self.sizes[file] = length
so_far += l
@@ -931,7 +931,8 @@
if valid_pieces.has_key(p):
del valid_pieces[p]
except:
- logger.exception('Error unpickling data cache')
+ if 'files' in data:
+ logger.exception('Error unpickling data cache')
return []
logger.info('Final list of valid pieces: '+str(valid_pieces.keys()))
Modified: debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py
URL: http://svn.debian.org/wsvn/debtorrent/debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py?rev=264&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py (original)
+++ debtorrent/trunk/DebTorrent/BT1/StorageWrapper.py Fri Aug 17 19:54:11 2007
@@ -1393,8 +1393,9 @@
@param begin: the offset within the piece of the request
@type length: C{int}
@param length: the length of the request
- @rtype: C{string}
- @return: the requested data, or None if there was a problem
+ @rtype: L{DebTorrent.piecebuffer.SingleBuffer} or C{string}
+ @return: the requested data (in a piecebuffer if the request was for
+ the entire piece), or None if there was a problem
"""
@@ -1442,7 +1443,7 @@
@type flush_first: C{boolean}
@param flush_first: whether to flush the files before reading the data
(optional, default is not to flush)
- @rtype: C{string}
+ @rtype: L{DebTorrent.piecebuffer.SingleBuffer}
@return: the requested data, or None if there was a problem
"""
@@ -1746,7 +1747,8 @@
assert amount_obtained + amount_inactive == self.amount_desired
except:
- logger.exception('Error unpickling data cache')
+ if 'pieces' in data:
+ logger.exception('Error unpickling data cache')
return [] # invalid data, discard everything
self.have = have
Modified: debtorrent/trunk/DebTorrent/download_bt1.py
URL: http://svn.debian.org/wsvn/debtorrent/debtorrent/trunk/DebTorrent/download_bt1.py?rev=264&op=diff
==============================================================================
--- debtorrent/trunk/DebTorrent/download_bt1.py (original)
+++ debtorrent/trunk/DebTorrent/download_bt1.py Fri Aug 17 19:54:11 2007
@@ -38,7 +38,7 @@
from ConfigDir import ConfigDir
from bencode import bencode, bdecode
from sha import sha
-from os import path, makedirs, listdir
+from os import path, makedirs, listdir, walk
from parseargs import parseargs, formatDefinitions, defaultargs
from socket import error as socketerror
from random import seed
@@ -808,6 +808,30 @@
self.errorfunc(reason)
+ def find_files(self):
+ """Search through the save directory to find files which already exist.
+
+ @rtype: C{list} of C{boolean}
+ @return: a list of which entries in the list L{files} already exist
+
+ """
+
+ found_files = {}
+ for root, dirs, files in walk(self.filename):
+ for file in files:
+ found_files[path.join(root, file)] = 1
+
+ if not found_files:
+ return None
+
+ enabled_files = []
+ for file, length in self.files:
+ if file in found_files:
+ enabled_files.append(True)
+ else:
+ enabled_files.append(False)
+ return enabled_files
+
def initFiles(self, old_style = False):
"""Initialize the files for the download.
@@ -825,19 +849,29 @@
if self.doneflag.isSet():
return None
- disabled_files = None
+ enabled_files = None
data = self.appdataobj.getTorrentData(self.infohash)
try:
d = data['resume data']['priority']
assert len(d) == len(self.files)
- disabled_files = [x == -1 for x in d]
+ enabled_files = [x != -1 for x in d]
except:
- pass
+ if data:
+ logger.exception('pickled data is corrupt, manually finding and hash checking old files')
+ enabled_files = self.find_files()
+ if enabled_files:
+ priority = []
+ for found in enabled_files:
+ if found:
+ priority.append(1)
+ else:
+ priority.append(-1)
+ data = {'resume data': {'priority': priority}}
try:
try:
self.storage = Storage(self.files, self.piece_lengths,
- self.doneflag, self.config, disabled_files)
+ self.doneflag, self.config, enabled_files)
except IOError, e:
logger.exception('trouble accessing files')
self.errorfunc('trouble accessing files - ' + str(e))
More information about the Debtorrent-commits
mailing list