]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5531 - Optimized Synchronizer (no upsert)
authorStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 23 Sep 2014 11:18:10 +0000 (13:18 +0200)
committerStephane Gamard <stephane.gamard@sonarsource.com>
Tue, 23 Sep 2014 11:58:17 +0000 (13:58 +0200)
server/sonar-server/src/main/java/org/sonar/server/db/BaseDao.java
server/sonar-server/src/main/java/org/sonar/server/search/IndexQueue.java
server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/rule/RuleBackendMediumTest.java

index 6dcffcc43b9f87f1251c500dd5b378321e601876..165246d5036f0a83137668efd687c6f081f452e9 100644 (file)
@@ -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<MAPPER, DTO extends Dto<KEY>, KEY extends Serializ
       @Override
       public void handleResult(ResultContext resultContext) {
         DTO dto = (DTO) resultContext.getResultObject();
-        session.enqueue(new UpsertDto<DTO>(getIndexType(), dto, false));
+        // session.enqueue(new UpsertDto<DTO>(getIndexType(), dto, false));
+        session.enqueue(new InsertDto<DTO>(getIndexType(), dto, false));
         count++;
         if (count % 100000 == 0) {
           LOGGER.info(" - synchronized {} {}", count, getIndexType());
index 79a59ef8502d79d40f5c1ce49140edc8bac1e671..3b6bd8d0cc5b1447969d19af238b24207a4922d7 100644 (file)
@@ -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<IndexAction<?>> {
       List<Future<List<? extends ActionRequest>>> requests = executorService.invokeAll(actions, 20, TimeUnit.SECONDS);
       for (Future<List<? extends ActionRequest>> 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));
           }
 
index 7cae13f4c4d6f6f7fd0e2b9eb29561337b76de33..0f01ef1b934b006488a398b1932443d31ac0bc5a 100644 (file)
@@ -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);
index 54f914775de8f1f67df5644cd0c1c100b5ded1dc..b805a2babf4edd8c83ddb05727c1beb7beff8e3d 100644 (file)
@@ -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");
+
+  }
 }