You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2017/04/27 18:47:56 UTC

[21/40] geode git commit: GEODE-2681: prevent synchronization hang on getAnyInstance

GEODE-2681: prevent synchronization hang on getAnyInstance

Take advantage of recent refactoring to use the InternalCache interface API
instead of GemFireCahceImpl.


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/809fd1aa
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/809fd1aa
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/809fd1aa

Branch: refs/heads/feature/GEM-1299
Commit: 809fd1aad30f66b724aecae7e5cbca2b9b9bf3a0
Parents: e800282
Author: Ken Howe <kh...@pivotal.io>
Authored: Tue Apr 18 10:43:51 2017 -0700
Committer: Ken Howe <kh...@pivotal.io>
Committed: Wed Apr 26 07:40:35 2017 -0700

----------------------------------------------------------------------
 .../ShowMissingDiskStoresFunction.java          |  44 +++--
 .../ShowMissingDiskStoresDUnitTest.java         | 170 +++++++++++++++++++
 .../ShowMissingDiskStoresFunctionJUnitTest.java | 110 +++++-------
 .../apache/geode/test/dunit/rules/MemberVM.java |   5 +
 .../test/dunit/rules/ServerStarterRule.java     |   2 +-
 5 files changed, 235 insertions(+), 96 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/809fd1aa/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunction.java
----------------------------------------------------------------------
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunction.java
index a2812fa..441486e 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunction.java
@@ -35,8 +35,8 @@ import org.apache.geode.internal.cache.persistence.PersistentMemberPattern;
 
 public class ShowMissingDiskStoresFunction extends FunctionAdapter implements InternalEntity {
 
-  protected Cache getCache() {
-    return CacheFactory.getAnyInstance();
+  protected InternalCache getCache() {
+    return GemFireCacheImpl.getInstance();
   }
 
   @Override
@@ -48,34 +48,28 @@ public class ShowMissingDiskStoresFunction extends FunctionAdapter implements In
       throw new RuntimeException();
     }
     try {
-      final Cache cache = getCache();
+      final InternalCache cache = getCache();
 
-      if (cache instanceof InternalCache) {
-        final InternalCache gemfireCache = (InternalCache) cache;
+      if (cache != null && !cache.isClosed()) {
+        final DistributedMember member = cache.getMyId();
 
-        final DistributedMember member = gemfireCache.getMyId();
-
-        GemFireCacheImpl gfci = GemFireCacheImpl.getInstance();
-        if (gfci != null && !gfci.isClosed()) {
-          // Missing DiskStores
-          PersistentMemberManager mm = gfci.getPersistentMemberManager();
-          Map<String, Set<PersistentMemberID>> waitingRegions = mm.getWaitingRegions();
-          for (Map.Entry<String, Set<PersistentMemberID>> entry : waitingRegions.entrySet()) {
-            for (PersistentMemberID id : entry.getValue()) {
-              memberMissingIDs.add(new PersistentMemberPattern(id));
-            }
+        // Missing DiskStores
+        PersistentMemberManager mm = cache.getPersistentMemberManager();
+        Map<String, Set<PersistentMemberID>> waitingRegions = mm.getWaitingRegions();
+        for (Set<PersistentMemberID> entry : waitingRegions.values()) {
+          for (PersistentMemberID id : entry) {
+            memberMissingIDs.add(new PersistentMemberPattern(id));
           }
-          // Missing colocated regions
-          Set<PartitionedRegion> prs = gfci.getPartitionedRegions();
-          for (PartitionedRegion pr : prs) {
-            List<String> missingChildRegions = pr.getMissingColocatedChildren();
-            for (String child : missingChildRegions) {
-              missingColocatedRegions.add(new ColocatedRegionDetails(member.getHost(),
-                  member.getName(), pr.getFullPath(), child));
-            }
+        }
+        // Missing colocated regions
+        Set<PartitionedRegion> prs = ((GemFireCacheImpl) cache).getPartitionedRegions();
+        for (PartitionedRegion pr : prs) {
+          List<String> missingChildRegions = pr.getMissingColocatedChildren();
+          for (String child : missingChildRegions) {
+            missingColocatedRegions.add(new ColocatedRegionDetails(member.getHost(),
+                member.getName(), pr.getFullPath(), child));
           }
         }
-
       }
 
       if (memberMissingIDs.isEmpty() && missingColocatedRegions.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/geode/blob/809fd1aa/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
new file mode 100644
index 0000000..766f25a
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMissingDiskStoresDUnitTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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.management.internal.cli.commands;
+
+import static org.apache.geode.distributed.ConfigurationProperties.CLUSTER_CONFIGURATION_DIR;
+import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
+import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
+import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.NAME;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.DiskStoreFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.distributed.ConfigurationProperties;
+import org.apache.geode.distributed.ServerLauncher;
+import org.apache.geode.internal.cache.DiskStoreAttributes;
+import org.apache.geode.internal.cache.DiskStoreFactoryImpl;
+import org.apache.geode.management.cli.CliMetaData;
+import org.apache.geode.management.internal.cli.i18n.CliStrings;
+import org.apache.geode.management.internal.cli.result.CommandResult;
+import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
+import org.apache.geode.test.dunit.AsyncInvocation;
+import org.apache.geode.test.dunit.rules.GfshShellConnectionRule;
+import org.apache.geode.test.dunit.rules.LocatorServerStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+import org.apache.geode.test.junit.categories.DistributedTest;
+import org.awaitility.Awaitility;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.springframework.shell.support.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+@Category(DistributedTest.class)
+public class ShowMissingDiskStoresDUnitTest {
+
+  // private static final String DISK_STORE = "diskStore";
+  private static final String DISK_STORE_DIR = "myDiskStores";
+  private MemberVM locator;
+  private MemberVM server1;
+  private MemberVM server2;
+
+  @Rule
+  public TestName testName = new TestName();
+
+  @Rule
+  public LocatorServerStartupRule lsRule = new LocatorServerStartupRule();
+
+  @Rule
+  public GfshShellConnectionRule gfshConnector = new GfshShellConnectionRule();
+
+  @Before
+  public void before() throws Exception {
+    locator = lsRule.startLocatorVM(0);
+    gfshConnector.connect(locator);
+    assertThat(gfshConnector.isConnected()).isTrue();
+
+    // start a server so that we can execute data commands that requires at least a server running
+    server1 = lsRule.startServerVM(1, locator.getPort());
+    server2 = lsRule.startServerVM(2, locator.getPort());
+  }
+
+  @Ignore("WIP: new test for GEODE-2681 fix")
+  @Test
+  public void missingDiskStores_gfshDoesntHang() throws Exception {
+    final String testRegionName = "regionA";
+    CommandStringBuilder csb;
+    // TODO: Need to ensure that the diskstores are created in "user.dir" as set by the
+    // *StarterRules, see DiskStoreFactoryImpl.setDiskDirsAndSizes
+    csb = new CommandStringBuilder(CliStrings.CREATE_DISK_STORE)
+        .addOption(CliStrings.CREATE_DISK_STORE__NAME, "diskStore")
+        .addOption(CliStrings.CREATE_DISK_STORE__DIRECTORY_AND_SIZE, "diskStoreDir");
+    gfshConnector.executeAndVerifyCommand(csb.getCommandString());
+
+    Awaitility.await().until(() -> {
+      return new File(server1.getWorkingDir(), "diskStoreDir").exists()
+          && new File(server2.getWorkingDir(), "diskStoreDir").exists();
+    });
+
+    csb = new CommandStringBuilder(CliStrings.CREATE_REGION)
+        .addOption(CliStrings.CREATE_REGION__REGION, testRegionName)
+        .addOption(CliStrings.CREATE_REGION__DISKSTORE, "diskStore")
+        .addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT,
+            RegionShortcut.REPLICATE_PERSISTENT.toString());
+    gfshConnector.executeAndVerifyCommand(csb.getCommandString());
+
+    // Add data to the region
+    putUsingGfsh(gfshConnector, testRegionName, 1, "A");
+    putUsingGfsh(gfshConnector, testRegionName, 2, "B");
+    putUsingGfsh(gfshConnector, testRegionName, 3, "C");
+
+    lsRule.stopMember(1);
+    lsRule.stopMember(2);
+
+    AsyncInvocation restart1 = restartServerAsync(server1);
+    checkAsyncResults(restart1, gfshConnector, 5);
+
+    AsyncInvocation restart2 = restartServerAsync(server2);
+    checkAsyncResults(restart2, gfshConnector, 5);
+
+    for (AsyncInvocation ai : new AsyncInvocation[] {restart1, restart2}) {
+      if (ai.isAlive()) {
+        restart1.cancel(true);
+      }
+    }
+  }
+
+  private AsyncInvocation restartServerAsync(MemberVM member) throws Exception {
+    String memberWorkingDir = member.getWorkingDir().getAbsolutePath();
+    int locatorPort = locator.getPort();
+    AsyncInvocation restart = member.invokeAsync(() -> {
+      ServerLauncher serverLauncher =
+          new ServerLauncher.Builder().setWorkingDirectory(memberWorkingDir)
+              .setMemberName("server-1").set(LOCATORS, "localhost[" + locatorPort + "]").build();
+      serverLauncher.start();
+    });
+
+    return restart;
+  }
+
+  private void checkAsyncResults(AsyncInvocation ai, GfshShellConnectionRule gfsh, int secsToWait)
+      throws Exception {
+    try {
+      Awaitility.await().atLeast(secsToWait, TimeUnit.SECONDS).until(() -> ai.isDone());
+    } catch (Exception e) {
+      // e.printStackTrace();
+    }
+
+    CommandResult result;
+
+    result = gfsh.executeCommand("list members");
+    System.out.println(result);
+    result = gfsh.executeCommand("show missing-disk-stores");
+    System.out.println(result);
+  }
+
+  private void putUsingGfsh(GfshShellConnectionRule gfsh, String regionName, int key, String val)
+      throws Exception {
+    CommandStringBuilder csb = new CommandStringBuilder(CliStrings.PUT)
+        .addOption(CliStrings.PUT__KEY, Integer.toString(key)).addOption(CliStrings.PUT__VALUE, val)
+        .addOption(CliStrings.PUT__REGIONNAME, regionName);
+    gfsh.executeAndVerifyCommand(csb.getCommandString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/geode/blob/809fd1aa/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunctionJUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunctionJUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunctionJUnitTest.java
index 1cfa242..ba436c5 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunctionJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/ShowMissingDiskStoresFunctionJUnitTest.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.Logger;
@@ -107,16 +108,16 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
     GemFireCacheImpl.setInstanceForTests(oldCacheInstance);
   }
 
-  private class TestSPRFFunc1 extends ShowMissingDiskStoresFunction {
+  private class TestSMDSFFunc1 extends ShowMissingDiskStoresFunction {
     @Override
-    protected Cache getCache() {
+    protected InternalCache getCache() {
       return null;
     }
   }
 
-  private class TestSPRFFunc2 extends ShowMissingDiskStoresFunction {
+  private class TestSMDSFFunc2 extends ShowMissingDiskStoresFunction {
     @Override
-    protected Cache getCache() {
+    protected InternalCache getCache() {
       return cache;
     }
   }
@@ -127,22 +128,21 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    */
   @Test
   public final void testGetCache() {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
-    assertTrue(rff.getCache() instanceof Cache);
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
+    assertTrue(smdsFunc.getCache() instanceof Cache);
   }
 
   /**
-   * Test method for
-   * {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
+   * Test method for {@link ShowMissingDiskStoresFunction#execute(FunctionContext)}.
    */
   @Test
   public final void testExecute() {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
 
-    rff.execute(context);
+    smdsFunc.execute(context);
     try {
       results = resultSender.getResults();
     } catch (Throwable e) {
@@ -160,8 +160,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
   public final void testExecuteWithNullContextThrowsRuntimeException() {
     expectedException.expect(RuntimeException.class);
 
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
-    rff.execute(null);
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
+    smdsFunc.execute(null);
     fail("Missing expected RuntimeException");
   }
 
@@ -170,17 +170,12 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
    */
   @Test
-  public final void testExecuteWithNullCacheInstanceHasEmptyResults() {
-    TestSPRFFunc1 rff = new TestSPRFFunc1();
+  public final void testExecuteWithNullCacheInstanceHasEmptyResults() throws Throwable {
+    TestSMDSFFunc1 testSMDSFunc = new TestSMDSFFunc1();
     List<?> results = null;
 
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    testSMDSFunc.execute(context);
+    results = resultSender.getResults();
     assertNotNull(results);
     assertEquals(1, results.size());
     assertNull(results.get(0));
@@ -191,20 +186,15 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
    */
   @Test
-  public final void testExecuteWithNullGFCIResultValueIsNull() {
-    TestSPRFFunc2 rff = new TestSPRFFunc2();
+  public final void testExecuteWithNullGFCIResultValueIsNull() throws Throwable {
+    TestSMDSFFunc2 testSMDSFunc = new TestSMDSFFunc2();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
     GemFireCacheImpl.setInstanceForTests(null);
 
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    testSMDSFunc.execute(context);
+    results = resultSender.getResults();
     assertNotNull(results);
     assertEquals(1, results.size());
     assertNull(results.get(0));
@@ -215,19 +205,14 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
    */
   @Test
-  public final void testExecuteWhenGFCIClosedResultValueIsNull() {
-    TestSPRFFunc2 rff = new TestSPRFFunc2();
+  public final void testExecuteWhenGFCIClosedResultValueIsNull() throws Throwable {
+    TestSMDSFFunc2 testSMDSFunc = new TestSMDSFFunc2();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
     when(((GemFireCacheImpl) cache).isClosed()).thenReturn(true);
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    testSMDSFunc.execute(context);
+    results = resultSender.getResults();
     assertNotNull(results);
   }
 
@@ -238,8 +223,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * @throws UnknownHostException
    */
   @Test
-  public final void testExecuteReturnsMissingDiskStores() throws UnknownHostException {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
+  public final void testExecuteReturnsMissingDiskStores() throws Throwable {
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
@@ -255,13 +240,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
     mapMember1.put("member1", regions1);
     when(memberManager.getWaitingRegions()).thenReturn(mapMember1);
 
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    smdsFunc.execute(context);
+    results = resultSender.getResults();
     assertNotNull(results);
     assertEquals(1, results.size());
     Set<?> detailSet = (Set<?>) results.get(0);
@@ -286,8 +266,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * {@link org.apache.geode.management.internal.cli.functions.ShowMissingDiskStoresFunction#execute(org.apache.geode.cache.execute.FunctionContext)}.
    */
   @Test
-  public final void testExecuteReturnsMissingColocatedRegions() {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
+  public final void testExecuteReturnsMissingColocatedRegions() throws Throwable {
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
@@ -301,13 +281,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
     when(pr1.getMissingColocatedChildren()).thenReturn(missing1);
     when(pr1.getFullPath()).thenReturn("/pr1");
 
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    smdsFunc.execute(context);
+    results = resultSender.getResults();
     assertEquals(1, results.size());
     Set<?> detailSet = (Set<?>) results.get(0);
     assertEquals(2, detailSet.toArray().length);
@@ -332,8 +307,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    * @throws UnknownHostException
    */
   @Test
-  public final void testExecuteReturnsMissingStoresAndRegions() throws UnknownHostException {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
+  public final void testExecuteReturnsMissingStoresAndRegions() throws Throwable {
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
     List<?> results = null;
 
     when(cache.getPersistentMemberManager()).thenReturn(memberManager);
@@ -358,13 +333,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
     when(pr1.getMissingColocatedChildren()).thenReturn(missing1);
     when(pr1.getFullPath()).thenReturn("/pr1");
 
-    rff.execute(context);
-    try {
-      results = resultSender.getResults();
-    } catch (Throwable e) {
-      e.printStackTrace();
-      fail("Unexpected exception");
-    }
+    smdsFunc.execute(context);
+    results = resultSender.getResults();
     assertEquals(2, results.size());
     for (Object result : results) {
       Set<?> detailSet = (Set<?>) result;
@@ -412,11 +382,11 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
   public final void testExecuteCatchesExceptions() throws Throwable {
     expectedException.expect(RuntimeException.class);
 
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
 
     when(cache.getPersistentMemberManager()).thenThrow(new RuntimeException());
 
-    rff.execute(context);
+    smdsFunc.execute(context);
     List<?> results = resultSender.getResults();
     fail("Failed to catch expected RuntimeException");
   }
@@ -428,8 +398,8 @@ public class ShowMissingDiskStoresFunctionJUnitTest {
    */
   @Test
   public final void testGetId() {
-    ShowMissingDiskStoresFunction rff = new ShowMissingDiskStoresFunction();
-    assertEquals(ShowMissingDiskStoresFunction.class.getName(), rff.getId());
+    ShowMissingDiskStoresFunction smdsFunc = new ShowMissingDiskStoresFunction();
+    assertEquals(ShowMissingDiskStoresFunction.class.getName(), smdsFunc.getId());
   }
 
   private static class TestResultSender implements ResultSender {

http://git-wip-us.apache.org/repos/asf/geode/blob/809fd1aa/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java
index 05e541a..1626985 100644
--- a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java
+++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/MemberVM.java
@@ -15,6 +15,7 @@
 
 package org.apache.geode.test.dunit.rules;
 
+import org.apache.geode.test.dunit.AsyncInvocation;
 import org.apache.geode.test.dunit.SerializableRunnableIF;
 import org.apache.geode.test.dunit.VM;
 
@@ -41,6 +42,10 @@ public class MemberVM<T extends Member> implements Member {
     vm.invoke(runnable);
   }
 
+  public AsyncInvocation invokeAsync(final SerializableRunnableIF runnable) {
+    return vm.invokeAsync(runnable);
+  }
+
   public T getMember() {
     return (T) member;
   }

http://git-wip-us.apache.org/repos/asf/geode/blob/809fd1aa/geode-core/src/test/java/org/apache/geode/test/dunit/rules/ServerStarterRule.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/ServerStarterRule.java b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/ServerStarterRule.java
index 0e65354..ead1047 100644
--- a/geode-core/src/test/java/org/apache/geode/test/dunit/rules/ServerStarterRule.java
+++ b/geode-core/src/test/java/org/apache/geode/test/dunit/rules/ServerStarterRule.java
@@ -93,7 +93,7 @@ public class ServerStarterRule extends MemberStarterRule<ServerStarterRule> impl
   }
 
   @Override
-  void stopMember() {
+  public void stopMember() {
     // make sure this cache is the one currently open. A server cache can be recreated due to
     // importing a new set of cluster configuration.
     cache = GemFireCacheImpl.getInstance();