@Test public void errors_during_indexing_are_recovered() { ComponentDto project = db.components().insertPrivateProject(); ComponentDto file = db.components().insertComponent(newFileDto(project)); es.lockWrites(INDEX_TYPE_COMPONENT); IndexingResult result = indexProject(project, PROJECT_CREATION); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(2L); // index is still read-only, fail to recover result = recover(); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(2L); assertThat(es.countDocuments(INDEX_TYPE_COMPONENT)).isEqualTo(0); es.unlockWrites(INDEX_TYPE_COMPONENT); result = recover(); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(0L); assertThatIndexContainsOnly(project, file); }
@Test public void errors_during_project_deletion_are_recovered() { addIssueToIndex("P1", "I1"); assertThatIndexHasSize(1); es.lockWrites(INDEX_TYPE_ISSUE); IndexingResult result = indexProject("P1", ProjectIndexer.Cause.PROJECT_DELETION); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); // index is still read-only, fail to recover result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); assertThatIndexHasSize(1); es.unlockWrites(INDEX_TYPE_ISSUE); result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(0L); assertThatIndexHasSize(0); }
@Test public void errors_during_indexing_are_recovered() { ComponentDto project = db.components().insertPrivateProject(); es.lockWrites(INDEX_TYPE_PROJECT_MEASURES); IndexingResult result = indexProject(project, PROJECT_CREATION); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); // index is still read-only, fail to recover result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); assertThat(es.countDocuments(INDEX_TYPE_PROJECT_MEASURES)).isEqualTo(0); assertThatEsQueueTableHasSize(1); es.unlockWrites(INDEX_TYPE_PROJECT_MEASURES); result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(0L); assertThatEsQueueTableHasSize(0); assertThatIndexContainsOnly(project); }
@Test public void errors_during_indexing_are_recovered() { ComponentDto project = createAndIndexPublicProject(); es.lockWrites(INDEX_TYPE_FOO_AUTH); IndexingResult result = indexPermissions(project, PERMISSION_CHANGE); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); // index is still read-only, fail to recover result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(1L); assertThatAuthIndexHasSize(0); assertThatEsQueueTableHasSize(1); es.unlockWrites(INDEX_TYPE_FOO_AUTH); result = recover(); assertThat(result.getTotal()).isEqualTo(1L); assertThat(result.getFailures()).isEqualTo(0L); verifyAnyoneAuthorized(project); assertThatEsQueueTableHasSize(0); }
@Test public void deleteByKeys_does_not_recover_from_errors() { addIssueToIndex("P1", "Issue1"); es.lockWrites(INDEX_TYPE_ISSUE); try { // FIXME : test also message expectedException.expect(IllegalStateException.class); underTest.deleteByKeys("P1", asList("Issue1")); } finally { assertThatIndexHasOnly("Issue1"); assertThatEsQueueTableHasSize(0); es.unlockWrites(INDEX_TYPE_ISSUE); } }
@Test public void indexOnStartup_does_not_fail_on_errors_and_does_enable_recovery_mode() { es.lockWrites(INDEX_TYPE_ISSUE); db.issues().insertIssue(organization); try { // FIXME : test also message expectedException.expect(IllegalStateException.class); underTest.indexOnStartup(emptySet()); } finally { assertThatIndexHasSize(0); assertThatEsQueueTableHasSize(0); es.unlockWrites(INDEX_TYPE_ISSUE); } }
@Test public void indexing_recovers_multiple_errors_on_the_same_project() { RuleDefinitionDto rule = db.rules().insert(); ComponentDto project = db.components().insertPrivateProject(organization); ComponentDto file = db.components().insertComponent(newFileDto(project)); IssueDto issue1 = db.issues().insertIssue(IssueTesting.newIssue(rule, project, file)); IssueDto issue2 = db.issues().insertIssue(IssueTesting.newIssue(rule, project, file)); es.lockWrites(INDEX_TYPE_ISSUE); IndexingResult result = indexProject(project.uuid(), ProjectIndexer.Cause.PROJECT_DELETION); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(2L); // index is still read-only, fail to recover result = recover(); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(2L); assertThatIndexHasSize(0); es.unlockWrites(INDEX_TYPE_ISSUE); result = recover(); assertThat(result.getTotal()).isEqualTo(2L); assertThat(result.getFailures()).isEqualTo(0L); assertThatIndexHasSize(2); assertThatEsQueueTableHasSize(0); }
@Test public void commitAndIndex_keeps_elements_to_recover_in_ES_QUEUE_on_errors() { ActiveRuleDto ar = db.qualityProfiles().activateRule(profile1, rule1); es.lockWrites(INDEX_TYPE_ACTIVE_RULE); commitAndIndex(rule1, ar); EsQueueDto expectedItem = EsQueueDto.create(INDEX_TYPE_ACTIVE_RULE.format(), "" + ar.getId(), "activeRuleId", valueOf(ar.getRuleId())); assertThatEsQueueContainsExactly(expectedItem); es.unlockWrites(INDEX_TYPE_ACTIVE_RULE); }
@Test public void indexing_recovers_multiple_errors_on_the_same_issue() { es.lockWrites(INDEX_TYPE_ISSUE); IssueDto issue = db.issues().insertIssue(organization); // three changes on the same issue underTest.commitAndIndexIssues(db.getSession(), asList(issue)); underTest.commitAndIndexIssues(db.getSession(), asList(issue)); underTest.commitAndIndexIssues(db.getSession(), asList(issue)); assertThatIndexHasSize(0); // three attempts of indexing are stored in es_queue recovery table assertThatEsQueueTableHasSize(3); es.unlockWrites(INDEX_TYPE_ISSUE); recover(); assertThatIndexHasOnly(issue); assertThatEsQueueTableHasSize(0); }
@Test public void indexing_errors_during_commitAndIndexIssues_are_recovered() { RuleDefinitionDto rule = db.rules().insert(); ComponentDto project = db.components().insertPrivateProject(organization); ComponentDto file = db.components().insertComponent(newFileDto(project)); // insert issues in db without committing IssueDto issue1 = IssueTesting.newIssue(rule, project, file); IssueDto issue2 = IssueTesting.newIssue(rule, project, file); db.getDbClient().issueDao().insert(db.getSession(), issue1, issue2); // index is read-only es.lockWrites(INDEX_TYPE_ISSUE); underTest.commitAndIndexIssues(db.getSession(), asList(issue1, issue2)); // issues are persisted but not indexed assertThatIndexHasSize(0); assertThatDbHasOnly(issue1, issue2); assertThatEsQueueTableHasSize(2); // re-enable write on index es.unlockWrites(INDEX_TYPE_ISSUE); // emulate the recovery daemon IndexingResult result = recover(); assertThatEsQueueTableHasSize(0); assertThatIndexHasOnly(issue1, issue2); assertThat(result.isSuccess()).isTrue(); assertThat(result.getTotal()).isEqualTo(2L); }
/** * Indexing recovery is handled by Compute Engine, without using * the table es_queue */ @Test public void indexOnAnalysis_does_not_fail_on_errors_and_does_not_enable_recovery_mode() { es.lockWrites(INDEX_TYPE_ISSUE); IssueDto issue = db.issues().insertIssue(organization); try { // FIXME : test also message expectedException.expect(IllegalStateException.class); underTest.indexOnAnalysis(issue.getProjectUuid()); } finally { assertThatIndexHasSize(0); assertThatEsQueueTableHasSize(0); es.unlockWrites(INDEX_TYPE_ISSUE); } }