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/b9c007b6 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/b9c007b6 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/b9c007b6 Branch: refs/heads/feature/GEM-1299 Commit: b9c007b60a65be10f7b430e855df842d51f83239 Parents: 9e5dfa4 Author: Ken Howe <kh...@pivotal.io> Authored: Tue Apr 18 10:43:51 2017 -0700 Committer: zhouxh <gz...@pivotal.io> Committed: Wed Apr 26 23:28:49 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/b9c007b6/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/b9c007b6/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/b9c007b6/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/b9c007b6/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/b9c007b6/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();