def process_queue(self): utcnow = datetime.utcnow() errors = self.get_items_to_be_processed(utcnow) for error in errors: process_pillow_retry(error, producer=producer) producer.flush() return len(errors)
def test(self): document = { '_id': 'test-id', 'doc_type': 'CommCareCase', 'type': 'mother', 'domain': 'kafka-test-domain', } change = Change(id='test-id', sequence_id='3', document=document) populate_change_metadata(change, SOURCE_COUCH, 'test_commcarehq') with patch('pillow_retry.api.get_pillow_by_name', return_value=self.pillow): # first change creates error message = 'test retry 1' self.pillow.process_change = MagicMock(side_effect=TestException(message)) self.pillow.process_with_error_handling(change, PillowRuntimeContext(changes_seen=0)) errors = self._check_errors(1, message) # second attempt updates error with process_pillow_changes(self.pillow): process_pillow_retry(errors[0]) errors = self._check_errors(2) # third attempt successful self.pillow.process_change = self.original_process_change with process_pillow_changes(self.pillow): process_pillow_retry(errors[0]) errors = list(PillowError.objects.filter(pillow=self.pillow.pillow_id).all()) self.assertEqual(0, len(errors)) self.assertEqual(1, self.processor.count)
def test_empty_metadata(self): change = _change(id='123') error = PillowError.get_or_create(change, GetDocPillow()) error.save() process_pillow_retry(error) error = PillowError.objects.get(pk=error.id) self.assertEquals(error.total_attempts, 1)
def test_deleted_doc(self): id = 'test_doc' change_dict = {'id': id, 'seq': 54321} error = create_error(change_from_couch_row(change_dict)) error.save() # this used to error out process_pillow_retry(error) with self.assertRaises(PillowError.DoesNotExist): PillowError.objects.get(id=error.id)
def test_pillow_not_found(self): error = PillowError.objects.create(doc_id='missing-pillow', pillow='NotARealPillow', date_created=datetime.utcnow(), date_last_attempt=datetime.utcnow()) # make sure this doesn't error process_pillow_retry(error) # and that its total_attempts was bumped above the threshold error = PillowError.objects.get(pk=error.pk) self.assertTrue( error.total_attempts > const.PILLOW_RETRY_MULTI_ATTEMPTS_CUTOFF)
def test_pillow_not_found(self): error = PillowError.objects.create( doc_id='missing-pillow', pillow='NotARealPillow', date_created=datetime.utcnow(), date_last_attempt=datetime.utcnow() ) # make sure this doesn't error process_pillow_retry(error) # and that its total_attempts was bumped above the threshold error = PillowError.objects.get(pk=error.pk) self.assertTrue(error.total_attempts > const.PILLOW_RETRY_MULTI_ATTEMPTS_CUTOFF)
def test(self): document = { 'doc_type': 'CommCareCase', 'type': 'mother', 'domain': 'kafka-test-domain', } change = Change(id='test-id', sequence_id='3', document=document) populate_change_metadata(change, SOURCE_COUCH, self._fake_couch.dbname) with patch('pillow_retry.api.get_pillow_by_name', return_value=self.pillow): # first change creates error message = 'test retry 1' self.pillow.process_change = MagicMock( side_effect=TestException(message)) self.pillow.process_with_error_handling( change, PillowRuntimeContext(changes_seen=0)) errors = self._check_errors(1, message) # second attempt updates error process_pillow_retry(errors[0]) errors = self._check_errors(2) # third attempt successful self.pillow.process_change = self.original_process_change process_pillow_retry(errors[0]) errors = list( PillowError.objects.filter(pillow=self.pillow.pillow_id).all()) self.assertEqual(0, len(errors)) message = next(self.consumer) change_meta = change_meta_from_kafka_message(message.value) self.assertEqual(SOURCE_COUCH, change_meta.data_source_type) self.assertEqual(self._fake_couch.dbname, change_meta.data_source_name) self.assertEqual('test-id', change_meta.document_id) self.assertEqual(document['doc_type'], change_meta.document_type) self.assertEqual(document['type'], change_meta.document_subtype) self.assertEqual(document['domain'], change_meta.domain) self.assertEqual(False, change_meta.is_deletion)
def enqueue_item(self, item): process_pillow_retry(item.object)