Repository: ignite Updated Branches: refs/heads/master 407843251 -> 76485fc3e
ignite-4173 IgniteSemaphore with failoverSafe enabled doesn't release permits in case permits owner node left topology Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/76485fc3 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/76485fc3 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/76485fc3 Branch: refs/heads/master Commit: 76485fc3eb4baf9c1e1e60e77dd904330db837b4 Parents: 4078432 Author: vladisav <[email protected]> Authored: Thu Apr 13 13:24:42 2017 +0300 Committer: Yakov Zhdanov <[email protected]> Committed: Thu Apr 13 13:24:42 2017 +0300 ---------------------------------------------------------------------- .../datastructures/GridCacheSemaphoreImpl.java | 12 ++++++++++++ .../SemaphoreFailoverSafeReleasePermitsTest.java | 9 ++++----- 2 files changed, 16 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/76485fc3/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java index 159e735..c96894b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/GridCacheSemaphoreImpl.java @@ -571,6 +571,18 @@ public final class GridCacheSemaphoreImpl implements GridCacheSemaphoreEx, Exter /** {@inheritDoc} */ @Override public void onNodeRemoved(UUID nodeId) { + try { + initializeSemaphore(); + } + catch (IgniteCheckedException e) { + U.error(log, "Failed to recover from failover because distributed semaphore cannot be initialized " + + "(Ignore if this node is failing also)." ); + + // Degrade gracefully, no exception is thrown + // because other semaphores might also attempt to recover from failover. + return; + } + int numPermits = sync.getPermitsForNode(nodeId); if (numPermits > 0) { http://git-wip-us.apache.org/repos/asf/ignite/blob/76485fc3/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/SemaphoreFailoverSafeReleasePermitsTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/SemaphoreFailoverSafeReleasePermitsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/SemaphoreFailoverSafeReleasePermitsTest.java index 733b797..210b234 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/SemaphoreFailoverSafeReleasePermitsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/SemaphoreFailoverSafeReleasePermitsTest.java @@ -92,6 +92,9 @@ public class SemaphoreFailoverSafeReleasePermitsTest extends GridCommonAbstractT IgniteSemaphore sem = ignite.semaphore("sem", 1, true, true); + // Initialize second semaphore before the first one is broken. + IgniteSemaphore sem2 = grid(1).semaphore("sem", 1, true, true); + assertEquals(1, sem.availablePermits()); sem.acquire(1); @@ -102,11 +105,7 @@ public class SemaphoreFailoverSafeReleasePermitsTest extends GridCommonAbstractT awaitPartitionMapExchange(); - ignite = grid(1); - - sem = ignite.semaphore("sem", 1, true, true); - - assertTrue(sem.tryAcquire(1, 5000, TimeUnit.MILLISECONDS)); + assertTrue(sem2.tryAcquire(1, 5000, TimeUnit.MILLISECONDS)); } finally { stopAllGrids();
