def write(self, data): self.hashsum.update(data) self.len_so_far += len(data) if self.len_so_far > self.length_getter(): self.finished_cb(self, Failure(InvalidDataError("Length so far is greater than the expected length." " %s to %s" % (str(self.len_so_far), str(self.length_getter()))))) else: if self.write_handle is None: log.debug("Tried to write to a write_handle that was None.") return self.write_handle.write(data) if self.len_so_far == self.length_getter(): self.finished_cb(self)
def writer_finished(self, writer, err=None): def fire_finished_deferred(): self.verified = True for p, (w, finished_deferred) in self.writers.items(): if w == writer: finished_deferred.callback(self) del self.writers[p] return True log.warning( "Somehow, the writer that was accepted as being valid was already removed. writer: %s", str(writer)) return False def errback_finished_deferred(err): for p, (w, finished_deferred) in self.writers.items(): if w == writer: finished_deferred.errback(err) del self.writers[p] def cancel_other_downloads(): for p, (w, finished_deferred) in self.writers.items(): w.cancel() if err is None: if writer.len_so_far == self.length and writer.hashsum.hexdigest( ) == self.blob_hash: if self.verified is False: d = self._save_verified_blob(writer) d.addCallbacks(lambda _: fire_finished_deferred(), errback_finished_deferred) d.addCallback(lambda _: cancel_other_downloads()) else: errback_finished_deferred(Failure(DownloadCanceledError())) d = defer.succeed(True) else: err_string = "length vs expected: {0}, {1}, hash vs expected: {2}, {3}" err_string = err_string.format(self.length, writer.len_so_far, self.blob_hash, writer.hashsum.hexdigest()) errback_finished_deferred(Failure( InvalidDataError(err_string))) d = defer.succeed(True) else: errback_finished_deferred(err) d = defer.succeed(True) d.addBoth(lambda _: self._close_writer(writer)) return d
def writer_finished(self, writer, err=None): def fire_finished_deferred(): self._verified = True for p, (w, finished_deferred) in self.writers.items(): if w == writer: del self.writers[p] finished_deferred.callback(self) return True log.warning( "Somehow, the writer that was accepted as being valid was already removed: %s", writer) return False def errback_finished_deferred(err): for p, (w, finished_deferred) in self.writers.items(): if w == writer: del self.writers[p] finished_deferred.errback(err) def cancel_other_downloads(): for p, (w, finished_deferred) in self.writers.items(): w.close() if err is None: if writer.len_so_far == self.length and writer.blob_hash == self.blob_hash: if self._verified is False: d = self.save_verified_blob(writer) d.addCallbacks(lambda _: fire_finished_deferred(), errback_finished_deferred) d.addCallback(lambda _: cancel_other_downloads()) else: d = defer.succeed(None) fire_finished_deferred() else: if writer.len_so_far != self.length: err_string = "blob length is %i vs expected %i" % ( writer.len_so_far, self.length) else: err_string = "blob hash is %s vs expected %s" % ( writer.blob_hash, self.blob_hash) errback_finished_deferred(Failure( InvalidDataError(err_string))) d = defer.succeed(None) else: errback_finished_deferred(err) d = defer.succeed(None) d.addBoth(lambda _: writer.close_handle()) return d
def write(self, data): if self.write_handle is None: log.exception("writer has already been closed") raise IOError('I/O operation on closed file') self._hashsum.update(data) self.len_so_far += len(data) if self.len_so_far > self.length_getter(): self.finished_cb_d = self.finished_cb( self, Failure(InvalidDataError("Length so far is greater than the expected length." " %s to %s" % (self.len_so_far, self.length_getter())))) else: self.write_handle.write(data) if self.len_so_far == self.length_getter(): self.finished_cb_d = self.finished_cb(self)