From 5f97303009f20fdf47d70f9ba3edaa0337ac16a5 Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Tue, 23 Sep 2014 13:18:10 +0200 Subject: [PATCH] SONAR-5531 - Optimized Synchronizer (no upsert) --- .../java/org/sonar/server/db/BaseDao.java | 4 +- .../org/sonar/server/search/IndexQueue.java | 8 +++- .../issue/db/IssueBackendMediumTest.java | 1 + .../server/rule/RuleBackendMediumTest.java | 44 +++++++++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java index 6dcffcc43b9..165246d5036 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java @@ -34,6 +34,7 @@ import org.sonar.server.search.DbSynchronizationHandler; import org.sonar.server.search.IndexDefinition; import org.sonar.server.search.action.DeleteKey; import org.sonar.server.search.action.DeleteNestedItem; +import org.sonar.server.search.action.InsertDto; import org.sonar.server.search.action.RefreshIndex; import org.sonar.server.search.action.UpsertDto; import org.sonar.server.search.action.UpsertNestedItem; @@ -328,7 +329,8 @@ public abstract class BaseDao, KEY extends Serializ @Override public void handleResult(ResultContext resultContext) { DTO dto = (DTO) resultContext.getResultObject(); - session.enqueue(new UpsertDto(getIndexType(), dto, false)); + // session.enqueue(new UpsertDto(getIndexType(), dto, false)); + session.enqueue(new InsertDto(getIndexType(), dto, false)); count++; if (count % 100000 == 0) { LOGGER.info(" - synchronized {} {}", count, getIndexType()); diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java index 79a59ef8502..3b6bd8d0cc5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java @@ -26,6 +26,7 @@ import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; +import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.update.UpdateRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -138,7 +139,12 @@ public class IndexQueue implements ServerComponent, WorkQueue> { List>> requests = executorService.invokeAll(actions, 20, TimeUnit.SECONDS); for (Future> updates : requests) { for (ActionRequest update : updates.get()) { - if (UpdateRequest.class.isAssignableFrom(update.getClass())) { + + if (IndexRequest.class.isAssignableFrom(update.getClass())) { + bulkRequestBuilder.add(((IndexRequest) update)); + } + + else if (UpdateRequest.class.isAssignableFrom(update.getClass())) { bulkRequestBuilder.add(((UpdateRequest) update)); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java index 7cae13f4c4d..0f01ef1b934 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java @@ -160,6 +160,7 @@ public class IssueBackendMediumTest { .setRootComponentKey(project.key()) .setComponentId(resource.getId()) .setComponentKey(resource.key()) + .setRule(rule) .setStatus("OPEN").setResolution("OPEN") .setKee(UUID.randomUUID().toString()); dbClient.issueDao().insert(dbSession, issue); diff --git a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java index 54f914775de..b805a2babf4 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java @@ -33,6 +33,7 @@ import org.sonar.core.rule.RuleParamDto; import org.sonar.core.technicaldebt.db.CharacteristicDto; import org.sonar.server.db.DbClient; import org.sonar.server.debt.DebtTesting; +import org.sonar.server.platform.Platform; import org.sonar.server.rule.db.RuleDao; import org.sonar.server.rule.index.RuleDoc; import org.sonar.server.rule.index.RuleIndex; @@ -435,4 +436,47 @@ public class RuleBackendMediumTest { assertThat(rules).hasSize(1); assertThat(rules.get(0).key()).isEqualTo(RuleTesting.XOO_X1); } + + @Test + public void synchronize_after() { + // insert db + dao.insert(dbSession, + RuleTesting.newXooX1()); + dbSession.commit(); + + // 0. Assert rules are in DB + assertThat(dao.findAll(dbSession)).hasSize(1); + assertThat(index.countAll()).isEqualTo(1); + + tester.clearIndexes(); + assertThat(index.countAll()).isEqualTo(0); + + tester.get(Platform.class).executeStartupTasks(); + assertThat(index.countAll()).isEqualTo(1); + + } + + @Test + public void synchronize_after_with_nested() { + RuleDto rule = RuleTesting.newXooX1(); + + // insert db + dao.insert(dbSession, rule); + + dao.addRuleParam(dbSession, rule, RuleParamDto.createFor(rule).setName("MyParam").setType("STRING").setDefaultValue("test")); + dbSession.commit(); + + // 0. Assert rules are in DB + assertThat(dao.findAll(dbSession)).hasSize(1); + assertThat(index.countAll()).isEqualTo(1); + + tester.clearIndexes(); + assertThat(index.countAll()).isEqualTo(0); + + tester.get(Platform.class).executeStartupTasks(); + assertThat(index.countAll()).isEqualTo(1); + + assertThat(index.getByKey(rule.getKey()).param("MyParam").defaultValue()).isEqualTo("test"); + + } } -- 2.39.5