]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
Tue Jan 24 20:52:09 GMT 2012 Brian Warner <warner@lothar.com>
authorDaira Hopwood <daira@jacaranda.org>
Thu, 5 Sep 2013 17:14:19 +0000 (18:14 +0100)
committerDaira Hopwood <daira@jacaranda.org>
Thu, 5 Sep 2013 17:14:19 +0000 (18:14 +0100)
  * Ensure that verification proceeds and stops when appropriate.

  The removed assertions are appropriate for a download that seeks to
  return plaintext to a caller; if we don't have at least k active remote
  shares, then we can't hope to do that. They're not appropriate for a
  verification operation; a user can try to verify a file that has fewer
  than k shares available, so that shouldn't be treated as an error.
  Instead, we proceed with fewer than k shares, and ensure that we
  terminate the download if we have no shares at all and we're verifying.

src/allmydata/mutable/retrieve.py

index 175116e073fb7d1050ce6caee47c584a421b10e1..291fb120c9ab1f86c6f5547c81679980b3fd0a20 100644 (file)
@@ -504,7 +504,6 @@ class Retrieve:
                 d.addCallback(self._try_to_validate_privkey, reader, reader.server)
                 # XXX: don't just drop the Deferred. We need error-reporting
                 # but not flow-control here.
-        assert len(self._active_readers) >= self._required_shares
 
     def _try_to_validate_prefix(self, prefix, reader):
         """
@@ -601,11 +600,13 @@ class Retrieve:
         I download, validate, decode, decrypt, and assemble the segment
         that this Retrieve is currently responsible for downloading.
         """
-        assert len(self._active_readers) >= self._required_shares
         if self._current_segment > self._last_segment:
             # No more segments to download, we're done.
             self.log("got plaintext, done")
             return self._done()
+        elif self._verify and len(self._active_readers) == 0:
+            self.log("no more good shares, no need to keep verifying")
+            return self._done()
         self.log("on segment %d of %d" %
                  (self._current_segment + 1, self._num_segments))
         d = self._process_segment(self._current_segment)
@@ -624,7 +625,6 @@ class Retrieve:
 
         # TODO: The old code uses a marker. Should this code do that
         # too? What did the Marker do?
-        assert len(self._active_readers) >= self._required_shares
 
         # We need to ask each of our active readers for its block and
         # salt. We will then validate those. If validation is