IGNITE-1977: improved and fixed IgniteSemaphores failover tests
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/14e16282 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/14e16282 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/14e16282 Branch: refs/heads/ignite-2265 Commit: 14e1628234e1bba995228625de0c6405950db65a Parents: c88ab6f Author: Denis Magda <dma...@gridgain.com> Authored: Mon Nov 30 16:24:29 2015 +0300 Committer: Denis Magda <dma...@gridgain.com> Committed: Mon Nov 30 16:24:29 2015 +0300 ---------------------------------------------------------------------- ...eAbstractDataStructuresFailoverSelfTest.java | 309 +++++-------------- 1 file changed, 82 insertions(+), 227 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/14e16282/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java index bc11448..e9737d9 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAbstractDataStructuresFailoverSelfTest.java @@ -406,280 +406,138 @@ public abstract class GridCacheAbstractDataStructuresFailoverSelfTest extends Ig /** * @throws Exception If failed. */ - public void testSemaphoreTopologyChange() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1977"); - + public void testSemaphoreFailoverSafe() throws Exception { try (IgniteSemaphore semaphore = grid(0).semaphore(STRUCTURE_NAME, 20, true, true)) { - try { - Ignite g = startGrid(NEW_GRID_NAME); + Ignite g = startGrid(NEW_GRID_NAME); - assert g.semaphore(STRUCTURE_NAME, 20, true, true).availablePermits() == 20; + IgniteSemaphore semaphore2 = g.semaphore(STRUCTURE_NAME, 20, true, false); - g.semaphore(STRUCTURE_NAME, 20, true, true).acquire(10); + assertEquals(20, semaphore2.availablePermits()); - stopGrid(NEW_GRID_NAME); + semaphore2.acquire(10); - assert grid(0).semaphore(STRUCTURE_NAME, 20, true, true).availablePermits() == 10; - } - finally { - grid(0).semaphore(STRUCTURE_NAME, 20, true, true).close(); - } - } + stopGrid(NEW_GRID_NAME); + assertEquals(10, semaphore.availablePermits()); + } } /** * @throws Exception If failed. */ - public void testSemaphoreConstantTopologyChange() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1977"); - - try (IgniteSemaphore s = grid(0).semaphore(STRUCTURE_NAME, 10, false, true)) { - try { - IgniteInternalFuture<?> fut = GridTestUtils.runMultiThreadedAsync(new CA() { - @Override public void apply() { - try { - for (int i = 0; i < TOP_CHANGE_CNT; i++) { - String name = UUID.randomUUID().toString(); - - try { - Ignite g = startGrid(name); - - assert g.semaphore(STRUCTURE_NAME, 10, false, false) != null; - } - finally { - if (i != TOP_CHANGE_CNT - 1) - stopGrid(name); - } - } - } - catch (Exception e) { - throw F.wrap(e); - } - } - }, TOP_CHANGE_THREAD_CNT, "topology-change-thread"); + public void testSemaphoreNonFailoverSafe() throws Exception { + try (IgniteSemaphore sem = grid(0).semaphore(STRUCTURE_NAME, 20, false, true)) { + Ignite g = startGrid(NEW_GRID_NAME); - int val = s.availablePermits(); + IgniteSemaphore sem2 = g.semaphore(STRUCTURE_NAME, 20, false, false); - while (!fut.isDone()) { - assert s.availablePermits() == val; + sem2.acquire(20); - s.acquire(); + assertEquals(0, sem.availablePermits()); - assert s.availablePermits() == val - 1; - - s.release(); + new Timer().schedule(new TimerTask() { + @Override public void run() { + stopGrid(NEW_GRID_NAME); } + }, 2000); - fut.get(); - - for (Ignite g : G.allGrids()) - assert g.semaphore(STRUCTURE_NAME, 0, false, true).availablePermits() == val; + try { + sem.acquire(1); } - finally { - grid(0).semaphore(STRUCTURE_NAME, 0, false, true).close(); + catch (IgniteInterruptedException e) { + // Expected exception. + return; } } + + fail("Thread hasn't been interrupted"); } /** - * This method tests if permits are successfully reassigned when a node fails in failoverSafe mode. - * * @throws Exception If failed. */ public void testSemaphoreConstantTopologyChangeFailoverSafe() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1977"); - - try (IgniteSemaphore s = grid(0).semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true)) { - try { - IgniteInternalFuture<?> fut = GridTestUtils.runMultiThreadedAsync(new CA() { - @Override public void apply() { - try { - for (int i = 0; i < TOP_CHANGE_CNT; i++) { - String name = UUID.randomUUID().toString(); - - try { - Ignite g = startGrid(name); - - final IgniteSemaphore sem = g.semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true); - - assertNotNull(sem); - - sem.acquire(); - - if (i == TOP_CHANGE_CNT - 1) { - sem.release(); - } - } - finally { - if (i != TOP_CHANGE_CNT - 1) { - stopGrid(name); - } - } - } - } - catch (Exception e) { - throw F.wrap(e); - } - } - }, TOP_CHANGE_THREAD_CNT, "topology-change-thread"); - - while (!fut.isDone()) { - s.release(); - - s.acquire(); - } - - fut.get(); - - int val = s.availablePermits(); - - assertEquals(val, TOP_CHANGE_CNT); - - for (Ignite g : G.allGrids()) - assertEquals(val, g.semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true).availablePermits()); - } - finally { - grid(0).semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true).close(); - } - } + doTestSemaphore(new ConstantTopologyChangeWorker(), true); } /** - * This method tests if permits are successfully reassigned when multiple nodes fail in failoverSafe mode. - * * @throws Exception If failed. */ - public void testSemaphoreConstantMultipleTopologyChangeFailoverSafe() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-1977"); - - final int numPermits = 3; - - try (IgniteSemaphore s = grid(0).semaphore(STRUCTURE_NAME, numPermits, true, true)) { - try { - IgniteInternalFuture<?> fut = GridTestUtils.runMultiThreadedAsync(new CA() { - @Override public void apply() { - try { - for (int i = 0; i < TOP_CHANGE_CNT; i++) { - Collection<String> names = new GridLeanSet<>(3); - - try { - for (int j = 0; j < numPermits; j++) { - String name = UUID.randomUUID().toString(); - - names.add(name); - - Ignite g = startGrid(name); - - final IgniteSemaphore sem = g.semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true); - - assertNotNull(sem); - - sem.acquire(); - - if (i == TOP_CHANGE_CNT - 1) { - sem.release(); - } - } - } - finally { - if (i != TOP_CHANGE_CNT - 1) - for (String name : names) { - stopGrid(name); - - awaitPartitionMapExchange(); - } - } - } - } - catch (Exception e) { - throw F.wrap(e); - } - } - }, TOP_CHANGE_THREAD_CNT, "topology-change-thread"); - - while (!fut.isDone()) { - s.release(); - - s.acquire(); - } - - fut.get(); - - int val = s.availablePermits(); + public void testSemaphoreConstantTopologyChangeNonFailoverSafe() throws Exception { + doTestSemaphore(new ConstantTopologyChangeWorker(), false); + } - assertEquals(val, numPermits); + /** + * @throws Exception If failed. + */ + public void testSemaphoreMultipleTopologyChangeFailoverSafe() throws Exception { + doTestSemaphore(multipleTopologyChangeWorker(), true); + } - for (Ignite g : G.allGrids()) - assertEquals(val, g.semaphore(STRUCTURE_NAME, 0, true, true).availablePermits()); - } - finally { - grid(0).semaphore(STRUCTURE_NAME, 0, true, true).close(); - } - } + /** + * @throws Exception If failed. + */ + public void testSemaphoreMultipleTopologyChangeNonFailoverSafe() throws Exception { + doTestSemaphore(multipleTopologyChangeWorker(), false); } /** - * This method test if exception is thrown when node fails in non FailoverSafe mode. - * * @throws Exception If failed. */ - public void testSemaphoreConstantTopologyChangeNotFailoverSafe() throws Exception { + private void doTestSemaphore(ConstantTopologyChangeWorker topWorker, final boolean failoverSafe) throws Exception { fail("https://issues.apache.org/jira/browse/IGNITE-1977"); - try (IgniteSemaphore s = grid(0).semaphore(STRUCTURE_NAME, 1, false, true)) { - try { - IgniteInternalFuture<?> fut = GridTestUtils.runMultiThreadedAsync(new CA() { - @Override public void apply() { - try { - for (int i = 0; i < 2; i++) { - String name = UUID.randomUUID().toString(); - - try { - Ignite g = startGrid(name); - - final IgniteSemaphore sem = g.semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true); + final int permits = topWorker instanceof MultipleTopologyChangeWorker || + topWorker instanceof PartitionedMultipleTopologyChangeWorker ? TOP_CHANGE_THREAD_CNT * 3 : + TOP_CHANGE_CNT; - assertNotNull(sem); - - if (i != 1) { - sem.acquire(); - } + try (IgniteSemaphore s = grid(0).semaphore(STRUCTURE_NAME, permits, failoverSafe, true)) { + IgniteInternalFuture<?> fut = topWorker.startChangingTopology(new IgniteClosure<Ignite, Object>() { + @Override public Object apply(Ignite ignite) { + IgniteSemaphore sem = ignite.semaphore(STRUCTURE_NAME, permits, failoverSafe, false); - } - finally { - if (i != 1) { - stopGrid(name); - } - } - } + while (true) { + try { + sem.acquire(1); + break; } - catch (Exception e) { - throw F.wrap(e); + catch (IgniteInterruptedException e) { + // Exception may happen in non failover safe mode. + if (failoverSafe) + throw e; } } - }, TOP_CHANGE_THREAD_CNT, "topology-change-thread"); - while (s.availablePermits() != 0) { - // Wait for semaphore to be acquired. + return null; } + }); - try { - s.acquire(); - fail("In non-FailoverSafe mode IgniteInterruptedCheckedException must be thrown."); - } - catch (Exception e) { - assert (e instanceof IgniteInterruptedException); + while (!fut.isDone()) { + while (true) { + try { + s.acquire(1); + + break; + } + catch (IgniteInterruptedException e) { + // Exception may happen in non failover safe mode. + if (failoverSafe) + throw e; + } } - assertTrue(s.isBroken()); + assert s.availablePermits() < permits; - fut.get(); - } - finally { - grid(0).semaphore(STRUCTURE_NAME, TOP_CHANGE_CNT, true, true).close(); + s.release(); + + assert s.availablePermits() <= permits; } + + fut.get(); + + for (Ignite g : G.allGrids()) + assertEquals(permits, g.semaphore(STRUCTURE_NAME, permits, false, false).availablePermits()); } } @@ -1010,8 +868,7 @@ public abstract class GridCacheAbstractDataStructuresFailoverSelfTest extends Ig callback.apply(g); } finally { - if (i != TOP_CHANGE_CNT - 1) - stopGrid(name); + stopGrid(name); } } } @@ -1060,10 +917,8 @@ public abstract class GridCacheAbstractDataStructuresFailoverSelfTest extends Ig } } finally { - if (i != TOP_CHANGE_CNT - 1) { - for (String name : names) - stopGrid(name); - } + for (String name : names) + stopGrid(name); } } }