http://git-wip-us.apache.org/repos/asf/ignite/blob/e832ef9c/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheExpiryPolicyWithStoreAbstractTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheExpiryPolicyWithStoreAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheExpiryPolicyWithStoreAbstractTest.java index 78c59ac..1f6ec2d 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheExpiryPolicyWithStoreAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheExpiryPolicyWithStoreAbstractTest.java @@ -17,6 +17,11 @@ package org.apache.ignite.internal.processors.cache.expiry; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; import javax.cache.configuration.Factory; import javax.cache.expiry.Duration; @@ -25,6 +30,7 @@ import javax.cache.integration.CompletionListenerFuture; import javax.cache.processor.EntryProcessor; import javax.cache.processor.MutableEntry; import org.apache.ignite.IgniteCache; +import org.apache.ignite.IgniteTransactions; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cache.store.CacheStore; @@ -36,6 +42,9 @@ import org.apache.ignite.internal.processors.cache.GridCacheEntryEx; import org.apache.ignite.internal.processors.cache.IgniteCacheAbstractTest; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.transactions.Transaction; +import org.apache.ignite.transactions.TransactionConcurrency; +import org.apache.ignite.transactions.TransactionIsolation; /** * @@ -174,6 +183,99 @@ public abstract class IgniteCacheExpiryPolicyWithStoreAbstractTest extends Ignit } /** + * @throws Exception If failed. + */ + public void testGetReadThrough() throws Exception { + getReadThrough(false, null, null); + getReadThrough(true, null, null); + } + + /** + * @throws Exception If failed. + */ + protected void getReadThrough(boolean withExcPlc, + TransactionConcurrency txConcurrency, + TransactionIsolation txIsolation) throws Exception { + IgniteCache<Integer, Integer> cache = jcache(0); + + if (withExcPlc) + cache = cache.withExpiryPolicy(new ExpiryPolicy() { + @Override public Duration getExpiryForCreation() { + return new Duration(TimeUnit.MILLISECONDS, 501); + } + + @Override public Duration getExpiryForAccess() { + return new Duration(TimeUnit.MILLISECONDS, 601); + } + + @Override public Duration getExpiryForUpdate() { + return new Duration(TimeUnit.MILLISECONDS, 701); + } + }); + + Integer prim = primaryKeys(cache, 1, 1000).get(0); + Integer back = backupKeys(cache, 1, 1000).get(0); + Integer near = nearKeys(cache, 1, 1000).get(0); + + Set<Integer> prims = new HashSet<>(primaryKeys(cache, 10, prim + 1)); + Set<Integer> backs = new HashSet<>(backupKeys(cache, 10, back + 1)); + Set<Integer> nears = new HashSet<>(nearKeys(cache, 10, near + 1)); + + Set<Integer> keys = new HashSet<>(); + + keys.add(prim); + keys.add(back); + keys.add(near); + + keys.addAll(prims); + keys.addAll(backs); + keys.addAll(nears); + + for (Integer key : keys) + storeMap.put(key, key); + + IgniteTransactions transactions = grid(0).transactions(); + + Transaction tx = txConcurrency != null ? transactions.txStart(txConcurrency, txIsolation) : null; + + try { + Collection<Integer> singleKeys = new HashSet<>(); + + singleKeys.add(prim); + singleKeys.add(back); + singleKeys.add(near); + + assertEquals(3, singleKeys.size()); + + for (Integer key : singleKeys) + assertEquals(key, cache.get(key)); + + Map<Integer, Integer> res = new HashMap<>(); + + res.putAll(cache.getAll(prims)); + res.putAll(cache.getAll(backs)); + res.putAll(cache.getAll(nears)); + + assertEquals(30, res.size()); + + for (Map.Entry<Integer, Integer> e : res.entrySet()) + assertEquals(e.getKey(), e.getValue()); + } + finally { + if (tx != null) + tx.rollback(); + } + + for (Integer key : keys) + checkTtl(key, withExcPlc ? 501 : 500, true); + + U.sleep(600); + + for (Integer key : keys) + checkExpired(key); + } + + /** * @param key Key. */ private void checkExpired(Integer key) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/e832ef9c/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTxExpiryPolicyWithStoreTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTxExpiryPolicyWithStoreTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTxExpiryPolicyWithStoreTest.java index 4b9b61a..f5888f8 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTxExpiryPolicyWithStoreTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTxExpiryPolicyWithStoreTest.java @@ -19,6 +19,8 @@ package org.apache.ignite.internal.processors.cache.expiry; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.transactions.TransactionConcurrency; +import org.apache.ignite.transactions.TransactionIsolation; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; @@ -41,4 +43,23 @@ public class IgniteCacheTxExpiryPolicyWithStoreTest extends IgniteCacheExpiryPol @Override protected CacheAtomicityMode atomicityMode() { return TRANSACTIONAL; } + + /** {@inheritDoc} */ + @Override public void testGetReadThrough() throws Exception { + super.testGetReadThrough(); + + getReadThrough(false, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.READ_COMMITTED); + getReadThrough(true, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.READ_COMMITTED); + getReadThrough(false, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ); + getReadThrough(true, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ); + getReadThrough(false, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.SERIALIZABLE); + getReadThrough(true, TransactionConcurrency.OPTIMISTIC, TransactionIsolation.SERIALIZABLE); + + getReadThrough(false, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.READ_COMMITTED); + getReadThrough(true, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.READ_COMMITTED); + getReadThrough(false, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ); + getReadThrough(true, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ); + getReadThrough(false, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.SERIALIZABLE); + getReadThrough(true, TransactionConcurrency.PESSIMISTIC, TransactionIsolation.SERIALIZABLE); + } } \ No newline at end of file
