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