From 7b458e820fa2298aaeef3febac4467bc868965d5 Mon Sep 17 00:00:00 2001 From: Daniel Schwarz Date: Mon, 10 Apr 2017 11:28:39 +0200 Subject: [PATCH] SONAR-8952 fix rules: initialize uninitialized indexes on startup --- .../rule/index/RuleIndexDefinition.java | 2 +- .../sonar/server/rule/index/RuleIndexer.java | 39 ++++++++++++++++++- .../server/issue/index/IssueIndexTest.java | 2 +- .../sonar/server/issue/ws/TagsActionTest.java | 2 +- .../ws/ChangeParentActionTest.java | 4 +- .../qualityprofile/ws/CreateActionTest.java | 2 +- .../ws/InheritanceActionTest.java | 2 +- .../sonar/server/rule/RegisterRulesTest.java | 2 +- .../server/rule/index/RuleIndexTest.java | 2 +- .../server/rule/index/RuleIndexerTest.java | 15 ++++++- 10 files changed, 61 insertions(+), 11 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java index 9f94a9042f8..9d15fea2e19 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexDefinition.java @@ -38,7 +38,7 @@ import static org.sonar.server.es.DefaultIndexSettingsElement.SORTABLE_ANALYZER; */ public class RuleIndexDefinition implements IndexDefinition { - private static final String INDEX = "rules"; + static final String INDEX = "rules"; public static final IndexType INDEX_TYPE_RULE = new IndexType(INDEX, "rule"); public static final String FIELD_RULE_KEY = "key"; diff --git a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java index 63e8ef982ac..5c46815529e 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndexer.java @@ -20,25 +20,60 @@ package org.sonar.server.rule.index; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import org.elasticsearch.action.index.IndexRequest; import org.sonar.api.rule.RuleKey; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; import org.sonar.db.organization.OrganizationDto; import org.sonar.server.es.BulkIndexer; import org.sonar.server.es.BulkIndexer.Size; import org.sonar.server.es.EsClient; +import org.sonar.server.es.IndexType; +import org.sonar.server.es.StartupIndexer; +import org.sonar.server.organization.DefaultOrganizationProvider; import static org.sonar.server.rule.index.RuleIndexDefinition.INDEX_TYPE_RULE; -public class RuleIndexer { +public class RuleIndexer implements StartupIndexer { private final EsClient esClient; + private final DbClient dbClient; private final RuleIteratorFactory ruleIteratorFactory; + private final DefaultOrganizationProvider defaultOrganizationProvider; - public RuleIndexer(EsClient esClient, RuleIteratorFactory ruleIteratorFactory) { + public RuleIndexer(EsClient esClient, DbClient dbClient, RuleIteratorFactory ruleIteratorFactory, DefaultOrganizationProvider defaultOrganizationProvider) { this.esClient = esClient; + this.dbClient = dbClient; this.ruleIteratorFactory = ruleIteratorFactory; + this.defaultOrganizationProvider = defaultOrganizationProvider; + } + + @Override + public Set getIndexTypes() { + return ImmutableSet.of(INDEX_TYPE_RULE); + } + + @Override + public void indexOnStartup(Set uninitializedIndexTypes) { + BulkIndexer bulk = new BulkIndexer(esClient, RuleIndexDefinition.INDEX).setSize(Size.LARGE); + + // index all definitions and system extensions + if (uninitializedIndexTypes.contains(INDEX_TYPE_RULE)) { + try(DbSession dbSession = dbClient.openSession(false)) { + + String defaultOrganizationUuid = defaultOrganizationProvider.get().getUuid(); + OrganizationDto defaultOrganization = dbClient.organizationDao().selectByUuid(dbSession, defaultOrganizationUuid) + .orElseThrow(() -> new IllegalStateException(String.format("Cannot load default organization for uuid '%s'", defaultOrganizationUuid))); + + try (RuleIterator rules = new RuleIteratorForSingleChunk(dbClient, defaultOrganization, null)) { + doIndex(bulk, rules); + } + } + } } public void index(OrganizationDto organization, RuleKey ruleKey) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java index 2d58d6dd5bb..4b86f20ec20 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/index/IssueIndexTest.java @@ -95,7 +95,7 @@ public class IssueIndexTest { private IssueIndexer issueIndexer = new IssueIndexer(tester.client(), new IssueIteratorFactory(null)); private ViewIndexer viewIndexer = new ViewIndexer(null, tester.client()); - private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null); + private RuleIndexer ruleIndexer = new RuleIndexer(tester.client(), null, null, null); private PermissionIndexerTester authorizationIndexerTester = new PermissionIndexerTester(tester, issueIndexer); private IssueIndex underTest = new IssueIndex(tester.client(), system2, userSessionRule, new AuthorizationTypeSupport(userSessionRule)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java index 38b12219a5e..25410a41e22 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/TagsActionTest.java @@ -63,7 +63,7 @@ public class TagsActionTest { public EsTester es = new EsTester(new IssueIndexDefinition(new MapSettings()), new RuleIndexDefinition(new MapSettings())); private IssueIndexer issueIndexer = new IssueIndexer(es.client(), new IssueIteratorFactory(db.getDbClient())); - private RuleIndexer ruleIndexer = new RuleIndexer(es.client(), new RuleIteratorFactory(db.getDbClient())); + private RuleIndexer ruleIndexer = new RuleIndexer(es.client(), null, new RuleIteratorFactory(db.getDbClient()), null); private IssueIndex issueIndex = new IssueIndex(es.client(), System2.INSTANCE, userSession, new AuthorizationTypeSupport(userSession)); private WsActionTester tester = new WsActionTester(new TagsAction(issueIndex)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java index faf25a4e75b..bf47fd48f42 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/ChangeParentActionTest.java @@ -105,7 +105,9 @@ public class ChangeParentActionTest { TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); ruleIndexer = new RuleIndexer( esClient, - new RuleIteratorFactory(dbClient) + null, + new RuleIteratorFactory(dbClient), + null ); activeRuleIndexer = new ActiveRuleIndexer( System2.INSTANCE, diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java index 24626a4b1f0..f8af26088bd 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/CreateActionTest.java @@ -94,7 +94,7 @@ public class CreateActionTest { private DbSession dbSession = dbTester.getSession(); private RuleIndex ruleIndex = new RuleIndex(esTester.client()); private DefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); - private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient)); + private RuleIndexer ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null); private ActiveRuleIndexer activeRuleIndexer = new ActiveRuleIndexer(system2, dbClient, esTester.client()); private ProfileImporter[] profileImporters = createImporters(); private QProfileExporters qProfileExporters = new QProfileExporters(dbClient, null, diff --git a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java index 8114a770215..e97f2e6c1f3 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/qualityprofile/ws/InheritanceActionTest.java @@ -85,7 +85,7 @@ public class InheritanceActionTest { dbClient = dbTester.getDbClient(); dbSession = dbTester.getSession(); esClient = esTester.client(); - ruleIndexer = new RuleIndexer(esClient, new RuleIteratorFactory(dbClient)); + ruleIndexer = new RuleIndexer(esClient, null, new RuleIteratorFactory(dbClient), null); activeRuleIndexer = new ActiveRuleIndexer(System2.INSTANCE, dbClient, esClient); TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); underTest = new InheritanceAction( diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java index 11ed26165b7..5264385530c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RegisterRulesTest.java @@ -86,7 +86,7 @@ public class RegisterRulesTest { @Before public void before() { when(system.now()).thenReturn(DATE1.getTime()); - ruleIndexer = new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbClient)); + ruleIndexer = new RuleIndexer(esTester.client(), null, new RuleIteratorFactory(dbClient), null); ruleIndex = new RuleIndex(esTester.client()); activeRuleIndexer = new ActiveRuleIndexer(system, dbClient, esTester.client()); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java index f20dfc7dc5a..2e14dd23c99 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexTest.java @@ -85,7 +85,7 @@ public class RuleIndexTest { @Before public void setUp() { - ruleIndexer = new RuleIndexer(tester.client(), null); + ruleIndexer = new RuleIndexer(tester.client(), null, null, null); activeRuleIndexer = new ActiveRuleIndexer(system2, null, tester.client()); index = new RuleIndex(tester.client()); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java index fc9323266b3..f4581fd1e96 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/index/RuleIndexerTest.java @@ -34,6 +34,7 @@ import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleDto; import org.sonar.server.es.EsTester; +import org.sonar.server.organization.TestDefaultOrganizationProvider; import static com.google.common.collect.Sets.newHashSet; import static org.assertj.core.api.Assertions.assertThat; @@ -108,8 +109,20 @@ public class RuleIndexerTest { assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1); } + @Test + public void index_on_startup() { + RuleIndexer indexer = createIndexer(); + + // Create and Index rule + dbClient.ruleDao().insert(dbSession, rule.setStatus(RuleStatus.READY)); + dbSession.commit(); + + indexer.indexOnStartup(indexer.getIndexTypes()); + assertThat(esTester.countDocuments(RuleIndexDefinition.INDEX_TYPE_RULE)).isEqualTo(1); + } + private RuleIndexer createIndexer() { - return new RuleIndexer(esTester.client(), new RuleIteratorFactory(dbTester.getDbClient())); + return new RuleIndexer(esTester.client(), dbClient, new RuleIteratorFactory(dbTester.getDbClient()), TestDefaultOrganizationProvider.from(dbTester)); } } -- 2.39.5