You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bs...@apache.org on 2020/01/31 19:10:13 UTC

[geode] branch feature/GEODE-7652revert created (now e252ab2)

This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a change to branch feature/GEODE-7652revert
in repository https://gitbox.apache.org/repos/asf/geode.git.


      at e252ab2  Revert "GEODE-7652: MembershipBuilder lets you set the local locator (#4614)"

This branch includes the following new commits:

     new e252ab2  Revert "GEODE-7652: MembershipBuilder lets you set the local locator (#4614)"

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[geode] 01/01: Revert "GEODE-7652: MembershipBuilder lets you set the local locator (#4614)"

Posted by bs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bschuchardt pushed a commit to branch feature/GEODE-7652revert
in repository https://gitbox.apache.org/repos/asf/geode.git

commit e252ab2a70d05b97f98bc6f04c724737186ae889
Author: Bruce Schuchardt <bs...@pivotal.io>
AuthorDate: Fri Jan 31 11:08:57 2020 -0800

    Revert "GEODE-7652: MembershipBuilder lets you set the local locator (#4614)"
    
    This reverts commit d2947640af8c6bf16a650348bf09a28d11d27997.
---
 ...ReconnectWithClusterConfigurationDUnitTest.java |  1 +
 .../apache/geode/distributed/LocatorDUnitTest.java | 13 +++-
 .../internal/membership/MembershipJUnitTest.java   | 48 ++++++-------
 .../membership/gms/MembershipOnlyTest.java         | 17 +++--
 .../locator/GMSLocatorRecoveryIntegrationTest.java |  5 +-
 .../internal/ClusterDistributionManager.java       | 18 ++---
 .../distributed/internal/DistributionImpl.java     | 26 +++++---
 .../internal/InternalDistributedSystem.java        | 78 ++++------------------
 .../distributed/internal/InternalLocator.java      | 17 ++---
 .../gms/locator/GMSLocatorIntegrationTest.java     |  8 +--
 .../internal/membership/api/LifecycleListener.java |  7 ++
 .../internal/membership/api/MembershipBuilder.java |  5 +-
 .../internal/membership/gms/GMSMembership.java     |  1 +
 .../membership/gms/LifecycleListenerNoOp.java      |  5 ++
 .../membership/gms/MembershipBuilderImpl.java      | 16 +----
 .../internal/membership/gms/Services.java          | 25 ++-----
 .../membership/gms/locator/GMSLocator.java         | 19 +++---
 .../gms/locator/MembershipLocatorImpl.java         | 17 +----
 18 files changed, 125 insertions(+), 201 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/ReconnectWithClusterConfigurationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/ReconnectWithClusterConfigurationDUnitTest.java
index 6a7c262..b51d7f2 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/ReconnectWithClusterConfigurationDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/ReconnectWithClusterConfigurationDUnitTest.java
@@ -91,6 +91,7 @@ public class ReconnectWithClusterConfigurationDUnitTest implements Serializable
           locator = Locator.startLocatorAndDS(locatorPorts[locatorNumber], new File(""), props);
           system = locator.getDistributedSystem();
           cache = ((InternalLocator) locator).getCache();
+          ReconnectDUnitTest.savedSystem = locator.getDistributedSystem();
           IgnoredException.addIgnoredException(
               "org.apache.geode.ForcedDisconnectException||Possible loss of quorum");
         } catch (IOException e) {
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
index 348fdad..2e6bf6b 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
@@ -1357,8 +1357,17 @@ public class LocatorDUnitTest implements Serializable {
   public void testHostingMultipleLocators() throws Exception {
     Locator.startLocator(port1, null);
 
-    assertThatThrownBy(() -> Locator.startLocator(port2, null))
-        .isInstanceOf(IllegalStateException.class);
+    try {
+      Locator.startLocator(port2, null);
+      fail("expected second locator start to fail.");
+    } catch (IllegalStateException expected) {
+    }
+
+    String locators = hostName + "[" + port1 + "]," + hostName + "[" + port2 + "]";
+
+    Properties props = getBasicProperties(locators);
+
+    getConnectedDistributedSystem(props);
   }
 
   /**
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipJUnitTest.java
index 3d21f69..d70e603 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/MembershipJUnitTest.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -45,10 +46,12 @@ import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
 import org.apache.geode.distributed.ConfigurationProperties;
+import org.apache.geode.distributed.Locator;
 import org.apache.geode.distributed.internal.ClusterDistributionManager;
 import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionConfigImpl;
+import org.apache.geode.distributed.internal.DistributionImpl;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.distributed.internal.SerialAckedMessage;
@@ -63,7 +66,6 @@ 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.MembershipListener;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.MembershipView;
 import org.apache.geode.distributed.internal.membership.api.MessageListener;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
@@ -129,7 +131,7 @@ public class MembershipJUnitTest {
       throws Exception {
 
     Membership<InternalDistributedMember> m1 = null, m2 = null;
-    InternalLocator internalLocator = null;
+    Locator l = null;
     // int mcastPort = AvailablePortHelper.getRandomAvailableUDPPort();
 
     try {
@@ -140,9 +142,8 @@ public class MembershipJUnitTest {
 
       // this locator will hook itself up with the first Membership
       // to be created
-      internalLocator =
-          InternalLocator.startLocator(port, new File(""), null, null, localHost, false,
-              new Properties(), null, temporaryFolder.getRoot().toPath());
+      l = InternalLocator.startLocator(port, new File(""), null, null, localHost, false,
+          new Properties(), null, temporaryFolder.getRoot().toPath());
 
       // create configuration objects
       Properties nonDefault = new Properties();
@@ -158,14 +159,11 @@ public class MembershipJUnitTest {
           new RemoteTransportConfig(config, ClusterDistributionManager.LOCATOR_DM_TYPE);
 
       // start the first membership manager
-      final MembershipLocator<InternalDistributedMember> membershipLocator =
-          internalLocator.getMembershipLocator();
-
-      m1 = createMembershipManager(config, transport, membershipLocator).getLeft();
+      m1 = createMembershipManager(config, transport).getLeft();
 
       // start the second membership manager
       final Pair<Membership, MessageListener> pair =
-          createMembershipManager(config, transport, membershipLocator);
+          createMembershipManager(config, transport);
       m2 = pair.getLeft();
       final MessageListener listener2 = pair.getRight();
 
@@ -243,16 +241,15 @@ public class MembershipJUnitTest {
       if (m1 != null) {
         m1.shutdown();
       }
-      if (internalLocator != null) {
-        internalLocator.stop();
+      if (l != null) {
+        l.stop();
       }
     }
   }
 
   private Pair<Membership, MessageListener> createMembershipManager(
       final DistributionConfigImpl config,
-      final RemoteTransportConfig transport,
-      final MembershipLocator<InternalDistributedMember> locator) throws MemberStartupException {
+      final RemoteTransportConfig transport) throws MemberStartupException {
     final MembershipListener<InternalDistributedMember> listener = mock(MembershipListener.class);
     final MessageListener<InternalDistributedMember> messageListener = mock(MessageListener.class);
     final DMStats stats1 = mock(DMStats.class);
@@ -293,7 +290,6 @@ public class MembershipJUnitTest {
     final Membership<InternalDistributedMember> m1 =
         MembershipBuilder.<InternalDistributedMember>newMembershipBuilder(
             socketCreator, locatorClient, serializer, memberIdentifierFactory)
-            .setMembershipLocator(locator)
             .setAuthenticator(authenticator)
             .setStatistics(stats1)
             .setMessageListener(messageListener)
@@ -301,6 +297,10 @@ public class MembershipJUnitTest {
             .setConfig(new ServiceConfig(transport, config))
             .setLifecycleListener(lifeCycleListener)
             .create();
+    doAnswer(invocation -> {
+      DistributionImpl.connectLocatorToServices(m1);
+      return null;
+    }).when(lifeCycleListener).started();
     m1.start();
     m1.startEventProcessing();
     return Pair.of(m1, messageListener);
@@ -319,7 +319,7 @@ public class MembershipJUnitTest {
   public void testLocatorAndTwoServersJoinUsingDiffeHellman() throws Exception {
 
     Membership<InternalDistributedMember> m1 = null, m2 = null;
-    InternalLocator internalLocator = null;
+    Locator l = null;
     int mcastPort = AvailablePortHelper.getRandomAvailableUDPPort();
 
     try {
@@ -331,9 +331,8 @@ public class MembershipJUnitTest {
       p.setProperty(ConfigurationProperties.SECURITY_UDP_DHALGO, "AES:128");
       // this locator will hook itself up with the first Membership
       // to be created
-      internalLocator =
-          InternalLocator.startLocator(port, new File(""), null, null, localHost, false, p, null,
-              temporaryFolder.getRoot().toPath());
+      l = InternalLocator.startLocator(port, new File(""), null, null, localHost, false, p, null,
+          temporaryFolder.getRoot().toPath());
 
       // create configuration objects
       Properties nonDefault = new Properties();
@@ -350,14 +349,11 @@ public class MembershipJUnitTest {
           new RemoteTransportConfig(config, ClusterDistributionManager.LOCATOR_DM_TYPE);
 
       // start the first membership manager
-      final MembershipLocator<InternalDistributedMember> membershipLocator =
-          internalLocator.getMembershipLocator();
-
-      m1 = createMembershipManager(config, transport, membershipLocator).getLeft();
+      m1 = createMembershipManager(config, transport).getLeft();
 
       // start the second membership manager
       final Pair<Membership, MessageListener> pair =
-          createMembershipManager(config, transport, membershipLocator);
+          createMembershipManager(config, transport);
       m2 = pair.getLeft();
       final MessageListener listener2 = pair.getRight();
 
@@ -427,8 +423,8 @@ public class MembershipJUnitTest {
       if (m1 != null) {
         m1.disconnect(false);
       }
-      if (internalLocator != null) {
-        internalLocator.stop();
+      if (l != null) {
+        l.stop();
       }
     }
   }
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
index 9718e0b..c1ba5bd 100644
--- 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
@@ -16,6 +16,7 @@ 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.doAnswer;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
@@ -95,6 +96,7 @@ public class MembershipOnlyTest {
     assertThat(membership.getView().getMembers()).hasSize(1);
   }
 
+
   @Test
   public void twoMembersCanConnect() throws MemberStartupException {
     Membership<MemberIdentifierImpl> member1 = startMember("member1", membershipLocator);
@@ -135,15 +137,20 @@ public class MembershipOnlyTest {
 
     final Membership<MemberIdentifierImpl> membership =
         MembershipBuilder.<MemberIdentifierImpl>newMembershipBuilder(
-            socketCreator,
-            locatorClient,
-            dsfidSerializer,
-            memberIdFactory)
-            .setMembershipLocator(membershipLocator)
+            socketCreator, locatorClient, dsfidSerializer, memberIdFactory)
             .setConfig(config)
             .setLifecycleListener(lifeCycleListener)
             .create();
 
+    // TODO - the membership *must* be installed in the locator at this special
+    // point during membership startup for the start to succeed
+    if (embeddedLocator != null) {
+      doAnswer(invocation -> {
+        embeddedLocator.setMembership(membership);
+        return null;
+      }).when(lifeCycleListener).started();
+    }
+
     membership.start();
     membership.startEventProcessing();
     return membership;
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorRecoveryIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorRecoveryIntegrationTest.java
index 94a7e7e..dcc49d4 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorRecoveryIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorRecoveryIntegrationTest.java
@@ -41,6 +41,7 @@ import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
 import org.apache.geode.DataSerializer;
+import org.apache.geode.distributed.Locator;
 import org.apache.geode.distributed.internal.ClusterDistributionManager;
 import org.apache.geode.distributed.internal.DMStats;
 import org.apache.geode.distributed.internal.Distribution;
@@ -77,7 +78,7 @@ public class GMSLocatorRecoveryIntegrationTest {
 
   private File stateFile;
   private GMSLocator gmsLocator;
-  private InternalLocator locator;
+  private Locator locator;
   private DSFIDSerializer serializer;
   private Distribution distribution;
 
@@ -192,7 +193,7 @@ public class GMSLocatorRecoveryIntegrationTest {
 
     distribution =
         new DistributionImpl(mockClusterDistributionManager, transport, mockSystem, mockListener,
-            mockMessageListener, locator.getMembershipLocator());
+            mockMessageListener);
     distribution.start();
 
     GMSLocator gmsLocator = new GMSLocator(localHost,
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
index 0ece626..4d765ac 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
@@ -67,7 +67,6 @@ import org.apache.geode.distributed.internal.membership.api.MemberDisconnectedEx
 import org.apache.geode.distributed.internal.membership.api.MemberIdentifier;
 import org.apache.geode.distributed.internal.membership.api.MemberIdentifierFactory;
 import org.apache.geode.distributed.internal.membership.api.Membership;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.MembershipView;
 import org.apache.geode.distributed.internal.membership.api.Message;
 import org.apache.geode.internal.Assert;
@@ -296,8 +295,7 @@ public class ClusterDistributionManager implements DistributionManager {
    *
    * @param system The distributed system to which this distribution manager will send messages.
    */
-  static ClusterDistributionManager create(InternalDistributedSystem system,
-      final MembershipLocator<InternalDistributedMember> membershipLocator) {
+  static ClusterDistributionManager create(InternalDistributedSystem system) {
 
     ClusterDistributionManager distributionManager = null;
     boolean beforeJoined = true;
@@ -324,8 +322,7 @@ public class ClusterDistributionManager implements DistributionManager {
       long start = System.currentTimeMillis();
 
       distributionManager =
-          new ClusterDistributionManager(system, transport, system.getAlertingService(),
-              membershipLocator);
+          new ClusterDistributionManager(system, transport, system.getAlertingService());
       distributionManager.assertDistributionManagerType();
 
       beforeJoined = false; // we have now joined the system
@@ -429,8 +426,7 @@ public class ClusterDistributionManager implements DistributionManager {
    *
    */
   private ClusterDistributionManager(RemoteTransportConfig transport,
-      InternalDistributedSystem system, AlertingService alertingService,
-      MembershipLocator<InternalDistributedMember> locator) {
+      InternalDistributedSystem system, AlertingService alertingService) {
 
     this.system = system;
     this.transport = transport;
@@ -463,7 +459,7 @@ public class ClusterDistributionManager implements DistributionManager {
       DMListener listener = new DMListener(this);
       distribution = DistributionImpl
           .createDistribution(this, transport, system, listener,
-              this::handleIncomingDMsg, locator);
+              this::handleIncomingDMsg);
 
       sb.append(System.currentTimeMillis() - start);
 
@@ -492,10 +488,8 @@ public class ClusterDistributionManager implements DistributionManager {
    * @param system The distributed system to which this distribution manager will send messages.
    */
   private ClusterDistributionManager(InternalDistributedSystem system,
-      RemoteTransportConfig transport,
-      AlertingService alertingService,
-      final MembershipLocator<InternalDistributedMember> membershipLocator) {
-    this(transport, system, alertingService, membershipLocator);
+      RemoteTransportConfig transport, AlertingService alertingService) {
+    this(transport, system, alertingService);
 
     boolean finishedConstructor = false;
     try {
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
index b81d2ac..482fe9d 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
@@ -57,7 +57,6 @@ import org.apache.geode.distributed.internal.membership.api.MembershipBuilder;
 import org.apache.geode.distributed.internal.membership.api.MembershipClosedException;
 import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
 import org.apache.geode.distributed.internal.membership.api.MembershipListener;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.MembershipStatistics;
 import org.apache.geode.distributed.internal.membership.api.MembershipView;
 import org.apache.geode.distributed.internal.membership.api.Message;
@@ -110,11 +109,9 @@ public class DistributionImpl implements Distribution {
 
 
   public DistributionImpl(final ClusterDistributionManager clusterDistributionManager,
-      final RemoteTransportConfig transport,
-      final InternalDistributedSystem system,
+      final RemoteTransportConfig transport, final InternalDistributedSystem system,
       final MembershipListener<InternalDistributedMember> listener,
-      final MessageListener<InternalDistributedMember> messageListener,
-      final MembershipLocator<InternalDistributedMember> locator) {
+      final MessageListener<InternalDistributedMember> messageListener) {
     this.clusterDistributionManager = clusterDistributionManager;
     this.transportConfig = transport;
     this.tcpDisabled = transportConfig.isTcpDisabled();
@@ -140,7 +137,6 @@ public class DistributionImpl implements Distribution {
           locatorClient,
           InternalDataSerializer.getDSFIDSerializer(),
           new ClusterDistributionManager.ClusterDistributionManagerIDFactory())
-          .setMembershipLocator(locator)
           .setAuthenticator(
               new GMSAuthenticator(system.getSecurityProperties(), system.getSecurityService(),
                   system.getSecurityLogWriter(), system.getInternalLogWriter()))
@@ -160,6 +156,14 @@ public class DistributionImpl implements Distribution {
     }
   }
 
+  public static void connectLocatorToServices(Membership<InternalDistributedMember> membership) {
+    // see if a locator was started and put it in GMS Services
+    InternalLocator l = (InternalLocator) Locator.getLocator();
+    if (l != null && l.getMembershipLocator() != null) {
+      l.getMembershipLocator().setMembership(membership);
+    }
+  }
+
   @Override
   public Membership<InternalDistributedMember> getMembership() {
     return membership;
@@ -213,12 +217,11 @@ public class DistributionImpl implements Distribution {
       ClusterDistributionManager clusterDistributionManager, RemoteTransportConfig transport,
       InternalDistributedSystem system,
       MembershipListener<InternalDistributedMember> listener,
-      MessageListener<InternalDistributedMember> messageListener,
-      final MembershipLocator<InternalDistributedMember> locator) {
+      MessageListener<InternalDistributedMember> messageListener) {
 
     DistributionImpl distribution =
         new DistributionImpl(clusterDistributionManager, transport, system, listener,
-            messageListener, locator);
+            messageListener);
     distribution.start();
     return distribution;
   }
@@ -913,6 +916,11 @@ public class DistributionImpl implements Distribution {
     }
 
     @Override
+    public void started() {
+      connectLocatorToServices(distribution.getMembership());
+    }
+
+    @Override
     public void forcedDisconnect() {
       // stop server locators immediately since they may not have correct
       // information. This has caused client failures in bridge/wan
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
index 2ed25ae..fa53678 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
@@ -77,7 +77,6 @@ import org.apache.geode.distributed.DurableClientAttributes;
 import org.apache.geode.distributed.internal.locks.GrantorRequestProcessor;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.distributed.internal.membership.api.MembershipInformation;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.QuorumChecker;
 import org.apache.geode.internal.Assert;
 import org.apache.geode.internal.InternalDataSerializer;
@@ -199,23 +198,6 @@ public class InternalDistributedSystem extends DistributedSystem
   private final AtomicReference<ClusterAlertMessaging> clusterAlertMessaging =
       new AtomicReference<>();
 
-  // captured in initialize() when starting so that we can hand it to new instance when restarting
-  private MembershipLocator<InternalDistributedMember> membershipLocator;
-
-  /**
-   * If the experimental multiple-system feature is enabled, always create a new system.
-   *
-   * <p>
-   * Otherwise, create a new InternalDistributedSystem with the given properties, or connect to an
-   * existing one with the same properties.
-   */
-  public static InternalDistributedSystem connectInternal(
-      Properties config,
-      SecurityConfig securityConfig,
-      MetricsService.Builder metricsSessionBuilder) {
-    return connectInternal(config, securityConfig, metricsSessionBuilder, null);
-  }
-
   /**
    * If the experimental multiple-system feature is enabled, always create a new system.
    *
@@ -223,11 +205,8 @@ public class InternalDistributedSystem extends DistributedSystem
    * Otherwise, create a new InternalDistributedSystem with the given properties, or connect to an
    * existing one with the same properties.
    */
-  public static InternalDistributedSystem connectInternal(
-      Properties config,
-      SecurityConfig securityConfig,
-      MetricsService.Builder metricsSessionBuilder,
-      final MembershipLocator<InternalDistributedMember> locator) {
+  public static InternalDistributedSystem connectInternal(Properties config,
+      SecurityConfig securityConfig, MetricsService.Builder metricsSessionBuilder) {
     if (config == null) {
       config = new Properties();
     }
@@ -235,7 +214,6 @@ public class InternalDistributedSystem extends DistributedSystem
     if (Boolean.getBoolean(ALLOW_MULTIPLE_SYSTEMS_PROPERTY)) {
       return new Builder(config, metricsSessionBuilder)
           .setSecurityConfig(securityConfig)
-          .setLocator(locator)
           .build();
     }
 
@@ -286,7 +264,6 @@ public class InternalDistributedSystem extends DistributedSystem
       // Make a new connection to the distributed system
       InternalDistributedSystem newSystem = new Builder(config, metricsSessionBuilder)
           .setSecurityConfig(securityConfig)
-          .setLocator(locator)
           .build();
       addSystem(newSystem);
       return newSystem;
@@ -674,9 +651,7 @@ public class InternalDistributedSystem extends DistributedSystem
    * Initializes this connection to a distributed system with the current configuration state.
    */
   private void initialize(SecurityManager securityManager, PostProcessor postProcessor,
-      MetricsService.Builder metricsServiceBuilder,
-      final MembershipLocator<InternalDistributedMember> membershipLocatorArg) {
-
+      MetricsService.Builder metricsServiceBuilder) {
     if (originalConfig.getLocators().equals("")) {
       if (originalConfig.getMcastPort() != 0) {
         throw new GemFireConfigException("The " + LOCATORS + " attribute can not be empty when the "
@@ -765,7 +740,7 @@ public class InternalDistributedSystem extends DistributedSystem
       }
 
       try {
-        startInitLocator(membershipLocatorArg);
+        startInitLocator();
       } catch (InterruptedException e) {
         throw new SystemConnectException("Startup has been interrupted", e);
       }
@@ -776,13 +751,12 @@ public class InternalDistributedSystem extends DistributedSystem
 
       if (!isLoner) {
         try {
-          dm = ClusterDistributionManager.create(this, membershipLocator);
+          dm = ClusterDistributionManager.create(this);
           // fix bug #46324
           if (InternalLocator.hasLocator()) {
-            InternalLocator internalLocator = InternalLocator.getLocator();
+            InternalLocator locator = InternalLocator.getLocator();
             getDistributionManager().addHostedLocators(getDistributedMember(),
-                InternalLocator.getLocatorStrings(),
-                internalLocator.isSharedConfigurationEnabled());
+                InternalLocator.getLocatorStrings(), locator.isSharedConfigurationEnabled());
           }
         } finally {
           if (dm == null && quorumChecker != null) {
@@ -806,7 +780,7 @@ public class InternalDistributedSystem extends DistributedSystem
       }
       if (attemptingToReconnect && (startedLocator == null)) {
         try {
-          startInitLocator(membershipLocatorArg);
+          startInitLocator();
         } catch (InterruptedException e) {
           throw new SystemConnectException("Startup has been interrupted", e);
         }
@@ -879,25 +853,11 @@ public class InternalDistributedSystem extends DistributedSystem
   }
 
   /**
-   * Starts a locator in this JVM iff the distribution config wants one started.
-   *
-   * @return the membershipLocatorArg if the distribution config has no locator specified;
-   *         otherwise starts a new InternalLocator and returns its associated MembershipLocator
-   *
    * @since GemFire 5.7
-   * @param membershipLocatorArg on initial startup, a MembershipLocator provided explicitly by
-   *        a caller, or null; on restart, the old MembershipLocator (from the previous instance of
-   *        InternalDistributedSystem.)
    */
-  private void startInitLocator(
-      final MembershipLocator<InternalDistributedMember> membershipLocatorArg)
-      throws InterruptedException {
-
-    final String locatorString = originalConfig.getStartLocator();
-    final boolean shouldStartLocator = locatorString.length() > 0;
-
-    if (!shouldStartLocator) {
-      membershipLocator = membershipLocatorArg;
+  private void startInitLocator() throws InterruptedException {
+    String locatorString = originalConfig.getStartLocator();
+    if (locatorString.length() == 0) {
       return;
     }
 
@@ -926,13 +886,10 @@ public class InternalDistributedSystem extends DistributedSystem
       boolean startedPeerLocation = false;
       try {
         startedLocator.startPeerLocation();
-        membershipLocator = startedLocator.getMembershipLocator();
         startedPeerLocation = true;
       } finally {
         if (!startedPeerLocation) {
           startedLocator.stop();
-          startedLocator = null;
-          membershipLocator = null;
         }
       }
     } catch (IOException e) {
@@ -2611,8 +2568,7 @@ public class InternalDistributedSystem extends DistributedSystem
 
           try {
 
-            newDS = connectInternal(configProps, null, metricsService.getRebuilder(),
-                membershipLocator);
+            newDS = connectInternal(configProps, null, metricsService.getRebuilder());
 
           } catch (CancelException e) {
             if (isReconnectCancelled()) {
@@ -3005,8 +2961,6 @@ public class InternalDistributedSystem extends DistributedSystem
     private SecurityConfig securityConfig;
     private MetricsService.Builder metricsServiceBuilder;
 
-    private MembershipLocator<InternalDistributedMember> locator;
-
     public Builder(Properties configProperties, MetricsService.Builder metricsServiceBuilder) {
       this.configProperties = configProperties;
       this.metricsServiceBuilder = metricsServiceBuilder;
@@ -3017,12 +2971,6 @@ public class InternalDistributedSystem extends DistributedSystem
       return this;
     }
 
-    public Builder setLocator(
-        final MembershipLocator<InternalDistributedMember> locator) {
-      this.locator = locator;
-      return this;
-    }
-
     /**
      * Builds and initializes new instance of InternalDistributedSystem.
      */
@@ -3041,7 +2989,7 @@ public class InternalDistributedSystem extends DistributedSystem
                 FunctionStatsManager::new);
         newSystem
             .initialize(securityConfig.getSecurityManager(), securityConfig.getPostProcessor(),
-                metricsServiceBuilder, locator);
+                metricsServiceBuilder);
         notifyConnectListeners(newSystem);
         stopThreads = false;
         return newSystem;
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
index b7475ad..8466dfb 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
@@ -110,7 +110,6 @@ import org.apache.geode.management.internal.configuration.handlers.SharedConfigu
 import org.apache.geode.management.internal.configuration.messages.ClusterManagementServiceInfoRequest;
 import org.apache.geode.management.internal.configuration.messages.SharedConfigurationStatusRequest;
 import org.apache.geode.management.internal.configuration.messages.SharedConfigurationStatusResponse;
-import org.apache.geode.metrics.internal.InternalDistributedSystemMetricsService;
 import org.apache.geode.security.AuthTokenEnabledComponents;
 
 /**
@@ -562,9 +561,9 @@ public class InternalLocator extends Locator implements ConnectListener, LogConf
 
     membershipLocator.addHandler(InfoRequest.class, new InfoRequestHandler());
     restartHandlers.add((ds, cache, sharedConfig) -> {
-      final InternalDistributedSystem ids = (InternalDistributedSystem) ds;
-      // let old locator know about new membership object
-      membershipLocator.setMembership(ids.getDM().getDistribution().getMembership());
+      InternalDistributedSystem ids = (InternalDistributedSystem) ds;
+      Distribution distribution = ids.getDM().getDistribution();
+      membershipLocator.setMembership(distribution.getMembership());
     });
   }
 
@@ -659,7 +658,7 @@ public class InternalLocator extends Locator implements ConnectListener, LogConf
   /**
    * @return the TcpHandler for peer to peer discovery
    */
-  public MembershipLocator<InternalDistributedMember> getMembershipLocator() {
+  public MembershipLocator getMembershipLocator() {
     return membershipLocator;
   }
 
@@ -734,17 +733,13 @@ public class InternalLocator extends Locator implements ConnectListener, LogConf
       logger.info("Starting distributed system");
 
       internalDistributedSystem =
-          InternalDistributedSystem
-              .connectInternal(distributedSystemProperties, null,
-                  new InternalDistributedSystemMetricsService.Builder(),
-                  membershipLocator);
+          (InternalDistributedSystem) DistributedSystem.connect(distributedSystemProperties);
 
       if (peerLocator) {
         // We've created a peer location message handler - it needs to be connected to
         // the membership service in order to get membership view notifications
         membershipLocator
-            .setMembership(internalDistributedSystem.getDM()
-                .getDistribution().getMembership());
+            .setMembership(internalDistributedSystem.getDM().getDistribution().getMembership());
       }
 
       internalDistributedSystem.addDisconnectListener(sys -> stop(false, false, false));
diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorIntegrationTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorIntegrationTest.java
index 7086f34..cab82dc 100644
--- a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorIntegrationTest.java
+++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocatorIntegrationTest.java
@@ -30,7 +30,7 @@ import org.apache.geode.distributed.internal.membership.api.MemberDataBuilder;
 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.MembershipConfigurationException;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
+import org.apache.geode.distributed.internal.membership.gms.GMSMembership;
 import org.apache.geode.distributed.internal.membership.gms.GMSMembershipView;
 import org.apache.geode.distributed.internal.membership.gms.MembershipLocatorStatisticsNoOp;
 import org.apache.geode.distributed.internal.membership.gms.Services;
@@ -85,9 +85,9 @@ public class GMSLocatorIntegrationTest {
                 services.getSerializer().getObjectDeserializer()),
             services.getSerializer().getObjectSerializer(),
             services.getSerializer().getObjectDeserializer());
-
-    final MembershipLocator membershipLocator = mock(MembershipLocator.class);
-    gmsLocator.setServices(services);
+    GMSMembership membership = mock(GMSMembership.class);
+    when(membership.getServices()).thenReturn(services);
+    gmsLocator.setMembership(membership);
   }
 
   @Test
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/LifecycleListener.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/LifecycleListener.java
index 68118ff..32f5c49 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/LifecycleListener.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/LifecycleListener.java
@@ -33,6 +33,13 @@ public interface LifecycleListener<ID extends MemberIdentifier> {
       final ID memberID);
 
   /**
+   * Invoked when the Membership is starting. All membership services will have been
+   * initialized and had their "started" methods invoked but we will not yet have joined
+   * the cluster.
+   */
+  void started();
+
+  /**
    * Invoked when the Membership has successfully joined the cluster. At this point the
    * membership address is stable.
    */
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/MembershipBuilder.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/MembershipBuilder.java
index 220a0d0..d3f491a 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/MembershipBuilder.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/api/MembershipBuilder.java
@@ -32,8 +32,6 @@ public interface MembershipBuilder<ID extends MemberIdentifier> {
 
   MembershipBuilder<ID> setMembershipListener(MembershipListener<ID> membershipListener);
 
-  MembershipBuilder<ID> setMembershipLocator(MembershipLocator<ID> membershipLocator);
-
   MembershipBuilder<ID> setMessageListener(MessageListener<ID> messageListener);
 
   MembershipBuilder<ID> setConfig(MembershipConfig membershipConfig);
@@ -47,7 +45,6 @@ public interface MembershipBuilder<ID extends MemberIdentifier> {
       final TcpClient locatorClient,
       final DSFIDSerializer serializer,
       final MemberIdentifierFactory<ID> memberFactory) {
-    return new MembershipBuilderImpl<>(
-        socketCreator, locatorClient, serializer, memberFactory);
+    return new MembershipBuilderImpl<>(socketCreator, locatorClient, serializer, memberFactory);
   }
 }
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMembership.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMembership.java
index 4406939..ccef4ef 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMembership.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/GMSMembership.java
@@ -1890,6 +1890,7 @@ public class GMSMembership<ID extends MemberIdentifier> implements Membership<ID
     @Override
     public void started() throws MemberStartupException {
       startCleanupTimer();
+      lifecycleListener.started();
     }
 
     /* Service interface */
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/LifecycleListenerNoOp.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/LifecycleListenerNoOp.java
index 5f3f8f0..3924467 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/LifecycleListenerNoOp.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/LifecycleListenerNoOp.java
@@ -43,6 +43,11 @@ public class LifecycleListenerNoOp<ID extends MemberIdentifier> implements Lifec
   }
 
   @Override
+  public void started() {
+
+  }
+
+  @Override
   public void forcedDisconnect() {
 
   }
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipBuilderImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipBuilderImpl.java
index 742c046..f6a46db 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipBuilderImpl.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/MembershipBuilderImpl.java
@@ -24,10 +24,8 @@ 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.MembershipListener;
-import org.apache.geode.distributed.internal.membership.api.MembershipLocator;
 import org.apache.geode.distributed.internal.membership.api.MembershipStatistics;
 import org.apache.geode.distributed.internal.membership.api.MessageListener;
-import org.apache.geode.distributed.internal.membership.gms.locator.MembershipLocatorImpl;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator;
 import org.apache.geode.internal.serialization.DSFIDSerializer;
@@ -49,8 +47,6 @@ public class MembershipBuilderImpl<ID extends MemberIdentifier> implements Membe
   private final MemberIdentifierFactory<ID> memberFactory;
   private LifecycleListener<ID> lifecycleListener = new LifecycleListenerNoOp();
 
-  private MembershipLocatorImpl<ID> membershipLocator;
-
   public MembershipBuilderImpl(
       final TcpSocketCreator socketCreator,
       final TcpClient locatorClient,
@@ -81,13 +77,6 @@ public class MembershipBuilderImpl<ID extends MemberIdentifier> implements Membe
   }
 
   @Override
-  public MembershipBuilder<ID> setMembershipLocator(
-      final MembershipLocator<ID> membershipLocator) {
-    this.membershipLocator = (MembershipLocatorImpl<ID>) membershipLocator;
-    return this;
-  }
-
-  @Override
   public MembershipBuilder<ID> setMessageListener(MessageListener<ID> messageListener) {
     this.messageListener = messageListener;
     return this;
@@ -110,12 +99,9 @@ public class MembershipBuilderImpl<ID extends MemberIdentifier> implements Membe
   public Membership<ID> create() throws MembershipConfigurationException {
     GMSMembership<ID> gmsMembership =
         new GMSMembership<>(membershipListener, messageListener, lifecycleListener);
-    final Services<ID> services =
+    Services<ID> services =
         new Services<>(gmsMembership.getGMSManager(), statistics, authenticator,
             membershipConfig, serializer, memberFactory, locatorClient, socketCreator);
-    if (membershipLocator != null) {
-      services.setLocators(membershipLocator.getGMSLocator(), membershipLocator);
-    }
     services.init();
     return gmsMembership;
   }
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/Services.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/Services.java
index 334dc9c..a994e42 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/Services.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/Services.java
@@ -46,7 +46,6 @@ import org.apache.geode.distributed.internal.membership.api.MemberStartupExcepti
 import org.apache.geode.distributed.internal.membership.api.MembershipClosedException;
 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.MembershipStatistics;
 import org.apache.geode.distributed.internal.membership.gms.fd.GMSHealthMonitor;
 import org.apache.geode.distributed.internal.membership.gms.interfaces.HealthMonitor;
@@ -58,7 +57,6 @@ import org.apache.geode.distributed.internal.membership.gms.locator.FindCoordina
 import org.apache.geode.distributed.internal.membership.gms.locator.FindCoordinatorResponse;
 import org.apache.geode.distributed.internal.membership.gms.locator.GetViewRequest;
 import org.apache.geode.distributed.internal.membership.gms.locator.GetViewResponse;
-import org.apache.geode.distributed.internal.membership.gms.locator.MembershipLocatorImpl;
 import org.apache.geode.distributed.internal.membership.gms.membership.GMSJoinLeave;
 import org.apache.geode.distributed.internal.membership.gms.messages.FinalCheckPassedMessage;
 import org.apache.geode.distributed.internal.membership.gms.messages.HeartbeatMessage;
@@ -105,7 +103,6 @@ public class Services<ID extends MemberIdentifier> {
   private volatile Exception shutdownCause;
 
   private Locator<ID> locator;
-  private MembershipLocator<ID> membershipLocator;
 
   private final Timer timer = new Timer("Geode Membership Timer", true);
 
@@ -212,18 +209,6 @@ public class Services<ID extends MemberIdentifier> {
       this.joinLeave.started();
       this.healthMon.started();
       this.manager.started();
-
-      if (membershipLocator != null) {
-        /*
-         * Now that all the services have started we can let the membership locator know
-         * about them. We must do this before telling the manager to joinDistributedSystem()
-         * later in this method
-         */
-        final MembershipLocatorImpl locatorImpl =
-            (MembershipLocatorImpl) this.membershipLocator;
-        locatorImpl.setServices(this);
-      }
-
       logger.debug("All membership services have been started");
       started = true;
     } catch (RuntimeException e) {
@@ -345,14 +330,12 @@ public class Services<ID extends MemberIdentifier> {
     return this.manager;
   }
 
-  public void setLocators(final Locator<ID> locator,
-      final MembershipLocator<ID> membershipLocator) {
-    this.locator = locator;
-    this.membershipLocator = membershipLocator;
+  public Locator<ID> getLocator() {
+    return this.locator;
   }
 
-  public Locator<ID> getLocator() {
-    return locator;
+  public void setLocator(Locator<ID> locator) {
+    this.locator = locator;
   }
 
   public JoinLeave<ID> getJoinLeave() {
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
index 815b28e..f295362 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/GMSLocator.java
@@ -39,8 +39,10 @@ import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.distributed.internal.membership.api.MemberIdentifier;
+import org.apache.geode.distributed.internal.membership.api.Membership;
 import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
 import org.apache.geode.distributed.internal.membership.api.MembershipLocatorStatistics;
+import org.apache.geode.distributed.internal.membership.gms.GMSMembership;
 import org.apache.geode.distributed.internal.membership.gms.GMSMembershipView;
 import org.apache.geode.distributed.internal.membership.gms.GMSUtil;
 import org.apache.geode.distributed.internal.membership.gms.Services;
@@ -130,20 +132,15 @@ public class GMSLocator<ID extends MemberIdentifier> implements Locator<ID>, Tcp
     this.objectDeserializer = objectDeserializer;
   }
 
-  /**
-   * Called initially and after each auto-reconnect. See restart handlers in InternalLocator
-   * up in geode-core. Services must be started before this call.
-   *
-   */
-  public synchronized boolean setServices(
-      final Services<ID> services) {
-    if (this.services == null || this.services.isStopped()) {
-      this.services = services;
-      localAddress = this.services.getMessenger().getMemberID();
+  public synchronized boolean setMembership(Membership<ID> membership) {
+    if (services == null || services.isStopped()) {
+      services = ((GMSMembership<ID>) membership).getServices();
+      localAddress = services.getMessenger().getMemberID();
       Objects.requireNonNull(localAddress, "member address should have been established");
       logger.info("Peer locator is connecting to local membership services with ID {}",
           localAddress);
-      GMSMembershipView<ID> newView = this.services.getJoinLeave().getView();
+      services.setLocator(this);
+      GMSMembershipView<ID> newView = services.getJoinLeave().getView();
       if (newView != null) {
         view = newView;
         recoveredView = null;
diff --git a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
index 9009d66..7a0a2d3 100644
--- a/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
+++ b/geode-membership/src/main/java/org/apache/geode/distributed/internal/membership/gms/locator/MembershipLocatorImpl.java
@@ -34,8 +34,6 @@ 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.MembershipLocatorStatistics;
-import org.apache.geode.distributed.internal.membership.gms.GMSMembership;
-import org.apache.geode.distributed.internal.membership.gms.Services;
 import org.apache.geode.distributed.internal.tcpserver.ProtocolChecker;
 import org.apache.geode.distributed.internal.tcpserver.TcpClient;
 import org.apache.geode.distributed.internal.tcpserver.TcpHandler;
@@ -143,9 +141,8 @@ public class MembershipLocatorImpl<ID extends MemberIdentifier> implements Membe
   }
 
   @Override
-  public void setMembership(final Membership<ID> membership) {
-    final GMSMembership<ID> gmsMembership = (GMSMembership<ID>) membership;
-    setServices(gmsMembership.getServices());
+  public void setMembership(Membership<ID> membership) {
+    gmsLocator.setMembership(membership);
   }
 
   @Override
@@ -159,18 +156,10 @@ public class MembershipLocatorImpl<ID extends MemberIdentifier> implements Membe
   }
 
   @VisibleForTesting
-  public GMSLocator<ID> getGMSLocator() {
+  public GMSLocator getGMSLocator() {
     return this.gmsLocator;
   }
 
-  /**
-   * Services is a class internal to the membership module. As such, the ability to setServices
-   * is available ony within the module. It's not part of the external API.
-   */
-  public void setServices(final Services<ID> services) {
-    gmsLocator.setServices(services);
-  }
-
   public void stop() {
     if (isAlive()) {
       logger.info("Stopping {}", this);