diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2017-09-15 14:05:57 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@sonarsource.com> | 2017-09-26 23:49:37 +0200 |
commit | e4c401f8bc9100fec7fd28bb93469d3de199f5f7 (patch) | |
tree | e07cd247c43059bedf5b0bc5c85c12d232c8f82a /server/sonar-ce | |
parent | f6226c06c40855028ae7f8266e9ae36c8eeca618 (diff) | |
download | sonarqube-e4c401f8bc9100fec7fd28bb93469d3de199f5f7.tar.gz sonarqube-e4c401f8bc9100fec7fd28bb93469d3de199f5f7.zip |
SONAR-9802 replace Hazelcast clients by members
Web Server and Compute Engine processes must use
plain HZ members but not clients so that they can
be involved in distributed computing (contribute to
api/system/info response)
Diffstat (limited to 'server/sonar-ce')
5 files changed, 43 insertions, 56 deletions
diff --git a/server/sonar-ce/src/main/java/org/sonar/ce/CeDistributedInformationImpl.java b/server/sonar-ce/src/main/java/org/sonar/ce/CeDistributedInformationImpl.java index ee5b14c8754..23152f3521a 100644 --- a/server/sonar-ce/src/main/java/org/sonar/ce/CeDistributedInformationImpl.java +++ b/server/sonar-ce/src/main/java/org/sonar/ce/CeDistributedInformationImpl.java @@ -25,27 +25,27 @@ import java.util.Set; import java.util.concurrent.locks.Lock; import org.picocontainer.Startable; import org.sonar.ce.taskprocessor.CeWorkerFactory; -import org.sonar.process.cluster.ClusterObjectKeys; -import org.sonar.process.cluster.HazelcastClient; +import org.sonar.process.cluster.hz.HazelcastObjects; +import org.sonar.process.cluster.hz.HazelcastMember; import static org.sonar.core.util.stream.MoreCollectors.toSet; -import static org.sonar.process.cluster.ClusterObjectKeys.WORKER_UUIDS; +import static org.sonar.process.cluster.hz.HazelcastObjects.WORKER_UUIDS; /** * Provide the set of worker's UUID in a clustered SonarQube instance */ public class CeDistributedInformationImpl implements CeDistributedInformation, Startable { - private final HazelcastClient hazelcastClient; + private final HazelcastMember hazelcastMember; private final CeWorkerFactory ceCeWorkerFactory; - public CeDistributedInformationImpl(HazelcastClient hazelcastClient, CeWorkerFactory ceCeWorkerFactory) { - this.hazelcastClient = hazelcastClient; + public CeDistributedInformationImpl(HazelcastMember hazelcastMember, CeWorkerFactory ceCeWorkerFactory) { + this.hazelcastMember = hazelcastMember; this.ceCeWorkerFactory = ceCeWorkerFactory; } @Override public Set<String> getWorkerUUIDs() { - Set<String> connectedWorkerUUIDs = hazelcastClient.getMemberUuids(); + Set<String> connectedWorkerUUIDs = hazelcastMember.getMemberUuids(); return getClusteredWorkerUUIDs().entrySet().stream() .filter(e -> connectedWorkerUUIDs.contains(e.getKey())) @@ -56,12 +56,12 @@ public class CeDistributedInformationImpl implements CeDistributedInformation, S @Override public void broadcastWorkerUUIDs() { - getClusteredWorkerUUIDs().put(hazelcastClient.getUUID(), ceCeWorkerFactory.getWorkerUUIDs()); + getClusteredWorkerUUIDs().put(hazelcastMember.getUuid(), ceCeWorkerFactory.getWorkerUUIDs()); } @Override public Lock acquireCleanJobLock() { - return hazelcastClient.getLock(ClusterObjectKeys.CE_CLEANING_JOB_LOCK); + return hazelcastMember.getLock(HazelcastObjects.CE_CLEANING_JOB_LOCK); } @Override @@ -72,10 +72,10 @@ public class CeDistributedInformationImpl implements CeDistributedInformation, S @Override public void stop() { // Removing the worker UUIDs - getClusteredWorkerUUIDs().remove(hazelcastClient.getUUID()); + getClusteredWorkerUUIDs().remove(hazelcastMember.getUuid()); } private Map<String, Set<String>> getClusteredWorkerUUIDs() { - return hazelcastClient.getReplicatedMap(WORKER_UUIDS); + return hazelcastMember.getReplicatedMap(WORKER_UUIDS); } } diff --git a/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java b/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java index 16529cd55e0..b443c7f6894 100644 --- a/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java +++ b/server/sonar-ce/src/main/java/org/sonar/ce/container/ComputeEngineContainerImpl.java @@ -73,16 +73,17 @@ import org.sonar.db.DatabaseChecker; import org.sonar.db.DbClient; import org.sonar.db.DefaultDatabase; import org.sonar.db.purge.PurgeProfiler; +import org.sonar.process.NetworkUtils; +import org.sonar.process.ProcessProperties; import org.sonar.process.Props; -import org.sonar.process.cluster.ClusterProperties; import org.sonar.process.logging.LogbackHelper; +import org.sonar.server.cluster.StartableHazelcastMember; import org.sonar.server.component.ComponentFinder; import org.sonar.server.component.index.ComponentIndexer; import org.sonar.server.computation.task.projectanalysis.ProjectAnalysisTaskModule; import org.sonar.server.debt.DebtModelPluginRepository; import org.sonar.server.debt.DebtRulesXMLImporter; import org.sonar.server.event.NewAlerts; -import org.sonar.server.hz.HazelcastLocalClient; import org.sonar.server.issue.IssueFieldsSetter; import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.issue.index.IssueIndexer; @@ -234,6 +235,7 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { SonarRuntimeImpl.forSonarQube(ApiVersion.load(System2.INSTANCE), SonarQubeSide.COMPUTE_ENGINE), CeProcessLogging.class, UuidFactoryImpl.INSTANCE, + NetworkUtils.INSTANCE, WebServerImpl.class, LogbackHelper.class, DefaultDatabase.class, @@ -417,9 +419,9 @@ public class ComputeEngineContainerImpl implements ComputeEngineContainer { // cleaning CeCleaningModule.class); - if (props.valueAsBoolean(ClusterProperties.CLUSTER_ENABLED)) { + if (props.valueAsBoolean(ProcessProperties.CLUSTER_ENABLED)) { container.add( - HazelcastLocalClient.class, + StartableHazelcastMember.class, CeDistributedInformationImpl.class); } else { container.add(StandaloneCeDistributedInformation.class); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/CeDistributedInformationImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/CeDistributedInformationImplTest.java index 638b01d43ea..8792800ce5c 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/CeDistributedInformationImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/CeDistributedInformationImplTest.java @@ -27,13 +27,13 @@ import java.util.Map; import java.util.Set; import org.junit.Test; import org.sonar.ce.taskprocessor.CeWorkerFactory; -import org.sonar.server.hz.HazelcastLocalClient; +import org.sonar.server.cluster.StartableHazelcastMember; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.MapEntry.entry; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.sonar.process.cluster.ClusterObjectKeys.WORKER_UUIDS; +import static org.sonar.process.cluster.hz.HazelcastObjects.WORKER_UUIDS; public class CeDistributedInformationImplTest { private String clientUUID1 = "1"; @@ -45,11 +45,11 @@ public class CeDistributedInformationImplTest { clientUUID3, ImmutableSet.of("4", "5", "6") ); - private HazelcastLocalClient hzClientWrapper = mock(HazelcastLocalClient.class); + private StartableHazelcastMember hzClientWrapper = mock(StartableHazelcastMember.class); @Test public void getWorkerUUIDs_returns_union_of_workers_uuids_of_local_and_cluster_worker_uuids() { - when(hzClientWrapper.getUUID()).thenReturn(clientUUID1); + when(hzClientWrapper.getUuid()).thenReturn(clientUUID1); when(hzClientWrapper.getMemberUuids()).thenReturn(ImmutableSet.of(clientUUID1, clientUUID2, clientUUID3)); when(hzClientWrapper.getReplicatedMap(WORKER_UUIDS)).thenReturn(workerMap); @@ -59,7 +59,7 @@ public class CeDistributedInformationImplTest { @Test public void getWorkerUUIDs_must_filter_absent_client() { - when(hzClientWrapper.getUUID()).thenReturn(clientUUID1); + when(hzClientWrapper.getUuid()).thenReturn(clientUUID1); when(hzClientWrapper.getMemberUuids()).thenReturn(ImmutableSet.of(clientUUID1, clientUUID2)); when(hzClientWrapper.getReplicatedMap(WORKER_UUIDS)).thenReturn(workerMap); @@ -74,7 +74,7 @@ public class CeDistributedInformationImplTest { connectedClients.add(clientUUID1); connectedClients.add(clientUUID2); - when(hzClientWrapper.getUUID()).thenReturn(clientUUID1); + when(hzClientWrapper.getUuid()).thenReturn(clientUUID1); when(hzClientWrapper.getMemberUuids()).thenReturn(connectedClients); when(hzClientWrapper.getReplicatedMap(WORKER_UUIDS)).thenReturn(modifiableWorkerMap); @@ -101,7 +101,7 @@ public class CeDistributedInformationImplTest { Map modifiableWorkerMap = new HashMap(); modifiableWorkerMap.putAll(workerMap); - when(hzClientWrapper.getUUID()).thenReturn(clientUUID1); + when(hzClientWrapper.getUuid()).thenReturn(clientUUID1); when(hzClientWrapper.getMemberUuids()).thenReturn(connectedClients); when(hzClientWrapper.getReplicatedMap(WORKER_UUIDS)).thenReturn(modifiableWorkerMap); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java index 727166bb963..640b8e76c43 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/ComputeEngineContainerImplTest.java @@ -19,14 +19,15 @@ */ package org.sonar.ce.container; -import com.hazelcast.core.HazelcastInstance; import java.io.File; import java.io.IOException; import java.net.InetAddress; import java.util.Date; +import java.util.Optional; import java.util.Properties; import java.util.stream.Collectors; import org.apache.commons.dbcp.BasicDataSource; +import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -45,19 +46,22 @@ import org.sonar.process.NetworkUtils; import org.sonar.process.ProcessId; import org.sonar.process.ProcessProperties; import org.sonar.process.Props; -import org.sonar.server.hz.HazelcastLocalClient; +import org.sonar.server.cluster.StartableHazelcastMember; import static java.lang.String.valueOf; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assume.assumeThat; import static org.mockito.Mockito.mock; import static org.sonar.process.ProcessEntryPoint.PROPERTY_PROCESS_INDEX; +import static org.sonar.process.ProcessEntryPoint.PROPERTY_PROCESS_KEY; import static org.sonar.process.ProcessEntryPoint.PROPERTY_SHARED_PATH; +import static org.sonar.process.ProcessProperties.CLUSTER_ENABLED; +import static org.sonar.process.ProcessProperties.CLUSTER_NODE_HOST; +import static org.sonar.process.ProcessProperties.CLUSTER_NODE_PORT; +import static org.sonar.process.ProcessProperties.CLUSTER_NODE_TYPE; import static org.sonar.process.ProcessProperties.PATH_DATA; import static org.sonar.process.ProcessProperties.PATH_HOME; import static org.sonar.process.ProcessProperties.PATH_TEMP; -import static org.sonar.process.cluster.ClusterProperties.CLUSTER_ENABLED; -import static org.sonar.process.cluster.ClusterProperties.CLUSTER_LOCALENDPOINT; -import static org.sonar.process.cluster.ClusterProperties.CLUSTER_NODE_TYPE; public class ComputeEngineContainerImplTest { private static final int CONTAINER_ITSELF = 1; @@ -83,13 +87,16 @@ public class ComputeEngineContainerImplTest { @Test public void real_start_with_cluster() throws IOException { - int port = NetworkUtils.INSTANCE.getNextAvailablePort(InetAddress.getLoopbackAddress()); - HazelcastInstance hzInstance = HazelcastTestHelper.createHazelcastCluster(NetworkUtils.INSTANCE.getHostname(), port); + Optional<InetAddress> localhost = NetworkUtils.INSTANCE.getLocalNonLoopbackIpv4Address(); + // test is ignored if offline + assumeThat(localhost.isPresent(), CoreMatchers.is(true)); Properties properties = getProperties(); - properties.setProperty(CLUSTER_NODE_TYPE, "application"); + properties.setProperty(PROPERTY_PROCESS_KEY, ProcessId.COMPUTE_ENGINE.getKey()); properties.setProperty(CLUSTER_ENABLED, "true"); - properties.setProperty(CLUSTER_LOCALENDPOINT, String.format("%s:%d", hzInstance.getCluster().getLocalMember().getAddress().getHost(), port)); + properties.setProperty(CLUSTER_NODE_TYPE, "application"); + properties.setProperty(CLUSTER_NODE_HOST, localhost.get().getHostAddress()); + properties.setProperty(CLUSTER_NODE_PORT, "" + NetworkUtils.INSTANCE.getNextAvailablePort(localhost.get())); // required persisted properties insertProperty(CoreProperties.SERVER_ID, "a_startup_id"); @@ -102,7 +109,7 @@ public class ComputeEngineContainerImplTest { assertThat( picoContainer.getComponentAdapters().stream() .map(ComponentAdapter::getComponentImplementation) - .collect(Collectors.toList())).contains((Class) HazelcastLocalClient.class, + .collect(Collectors.toList())).contains((Class) StartableHazelcastMember.class, (Class) CeDistributedInformationImpl.class); underTest.stop(); } @@ -143,7 +150,7 @@ public class ComputeEngineContainerImplTest { ); assertThat(picoContainer.getParent().getParent().getParent().getComponentAdapters()).hasSize( COMPONENTS_IN_LEVEL_1_AT_CONSTRUCTION - + 25 // level 1 + + 26 // level 1 + 49 // content of DaoModule + 3 // content of EsSearchModule + 64 // content of CorePropertyDefinitions @@ -152,7 +159,7 @@ public class ComputeEngineContainerImplTest { assertThat( picoContainer.getComponentAdapters().stream() .map(ComponentAdapter::getComponentImplementation) - .collect(Collectors.toList())).doesNotContain((Class) HazelcastLocalClient.class, + .collect(Collectors.toList())).doesNotContain((Class) StartableHazelcastMember.class, (Class) CeDistributedInformationImpl.class).contains( (Class) StandaloneCeDistributedInformation.class); assertThat(picoContainer.getParent().getParent().getParent().getParent()).isNull(); diff --git a/server/sonar-ce/src/test/java/org/sonar/ce/container/HazelcastTestHelper.java b/server/sonar-ce/src/test/java/org/sonar/ce/container/HazelcastTestHelper.java index f59da2d47e7..07cb6f55d93 100644 --- a/server/sonar-ce/src/test/java/org/sonar/ce/container/HazelcastTestHelper.java +++ b/server/sonar-ce/src/test/java/org/sonar/ce/container/HazelcastTestHelper.java @@ -23,12 +23,9 @@ package org.sonar.ce.container; import com.hazelcast.config.Config; import com.hazelcast.config.JoinConfig; import com.hazelcast.config.NetworkConfig; -import com.hazelcast.core.Client; -import com.hazelcast.core.ClientListener; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import java.net.InetAddress; -import org.sonar.process.cluster.ClusterObjectKeys; /** * TODO move outside main sources @@ -75,25 +72,6 @@ public class HazelcastTestHelper { // We are not using the partition group of Hazelcast, so disabling it hzConfig.getPartitionGroupConfig().setEnabled(false); HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(hzConfig); - hzInstance.getClientService().addClientListener(new ConnectedClientListener(hzInstance)); return hzInstance; } - - private static class ConnectedClientListener implements ClientListener { - private final HazelcastInstance hzInstance; - - private ConnectedClientListener(HazelcastInstance hzInstance) { - this.hzInstance = hzInstance; - } - - @Override - public void clientConnected(Client client) { - hzInstance.getSet(ClusterObjectKeys.LOCAL_MEMBER_UUIDS).add(client.getUuid()); - } - - @Override - public void clientDisconnected(Client client) { - hzInstance.getSet(ClusterObjectKeys.LOCAL_MEMBER_UUIDS).remove(client.getUuid()); - } - } } |