GEODE-2859: Fix race in ShowDeadlockDUnitTest
Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/ab7e51f8 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/ab7e51f8 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/ab7e51f8 Branch: refs/heads/feature/GEODE-2900 Commit: ab7e51f820db6cfb070769cecebb621298e75c26 Parents: e98606d Author: Jared Stewart <jstew...@pivotal.io> Authored: Wed May 10 16:06:13 2017 -0700 Committer: Jared Stewart <jstew...@pivotal.io> Committed: Thu May 11 11:19:34 2017 -0700 ---------------------------------------------------------------------- .../cli/commands/ShowDeadlockDUnitTest.java | 95 +++++++------------- 1 file changed, 32 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/ab7e51f8/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowDeadlockDUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowDeadlockDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowDeadlockDUnitTest.java index 2cfce97..a5293eb 100644 --- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowDeadlockDUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowDeadlockDUnitTest.java @@ -14,14 +14,11 @@ */ package org.apache.geode.management.internal.cli.commands; -import static org.apache.geode.distributed.ConfigurationProperties.*; - -import org.apache.geode.cache.Cache; +import org.apache.commons.io.FileUtils; import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionContext; import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.cache.execute.ResultCollector; -import org.apache.geode.distributed.DistributedLockService; import org.apache.geode.distributed.internal.deadlock.GemFireDeadlockDetector; import org.apache.geode.distributed.internal.membership.InternalDistributedMember; import org.apache.geode.management.cli.Result; @@ -36,6 +33,7 @@ import org.apache.geode.test.dunit.SerializableRunnable; import org.apache.geode.test.dunit.VM; import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase; import org.apache.geode.test.junit.categories.DistributedTest; +import org.awaitility.Awaitility; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -46,7 +44,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT; import static org.apache.geode.test.dunit.Assert.*; import static org.apache.geode.test.dunit.Invoke.invokeInEveryVM; import static org.apache.geode.test.dunit.LogWriterUtils.getLogWriter; @@ -98,15 +95,17 @@ public class ShowDeadlockDUnitTest extends JUnit4CacheTestCase { createCache(vm1); createCache(new Properties()); - String fileName = "dependency.txt"; + String filename = "dependency.txt"; GemFireDeadlockDetector detect = new GemFireDeadlockDetector(); assertEquals(null, detect.find().findCycle()); - CommandProcessor commandProcessor = new CommandProcessor(); - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.SHOW_DEADLOCK); - csb.addOption(CliStrings.SHOW_DEADLOCK__DEPENDENCIES__FILE, fileName); - Result result = commandProcessor.createCommandStatement(csb.toString(), EMPTY_ENV).process(); + String showDeadlockCommand = new CommandStringBuilder(CliStrings.SHOW_DEADLOCK) + .addOption(CliStrings.SHOW_DEADLOCK__DEPENDENCIES__FILE, filename).toString(); + + CommandProcessor commandProcessor = new CommandProcessor(); + Result result = + commandProcessor.createCommandStatement(showDeadlockCommand, EMPTY_ENV).process(); String deadLockOutputFromCommand = getResultAsString(result); getLogWriter().info("output = " + deadLockOutputFromCommand); @@ -115,7 +114,7 @@ public class ShowDeadlockDUnitTest extends JUnit4CacheTestCase { assertEquals(true, deadLockOutputFromCommand.startsWith(CliStrings.SHOW_DEADLOCK__NO__DEADLOCK)); result.saveIncomingFiles(null); - File file = new File(fileName); + File file = new File(filename); assertTrue(file.exists()); file.delete(); @@ -140,40 +139,34 @@ public class ShowDeadlockDUnitTest extends JUnit4CacheTestCase { // This thread locks the lock member2 first, then member1. lockTheLocks(vm1, member1); - Thread.sleep(5000); - CommandProcessor commandProcessor = new CommandProcessor(); - CommandStringBuilder csb = new CommandStringBuilder(CliStrings.SHOW_DEADLOCK); - csb.addOption(CliStrings.SHOW_DEADLOCK__DEPENDENCIES__FILE, filename); - Result result = commandProcessor.createCommandStatement(csb.toString(), EMPTY_ENV).process(); + String showDeadlockCommand = new CommandStringBuilder(CliStrings.SHOW_DEADLOCK) + .addOption(CliStrings.SHOW_DEADLOCK__DEPENDENCIES__FILE, filename).toString(); - String deadLockOutputFromCommand = getResultAsString(result); - getLogWriter().info("Deadlock = " + deadLockOutputFromCommand); - result.saveIncomingFiles(null); - assertEquals(true, - deadLockOutputFromCommand.startsWith(CliStrings.SHOW_DEADLOCK__DEADLOCK__DETECTED)); - assertEquals(true, result.getStatus().equals(Status.OK)); - File file = new File(filename); - assertTrue(file.exists()); - file.delete(); + CommandProcessor commandProcessor = new CommandProcessor(); + Awaitility.await().atMost(1, TimeUnit.MINUTES).until(() -> { + Result result = + commandProcessor.createCommandStatement(showDeadlockCommand, EMPTY_ENV).process(); + String deadLockOutputFromCommand = getResultAsString(result); + File fileResult = new File(filename); + FileUtils.deleteQuietly(fileResult); + try { + result.saveIncomingFiles(null); + } catch (IOException e) { + throw new RuntimeException(e); + } + assertEquals(true, + deadLockOutputFromCommand.startsWith(CliStrings.SHOW_DEADLOCK__DEADLOCK__DETECTED)); + assertEquals(true, result.getStatus().equals(Status.OK)); + assertTrue(fileResult.exists()); + fileResult.delete(); + }); } private void createCache(Properties props) { getSystem(props); - final Cache cache = getCache(); - } - - private Properties createProperties(Host host, int locatorPort) { - Properties props = new Properties(); - props.setProperty(MCAST_PORT, "0"); - // props.setProperty(DistributionConfig.LOCATORS_NAME, getServerHostName(host) + "[" + - // locatorPort + "]"); - props.setProperty(LOG_LEVEL, "info"); - props.setProperty(STATISTIC_SAMPLING_ENABLED, "true"); - props.setProperty(ENABLE_TIME_STATISTICS, "true"); - props.put(ENABLE_NETWORK_PARTITION_DETECTION, "true"); - return props; + getCache(); } private void lockTheLocks(VM vm0, final InternalDistributedMember member) { @@ -183,11 +176,7 @@ public class ShowDeadlockDUnitTest extends JUnit4CacheTestCase { public void run() { lock.lock(); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - fail("interrupted", e); - } + ResultCollector collector = FunctionService.onMember(basicGetSystem(), member).execute(new TestFunction()); // wait the function to lock the lock on member. @@ -197,26 +186,6 @@ public class ShowDeadlockDUnitTest extends JUnit4CacheTestCase { }); } - private void lockTheDLocks(VM vm, final String first, final String second) { - vm.invokeAsync(new SerializableRunnable() { - - private static final long serialVersionUID = 1L; - - public void run() { - getCache(); - DistributedLockService dls = DistributedLockService.create("deadlock_test", getSystem()); - dls.lock(first, 10 * 1000, -1); - - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - dls.lock(second, 10 * 1000, -1); - } - }); - } - private InternalDistributedMember createCache(VM vm) { return (InternalDistributedMember) vm.invoke(new SerializableCallable() { /**