예제 #1
0
파일: io.py 프로젝트: vandanabn/oio-sds
    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
예제 #2
0
파일: obj.py 프로젝트: AymericDu/swift
 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
예제 #3
0
 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)
예제 #4
0
 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
예제 #5
0
 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)