From: Daira Hopwood Date: Thu, 5 Sep 2013 17:14:19 +0000 (+0100) Subject: Tue Jan 24 20:52:09 GMT 2012 Brian Warner X-Git-Url: https://git.rkrishnan.org/%5B/%5D%20/uri?a=commitdiff_plain;h=49961756a7c0b15c4b636822cf771338055198cd;p=tahoe-lafs%2Ftahoe-lafs.git Tue Jan 24 20:52:09 GMT 2012 Brian Warner * 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. --- diff --git a/src/allmydata/mutable/retrieve.py b/src/allmydata/mutable/retrieve.py index 175116e0..291fb120 100644 --- a/src/allmydata/mutable/retrieve.py +++ b/src/allmydata/mutable/retrieve.py @@ -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