def test_rebuild_parity_errors(self): test_data = ('1234' * self.storage_method.ec_segment_size)[:-777] ec_chunks = self._make_ec_chunks(test_data) # break one parity chunk missing_chunk_body = ec_chunks.pop(-1) meta_chunk = self.meta_chunk() missing_chunk = meta_chunk.pop(-1) # add also error on another chunk for error in (Timeout(), 404, Exception('failure')): headers = {} base_responses = list() for ec_chunk in ec_chunks: base_responses.append(FakeResponse(200, ec_chunk, headers)) responses = base_responses error_idx = random.randint(0, len(responses) - 1) responses[error_idx] = FakeResponse(error, '', {}) def get_response(req): return responses.pop(0) if responses else FakeResponse(404) missing = missing_chunk['num'] nb = self.storage_method.ec_nb_data +\ self.storage_method.ec_nb_parity with set_http_requests(get_response) as conn_record: handler = ECRebuildHandler( meta_chunk, missing, self.storage_method) stream = handler.rebuild() result = ''.join(stream) self.assertEqual(len(result), len(missing_chunk_body)) self.assertEqual(self.checksum(result).hexdigest(), self.checksum(missing_chunk_body).hexdigest()) self.assertEqual(len(conn_record), nb - 1)
def test_rebuild(self): test_data = ('1234' * self.storage_method.ec_segment_size)[:-777] ec_chunks = self._make_ec_chunks(test_data) missing_chunk_body = ec_chunks.pop(1) meta_chunk = self.meta_chunk() missing_chunk = meta_chunk.pop(1) headers = {} responses = [ FakeResponse(200, ec_chunks[0], headers), FakeResponse(200, ec_chunks[1], headers), FakeResponse(200, ec_chunks[2], headers), FakeResponse(200, ec_chunks[3], headers), FakeResponse(200, ec_chunks[4], headers), FakeResponse(200, ec_chunks[5], headers), FakeResponse(200, ec_chunks[6], headers), ] def get_response(req): return responses.pop(0) if responses else FakeResponse(404) missing = missing_chunk['num'] nb = self.storage_method.ec_nb_data + self.storage_method.ec_nb_parity with set_http_requests(get_response) as conn_record: handler = ECRebuildHandler( meta_chunk, missing, self.storage_method) stream = handler.rebuild() result = ''.join(stream) self.assertEqual(len(result), len(missing_chunk_body)) self.assertEqual(self.checksum(result).hexdigest(), self.checksum(missing_chunk_body).hexdigest()) self.assertEqual(len(conn_record), nb - 1)