From 226f1439d0f07a69ebe89f8d58e13b18b0a90d9e Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Wed, 30 Apr 2014 10:30:49 +0200 Subject: [PATCH] SONAR-5237 - Moved Latching into Queue. Defaults to SYNCH --- .../org/sonar/core/cluster/NullQueue.java | 4 +- .../org/sonar/core/cluster/WorkQueue.java | 4 +- .../org/sonar/core/persistence/DbSession.java | 17 +----- .../core/persistence/AbstractDaoTestCase.java | 6 +- .../sonar/core/persistence/TestDatabase.java | 6 +- .../cluster/LocalNonBlockingWorkQueue.java | 31 +++++++--- .../server/platform/ServerComponents.java | 2 +- .../sonar/server/rule2/RuleDaoTest/empty.xml | 3 + .../rule2/RuleDaoTest/insert-result.xml | 33 ++++++++++ .../rule2/RuleDaoTest/insert_all-result.xml | 43 +++++++++++++ .../RuleDaoTest/insert_parameter-result.xml | 3 + .../rule2/RuleDaoTest/insert_parameter.xml | 3 + .../server/rule2/RuleDaoTest/selectAll.xml | 13 ++++ .../server/rule2/RuleDaoTest/selectById.xml | 6 ++ .../rule2/RuleDaoTest/selectNonManual.xml | 6 ++ .../rule2/RuleDaoTest/selectParameters.xml | 6 ++ .../rule2/RuleDaoTest/select_by_name.xml | 6 ++ .../rule2/RuleDaoTest/select_by_rule_key.xml | 6 ++ .../select_by_sub_characteristic_id.xml | 61 +++++++++++++++++++ .../select_enables_and_non_manual.xml | 27 ++++++++ .../select_parameters_by_rule_id.xml | 8 +++ .../select_parameters_by_rule_ids.xml | 7 +++ .../RuleDaoTest/select_tags_by_rule_id.xml | 11 ++++ .../RuleDaoTest/select_tags_by_rule_ids.xml | 11 ++++ .../rule2/RuleDaoTest/update-result.xml | 21 +++++++ .../sonar/server/rule2/RuleDaoTest/update.xml | 12 ++++ .../RuleDaoTest/update_parameter-result.xml | 3 + .../rule2/RuleDaoTest/update_parameter.xml | 3 + 28 files changed, 331 insertions(+), 31 deletions(-) create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/empty.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert-result.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_all-result.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter-result.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectAll.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectById.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectNonManual.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectParameters.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_name.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_rule_key.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_sub_characteristic_id.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_enables_and_non_manual.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_id.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_ids.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_id.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_ids.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update-result.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter-result.xml create mode 100644 sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter.xml diff --git a/sonar-core/src/main/java/org/sonar/core/cluster/NullQueue.java b/sonar-core/src/main/java/org/sonar/core/cluster/NullQueue.java index 4e1aebf0043..218685d78dc 100644 --- a/sonar-core/src/main/java/org/sonar/core/cluster/NullQueue.java +++ b/sonar-core/src/main/java/org/sonar/core/cluster/NullQueue.java @@ -19,6 +19,8 @@ */ package org.sonar.core.cluster; +import java.util.Collection; + public class NullQueue implements WorkQueue { @@ -29,7 +31,7 @@ public class NullQueue implements WorkQueue { } @Override - public void enqueue(Iterable actions) { + public void enqueue(Collection actions) { } } diff --git a/sonar-core/src/main/java/org/sonar/core/cluster/WorkQueue.java b/sonar-core/src/main/java/org/sonar/core/cluster/WorkQueue.java index c75d5b38e3b..b9f6b3c0db1 100644 --- a/sonar-core/src/main/java/org/sonar/core/cluster/WorkQueue.java +++ b/sonar-core/src/main/java/org/sonar/core/cluster/WorkQueue.java @@ -19,6 +19,8 @@ */ package org.sonar.core.cluster; +import java.util.Collection; + @@ -26,7 +28,7 @@ public interface WorkQueue { void enqueue(QueueAction action); - void enqueue(Iterable actions); + void enqueue(Collection actions); /* This is because of core vs server packages... */ // void enqueue(ClusterAction.Type type, ClusterAction.Method method, String ref, Serializable key); diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DbSession.java b/sonar-core/src/main/java/org/sonar/core/persistence/DbSession.java index 3e9ee5a996c..4b5dcaa89b0 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DbSession.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DbSession.java @@ -54,29 +54,16 @@ public class DbSession implements SqlSession { this.actions.add(action); } - private void enqueueActions(){ - CountDownLatch latch = new CountDownLatch(actions.size()); - for(QueueAction action:actions){ - action.setLatch(latch); - queue.enqueue(action); - } - try { - latch.await(); - } catch (InterruptedException e) { - LOG.error("ES update has been interrupted: {}",e.getMessage()); - } - } - @Override public void commit() { session.commit(); - enqueueActions(); + queue.enqueue(actions); } @Override public void commit(boolean force) { session.commit(force); - enqueueActions(); + queue.enqueue(actions); } /** diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java b/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java index 26843e8e90d..f4db47a783e 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/AbstractDaoTestCase.java @@ -19,8 +19,9 @@ */ package org.sonar.core.persistence; -import org.sonar.core.cluster.WorkQueue; +import org.sonar.core.cluster.NullQueue; +import org.sonar.core.cluster.WorkQueue; import com.google.common.collect.Maps; import com.google.common.io.Closeables; import org.apache.commons.io.FileUtils; @@ -56,7 +57,6 @@ import java.util.Map; import java.util.Properties; import static org.mockito.Mockito.mock; - import static org.junit.Assert.fail; public abstract class AbstractDaoTestCase { @@ -65,7 +65,7 @@ public abstract class AbstractDaoTestCase { private static DatabaseCommands databaseCommands; private static IDatabaseTester databaseTester; private static MyBatis myBatis; - private WorkQueue queue = mock(WorkQueue.class); + private WorkQueue queue = new NullQueue(); @Before diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java b/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java index a8c5dd16d5c..6f9941d0966 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/TestDatabase.java @@ -19,8 +19,9 @@ */ package org.sonar.core.persistence; -import org.sonar.core.cluster.WorkQueue; +import org.sonar.core.cluster.NullQueue; +import org.sonar.core.cluster.WorkQueue; import com.google.common.collect.Maps; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.dbutils.DbUtils; @@ -65,7 +66,6 @@ import java.util.Map; import java.util.Properties; import static org.mockito.Mockito.mock; - import static org.junit.Assert.fail; /** @@ -80,7 +80,7 @@ public class TestDatabase extends ExternalResource { private DatabaseCommands commands; private IDatabaseTester tester; private MyBatis myBatis; - private WorkQueue queue = mock(WorkQueue.class); + private WorkQueue queue = new NullQueue(); private String schemaPath = null; public TestDatabase schema(Class baseClass, String filename) { diff --git a/sonar-server/src/main/java/org/sonar/server/cluster/LocalNonBlockingWorkQueue.java b/sonar-server/src/main/java/org/sonar/server/cluster/LocalNonBlockingWorkQueue.java index 8afcdb10c64..c11204912c7 100644 --- a/sonar-server/src/main/java/org/sonar/server/cluster/LocalNonBlockingWorkQueue.java +++ b/sonar-server/src/main/java/org/sonar/server/cluster/LocalNonBlockingWorkQueue.java @@ -19,33 +19,50 @@ */ package org.sonar.server.cluster; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.sonar.api.ServerComponent; import org.sonar.core.cluster.QueueAction; import org.sonar.core.cluster.WorkQueue; +import java.util.Collection; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class LocalNonBlockingWorkQueue extends LinkedBlockingQueue - implements ServerComponent, WorkQueue{ + implements ServerComponent, WorkQueue { + + private static final Logger LOG = LoggerFactory.getLogger(LocalNonBlockingWorkQueue.class); - public LocalNonBlockingWorkQueue(){ + public LocalNonBlockingWorkQueue() { super(); } @Override public void enqueue(QueueAction action) { + CountDownLatch latch = new CountDownLatch(1); + action.setLatch(latch); try { - this.offer(action, 1000,TimeUnit.SECONDS); + this.offer(action, 1000, TimeUnit.SECONDS); + latch.await(); } catch (InterruptedException e) { - //TODO throw a runtime error here. + LOG.error("ES update has been interrupted: {}", e.getMessage()); } } @Override - public void enqueue(Iterable actions) { - for (QueueAction action : actions) { - enqueue(action); + public void enqueue(Collection actions) { + CountDownLatch latch = new CountDownLatch(actions.size()); + try { + for (QueueAction action : actions) { + action.setLatch(latch); + this.offer(action, 1000, TimeUnit.SECONDS); + } + latch.await(); + } catch (InterruptedException e) { + LOG.error("ES update has been interrupted: {}", e.getMessage()); } } } diff --git a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index 4b3521cac18..28bda726b6b 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -176,7 +176,7 @@ class ServerComponents { System2.INSTANCE, /* new RuleDao working with ES */ - RuleDao.class + org.sonar.server.rule2.RuleDao.class )); components.addAll(CorePropertyDefinitions.all()); components.addAll(DatabaseMigrations.CLASSES); diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/empty.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/empty.xml new file mode 100644 index 00000000000..871dedcb5e9 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/empty.xml @@ -0,0 +1,3 @@ + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert-result.xml new file mode 100644 index 00000000000..e7e1d53d554 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert-result.xml @@ -0,0 +1,33 @@ + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_all-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_all-result.xml new file mode 100644 index 00000000000..878e3d586ed --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_all-result.xml @@ -0,0 +1,43 @@ + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter-result.xml new file mode 100644 index 00000000000..5208b7a4a4c --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter-result.xml @@ -0,0 +1,3 @@ + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter.xml new file mode 100644 index 00000000000..871dedcb5e9 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/insert_parameter.xml @@ -0,0 +1,3 @@ + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectAll.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectAll.xml new file mode 100644 index 00000000000..04f7a7fb3da --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectAll.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectById.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectById.xml new file mode 100644 index 00000000000..dc8fe1e2615 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectById.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectNonManual.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectNonManual.xml new file mode 100644 index 00000000000..f5b69dc8f87 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectNonManual.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectParameters.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectParameters.xml new file mode 100644 index 00000000000..9753a48c8f0 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/selectParameters.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_name.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_name.xml new file mode 100644 index 00000000000..dc8fe1e2615 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_name.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_rule_key.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_rule_key.xml new file mode 100644 index 00000000000..dc8fe1e2615 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_rule_key.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_sub_characteristic_id.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_sub_characteristic_id.xml new file mode 100644 index 00000000000..a6677ee6b63 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_by_sub_characteristic_id.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_enables_and_non_manual.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_enables_and_non_manual.xml new file mode 100644 index 00000000000..b29914ea915 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_enables_and_non_manual.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_id.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_id.xml new file mode 100644 index 00000000000..3b21b8a8ae9 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_id.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_ids.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_ids.xml new file mode 100644 index 00000000000..5d840d5998d --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_parameters_by_rule_ids.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_id.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_id.xml new file mode 100644 index 00000000000..8d252e540b4 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_id.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_ids.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_ids.xml new file mode 100644 index 00000000000..8d252e540b4 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/select_tags_by_rule_ids.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update-result.xml new file mode 100644 index 00000000000..5c2ad7484e4 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update-result.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update.xml new file mode 100644 index 00000000000..d7e11ca1d24 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter-result.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter-result.xml new file mode 100644 index 00000000000..d61889441d9 --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter-result.xml @@ -0,0 +1,3 @@ + + + diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter.xml b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter.xml new file mode 100644 index 00000000000..5208b7a4a4c --- /dev/null +++ b/sonar-server/src/test/resources/org/sonar/server/rule2/RuleDaoTest/update_parameter.xml @@ -0,0 +1,3 @@ + + + -- 2.39.5