def quorum_or_fail(self, successes, failures): """ Compare the number of uploads against the quorum. :param successes: a list of chunk objects whose upload succeded :type successes: `list` or `tuple` :param failures: a list of chunk objects whose upload failed :type failures: `list` or `tuple` :raises `exc.SourceReadError`: if there is an error while reading data from the client :raises `exc.SourceReadTimeout`: if there is a timeout while reading data from the client :raises `exc.OioTimeout`: if there is a timeout among the errors :raises `exc.OioException`: if quorum has not been reached for any other reason """ if len(successes) < self.quorum: errors = group_chunk_errors( ((chunk["url"], chunk.get("error", "success")) for chunk in successes + failures)) new_exc = exc.OioException( "RAWX write failure, quorum not reached (%d/%d): %s" % (len(successes), self.quorum, errors)) for err in [x.get('error') for x in failures]: if isinstance(err, exc.SourceReadError): raise exc.SourceReadError(new_exc) elif isinstance(err, green.SourceReadTimeout): # Never raise 'green' timeouts out of our API raise exc.SourceReadTimeout(new_exc) elif isinstance(err, (exc.OioTimeout, green.OioTimeout)): raise exc.OioTimeout(new_exc) raise new_exc
def readline(self, *args, **kwargs): rc = self.source.readline(*args, **kwargs) if len(rc) == 0: if self.consumed != self.expected: raise exceptions.SourceReadError("Truncated input") else: self.consumed = self.consumed + len(rc) return rc
def test_metachunkwriter_quorum_fail_sourcereaderror(self): successes = [self._dummy_chunk(), self._dummy_chunk()] failures = [ self._dummy_chunk(Exception('Failed')), self._dummy_chunk(exceptions.SourceReadError('Failed')) ] self.assertRaises(exceptions.SourceReadError, self.mcw.quorum_or_fail, successes, failures) self._check_message(successes, failures)
def read(self, *args, **kwargs): rc = self.source.read(*args, **kwargs) if len(rc) == 0: if self.consumed != self.expected: raise exceptions.SourceReadError( "Truncated input (%s bytes read, %s bytes expected)" % (self.consumed, self.expected)) else: self.consumed = self.consumed + len(rc) return rc
def test_metachunkwriter_quorum_success(self): self.mcw.quorum_or_fail([{}, {}, {}], []) self.mcw.quorum_or_fail([{}, {}, {}, {}], []) failures = [ self._dummy_chunk(Exception('Failed')), self._dummy_chunk(exceptions.OioTimeout('Failed')), self._dummy_chunk(green.SourceReadTimeout(10)), self._dummy_chunk(exceptions.SourceReadError('Failed')) ] self.mcw.quorum_or_fail([{}, {}, {}], failures)