ignite-3537 Added tests. This closes #1441
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/db5da76a Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/db5da76a Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/db5da76a Branch: refs/heads/ignite-3477-merge2.0 Commit: db5da76a57734b0509c70cc3afc284310a35fe0f Parents: 46ff66e Author: javaller <vop...@gmail.com> Authored: Wed Feb 8 21:49:57 2017 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Wed Feb 8 21:49:57 2017 +0300 ---------------------------------------------------------------------- ...CacheAtomicReferenceApiSelfAbstractTest.java | 60 +++++++++++++++++++- ...idCacheAtomicStampedApiSelfAbstractTest.java | 59 +++++++++++++++++++ .../GridCacheQueueApiSelfAbstractTest.java | 58 +++++++++++++++++++ .../GridCacheSetAbstractSelfTest.java | 53 +++++++++++++++++ .../IgniteAtomicLongApiAbstractSelfTest.java | 27 +++++++++ .../IgniteCountDownLatchAbstractSelfTest.java | 43 ++++++++++++++ .../IgniteLockAbstractSelfTest.java | 54 +++++++++++++++++- .../IgniteSemaphoreAbstractSelfTest.java | 52 ++++++++++++++++- 8 files changed, 403 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicReferenceApiSelfAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicReferenceApiSelfAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicReferenceApiSelfAbstractTest.java index 278bcf9..3c4b3a7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicReferenceApiSelfAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicReferenceApiSelfAbstractTest.java @@ -18,8 +18,15 @@ package org.apache.ignite.internal.processors.cache.datastructures; import java.util.UUID; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteAtomicReference; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteException; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.transactions.Transaction; + +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Basic tests for atomic reference. @@ -127,4 +134,55 @@ public abstract class GridCacheAtomicReferenceApiSelfAbstractTest extends Ignite assertTrue(success); assertEquals("newVal", atomic.get()); } -} + + /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + String atomicName = UUID.randomUUID().toString(); + + String initValue = "qazwsx"; + + IgniteAtomicReference<String> atomicReference = ignite.atomicReference(atomicName, initValue, true); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + assertEquals(initValue, atomicReference.get()); + + assertTrue(atomicReference.compareAndSet(initValue, "aaa")); + + assertEquals("aaa", atomicReference.get()); + + tx.rollback(); + + assertEquals(0, cache.size()); + } + + assertTrue(atomicReference.compareAndSet("aaa", null)); + + assertNull(atomicReference.get()); + + atomicReference.close(); + + assertTrue(atomicReference.removed()); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicStampedApiSelfAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicStampedApiSelfAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicStampedApiSelfAbstractTest.java index 7474330..81300e4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicStampedApiSelfAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheAtomicStampedApiSelfAbstractTest.java @@ -18,8 +18,15 @@ package org.apache.ignite.internal.processors.cache.datastructures; import java.util.UUID; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteAtomicStamped; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteException; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.transactions.Transaction; + +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Basic tests for atomic stamped. @@ -120,4 +127,56 @@ public abstract class GridCacheAtomicStampedApiSelfAbstractTest extends IgniteAt assertEquals(null, atomic.value()); assertEquals(null, atomic.stamp()); } + + /** + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("MyCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + String atomicName = UUID.randomUUID().toString(); + + String initVal = "qwerty"; + String initStamp = "asdf"; + + IgniteAtomicStamped<String, String> atomicStamped = ignite.atomicStamped(atomicName, + initVal, + initStamp, + true); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1,1); + + assertEquals(initVal, atomicStamped.value()); + assertEquals(initStamp, atomicStamped.stamp()); + assertEquals(initVal, atomicStamped.get().get1()); + assertEquals(initStamp, atomicStamped.get().get2()); + + assertTrue(atomicStamped.compareAndSet(initVal, "b", initStamp, "d")); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertEquals("b", atomicStamped.value()); + assertEquals("d", atomicStamped.stamp()); + + atomicStamped.close(); + + assertTrue(atomicStamped.removed()); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueApiSelfAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueApiSelfAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueApiSelfAbstractTest.java index 93d0989..3e7eff9 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueApiSelfAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueApiSelfAbstractTest.java @@ -25,6 +25,8 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteQueue; import org.apache.ignite.cache.CacheMode; @@ -38,9 +40,11 @@ import org.apache.ignite.lang.IgniteCallable; import org.apache.ignite.lang.IgniteRunnable; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Queue basic tests. @@ -772,6 +776,60 @@ public abstract class GridCacheQueueApiSelfAbstractTest extends IgniteCollection } /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + String queueName = UUID.randomUUID().toString(); + + IgniteQueue<String> queue = grid(0).queue(queueName, 0, config(false)); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + for (int i = 0; i < QUEUE_CAPACITY; i++) + queue.put("Item-" + i); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertEquals(QUEUE_CAPACITY, queue.size()); + + queue.remove("Item-1"); + + assertEquals(QUEUE_CAPACITY - 1, queue.size()); + + assertEquals("Item-0", queue.peek()); + assertEquals("Item-0", queue.poll()); + assertEquals("Item-2", queue.poll()); + + assertEquals(0, queue.size()); + + queue.clear(); + + assertTrue(queue.isEmpty()); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } + + /** * Test class with the same hash code. */ private static class SameHashItem implements Serializable { http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetAbstractSelfTest.java index 9973b27..5ccb830 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetAbstractSelfTest.java @@ -28,11 +28,13 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import junit.framework.AssertionFailedError; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSet; import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.CollectionConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; @@ -47,9 +49,12 @@ import org.apache.ignite.lang.IgniteCallable; import org.apache.ignite.lang.IgniteRunnable; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.LOCAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Cache set tests. @@ -948,6 +953,54 @@ public abstract class GridCacheSetAbstractSelfTest extends IgniteCollectionAbstr } /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + CollectionConfiguration colCfg = collectionConfiguration(); + + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + IgniteSet<Integer> set0 = ignite.set(SET_NAME, colCfg); + + assertNotNull(set0); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + Collection<Integer> items = new ArrayList<>(100); + + for (int i = 0; i < 100; i++) + items.add(i); + + set0.addAll(items); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertEquals(100, set0.size()); + + set0.close(); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } + + /** * @param set Set. * @param size Expected size. */ http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteAtomicLongApiAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteAtomicLongApiAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteAtomicLongApiAbstractSelfTest.java index 9672265..49a1c72 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteAtomicLongApiAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteAtomicLongApiAbstractSelfTest.java @@ -265,4 +265,31 @@ public abstract class IgniteAtomicLongApiAbstractSelfTest extends IgniteAtomicsA assert newVal == atomic.get(); } } + + /** + * Implementation of ignite data structures internally uses special system caches, need make sure that + * transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + IgniteCache<Object, Object> cache = ignite.cache(TRANSACTIONAL_CACHE_NAME); + + IgniteAtomicLong atomic = ignite.atomicLong("atomic", 0, true); + + long curAtomicVal = atomic.get(); + + try (Transaction tx = ignite.transactions().txStart()) { + atomic.getAndIncrement(); + + cache.put(1, 1); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + assertEquals(curAtomicVal + 1, atomic.get()); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCountDownLatchAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCountDownLatchAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCountDownLatchAbstractSelfTest.java index e9b83d9..88966b0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCountDownLatchAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteCountDownLatchAbstractSelfTest.java @@ -35,6 +35,7 @@ import org.apache.ignite.IgniteCountDownLatch; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cluster.ClusterGroup; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteKernal; import org.apache.ignite.internal.util.typedef.G; @@ -45,11 +46,14 @@ import org.apache.ignite.lang.IgniteRunnable; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.resources.LoggerResource; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; import org.jetbrains.annotations.Nullable; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Cache count down latch self test. @@ -78,6 +82,45 @@ public abstract class IgniteCountDownLatchAbstractSelfTest extends IgniteAtomics } /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + IgniteCountDownLatch latch = ignite.countDownLatch("latch1", 10, false, true); + + assertNotNull(latch); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + assertEquals(8, latch.countDown(2)); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertEquals(7, latch.countDown(1)); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } + + /** * @throws Exception If failed. */ private void checkLatch() throws Exception { http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteLockAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteLockAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteLockAbstractSelfTest.java index 388f167..27e05b9 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteLockAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteLockAbstractSelfTest.java @@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCompute; import org.apache.ignite.IgniteCondition; @@ -42,6 +43,7 @@ import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteInterruptedException; import org.apache.ignite.IgniteLock; import org.apache.ignite.IgniteLogger; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteKernal; @@ -54,6 +56,7 @@ import org.apache.ignite.lang.IgniteFuture; import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.resources.LoggerResource; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; import org.jetbrains.annotations.Nullable; import org.junit.Rule; import org.junit.rules.ExpectedException; @@ -61,7 +64,9 @@ import org.junit.rules.ExpectedException; import static java.util.concurrent.TimeUnit.MICROSECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.LOCAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Cache reentrant lock self test. @@ -112,8 +117,55 @@ public abstract class IgniteLockAbstractSelfTest extends IgniteAtomicsAbstractTe } /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + IgniteLock lock = ignite.reentrantLock("lock", true, true, true); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + boolean success = lock.tryLock(1, MILLISECONDS); + + assertTrue(success); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertTrue(lock.isLocked()); + + lock.unlock(); + + assertFalse(lock.isLocked()); + + lock.close(); + + assertTrue(lock.removed()); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } + + /** * @param failoverSafe Failover safe flag. - * @throws Exception + * @throws Exception If failed. */ private void checkFailover(final boolean failoverSafe, final boolean fair) throws Exception { IgniteEx g = startGrid(NODES_CNT + 1); http://git-wip-us.apache.org/repos/asf/ignite/blob/db5da76a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSemaphoreAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSemaphoreAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSemaphoreAbstractSelfTest.java index 5241dd1..8ad8631 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSemaphoreAbstractSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteSemaphoreAbstractSelfTest.java @@ -26,10 +26,12 @@ import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCompute; import org.apache.ignite.IgniteLogger; import org.apache.ignite.IgniteSemaphore; +import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; @@ -42,6 +44,7 @@ import org.apache.ignite.resources.IgniteInstanceResource; import org.apache.ignite.resources.LoggerResource; import org.apache.ignite.testframework.GridStringLogger; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.transactions.Transaction; import org.jetbrains.annotations.Nullable; import org.junit.Rule; import org.junit.rules.ExpectedException; @@ -49,7 +52,9 @@ import org.junit.rules.ExpectedException; import static java.util.concurrent.TimeUnit.MICROSECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MINUTES; +import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.LOCAL; +import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; /** * Cache semaphore self test. @@ -94,8 +99,53 @@ public abstract class IgniteSemaphoreAbstractSelfTest extends IgniteAtomicsAbstr } /** + * Implementation of ignite data structures internally uses special system caches, need make sure + * that transaction on these system caches do not intersect with transactions started by user. + * + * @throws Exception If failed. + */ + public void testIsolation() throws Exception { + Ignite ignite = grid(0); + + CacheConfiguration cfg = new CacheConfiguration(); + + cfg.setName("myCache"); + cfg.setAtomicityMode(TRANSACTIONAL); + cfg.setWriteSynchronizationMode(FULL_SYNC); + + IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(cfg); + + try { + IgniteSemaphore semaphore = ignite.semaphore("testIsolation", 1, true, true); + + assertNotNull(semaphore); + + try (Transaction tx = ignite.transactions().txStart()) { + cache.put(1, 1); + + assertEquals(1, semaphore.availablePermits()); + + semaphore.acquire(); + + tx.rollback(); + } + + assertEquals(0, cache.size()); + + assertEquals(0, semaphore.availablePermits()); + + semaphore.close(); + + assertTrue(semaphore.removed()); + } + finally { + ignite.destroyCache(cfg.getName()); + } + } + + /** * @param failoverSafe Failover safe flag. - * @throws Exception + * @throws Exception If failed. */ private void checkFailover(boolean failoverSafe) throws Exception { IgniteEx g = startGrid(NODES_CNT + 1);