You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2020/03/30 18:18:26 UTC
[geode] branch develop updated: GEODE-7919: Moving membership
integration test to geode-membership (#4862)
This is an automated email from the ASF dual-hosted git repository.
upthewaterspout pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new 4966e50 GEODE-7919: Moving membership integration test to geode-membership (#4862)
4966e50 is described below
commit 4966e505b6fd6224967bbf1ac5487e8ddf1bdfc5
Author: Dan Smith <up...@apache.org>
AuthorDate: Mon Mar 30 11:18:01 2020 -0700
GEODE-7919: Moving membership integration test to geode-membership (#4862)
Moving MembershipOnlyTest to MembershipIntegrationTest in the geode-membership
module and adding some more tests.
---
.../membership/gms/MembershipOnlyTest.java | 152 --------------
.../membership/gms/MembershipIntegrationTest.java | 221 +++++++++++++++++++++
2 files changed, 221 insertions(+), 152 deletions(-)
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java
deleted file mode 100644
index 169297c..0000000
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.distributed.internal.membership.gms;
-
-import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.util.concurrent.ExecutorService;
-import java.util.function.Supplier;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-import org.apache.geode.distributed.internal.membership.api.LifecycleListener;
-import org.apache.geode.distributed.internal.membership.api.MemberIdentifier;
-import org.apache.geode.distributed.internal.membership.api.MemberIdentifierFactoryImpl;
-import org.apache.geode.distributed.internal.membership.api.MemberStartupException;
-import org.apache.geode.distributed.internal.membership.api.Membership;
-import org.apache.geode.distributed.internal.membership.api.MembershipBuilder;
-import org.apache.geode.distributed.internal.membership.api.MembershipConfig;
-import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocatorBuilder;
-import org.apache.geode.distributed.internal.tcpserver.TcpClient;
-import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
-import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreatorImpl;
-import org.apache.geode.distributed.internal.tcpserver.TcpSocketFactory;
-import org.apache.geode.internal.admin.SSLConfig;
-import org.apache.geode.internal.net.SocketCreator;
-import org.apache.geode.internal.serialization.DSFIDSerializer;
-import org.apache.geode.internal.serialization.DSFIDSerializerFactory;
-import org.apache.geode.logging.internal.executors.LoggingExecutors;
-
-public class MembershipOnlyTest {
-
- @Rule
- public TemporaryFolder temporaryFolder = new TemporaryFolder();
- private InetAddress localHost;
- private DSFIDSerializer dsfidSerializer;
- private TcpSocketCreator socketCreator;
- private MembershipLocator membershipLocator;
-
- @Before
- public void before() throws IOException, MembershipConfigurationException {
- localHost = InetAddress.getLocalHost();
-
- dsfidSerializer = new DSFIDSerializerFactory().create();
-
- // TODO - using geode-core socket creator
- socketCreator = new SocketCreator(new SSLConfig.Builder().build());
-
- final Supplier<ExecutorService> executorServiceSupplier =
- () -> LoggingExecutors.newCachedThreadPool("membership", false);
- membershipLocator = MembershipLocatorBuilder.<MemberIdentifierImpl>newLocatorBuilder(
- new TcpSocketCreatorImpl(),
- dsfidSerializer,
- temporaryFolder.newFolder("locator").toPath(),
- executorServiceSupplier)
- .create();
-
- membershipLocator.start();
- }
-
- @After
- public void after() {
- membershipLocator.stop();
- }
-
- @Test
- public void locatorStarts() {
- assertThat(membershipLocator.getPort()).isGreaterThan(0);
- }
-
- @Test
- public void memberCanConnectToSelfHostedLocator() throws MemberStartupException {
- Membership<MemberIdentifier> membership = startMember("member", membershipLocator);
- assertThat(membership.getView().getMembers()).hasSize(1);
- }
-
- @Test
- public void twoMembersCanConnect() throws MemberStartupException {
- Membership<MemberIdentifier> member1 = startMember("member1", membershipLocator);
- Membership<MemberIdentifier> member2 = startMember("member2", null);
- await().untilAsserted(() -> assertThat(member1.getView().getMembers()).hasSize(2));
- await().untilAsserted(() -> assertThat(member2.getView().getMembers()).hasSize(2));
- }
-
- private Membership<MemberIdentifier> startMember(String name,
- final MembershipLocator embeddedLocator)
- throws MemberStartupException {
- MembershipConfig config = new MembershipConfig() {
- public String getLocators() {
- return localHost.getHostName() + '[' + membershipLocator.getPort() + ']';
- }
-
- // TODO - the Membership system starting in the locator *MUST* be told that is
- // is a locator through this flag. Ideally it should be able to infer this from
- // being associated with a locator
- @Override
- public int getVmKind() {
- return embeddedLocator != null ? MemberIdentifier.LOCATOR_DM_TYPE
- : MemberIdentifier.NORMAL_DM_TYPE;
- }
-
- @Override
- public String getName() {
- return name;
- }
- };
-
- MemberIdentifierFactoryImpl memberIdFactory = new MemberIdentifierFactoryImpl();
-
- TcpClient locatorClient = new TcpClient(socketCreator, dsfidSerializer.getObjectSerializer(),
- dsfidSerializer.getObjectDeserializer(), TcpSocketFactory.DEFAULT);
-
- LifecycleListener<MemberIdentifier> lifeCycleListener = mock(LifecycleListener.class);
-
-
- final Membership<MemberIdentifier> membership =
- MembershipBuilder.<MemberIdentifier>newMembershipBuilder(
- socketCreator,
- locatorClient,
- dsfidSerializer,
- memberIdFactory)
- .setMembershipLocator(membershipLocator)
- .setConfig(config)
- .setLifecycleListener(lifeCycleListener)
- .create();
-
- membership.start();
- membership.startEventProcessing();
- return membership;
- }
-}
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java
new file mode 100644
index 0000000..0e823bd
--- /dev/null
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.distributed.internal.membership.gms;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.geode.distributed.internal.membership.api.MemberIdentifier;
+import org.apache.geode.distributed.internal.membership.api.MemberIdentifierFactoryImpl;
+import org.apache.geode.distributed.internal.membership.api.MemberStartupException;
+import org.apache.geode.distributed.internal.membership.api.Membership;
+import org.apache.geode.distributed.internal.membership.api.MembershipBuilder;
+import org.apache.geode.distributed.internal.membership.api.MembershipConfig;
+import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
+import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
+import org.apache.geode.distributed.internal.membership.api.MembershipLocatorBuilder;
+import org.apache.geode.distributed.internal.tcpserver.TcpClient;
+import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
+import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreatorImpl;
+import org.apache.geode.distributed.internal.tcpserver.TcpSocketFactory;
+import org.apache.geode.internal.inet.LocalHostUtil;
+import org.apache.geode.internal.serialization.DSFIDSerializer;
+import org.apache.geode.internal.serialization.internal.DSFIDSerializerImpl;
+import org.apache.geode.logging.internal.executors.LoggingExecutors;
+
+/**
+ * Tests of using the membership APIs to make multiple Membership systems that communicate
+ * with each other and form a group
+ */
+public class MembershipIntegrationTest {
+ private InetAddress localHost;
+ private DSFIDSerializer dsfidSerializer;
+ private TcpSocketCreator socketCreator;
+
+ @Rule
+ public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ @Before
+ public void before() throws IOException, MembershipConfigurationException {
+ localHost = LocalHostUtil.getLocalHost();
+ dsfidSerializer = new DSFIDSerializerImpl();
+ socketCreator = new TcpSocketCreatorImpl();
+ }
+
+ @Test
+ public void oneMembershipCanStartWithALocator()
+ throws IOException, MemberStartupException {
+ final MembershipLocator<MemberIdentifier> locator = createLocator(0);
+ locator.start();
+
+ final Membership<MemberIdentifier> membership = createMembership(locator,
+ locator.getPort());
+ start(membership);
+
+ assertThat(membership.getView().getMembers()).hasSize(1);
+ }
+
+ @Test
+ public void twoMembershipsCanStartWithOneLocator()
+ throws IOException, MemberStartupException {
+ final MembershipLocator<MemberIdentifier> locator = createLocator(0);
+ locator.start();
+ final int locatorPort = locator.getPort();
+
+ final Membership<MemberIdentifier> membership1 = createMembership(locator, locatorPort);
+ start(membership1);
+
+ final Membership<MemberIdentifier> membership2 = createMembership(null, locatorPort);
+ start(membership2);
+
+ assertThat(membership1.getView().getMembers()).hasSize(2);
+ assertThat(membership2.getView().getMembers()).hasSize(2);
+ }
+
+ @Test
+ public void twoLocatorsCanStartSequentially()
+ throws IOException, MemberStartupException {
+
+ final MembershipLocator<MemberIdentifier> locator1 = createLocator(0);
+ locator1.start();
+ final int locatorPort1 = locator1.getPort();
+
+ Membership<MemberIdentifier> membership1 = createMembership(locator1, locatorPort1);
+ start(membership1);
+
+ final MembershipLocator<MemberIdentifier> locator2 = createLocator(0, locatorPort1);
+ locator2.start();
+ final int locatorPort2 = locator2.getPort();
+
+ Membership<MemberIdentifier> membership2 =
+ createMembership(locator2, locatorPort1, locatorPort2);
+ start(membership2);
+
+ assertThat(membership1.getView().getMembers()).hasSize(2);
+ assertThat(membership2.getView().getMembers()).hasSize(2);
+ }
+
+ @Test
+ public void secondMembershipCanJoinUsingTheSecondLocatorToStart()
+ throws IOException, MemberStartupException {
+
+ final MembershipLocator<MemberIdentifier> locator1 = createLocator(0);
+ locator1.start();
+ final int locatorPort1 = locator1.getPort();
+
+ final Membership<MemberIdentifier> membership1 = createMembership(locator1, locatorPort1);
+ start(membership1);
+
+ final MembershipLocator<MemberIdentifier> locator2 = createLocator(0, locatorPort1);
+ locator2.start();
+ int locatorPort2 = locator2.getPort();
+
+ // Force the next membership to use locator2 by stopping locator1
+ locator1.stop();
+
+ Membership<MemberIdentifier> membership2 =
+ createMembership(locator2, locatorPort1, locatorPort2);
+ start(membership2);
+
+ assertThat(membership1.getView().getMembers()).hasSize(2);
+ assertThat(membership2.getView().getMembers()).hasSize(2);
+ }
+
+ private void start(final Membership<MemberIdentifier> membership)
+ throws MemberStartupException {
+ membership.start();
+ membership.startEventProcessing();
+ }
+
+ private Membership<MemberIdentifier> createMembership(
+ final MembershipLocator<MemberIdentifier> embeddedLocator,
+ final int... locatorPorts)
+ throws MembershipConfigurationException {
+ final boolean isALocator = embeddedLocator != null;
+ final MembershipConfig config = createMembershipConfig(isALocator, locatorPorts);
+
+ final MemberIdentifierFactoryImpl memberIdFactory = new MemberIdentifierFactoryImpl();
+
+ final TcpClient locatorClient =
+ new TcpClient(socketCreator, dsfidSerializer.getObjectSerializer(),
+ dsfidSerializer.getObjectDeserializer(), TcpSocketFactory.DEFAULT);
+
+ return MembershipBuilder.<MemberIdentifier>newMembershipBuilder(
+ socketCreator, locatorClient, dsfidSerializer, memberIdFactory)
+ .setMembershipLocator(embeddedLocator)
+ .setConfig(config)
+ .create();
+ }
+
+ private MembershipConfig createMembershipConfig(
+ final boolean isALocator,
+ final int[] locatorPorts) {
+ return new MembershipConfig() {
+ public String getLocators() {
+ return getLocatorString(locatorPorts);
+ }
+
+ // TODO - the Membership system starting in the locator *MUST* be told that is
+ // is a locator through this flag. Ideally it should be able to infer this from
+ // being associated with a locator
+ @Override
+ public int getVmKind() {
+ return isALocator ? MemberIdentifier.LOCATOR_DM_TYPE : MemberIdentifier.NORMAL_DM_TYPE;
+ }
+ };
+ }
+
+ private String getLocatorString(
+ final int... locatorPorts) {
+ final String hostName = localHost.getHostName();
+ return Arrays.stream(locatorPorts)
+ .mapToObj(port -> hostName + '[' + port + ']')
+ .collect(Collectors.joining(","));
+ }
+
+ private MembershipLocator<MemberIdentifier> createLocator(
+ final int localPort,
+ final int... locatorPorts)
+ throws MembershipConfigurationException,
+ IOException {
+ final Supplier<ExecutorService> executorServiceSupplier =
+ () -> LoggingExecutors.newCachedThreadPool("membership", false);
+ Path locatorDirectory = temporaryFolder.newFolder().toPath();
+
+ final MembershipConfig config = createMembershipConfig(true, locatorPorts);
+
+ return MembershipLocatorBuilder.<MemberIdentifier>newLocatorBuilder(
+ socketCreator,
+ dsfidSerializer,
+ locatorDirectory,
+ executorServiceSupplier)
+ .setConfig(config)
+ .setPort(localPort)
+ .create();
+ }
+
+}