You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/06/06 15:05:50 UTC
[01/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Repository: ignite
Updated Branches:
refs/heads/ignite-5293 51086899c -> b1c5f2d56
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
index da5cb1d..28aa5a2 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteCacheAbstractBenchmark.java
@@ -19,21 +19,30 @@ package org.apache.ignite.yardstick.cache;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
import org.apache.ignite.cache.affinity.Affinity;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
import org.apache.ignite.yardstick.IgniteAbstractBenchmark;
+import org.apache.ignite.yardstick.cache.model.SampleValue;
import org.yardstickframework.BenchmarkConfiguration;
import org.yardstickframework.BenchmarkUtils;
+import static org.yardstickframework.BenchmarkUtils.println;
+
/**
* Abstract class for Ignite benchmarks which use cache.
*/
@@ -42,21 +51,96 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
protected IgniteCache<K, V> cache;
/** */
+ protected List<IgniteCache> testCaches;
+
+ /** */
private ThreadLocal<ThreadRange> threadRange = new ThreadLocal<>();
/** */
private AtomicInteger threadIdx = new AtomicInteger();
+ /** */
+ private int caches;
+
+ /** */
+ private final AtomicInteger opCacheIdx = new AtomicInteger();
+
+ /** */
+ private final ThreadLocal<IgniteCache<K, V>> opCache = new ThreadLocal<>();
+
+ /**
+ * @return Cache for benchmark operation.
+ */
+ protected final IgniteCache<K, V> cacheForOperation() {
+ return cacheForOperation(false);
+ }
+
+ /**
+ * @param perThread If {@code true} then cache is selected once and set in thread local.
+ * @return Cache for benchmark operation.
+ */
+ protected final IgniteCache<K, V> cacheForOperation(boolean perThread) {
+ if (caches > 1) {
+ if (perThread) {
+ IgniteCache<K, V> cache = opCache.get();
+
+ if (cache == null) {
+ cache = testCaches.get(opCacheIdx.getAndIncrement() % caches);
+
+ opCache.set(cache);
+
+ BenchmarkUtils.println(cfg, "Initialized cache for thread [cache=" + cache.getName() + ']');
+ }
+
+ return cache;
+ }
+ else
+ return testCaches.get(ThreadLocalRandom.current().nextInt(caches));
+ }
+
+ return cache;
+ }
+
/** {@inheritDoc} */
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
cache = cache();
+ CacheConfiguration<?, ?> ccfg = cache.getConfiguration(CacheConfiguration.class);
+
+ String grpName = ccfg.getGroupName();
+
BenchmarkUtils.println(cfg, "Benchmark setUp [name=" + getClass().getSimpleName() +
", cacheName="+ cache.getName() +
+ ", cacheGroup="+ grpName +
", cacheCfg=" + cache.getConfiguration(CacheConfiguration.class) + ']');
+ caches = args.cachesCount();
+
+ if (caches > 1) {
+ List<CacheConfiguration> toCreate = new ArrayList<>();
+
+ for (int i = 0; i < caches - 1; i++) {
+ JdkMarshaller marsh = new JdkMarshaller();
+
+ CacheConfiguration ccfg0 = marsh.unmarshal(marsh.marshal(ccfg), null);
+
+ ccfg0.setName(cache.getName() + "-" + i);
+
+ toCreate.add(ccfg0);
+ }
+
+ Collection<IgniteCache> caches = ignite().getOrCreateCaches(toCreate);
+
+ testCaches = new ArrayList<>(caches);
+
+ testCaches.add(cache);
+
+ BenchmarkUtils.println(cfg, "Created additional caches [caches=" + testCaches.size() +
+ ", grp=" + grpName + ']');
+ }
+
if (args.printPartitionStatistics()) {
Map<ClusterNode, T2<List<Integer>, List<Integer>>> parts = new HashMap<>();
@@ -104,6 +188,80 @@ public abstract class IgniteCacheAbstractBenchmark<K, V> extends IgniteAbstractB
}
/**
+ * @throws Exception If failed.
+ */
+ protected final void loadCachesData() throws Exception {
+ List<IgniteCache> caches = testCaches != null ? testCaches : Collections.<IgniteCache>singletonList(cache);
+
+ if (caches.size() > 1) {
+ ExecutorService executor = Executors.newFixedThreadPool(10);
+
+ try {
+ List<Future<?>> futs = new ArrayList<>();
+
+ for (final IgniteCache cache : caches) {
+ futs.add(executor.submit(new Runnable() {
+ @Override public void run() {
+ loadCacheData0(cache.getName());
+ }
+ }));
+ }
+
+ for (Future<?> fut : futs)
+ fut.get();
+ }
+ finally {
+ executor.shutdown();
+ }
+ }
+ else
+ loadCacheData(caches.get(0).getName());
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param cnt Number of entries to load.
+ */
+ protected final void loadSampleValues(String cacheName, int cnt) {
+ try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
+ for (int i = 0; i < cnt; i++) {
+ dataLdr.addData(i, new SampleValue(i));
+
+ if (i % 100000 == 0) {
+ if (Thread.currentThread().isInterrupted())
+ break;
+
+ println("Loaded entries [cache=" + cacheName + ", cnt=" + i + ']');
+ }
+ }
+ }
+
+ println("Load entries done [cache=" + cacheName + ", cnt=" + cnt + ']');
+ }
+
+ /**
+ * @param cacheName Cache name.
+ */
+ private void loadCacheData0(String cacheName) {
+ println(cfg, "Loading data for cache: " + cacheName);
+
+ long start = System.nanoTime();
+
+ loadCacheData(cacheName);
+
+ long time = ((System.nanoTime() - start) / 1_000_000);
+
+ println(cfg, "Finished populating data [cache=" + cacheName + ", time=" + time + "ms]");
+ }
+
+ /**
+ * @param cacheName Cache name.
+ */
+ protected void loadCacheData(String cacheName) {
+ throw new IllegalStateException("Not implemented for " + getClass().getSimpleName());
+ }
+
+ /**
* @return Range.
*/
protected final ThreadRange threadRange() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllBenchmark.java
index 2f76b7c..f563ec8 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllBenchmark.java
@@ -19,6 +19,7 @@ package org.apache.ignite.yardstick.cache;
import java.util.Map;
import java.util.Set;
+import org.apache.ignite.IgniteCache;
import org.apache.ignite.internal.util.typedef.internal.U;
/**
@@ -35,6 +36,8 @@ public class IgniteGetAllBenchmark extends IgniteGetBenchmark {
keys.add(key);
}
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.getAll(keys);
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllPutAllTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllPutAllTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllPutAllTxBenchmark.java
index a8f6d7b..d984e64 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllPutAllTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAllPutAllTxBenchmark.java
@@ -55,6 +55,8 @@ public class IgniteGetAllPutAllTxBenchmark extends IgniteCacheAbstractBenchmark<
vals.put(key, key);
}
+ IgniteCache<Integer, Integer> cache = cacheForOperation();
+
cache.getAll(vals.keySet());
cache.putAll(vals);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutBenchmark.java
index 8d15e5e..f943f16 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutBenchmark.java
@@ -29,6 +29,8 @@ public class IgniteGetAndPutBenchmark extends IgniteCacheAbstractBenchmark<Integ
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.getAndPut(key, new SampleValue(key));
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutTxBenchmark.java
index 0a3794c..4a1af43 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetAndPutTxBenchmark.java
@@ -49,6 +49,8 @@ public class IgniteGetAndPutTxBenchmark extends IgniteCacheAbstractBenchmark<Int
@Override public Void call() throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.getAndPut(key, new SampleValue(key));
return null;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetBenchmark.java
index 6154ba4..96a99ff 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetBenchmark.java
@@ -19,19 +19,12 @@ package org.apache.ignite.yardstick.cache;
import java.util.Map;
import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteDataStreamer;
-import org.apache.ignite.yardstick.cache.model.SampleValue;
import org.yardstickframework.BenchmarkConfiguration;
-import static org.yardstickframework.BenchmarkUtils.println;
-
/**
* Ignite benchmark that performs get operations.
*/
public class IgniteGetBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
- /** */
- private static final String CACHE_NAME = "atomic";
-
/** {@inheritDoc} */
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
@@ -40,32 +33,20 @@ public class IgniteGetBenchmark extends IgniteCacheAbstractBenchmark<Integer, Ob
throw new IllegalArgumentException("Preloading amount (\"-pa\", \"--preloadAmount\") " +
"must by less then the range (\"-r\", \"--range\").");
- String cacheName = cache().getName();
-
- println(cfg, "Loading data for cache: " + cacheName);
-
- long start = System.nanoTime();
-
- try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
- for (int i = 0; i < args.preloadAmount(); i++) {
- dataLdr.addData(i, new SampleValue(i));
-
- if (i % 100000 == 0) {
- if (Thread.currentThread().isInterrupted())
- break;
-
- println("Loaded entries: " + i);
- }
- }
- }
+ loadCachesData();
+ }
- println(cfg, "Finished populating query data in " + ((System.nanoTime() - start) / 1_000_000) + " ms.");
+ /** {@inheritDoc} */
+ @Override protected void loadCacheData(String cacheName) {
+ loadSampleValues(cacheName, args.preloadAmount());
}
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.get(key);
return true;
@@ -73,6 +54,6 @@ public class IgniteGetBenchmark extends IgniteCacheAbstractBenchmark<Integer, Ob
/** {@inheritDoc} */
@Override protected IgniteCache<Integer, Object> cache() {
- return ignite().cache(CACHE_NAME);
+ return ignite().cache("atomic");
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetEntriesPutAllTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetEntriesPutAllTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetEntriesPutAllTxBenchmark.java
index 501e12d..fd61d5f 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetEntriesPutAllTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteGetEntriesPutAllTxBenchmark.java
@@ -47,6 +47,8 @@ public class IgniteGetEntriesPutAllTxBenchmark extends IgniteCacheAbstractBenchm
doInTransaction(txs, args.txConcurrency(), args.txIsolation(), new Callable<Void>() {
@Override public Void call() throws Exception {
+ IgniteCache<Integer, Integer> cache = cacheForOperation();
+
SortedMap<Integer, Integer> vals = new TreeMap<>();
for (int i = 0; i < args.batch(); i++) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeBenchmark.java
index a1e80f0..fa29cc4 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeBenchmark.java
@@ -31,6 +31,8 @@ public class IgniteInvokeBenchmark extends IgniteCacheAbstractBenchmark<Integer,
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.invoke(key, new SetValueEntryProcessor(new SampleValue(key)));
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeTxBenchmark.java
index 64dc6b8..c30ff29 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeTxBenchmark.java
@@ -49,6 +49,8 @@ public class IgniteInvokeTxBenchmark extends IgniteInvokeBenchmark {
@Override public Void call() throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.invoke(key, new SetValueEntryProcessor(new SampleValue(key)));
return null;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeWithInjectionBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeWithInjectionBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeWithInjectionBenchmark.java
index ef9d17b..93704cc 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeWithInjectionBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteInvokeWithInjectionBenchmark.java
@@ -34,6 +34,8 @@ public class IgniteInvokeWithInjectionBenchmark extends IgniteCacheAbstractBench
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.invoke(key, new SetValueEntryProcessor(new SampleValue(key)));
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
index 33aa205..dc21029 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllBenchmark.java
@@ -131,6 +131,8 @@ public class IgnitePutAllBenchmark extends IgniteCacheAbstractBenchmark<Integer,
}
}
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.putAll(vals);
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllSerializableTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllSerializableTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllSerializableTxBenchmark.java
index 200400e..089ee7a 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllSerializableTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutAllSerializableTxBenchmark.java
@@ -54,6 +54,8 @@ public class IgnitePutAllSerializableTxBenchmark extends IgniteCacheAbstractBenc
vals.put(key, key);
}
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
while (true) {
try (Transaction tx = txs.txStart(OPTIMISTIC, SERIALIZABLE)) {
cache.putAll(vals);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutBenchmark.java
index 69db87f..ebee87c 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutBenchmark.java
@@ -29,6 +29,8 @@ public class IgnitePutBenchmark extends IgniteCacheAbstractBenchmark<Integer, Ob
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.put(key, new SampleValue(key));
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBatchBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBatchBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBatchBenchmark.java
index a9f59d4..9526896 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBatchBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBatchBenchmark.java
@@ -30,6 +30,8 @@ import org.apache.ignite.yardstick.cache.model.SampleValue;
public class IgnitePutGetBatchBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
Set<Integer> keys = new TreeSet<>();
while (keys.size() < args.batch())
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBenchmark.java
index 42f308c..cc29e47 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetBenchmark.java
@@ -29,6 +29,8 @@ public class IgnitePutGetBenchmark extends IgniteCacheAbstractBenchmark<Integer,
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
int key = nextRandom(args.range());
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
Object val = cache.get(key);
if (val != null)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryBenchmark.java
index 1289fa1..eb49b57 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryBenchmark.java
@@ -28,6 +28,8 @@ import org.apache.ignite.yardstick.cache.model.SampleValue;
public class IgnitePutGetEntryBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
CacheEntry<Integer, Object> val = cache.getEntry(key);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryTxBenchmark.java
index 6e58b41..5b35009 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetEntryTxBenchmark.java
@@ -45,6 +45,8 @@ public class IgnitePutGetEntryTxBenchmark extends IgniteCacheAbstractBenchmark<I
clo = new Callable<Void>() {
@Override public Void call() throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(0, args.range() / 2);
CacheEntry<Integer, Object> val = cache.getEntry(key);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBatchBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBatchBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBatchBenchmark.java
index 7ac8180..954f93f 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBatchBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBatchBenchmark.java
@@ -47,6 +47,8 @@ public class IgnitePutGetTxBatchBenchmark extends IgniteCacheAbstractBenchmark<I
clo = new Callable<Void>() {
@Override public Void call() throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
Set<Integer> keys = new TreeSet<>();
while (keys.size() < args.batch())
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBenchmark.java
index 3235721..6b11ef8 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutGetTxBenchmark.java
@@ -44,6 +44,8 @@ public class IgnitePutGetTxBenchmark extends IgniteCacheAbstractBenchmark<Intege
clo = new Callable<Void>() {
@Override public Void call() throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(0, args.range() / 2);
Object val = cache.get(key);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIfAbsentIndexedValue1Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIfAbsentIndexedValue1Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIfAbsentIndexedValue1Benchmark.java
index aea909a..8430b12 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIfAbsentIndexedValue1Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIfAbsentIndexedValue1Benchmark.java
@@ -31,6 +31,8 @@ public class IgnitePutIfAbsentIndexedValue1Benchmark extends IgniteCacheAbstract
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = insCnt.getAndIncrement();
cache.putIfAbsent(key, new Person1(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue1Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue1Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue1Benchmark.java
index 6f06015..af206fe 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue1Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue1Benchmark.java
@@ -27,6 +27,8 @@ import org.apache.ignite.yardstick.cache.model.Person1;
public class IgnitePutIndexedValue1Benchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new Person1(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue2Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue2Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue2Benchmark.java
index 0112163..7c62714 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue2Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue2Benchmark.java
@@ -27,6 +27,8 @@ import org.apache.ignite.yardstick.cache.model.Person2;
public class IgnitePutIndexedValue2Benchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new Person2(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue8Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue8Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue8Benchmark.java
index dae32b4..a34e386 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue8Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutIndexedValue8Benchmark.java
@@ -27,6 +27,8 @@ import org.apache.ignite.yardstick.cache.model.Person8;
public class IgnitePutIndexedValue8Benchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new Person8(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRandomValueSizeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRandomValueSizeBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRandomValueSizeBenchmark.java
index 180b50e..db631aba 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRandomValueSizeBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRandomValueSizeBenchmark.java
@@ -26,6 +26,8 @@ import org.apache.ignite.IgniteCache;
public class IgnitePutRandomValueSizeBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
int size = 64 + nextRandom(64);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRemoveBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRemoveBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRemoveBenchmark.java
index 7ea3d91..564bff5 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRemoveBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutRemoveBenchmark.java
@@ -27,6 +27,8 @@ import org.apache.ignite.yardstick.cache.model.SampleValue;
public class IgnitePutRemoveBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new SampleValue(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
index 15b7cd6..0a8a470 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxBenchmark.java
@@ -47,6 +47,8 @@ public class IgnitePutTxBenchmark extends IgniteCacheAbstractBenchmark<Integer,
clo = new Callable<Void>() {
@Override public Void call() throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new SampleValue(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxImplicitBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxImplicitBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxImplicitBenchmark.java
index 89d87a8..d1070fb 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxImplicitBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxImplicitBenchmark.java
@@ -37,6 +37,8 @@ public class IgnitePutTxImplicitBenchmark extends IgniteCacheAbstractBenchmark<I
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
// Implicit transaction is used.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxPrimaryOnlyBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxPrimaryOnlyBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxPrimaryOnlyBenchmark.java
index 21275eb..5e79acd 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxPrimaryOnlyBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxPrimaryOnlyBenchmark.java
@@ -39,6 +39,8 @@ public class IgnitePutTxPrimaryOnlyBenchmark extends IgniteCacheAbstractBenchmar
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key;
Affinity<Object> aff = ignite().affinity("tx");
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxSkipLocalBackupBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxSkipLocalBackupBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxSkipLocalBackupBenchmark.java
index 63934e6..29d565a 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxSkipLocalBackupBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutTxSkipLocalBackupBenchmark.java
@@ -39,6 +39,8 @@ public class IgnitePutTxSkipLocalBackupBenchmark extends IgniteCacheAbstractBenc
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key;
Affinity<Object> aff = ignite().affinity("tx");
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutValue8Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutValue8Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutValue8Benchmark.java
index 6a3d492..e4ac2e2 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutValue8Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgnitePutValue8Benchmark.java
@@ -28,6 +28,8 @@ import java.util.Map;
public class IgnitePutValue8Benchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
int key = nextRandom(args.range());
cache.put(key, new Person8(key));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteReplaceIndexedValue1Benchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteReplaceIndexedValue1Benchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteReplaceIndexedValue1Benchmark.java
index cc50c84..70b94ab 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteReplaceIndexedValue1Benchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteReplaceIndexedValue1Benchmark.java
@@ -66,6 +66,8 @@ public class IgniteReplaceIndexedValue1Benchmark extends IgniteCacheAbstractBenc
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ IgniteCache<Integer, Object> cache = cacheForOperation();
+
cache.replace(rnd.nextInt(args.range()), new Person1(rnd.nextInt(args.range())));
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteScanQueryBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteScanQueryBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteScanQueryBenchmark.java
new file mode 100644
index 0000000..eda4ff6
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteScanQueryBenchmark.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.yardstick.cache;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.yardstickframework.BenchmarkConfiguration;
+
+/**
+ *
+ */
+public class IgniteScanQueryBenchmark extends IgniteCacheAbstractBenchmark<Integer, Object> {
+ /** {@inheritDoc} */
+ @Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
+ super.setUp(cfg);
+
+ loadCachesData();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void loadCacheData(String cacheName) {
+ loadSampleValues(cacheName, args.range());
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean test(Map<Object, Object> ctx) throws Exception {
+ int key = nextRandom(args.range());
+
+ ScanQuery<Integer, Object> qry = new ScanQuery<>();
+
+ qry.setFilter(new KeyFilter(key));
+
+ IgniteCache<Integer, Object> cache = cacheForOperation().withKeepBinary();
+
+ List<IgniteCache.Entry<Integer, Object>> res = cache.query(qry).getAll();
+
+ if (res.size() != 1)
+ throw new Exception("Invalid result size: " + res.size());
+
+ if (res.get(0).getKey() != key)
+ throw new Exception("Invalid entry found [key=" + key + ", entryKey=" + res.get(0).getKey() + ']');
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteCache<Integer, Object> cache() {
+ return ignite().cache("atomic");
+ }
+
+ /**
+ *
+ */
+ static class KeyFilter implements IgniteBiPredicate<Integer, Object> {
+ /** */
+ private final Integer key;
+
+ /**
+ * @param key Key to find.
+ */
+ public KeyFilter(Integer key) {
+ this.key = key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean apply(Integer key, Object val) {
+ return this.key.equals(key);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryBenchmark.java
index 8e31455..732cb71 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryBenchmark.java
@@ -37,20 +37,22 @@ public class IgniteSqlQueryBenchmark extends IgniteCacheAbstractBenchmark<Intege
@Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
super.setUp(cfg);
- println(cfg, "Populating query data...");
+ loadCachesData();
+ }
- long start = System.nanoTime();
+ /** {@inheritDoc} */
+ @Override protected void loadCacheData(String cacheName) {
+ try (IgniteDataStreamer<Integer, Person> dataLdr = ignite().dataStreamer(cacheName)) {
+ for (int i = 0; i < args.range(); i++) {
+ if (i % 100 == 0 && Thread.currentThread().isInterrupted())
+ break;
- try (IgniteDataStreamer<Integer, Person> dataLdr = ignite().dataStreamer(cache.getName())) {
- for (int i = 0; i < args.range() && !Thread.currentThread().isInterrupted(); i++) {
dataLdr.addData(i, new Person(i, "firstName" + i, "lastName" + i, i * 1000));
if (i % 100000 == 0)
println(cfg, "Populated persons: " + i);
}
}
-
- println(cfg, "Finished populating query data in " + ((System.nanoTime() - start) / 1_000_000) + " ms.");
}
/** {@inheritDoc} */
@@ -79,6 +81,8 @@ public class IgniteSqlQueryBenchmark extends IgniteCacheAbstractBenchmark<Intege
* @throws Exception If failed.
*/
private Collection<Cache.Entry<Integer, Object>> executeQuery(double minSalary, double maxSalary) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
SqlQuery qry = new SqlQuery(Person.class, "salary >= ? and salary <= ?");
qry.setArgs(minSalary, maxSalary);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryDistributedJoinBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryDistributedJoinBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryDistributedJoinBenchmark.java
index c5fdeb2..8f4829d 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryDistributedJoinBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryDistributedJoinBenchmark.java
@@ -47,14 +47,23 @@ public class IgniteSqlQueryDistributedJoinBenchmark extends IgniteCacheAbstractB
println(cfg, "Populating query data...");
- long start = System.nanoTime();
-
range = args.range();
if (range <= 0)
throw new IllegalArgumentException();
- try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cache.getName())) {
+ println(cfg, "Populating join query data [orgCnt=" + range +
+ ", personCnt=" + range +
+ ", broadcastJoin=" + broadcast + "]");
+
+ loadCachesData();
+
+ executeQueryJoin(0, broadcast, true);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void loadCacheData(String cacheName) {
+ try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
for (int orgId = 0; orgId < range; orgId++) {
dataLdr.addData(orgId, new Organization(orgId, "org" + orgId));
@@ -73,13 +82,6 @@ public class IgniteSqlQueryDistributedJoinBenchmark extends IgniteCacheAbstractB
dataLdr.close();
}
-
- println(cfg, "Finished populating join query [orgCnt=" + range +
- ", personCnt=" + range +
- ", broadcastJoin=" + broadcast +
- ", time=" + ((System.nanoTime() - start) / 1_000_000) + "ms]");
-
- executeQueryJoin(0, broadcast, true);
}
/**
@@ -141,6 +143,8 @@ public class IgniteSqlQueryDistributedJoinBenchmark extends IgniteCacheAbstractB
qry.setDistributedJoins(true);
qry.setArgs(orgId);
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
if (planOnly) {
String plan = (String)cache.query(qry).getAll().get(0).get(0);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryJoinBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryJoinBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryJoinBenchmark.java
index 1f8006d..1160803 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryJoinBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryJoinBenchmark.java
@@ -40,9 +40,15 @@ public class IgniteSqlQueryJoinBenchmark extends IgniteCacheAbstractBenchmark<In
println(cfg, "Populating query data...");
- long start = System.nanoTime();
+ loadCachesData();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void loadCacheData(String cacheName) {
+ if (args.range() < 100)
+ throw new IllegalArgumentException("Invalid range: " + args.range());
- try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cache.getName())) {
+ try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
final int orgRange = args.range() / 10;
// Populate organizations.
@@ -61,8 +67,6 @@ public class IgniteSqlQueryJoinBenchmark extends IgniteCacheAbstractBenchmark<In
println(cfg, "Populated persons: " + i);
}
}
-
- println(cfg, "Finished populating join query data in " + ((System.nanoTime() - start) / 1_000_000) + " ms.");
}
/** {@inheritDoc} */
@@ -100,6 +104,8 @@ public class IgniteSqlQueryJoinBenchmark extends IgniteCacheAbstractBenchmark<In
* @throws Exception If failed.
*/
private Collection<List<?>> executeQueryJoin(double minSalary, double maxSalary) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
SqlFieldsQuery qry = new SqlFieldsQuery(
"select p.id, p.orgId, p.firstName, p.lastName, p.salary, o.name " +
"from Person p " +
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutBenchmark.java
index dfa4cbc..a67f0dc 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutBenchmark.java
@@ -25,7 +25,6 @@ import javax.cache.Cache;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.query.SqlQuery;
import org.apache.ignite.yardstick.cache.model.Person;
-import org.yardstickframework.BenchmarkConfiguration;
import static org.yardstickframework.BenchmarkUtils.println;
@@ -40,14 +39,11 @@ public class IgniteSqlQueryPutBenchmark extends IgniteCacheAbstractBenchmark<Int
private AtomicInteger qryCnt = new AtomicInteger();
/** {@inheritDoc} */
- @Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
- super.setUp(cfg);
- }
-
- /** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
if (rnd.nextBoolean()) {
double salary = rnd.nextDouble() * args.range() * 1000;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutSeparatedBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutSeparatedBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutSeparatedBenchmark.java
index b74978e..2ba06cf 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutSeparatedBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/IgniteSqlQueryPutSeparatedBenchmark.java
@@ -55,6 +55,8 @@ public class IgniteSqlQueryPutSeparatedBenchmark extends IgniteCacheAbstractBenc
}
}
else {
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
int i = rnd.nextInt(args.range());
cache.put(i, new Person(i, "firstName" + i, "lastName" + i, i * 1000));
@@ -70,6 +72,8 @@ public class IgniteSqlQueryPutSeparatedBenchmark extends IgniteCacheAbstractBenc
* @throws Exception If failed.
*/
private Collection<Cache.Entry<Integer, Object>> executeQuery(double minSalary, double maxSalary) throws Exception {
+ IgniteCache<Integer, Object> cache = cacheForOperation(true);
+
SqlQuery qry = new SqlQuery(Person.class, "salary >= ? and salary <= ?");
qry.setArgs(minSalary, maxSalary);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/jdbc/JdbcPutGetBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/jdbc/JdbcPutGetBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/jdbc/JdbcPutGetBenchmark.java
index 8ee7679..a68b2b2 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/jdbc/JdbcPutGetBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/jdbc/JdbcPutGetBenchmark.java
@@ -28,8 +28,8 @@ import static org.apache.ignite.yardstick.cache.jdbc.JdbcPutBenchmark.createUpse
public class JdbcPutGetBenchmark extends JdbcAbstractBenchmark {
/** {@inheritDoc} */
@Override public boolean test(Map<Object, Object> ctx) throws Exception {
- int newKey = nextRandom(args.range);
- int newVal = nextRandom(args.range);
+ int newKey = nextRandom(args.range());
+ int newVal = nextRandom(args.range());
try (PreparedStatement stmt = createUpsertStatement(conn.get(), newKey, newVal)) {
if (stmt.executeUpdate() <= 0)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
index 4010f5e..9c9cbe4 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/IgniteCacheRandomOperationBenchmark.java
@@ -31,6 +31,9 @@ import java.util.TreeMap;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicLong;
import javax.cache.CacheException;
@@ -448,25 +451,36 @@ public class IgniteCacheRandomOperationBenchmark extends IgniteAbstractBenchmark
startPreloadLogging(args.preloadLogsInterval());
- Thread[] threads = new Thread[availableCaches.size()];
+ ExecutorService executor = Executors.newFixedThreadPool(10);
- for (int i = 0; i < availableCaches.size(); i++) {
- final String cacheName = availableCaches.get(i).getName();
+ try {
+ List<Future<?>> futs = new ArrayList<>();
+
+ final Thread thread = Thread.currentThread();
+
+ for (int i = 0; i < availableCaches.size(); i++) {
+ final String cacheName = availableCaches.get(i).getName();
- threads[i] = new Thread() {
- @Override public void run() {
- try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
- for (int i = 0; i < args.preloadAmount() && !isInterrupted(); i++)
- dataLdr.addData(createRandomKey(i, cacheName), createRandomValue(i, cacheName));
+ futs.add(executor.submit(new Runnable() {
+ @Override public void run() {
+ try (IgniteDataStreamer<Object, Object> dataLdr = ignite().dataStreamer(cacheName)) {
+ for (int i = 0; i < args.preloadAmount(); i++) {
+ if (i % 100 == 0 && thread.isInterrupted())
+ break;
+
+ dataLdr.addData(createRandomKey(i, cacheName), createRandomValue(i, cacheName));
+ }
+ }
}
- }
- };
+ }));
+ }
- threads[i].start();
+ for (Future<?> fut : futs)
+ fut.get();
+ }
+ finally {
+ executor.shutdown();
}
-
- for (Thread thread : threads)
- thread.join();
stopPreloadLogging();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/model/ModelUtil.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/model/ModelUtil.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/model/ModelUtil.java
index 9268cdd..492ace7 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/model/ModelUtil.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/load/model/ModelUtil.java
@@ -150,6 +150,9 @@ public class ModelUtil {
break;
case "String":
res = String.valueOf(id);
+ break;
+ default:
+ throw new IllegalArgumentException("Unsupported class: " + c.getSimpleName());
}
return res;
[05/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheDistributedQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheDistributedQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheDistributedQueryManager.java
index 06a3416..b112e1d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheDistributedQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheDistributedQueryManager.java
@@ -104,7 +104,7 @@ public class GridCacheDistributedQueryManager<K, V> extends GridCacheQueryManage
assert cctx.config().getCacheMode() != LOCAL;
- cctx.io().addHandler(cctx.cacheId(), GridCacheQueryRequest.class, new CI2<UUID, GridCacheQueryRequest>() {
+ cctx.io().addCacheHandler(cctx.cacheId(), GridCacheQueryRequest.class, new CI2<UUID, GridCacheQueryRequest>() {
@Override public void apply(UUID nodeId, GridCacheQueryRequest req) {
processQueryRequest(nodeId, req);
}
@@ -560,11 +560,11 @@ public class GridCacheDistributedQueryManager<K, V> extends GridCacheQueryManage
final Object topic = topic(cctx.nodeId(), req.id());
- cctx.io().addOrderedHandler(topic, resHnd);
+ cctx.io().addOrderedCacheHandler(topic, resHnd);
fut.listen(new CI1<IgniteInternalFuture<?>>() {
@Override public void apply(IgniteInternalFuture<?> fut) {
- cctx.io().removeOrderedHandler(topic);
+ cctx.io().removeOrderedHandler(false, topic);
}
});
@@ -744,11 +744,11 @@ public class GridCacheDistributedQueryManager<K, V> extends GridCacheQueryManage
final Object topic = topic(cctx.nodeId(), req.id());
- cctx.io().addOrderedHandler(topic, resHnd);
+ cctx.io().addOrderedCacheHandler(topic, resHnd);
fut.listen(new CI1<IgniteInternalFuture<?>>() {
@Override public void apply(IgniteInternalFuture<?> fut) {
- cctx.io().removeOrderedHandler(topic);
+ cctx.io().removeOrderedHandler(false, topic);
}
});
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index 07545a5..0c264db 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -863,12 +863,12 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
locPart = locPart0;
- it = cctx.offheap().iterator(part);
+ it = cctx.offheap().cachePartitionIterator(cctx.cacheId(), part);
}
else {
locPart = null;
- it = cctx.offheap().iterator(true, backups, topVer);
+ it = cctx.offheap().cacheIterator(cctx.cacheId(), true, backups, topVer);
}
return new PeekValueExpiryAwareIterator(it, plc, topVer, keyValFilter, qry.keepBinary(), locNode) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
index 00ddff8..9dc7817 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -47,7 +48,7 @@ import static org.apache.ignite.internal.processors.cache.query.GridCacheQueryTy
/**
* Query request.
*/
-public class GridCacheQueryRequest extends GridCacheMessage implements GridCacheDeployable {
+public class GridCacheQueryRequest extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java
index 4d8e658..521aacf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java
@@ -29,7 +29,7 @@ import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
@@ -46,7 +46,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Query request.
*/
-public class GridCacheQueryResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridCacheQueryResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryBatchAck.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryBatchAck.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryBatchAck.java
index 76147ee..ef0157e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryBatchAck.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryBatchAck.java
@@ -21,7 +21,7 @@ import java.nio.ByteBuffer;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.internal.GridDirectMap;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.plugin.extensions.communication.MessageCollectionItemType;
@@ -31,7 +31,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* Batch acknowledgement.
*/
-public class CacheContinuousQueryBatchAck extends GridCacheMessage {
+public class CacheContinuousQueryBatchAck extends GridCacheIdMessage {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEventBuffer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEventBuffer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEventBuffer.java
index 336f650..7a7c045 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEventBuffer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEventBuffer.java
@@ -155,9 +155,12 @@ public class CacheContinuousQueryEventBuffer {
batch = initBatch(entry.topologyVersion());
if (batch == null || cntr < batch.startCntr) {
- if (backup)
+ if (backup) {
backupQ.add(entry);
+ return null;
+ }
+
return entry;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java
index e5347c8..2b696a5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryHandler.java
@@ -487,6 +487,70 @@ public class CacheContinuousQueryHandler<K, V> implements GridContinuousHandler
onEntryUpdated(evt, primary, false, null);
}
+ @Override public CounterSkipContext skipUpdateCounter(final GridCacheContext cctx,
+ @Nullable CounterSkipContext skipCtx,
+ int part,
+ long cntr,
+ AffinityTopologyVersion topVer,
+ boolean primary) {
+ if (skipCtx == null)
+ skipCtx = new CounterSkipContext(part, cntr, topVer);
+
+ if (loc) {
+ assert !locCache;
+
+ final Collection<CacheEntryEvent<? extends K, ? extends V>> evts = handleEvent(ctx, skipCtx.entry());
+
+ if (!evts.isEmpty()) {
+ if (asyncCb) {
+ ctx.asyncCallbackPool().execute(new Runnable() {
+ @Override public void run() {
+ locLsnr.onUpdated(evts);
+ }
+ }, part);
+ }
+ else
+ skipCtx.addProcessClosure(new Runnable() {
+ @Override public void run() {
+ locLsnr.onUpdated(evts);
+ }
+ });
+ }
+
+ return skipCtx;
+ }
+
+ CacheContinuousQueryEventBuffer buf = partitionBuffer(cctx, part);
+
+ final Object entryOrList = buf.processEntry(skipCtx.entry(), !primary);
+
+ if (entryOrList != null) {
+ skipCtx.addProcessClosure(new Runnable() {
+ @Override public void run() {
+ try {
+ ctx.continuous().addNotification(nodeId,
+ routineId,
+ entryOrList,
+ topic,
+ false,
+ true);
+ }
+ catch (ClusterTopologyCheckedException ex) {
+ if (log.isDebugEnabled())
+ log.debug("Failed to send event notification to node, node left cluster " +
+ "[node=" + nodeId + ", err=" + ex + ']');
+ }
+ catch (IgniteCheckedException ex) {
+ U.error(ctx.log(CU.CONTINUOUS_QRY_LOG_CATEGORY),
+ "Failed to send event notification to node: " + nodeId, ex);
+ }
+ }
+ });
+ }
+
+ return skipCtx;
+ }
+
@Override public void onPartitionEvicted(int part) {
entryBufs.remove(part);
}
@@ -1011,7 +1075,7 @@ public class CacheContinuousQueryHandler<K, V> implements GridContinuousHandler
t.get1());
for (AffinityTopologyVersion topVer : t.get2()) {
- for (ClusterNode node : ctx.discovery().cacheAffinityNodes(cctx.name(), topVer)) {
+ for (ClusterNode node : ctx.discovery().cacheGroupAffinityNodes(cctx.groupId(), topVer)) {
if (!node.isLocal()) {
try {
cctx.io().send(node, msg, GridIoPolicy.SYSTEM_POOL);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryListener.java
index 84b22f9..7da657f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryListener.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryListener.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.cache.query.continuous;
import java.util.Map;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture;
import org.jetbrains.annotations.Nullable;
@@ -76,6 +77,25 @@ public interface CacheContinuousQueryListener<K, V> {
public void skipUpdateEvent(CacheContinuousQueryEvent<K, V> evt, AffinityTopologyVersion topVer, boolean primary);
/**
+ * For cache updates in shared cache group need notify others caches CQ listeners
+ * that generated counter should be skipped.
+ *
+ * @param cctx Cache context.
+ * @param skipCtx Context.
+ * @param part Partition.
+ * @param cntr Counter to skip.
+ * @param topVer Topology version.
+ * @return Context.
+ */
+ @Nullable public CounterSkipContext skipUpdateCounter(
+ GridCacheContext cctx,
+ @Nullable CounterSkipContext skipCtx,
+ int part,
+ long cntr,
+ AffinityTopologyVersion topVer,
+ boolean primary);
+
+ /**
* @param part Partition.
*/
public void onPartitionEvicted(int part);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
index 1a655e9..f264056 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
@@ -127,7 +127,7 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
topicPrefix = "CONTINUOUS_QUERY" + (cctx.name() == null ? "" : "_" + cctx.name());
if (cctx.affinityNode()) {
- cctx.io().addHandler(cctx.cacheId(), CacheContinuousQueryBatchAck.class,
+ cctx.io().addCacheHandler(cctx.cacheId(), CacheContinuousQueryBatchAck.class,
new CI2<UUID, CacheContinuousQueryBatchAck>() {
@Override public void apply(UUID uuid, CacheContinuousQueryBatchAck msg) {
CacheContinuousQueryListener lsnr = lsnrs.get(msg.routineId());
@@ -175,7 +175,7 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
* @param primary Primary.
* @param topVer Topology version.
*/
- public void skipUpdateEvent(Map<UUID, CacheContinuousQueryListener> lsnrs,
+ private void skipUpdateEvent(Map<UUID, CacheContinuousQueryListener> lsnrs,
KeyCacheObject key,
int partId,
long updCntr,
@@ -204,6 +204,24 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
}
/**
+ * @param skipCtx Context.
+ * @param part Partition number.
+ * @param cntr Update counter.
+ * @param topVer Topology version.
+ * @return Context.
+ */
+ @Nullable public CounterSkipContext skipUpdateCounter(@Nullable CounterSkipContext skipCtx,
+ int part,
+ long cntr,
+ AffinityTopologyVersion topVer,
+ boolean primary) {
+ for (CacheContinuousQueryListener lsnr : lsnrs.values())
+ skipCtx = lsnr.skipUpdateCounter(cctx, skipCtx, part, cntr, topVer, primary);
+
+ return skipCtx;
+ }
+
+ /**
* @param internal Internal entry flag (internal key or not user cache).
* @param preload Whether update happened during preloading.
* @return Registered listeners.
@@ -633,7 +651,7 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
hnd.localCache(cctx.isLocal());
IgnitePredicate<ClusterNode> pred = (loc || cctx.config().getCacheMode() == CacheMode.LOCAL) ?
- F.nodeForNodeId(cctx.localNodeId()) : cctx.config().getNodeFilter();
+ F.nodeForNodeId(cctx.localNodeId()) : cctx.group().nodeFilter();
assert pred != null : cctx.config();
@@ -658,7 +676,10 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
}
if (notifyExisting) {
- final Iterator<CacheDataRow> it = cctx.offheap().iterator(true, true, AffinityTopologyVersion.NONE);
+ final Iterator<CacheDataRow> it = cctx.offheap().cacheIterator(cctx.cacheId(),
+ true,
+ true,
+ AffinityTopologyVersion.NONE);
locLsnr.onUpdated(new Iterable<CacheEntryEvent>() {
@Override public Iterator<CacheEntryEvent> iterator() {
@@ -807,16 +828,24 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
intLsnrCnt.incrementAndGet();
}
else {
- added = lsnrs.putIfAbsent(lsnrId, lsnr) == null;
+ synchronized (this) {
+ if (lsnrCnt.get() == 0) {
+ if (cctx.group().sharedGroup() && !cctx.isLocal())
+ cctx.group().addCacheWithContinuousQuery(cctx);
+ }
- if (added) {
- lsnrCnt.incrementAndGet();
+ added = lsnrs.putIfAbsent(lsnrId, lsnr) == null;
- lsnr.onExecution();
+ if (added)
+ lsnrCnt.incrementAndGet();
}
+
+ if (added)
+ lsnr.onExecution();
}
- return added ? GridContinuousHandler.RegisterStatus.REGISTERED : GridContinuousHandler.RegisterStatus.NOT_REGISTERED;
+ return added ? GridContinuousHandler.RegisterStatus.REGISTERED :
+ GridContinuousHandler.RegisterStatus.NOT_REGISTERED;
}
/**
@@ -834,11 +863,17 @@ public class CacheContinuousQueryManager extends GridCacheManagerAdapter {
}
}
else {
- if ((lsnr = lsnrs.remove(id)) != null) {
- lsnrCnt.decrementAndGet();
+ synchronized (this) {
+ if ((lsnr = lsnrs.remove(id)) != null) {
+ int cnt = lsnrCnt.decrementAndGet();
- lsnr.onUnregister();
+ if (cctx.group().sharedGroup() && cnt == 0 && !cctx.isLocal())
+ cctx.group().removeCacheWithContinuousQuery(cctx);
+ }
}
+
+ if (lsnr != null)
+ lsnr.onUnregister();
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CounterSkipContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CounterSkipContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CounterSkipContext.java
new file mode 100644
index 0000000..23702bc
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CounterSkipContext.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.query.continuous;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ *
+ */
+public class CounterSkipContext {
+ /** */
+ private final CacheContinuousQueryEntry entry;
+
+ /** */
+ private List<Runnable> procC;
+
+ /**
+ * @param part Partition.
+ * @param cntr Filtered counter.
+ * @param topVer Topology version.
+ */
+ CounterSkipContext(int part, long cntr, AffinityTopologyVersion topVer) {
+ entry = new CacheContinuousQueryEntry(0,
+ null,
+ null,
+ null,
+ null,
+ false,
+ part,
+ cntr,
+ topVer,
+ (byte)0);
+
+ entry.markFiltered();
+ }
+
+ /**
+ * @return Entry for filtered counter.
+ */
+ CacheContinuousQueryEntry entry() {
+ return entry;
+ }
+
+ /**
+ * @return Entries
+ */
+ @Nullable public List<Runnable> processClosures() {
+ return procC;
+ }
+
+ /**
+ * @param c Closure send
+ */
+ void addProcessClosure(Runnable c) {
+ if (procC == null)
+ procC = new ArrayList<>();
+
+ procC.add(c);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
index 5cba0cf..96af425 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
@@ -1480,7 +1480,7 @@ public abstract class IgniteTxAdapter extends GridMetadataAwareAdapter implement
if (modified)
cacheVal = cacheCtx.toCacheObject(cacheCtx.unwrapTemporary(val));
- GridCacheOperation op = modified ? (val == null ? DELETE : UPDATE) : NOOP;
+ GridCacheOperation op = modified ? (cacheVal == null ? DELETE : UPDATE) : NOOP;
if (op == NOOP) {
ExpiryPolicy expiry = cacheCtx.expiryForTxEntry(txEntry);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
index 163ed99..30aa335 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
@@ -565,7 +565,9 @@ public class IgniteTxEntry implements GridPeerDeployAware, Message {
*/
public void cached(GridCacheEntryEx entry) {
assert entry == null || entry.context() == ctx : "Invalid entry assigned to tx entry [txEntry=" + this +
- ", entry=" + entry + ", ctxNear=" + ctx.isNear() + ", ctxDht=" + ctx.isDht() + ']';
+ ", entry=" + entry +
+ ", ctxNear=" + ctx.isNear() +
+ ", ctxDht=" + ctx.isDht() + ']';
this.entry = entry;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
index a591517..ba3b2b6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
@@ -136,68 +136,68 @@ public class IgniteTxHandler {
txPrepareMsgLog = ctx.logger(CU.TX_MSG_PREPARE_LOG_CATEGORY);
txFinishMsgLog = ctx.logger(CU.TX_MSG_FINISH_LOG_CATEGORY);
- ctx.io().addHandler(0, GridNearTxPrepareRequest.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridNearTxPrepareRequest.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processNearTxPrepareRequest(nodeId, (GridNearTxPrepareRequest)msg);
}
});
- ctx.io().addHandler(0, GridNearTxPrepareResponse.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridNearTxPrepareResponse.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processNearTxPrepareResponse(nodeId, (GridNearTxPrepareResponse)msg);
}
});
- ctx.io().addHandler(0, GridNearTxFinishRequest.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridNearTxFinishRequest.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processNearTxFinishRequest(nodeId, (GridNearTxFinishRequest)msg);
}
});
- ctx.io().addHandler(0, GridNearTxFinishResponse.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridNearTxFinishResponse.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processNearTxFinishResponse(nodeId, (GridNearTxFinishResponse)msg);
}
});
- ctx.io().addHandler(0, GridDhtTxPrepareRequest.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridDhtTxPrepareRequest.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processDhtTxPrepareRequest(nodeId, (GridDhtTxPrepareRequest)msg);
}
});
- ctx.io().addHandler(0, GridDhtTxPrepareResponse.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridDhtTxPrepareResponse.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processDhtTxPrepareResponse(nodeId, (GridDhtTxPrepareResponse)msg);
}
});
- ctx.io().addHandler(0, GridDhtTxFinishRequest.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridDhtTxFinishRequest.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processDhtTxFinishRequest(nodeId, (GridDhtTxFinishRequest)msg);
}
});
- ctx.io().addHandler(0, GridDhtTxOnePhaseCommitAckRequest.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridDhtTxOnePhaseCommitAckRequest.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processDhtTxOnePhaseCommitAckRequest(nodeId, (GridDhtTxOnePhaseCommitAckRequest)msg);
}
});
- ctx.io().addHandler(0, GridDhtTxFinishResponse.class, new CI2<UUID, GridCacheMessage>() {
+ ctx.io().addCacheHandler(0, GridDhtTxFinishResponse.class, new CI2<UUID, GridCacheMessage>() {
@Override public void apply(UUID nodeId, GridCacheMessage msg) {
processDhtTxFinishResponse(nodeId, (GridDhtTxFinishResponse)msg);
}
});
- ctx.io().addHandler(0, GridCacheTxRecoveryRequest.class,
+ ctx.io().addCacheHandler(0, GridCacheTxRecoveryRequest.class,
new CI2<UUID, GridCacheTxRecoveryRequest>() {
@Override public void apply(UUID nodeId, GridCacheTxRecoveryRequest req) {
processCheckPreparedTxRequest(nodeId, req);
}
});
- ctx.io().addHandler(0, GridCacheTxRecoveryResponse.class,
+ ctx.io().addCacheHandler(0, GridCacheTxRecoveryResponse.class,
new CI2<UUID, GridCacheTxRecoveryResponse>() {
@Override public void apply(UUID nodeId, GridCacheTxRecoveryResponse res) {
processCheckPreparedTxResponse(nodeId, res);
@@ -506,8 +506,8 @@ public class IgniteTxHandler {
for (IgniteTxEntry e : F.concat(false, req.reads(), req.writes())) {
GridCacheContext ctx = e.context();
- Collection<ClusterNode> cacheNodes0 = ctx.discovery().cacheAffinityNodes(ctx.cacheId(), expVer);
- Collection<ClusterNode> cacheNodes1 = ctx.discovery().cacheAffinityNodes(ctx.cacheId(), curVer);
+ Collection<ClusterNode> cacheNodes0 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), expVer);
+ Collection<ClusterNode> cacheNodes1 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), curVer);
if (!cacheNodes0.equals(cacheNodes1) || ctx.affinity().affinityTopologyVersion().compareTo(curVer) < 0)
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
index 5a708d7..52a0f56 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
@@ -660,6 +660,8 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter implements Ig
txEntry.updateCounter())));
if (op == CREATE || op == UPDATE) {
+ assert val != null : txEntry;
+
GridCacheUpdateTxResult updRes = cached.innerSet(
this,
eventNodeId(),
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java
index d1d6afd..94fe005 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java
@@ -70,6 +70,16 @@ public class TxLocksRequest extends GridCacheMessage {
this.txKeys = txKeys;
}
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
/**
* @return Future ID.
*/
@@ -139,13 +149,13 @@ public class TxLocksRequest extends GridCacheMessage {
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeLong("futId", futId))
return false;
writer.incrementState();
- case 4:
+ case 3:
if (!writer.writeObjectArray("txKeysArr", txKeysArr, MessageCollectionItemType.MSG))
return false;
@@ -167,7 +177,7 @@ public class TxLocksRequest extends GridCacheMessage {
return false;
switch (reader.state()) {
- case 3:
+ case 2:
futId = reader.readLong("futId");
if (!reader.isLastRead())
@@ -175,7 +185,7 @@ public class TxLocksRequest extends GridCacheMessage {
reader.incrementState();
- case 4:
+ case 3:
txKeysArr = reader.readObjectArray("txKeysArr", MessageCollectionItemType.MSG, IgniteTxKey.class);
if (!reader.isLastRead())
@@ -195,7 +205,7 @@ public class TxLocksRequest extends GridCacheMessage {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 5;
+ return 4;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java
index 7856eaa..a5c8f09 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java
@@ -73,6 +73,16 @@ public class TxLocksResponse extends GridCacheMessage {
// No-op.
}
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
/**
* @return Future ID.
*/
@@ -229,25 +239,25 @@ public class TxLocksResponse extends GridCacheMessage {
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeLong("futId", futId))
return false;
writer.incrementState();
- case 4:
+ case 3:
if (!writer.writeObjectArray("locksArr", locksArr, MessageCollectionItemType.MSG))
return false;
writer.incrementState();
- case 5:
+ case 4:
if (!writer.writeObjectArray("nearTxKeysArr", nearTxKeysArr, MessageCollectionItemType.MSG))
return false;
writer.incrementState();
- case 6:
+ case 5:
if (!writer.writeObjectArray("txKeysArr", txKeysArr, MessageCollectionItemType.MSG))
return false;
@@ -269,7 +279,7 @@ public class TxLocksResponse extends GridCacheMessage {
return false;
switch (reader.state()) {
- case 3:
+ case 2:
futId = reader.readLong("futId");
if (!reader.isLastRead())
@@ -277,7 +287,7 @@ public class TxLocksResponse extends GridCacheMessage {
reader.incrementState();
- case 4:
+ case 3:
locksArr = reader.readObjectArray("locksArr", MessageCollectionItemType.MSG, TxLockList.class);
if (!reader.isLastRead())
@@ -285,7 +295,7 @@ public class TxLocksResponse extends GridCacheMessage {
reader.incrementState();
- case 5:
+ case 4:
nearTxKeysArr = reader.readObjectArray("nearTxKeysArr", MessageCollectionItemType.MSG, IgniteTxKey.class);
if (!reader.isLastRead())
@@ -293,7 +303,7 @@ public class TxLocksResponse extends GridCacheMessage {
reader.incrementState();
- case 6:
+ case 5:
txKeysArr = reader.readObjectArray("txKeysArr", MessageCollectionItemType.MSG, IgniteTxKey.class);
if (!reader.isLastRead())
@@ -313,7 +323,7 @@ public class TxLocksResponse extends GridCacheMessage {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 7;
+ return 6;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
index b25b229..56f1183 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java
@@ -134,7 +134,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter {
cacheProc = ctx.cache();
sharedCtx = cacheProc.context();
- sharedCtx.io().addHandler(0,
+ sharedCtx.io().addCacheHandler(0,
GridChangeGlobalStateMessageResponse.class,
new CI2<UUID, GridChangeGlobalStateMessageResponse>() {
@Override public void apply(UUID nodeId, GridChangeGlobalStateMessageResponse msg) {
@@ -194,7 +194,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter {
@Override public void stop(boolean cancel) throws IgniteCheckedException {
super.stop(cancel);
- sharedCtx.io().removeHandler(0, GridChangeGlobalStateMessageResponse.class);
+ sharedCtx.io().removeHandler(false, 0, GridChangeGlobalStateMessageResponse.class);
ctx.event().removeLocalEventListener(lsr, EVT_NODE_LEFT, EVT_NODE_FAILED);
IgniteCheckedException stopErr = new IgniteInterruptedCheckedException(
@@ -377,7 +377,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter {
actx.setFail();
- // revert change if activation request fail
+ // Revert change if activation request fail.
if (actx.activate) {
try {
cacheProc.onKernalStopCaches(true);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index 175bcea..edf8dc1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -1561,7 +1561,8 @@ public class GridQueryProcessor extends GridProcessorAdapter {
fut.onDone(e);
}
catch (Throwable e) {
- log.error("Failed to rebuild indexes for type: " + typeName, e);
+ U.error(log, "Failed to rebuild indexes for type [cache=" + cacheName +
+ ", type=" + typeName + ']', e);
fut.onDone(e);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
index 6ac2390..fd498ad 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java
@@ -17,6 +17,19 @@
package org.apache.ignite.internal.processors.query;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.cache.QueryEntity;
@@ -31,32 +44,18 @@ import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDefaultAffinityKeyMapper;
import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
-import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
import org.apache.ignite.internal.processors.query.property.QueryBinaryProperty;
import org.apache.ignite.internal.processors.query.property.QueryClassProperty;
import org.apache.ignite.internal.processors.query.property.QueryFieldAccessor;
import org.apache.ignite.internal.processors.query.property.QueryMethodsAccessor;
import org.apache.ignite.internal.processors.query.property.QueryPropertyAccessor;
import org.apache.ignite.internal.processors.query.property.QueryReadOnlyMethodsAccessor;
+import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.jetbrains.annotations.Nullable;
-import java.lang.reflect.Method;
-import java.math.BigDecimal;
-import java.sql.Time;
-import java.sql.Timestamp;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
import static org.apache.ignite.IgniteSystemProperties.IGNITE_INDEXING_DISCOVERY_HISTORY_SIZE;
import static org.apache.ignite.IgniteSystemProperties.getInteger;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
index 69188c5..af65de0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCachePartitionsTask.java
@@ -124,7 +124,7 @@ public class VisorCachePartitionsTask extends VisorMultiNodeTask<VisorCacheParti
for (GridDhtLocalPartition part : locParts) {
int p = part.id();
- long sz = part.dataStore().size();
+ long sz = part.dataStore().cacheSize(ca.context().cacheId());
// Pass NONE as topology version in order not to wait for topology version.
if (part.primary(AffinityTopologyVersion.NONE))
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheAtomicSingleMessageCountSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheAtomicSingleMessageCountSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheAtomicSingleMessageCountSelfTest.java
index 5bd53bb..fdc98ff 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheAtomicSingleMessageCountSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheAtomicSingleMessageCountSelfTest.java
@@ -204,7 +204,7 @@ public class CacheAtomicSingleMessageCountSelfTest extends GridCommonAbstractTes
throws IgniteSpiException {
if (((GridIoMessage)msg).message() instanceof GridCacheMessage) {
- int msgCacheId = ((GridCacheMessage)((GridIoMessage)msg).message()).cacheId();
+ int msgCacheId = ((GridCacheIdMessage)((GridIoMessage)msg).message()).cacheId();
if (filterCacheId == null || filterCacheId == msgCacheId) {
AtomicInteger cntr = cntMap.get(((GridIoMessage)msg).message().getClass());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteQueueTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteQueueTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteQueueTest.java
index 65037d8..18a35c6 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteQueueTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDeferredDeleteQueueTest.java
@@ -116,7 +116,7 @@ public class CacheDeferredDeleteQueueTest extends GridCommonAbstractTest {
for (GridDhtLocalPartition p : top.currentLocalPartitions()) {
Collection<Object> rmvQueue = GridTestUtils.getFieldValue(p, "rmvQueue");
- if (!rmvQueue.isEmpty() || p.dataStore().size() != 0)
+ if (!rmvQueue.isEmpty() || p.dataStore().fullSize() != 0)
return false;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDhtLocalPartitionAfterRemoveSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDhtLocalPartitionAfterRemoveSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDhtLocalPartitionAfterRemoveSelfTest.java
index c060eb3..7263656 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDhtLocalPartitionAfterRemoveSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheDhtLocalPartitionAfterRemoveSelfTest.java
@@ -76,7 +76,7 @@ public class CacheDhtLocalPartitionAfterRemoveSelfTest extends GridCommonAbstrac
cache = grid(g).cache(DEFAULT_CACHE_NAME);
for (GridDhtLocalPartition p : dht(cache).topology().localPartitions()) {
- int size = p.dataStore().size();
+ int size = p.dataStore().fullSize();
assertTrue("Unexpected size: " + size, size <= 32);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
index d8a2065..f3a2204 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheExchangeMessageDuplicatedStateTest.java
@@ -283,30 +283,33 @@ public class CacheExchangeMessageDuplicatedStateTest extends GridCommonAbstractT
Map<Integer, Integer> dupPartsData,
GridDhtPartitionsFullMessage msg)
{
- Integer cacheId;
- Integer dupCacheId;
+ int cache1Grp = groupIdForCache(ignite(0), cache1);
+ int cache2Grp = groupIdForCache(ignite(0), cache2);
- if (dupPartsData.containsKey(CU.cacheId(cache1))) {
- cacheId = CU.cacheId(cache1);
- dupCacheId = CU.cacheId(cache2);
+ Integer grpId;
+ Integer dupGrpId;
+
+ if (dupPartsData.containsKey(cache1Grp)) {
+ grpId = cache1Grp;
+ dupGrpId = cache2Grp;
}
else {
- cacheId = CU.cacheId(cache2);
- dupCacheId = CU.cacheId(cache1);
+ grpId = cache2Grp;
+ dupGrpId = cache1Grp;
}
- assertTrue(dupPartsData.containsKey(cacheId));
- assertEquals(dupCacheId, dupPartsData.get(cacheId));
- assertFalse(dupPartsData.containsKey(dupCacheId));
+ assertTrue(dupPartsData.containsKey(grpId));
+ assertEquals(dupGrpId, dupPartsData.get(grpId));
+ assertFalse(dupPartsData.containsKey(dupGrpId));
Map<Integer, GridDhtPartitionFullMap> parts = msg.partitions();
- GridDhtPartitionFullMap emptyFullMap = parts.get(cacheId);
+ GridDhtPartitionFullMap emptyFullMap = parts.get(grpId);
for (GridDhtPartitionMap map : emptyFullMap.values())
assertEquals(0, map.map().size());
- GridDhtPartitionFullMap fullMap = parts.get(dupCacheId);
+ GridDhtPartitionFullMap fullMap = parts.get(dupGrpId);
for (GridDhtPartitionMap map : fullMap.values())
assertFalse(map.map().isEmpty());
@@ -323,29 +326,32 @@ public class CacheExchangeMessageDuplicatedStateTest extends GridCommonAbstractT
Map<Integer, Integer> dupPartsData,
GridDhtPartitionsSingleMessage msg)
{
- Integer cacheId;
- Integer dupCacheId;
+ int cache1Grp = groupIdForCache(ignite(0), cache1);
+ int cache2Grp = groupIdForCache(ignite(0), cache2);
+
+ Integer grpId;
+ Integer dupGrpId;
- if (dupPartsData.containsKey(CU.cacheId(cache1))) {
- cacheId = CU.cacheId(cache1);
- dupCacheId = CU.cacheId(cache2);
+ if (dupPartsData.containsKey(cache1Grp)) {
+ grpId = cache1Grp;
+ dupGrpId = cache2Grp;
}
else {
- cacheId = CU.cacheId(cache2);
- dupCacheId = CU.cacheId(cache1);
+ grpId = cache2Grp;
+ dupGrpId = cache1Grp;
}
- assertTrue(dupPartsData.containsKey(cacheId));
- assertEquals(dupCacheId, dupPartsData.get(cacheId));
- assertFalse(dupPartsData.containsKey(dupCacheId));
+ assertTrue(dupPartsData.containsKey(grpId));
+ assertEquals(dupGrpId, dupPartsData.get(grpId));
+ assertFalse(dupPartsData.containsKey(dupGrpId));
Map<Integer, GridDhtPartitionMap> parts = msg.partitions();
- GridDhtPartitionMap emptyMap = parts.get(cacheId);
+ GridDhtPartitionMap emptyMap = parts.get(grpId);
assertEquals(0, emptyMap.map().size());
- GridDhtPartitionMap map = parts.get(dupCacheId);
+ GridDhtPartitionMap map = parts.get(dupGrpId);
assertFalse(map.map().isEmpty());
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOffheapMapEntrySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOffheapMapEntrySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOffheapMapEntrySelfTest.java
index 1886c76..bdc5507 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOffheapMapEntrySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheOffheapMapEntrySelfTest.java
@@ -22,8 +22,7 @@ import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.IgniteKernal;
-import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicCacheEntry;
-import org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtColocatedCacheEntry;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheEntry;
import org.apache.ignite.internal.processors.cache.local.GridLocalCacheEntry;
@@ -97,9 +96,9 @@ public class CacheOffheapMapEntrySelfTest extends GridCacheAbstractSelfTest {
checkCacheMapEntry(TRANSACTIONAL, PARTITIONED, GridNearCacheEntry.class);
- checkCacheMapEntry(ATOMIC, REPLICATED, GridDhtAtomicCacheEntry.class);
+ checkCacheMapEntry(ATOMIC, REPLICATED, GridDhtCacheEntry.class);
- checkCacheMapEntry(TRANSACTIONAL, REPLICATED, GridDhtColocatedCacheEntry.class);
+ checkCacheMapEntry(TRANSACTIONAL, REPLICATED, GridDhtCacheEntry.class);
}
/**
@@ -135,7 +134,7 @@ public class CacheOffheapMapEntrySelfTest extends GridCacheAbstractSelfTest {
assertNotNull(entry);
- assertEquals(entry.getClass(), entryCls);
+ assertEquals(entryCls, entry.getClass());
}
finally {
jcache.destroy();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConditionalDeploymentSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConditionalDeploymentSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConditionalDeploymentSelfTest.java
index eefdf9d..b0d9f0e 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConditionalDeploymentSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheConditionalDeploymentSelfTest.java
@@ -167,10 +167,16 @@ public class GridCacheConditionalDeploymentSelfTest extends GridCommonAbstractTe
}
}
+ /**
+ * @return Cache context.
+ */
protected GridCacheContext cacheContext() {
return ((IgniteCacheProxy)grid(0).cache(DEFAULT_CACHE_NAME)).context();
}
+ /**
+ * @return IO manager.
+ */
protected GridCacheIoManager cacheIoManager() {
return grid(0).context().cache().context().io();
}
@@ -182,10 +188,22 @@ public class GridCacheConditionalDeploymentSelfTest extends GridCommonAbstractTe
/** */
public static final short DIRECT_TYPE = 302;
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public short directType() {
return DIRECT_TYPE;
}
+ /** {@inheritDoc} */
@Override public byte fieldsCount() {
return 3;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLeakTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLeakTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLeakTest.java
index a13ad64..cff9745 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLeakTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLeakTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
@@ -128,7 +129,7 @@ public class GridCacheLeakTest extends GridCommonAbstractTest {
GridCacheConcurrentMap map = ((IgniteKernal)grid(g)).internalCache(CACHE_NAME).map();
info("Map size for cache [g=" + g + ", size=" + map.internalSize() +
- ", pubSize=" + map.publicSize() + ']');
+ ", pubSize=" + map.publicSize(CU.cacheId(CACHE_NAME)) + ']');
assertTrue("Wrong map size: " + map.internalSize(), map.internalSize() <= 8192);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOrderedPreloadingSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOrderedPreloadingSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOrderedPreloadingSelfTest.java
index 7562fe5..bc4f2cb 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOrderedPreloadingSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOrderedPreloadingSelfTest.java
@@ -68,8 +68,10 @@ public class GridCacheOrderedPreloadingSelfTest extends GridCommonAbstractTest {
/** Caches rebalance finish times. */
private ConcurrentHashMap8<Integer, ConcurrentHashMap8<String, Long>> times;
+ /** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
super.beforeTestsStarted();
+
times = new ConcurrentHashMap8<>();
for (int i = 0; i < GRID_CNT; i++)
@@ -93,8 +95,8 @@ public class GridCacheOrderedPreloadingSelfTest extends GridCommonAbstractTest {
Map<IgnitePredicate<? extends Event>, int[]> listeners = new HashMap<>();
listeners.put(new IgnitePredicate<CacheRebalancingEvent>() {
- @Override public boolean apply(CacheRebalancingEvent event) {
- times.get(gridIdx(event)).putIfAbsent(event.cacheName(), event.timestamp());
+ @Override public boolean apply(CacheRebalancingEvent evt) {
+ times.get(gridIdx(evt)).putIfAbsent(evt.cacheName(), evt.timestamp());
return true;
}
}, new int[]{EventType.EVT_CACHE_REBALANCE_STOPPED});
@@ -194,7 +196,11 @@ public class GridCacheOrderedPreloadingSelfTest extends GridCommonAbstractTest {
}
}
- private int gridIdx(Event event) {
- return getTestIgniteInstanceIndex((String)event.node().attributes().get(GRID_NAME_ATTR));
+ /**
+ * @param evt Event.
+ * @return Index event node.
+ */
+ private int gridIdx(Event evt) {
+ return getTestIgniteInstanceIndex((String)evt.node().attributes().get(GRID_NAME_ATTR));
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManagerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManagerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManagerSelfTest.java
index 18c0b32..52f19b7 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManagerSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManagerSelfTest.java
@@ -112,7 +112,8 @@ public class GridCacheTtlManagerSelfTest extends GridCommonAbstractTest {
assertNull(g.cache(DEFAULT_CACHE_NAME).get(key));
if (!g.internalCache(DEFAULT_CACHE_NAME).context().deferredDelete())
- assertNull(g.internalCache(DEFAULT_CACHE_NAME).map().getEntry(g.internalCache(DEFAULT_CACHE_NAME).context().toCacheKeyObject(key)));
+ assertNull(g.internalCache(DEFAULT_CACHE_NAME).map().getEntry(g.internalCache(DEFAULT_CACHE_NAME).context(),
+ g.internalCache(DEFAULT_CACHE_NAME).context().toCacheKeyObject(key)));
}
});
}
[03/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekModesAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekModesAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekModesAbstractTest.java
index 81c0799..7725b19 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekModesAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekModesAbstractTest.java
@@ -1022,7 +1022,7 @@ public abstract class IgniteCachePeekModesAbstractTest extends IgniteCacheAbstra
// Swap and offheap are disabled for near cache.
IgniteCacheOffheapManager offheapManager = ctx.isNear() ? ctx.near().dht().context().offheap() : ctx.offheap();
//First count entries...
- int cnt = (int)offheapManager.entriesCount(part);
+ int cnt = (int)offheapManager.cacheEntriesCount(ctx.cacheId(), part);
GridCacheAffinityManager affinity = ctx.affinity();
AffinityTopologyVersion topVer = affinity.affinityTopologyVersion();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
index eb8077f..c889c31 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
@@ -18,9 +18,9 @@
package org.apache.ignite.internal.processors.cache;
import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.internal.CU;
@@ -176,8 +176,9 @@ public class IgniteCacheStartTest extends GridCommonAbstractTest {
* @param idx Node index.
* @param cacheName Cache name.
* @param expCache {@code True} if cache should be created.
+ * @throws IgniteCheckedException If failed.
*/
- private void checkCache(int idx, final String cacheName, final boolean expCache) throws IgniteInterruptedCheckedException {
+ private void checkCache(int idx, final String cacheName, final boolean expCache) throws IgniteCheckedException {
final IgniteKernal node = (IgniteKernal)ignite(idx);
assertTrue(GridTestUtils.waitForCondition(new GridAbsPredicate() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
index a5cb3f2..bccebaa 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteOnePhaseCommitInvokeTest.java
@@ -127,10 +127,12 @@ public class IgniteOnePhaseCommitInvokeTest extends GridCommonAbstractTest {
final Ignite clientNode = startGrid(1);
+ final int grpId = groupIdForCache(srv0, CACHE_NAME);
+
TestRecordingCommunicationSpi.spi(srv0).blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode node, Message msg) {
return msg instanceof GridDhtPartitionSupplyMessage &&
- ((GridDhtPartitionSupplyMessage)msg).cacheId() == CU.cacheId(CACHE_NAME);
+ ((GridDhtPartitionSupplyMessage)msg).groupId() == grpId;
}
});
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorAbstractTxCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorAbstractTxCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorAbstractTxCacheGroupsTest.java
new file mode 100644
index 0000000..06f1922
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorAbstractTxCacheGroupsTest.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.transactions.Transaction;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
+import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+
+/**
+ * Topology validator test
+ */
+public abstract class IgniteTopologyValidatorAbstractTxCacheGroupsTest
+ extends IgniteTopologyValidatorCacheGroupsAbstractTest {
+ /** {@inheritDoc} */
+ @Override protected CacheAtomicityMode atomicityMode() {
+ return TRANSACTIONAL;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected NearCacheConfiguration nearConfiguration() {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void testTopologyValidator() throws Exception {
+ try (Transaction tx = grid(0).transactions().txStart(OPTIMISTIC, REPEATABLE_READ)) {
+ putValid(CACHE_NAME_1);
+ putValid(CACHE_NAME_3);
+ commitFailed(tx);
+ }
+
+ assertEmpty(CACHE_NAME_1); // rolled back
+ assertEmpty(CACHE_NAME_3); // rolled back
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putInvalid(CACHE_NAME_1);
+ }
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putInvalid(CACHE_NAME_3);
+ }
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putValid(DEFAULT_CACHE_NAME);
+ putInvalid(CACHE_NAME_1);
+ }
+
+ assertEmpty(DEFAULT_CACHE_NAME); // rolled back
+
+ startGrid(1);
+
+ try (Transaction tx = grid(0).transactions().txStart(OPTIMISTIC, REPEATABLE_READ)) {
+ putValid(CACHE_NAME_1);
+ putValid(CACHE_NAME_3);
+ tx.commit();
+ }
+
+ remove(CACHE_NAME_1);
+ remove(CACHE_NAME_3);
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putValid(CACHE_NAME_1);
+ putValid(CACHE_NAME_3);
+ tx.commit();
+ }
+
+ remove(CACHE_NAME_1);
+ remove(CACHE_NAME_3);
+
+ startGrid(2);
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putValid(CACHE_NAME_3);
+ putInvalid(CACHE_NAME_1);
+ }
+
+ assertEmpty(CACHE_NAME_3); // rolled back
+
+ try (Transaction tx = grid(0).transactions().txStart(OPTIMISTIC, REPEATABLE_READ)) {
+ putValid(CACHE_NAME_1);
+ putValid(CACHE_NAME_3);
+ commitFailed(tx);
+ }
+
+ assertEmpty(CACHE_NAME_1); // rolled back
+ assertEmpty(CACHE_NAME_3); // rolled back
+
+ try (Transaction tx = grid(0).transactions().txStart(OPTIMISTIC, REPEATABLE_READ)) {
+ putValid(DEFAULT_CACHE_NAME);
+ putValid(CACHE_NAME_3);
+ tx.commit();
+ }
+
+ remove(DEFAULT_CACHE_NAME);
+ remove(CACHE_NAME_3);
+
+ try (Transaction tx = grid(0).transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ putValid(DEFAULT_CACHE_NAME);
+ putValid(CACHE_NAME_3);
+ tx.commit();
+ }
+
+ remove(DEFAULT_CACHE_NAME);
+ remove(CACHE_NAME_3);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorCacheGroupsAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorCacheGroupsAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorCacheGroupsAbstractTest.java
new file mode 100644
index 0000000..3070d9d
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorCacheGroupsAbstractTest.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.Collection;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.TopologyValidator;
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ *
+ */
+public abstract class IgniteTopologyValidatorCacheGroupsAbstractTest extends IgniteTopologyValidatorAbstractCacheTest {
+ /** group name 1. */
+ protected static final String GROUP_1 = "group1";
+
+ /** group name 2. */
+ protected static final String GROUP_2 = "group2";
+
+ /** cache name 3. */
+ protected static String CACHE_NAME_3 = "cache3";
+
+ /** cache name 4. */
+ protected static String CACHE_NAME_4 = "cache4";
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration icfg = super.getConfiguration(igniteInstanceName);
+
+ CacheConfiguration[] ccfgs = icfg.getCacheConfiguration();
+
+ TopologyValidator val1 = new TopologyValidator() {
+ @Override public boolean validate(Collection<ClusterNode> nodes) {
+ return nodes.size() == 2;
+ }
+ };
+
+ TopologyValidator val2 = new TopologyValidator() {
+ @Override public boolean validate(Collection<ClusterNode> nodes) {
+ return nodes.size() >= 2;
+ }
+ };
+
+ for (CacheConfiguration ccfg : ccfgs) {
+ if (CACHE_NAME_1.equals(ccfg.getName()) || CACHE_NAME_2.equals(ccfg.getName()))
+ ccfg.setGroupName(GROUP_1).setTopologyValidator(val1);
+ }
+
+ CacheConfiguration ccfg3 = cacheConfiguration(igniteInstanceName)
+ .setName(CACHE_NAME_3)
+ .setGroupName(GROUP_2)
+ .setTopologyValidator(val2);
+
+ CacheConfiguration ccfg4 = cacheConfiguration(igniteInstanceName)
+ .setName(CACHE_NAME_4)
+ .setGroupName(GROUP_2)
+ .setTopologyValidator(val2);
+
+ return icfg.setCacheConfiguration(F.concat(ccfgs, ccfg3, ccfg4));
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testTopologyValidator() throws Exception {
+ putValid(DEFAULT_CACHE_NAME);
+ remove(DEFAULT_CACHE_NAME);
+
+ putInvalid(CACHE_NAME_1);
+ removeInvalid(CACHE_NAME_1);
+
+ putInvalid(CACHE_NAME_2);
+ removeInvalid(CACHE_NAME_2);
+
+ putInvalid(CACHE_NAME_3);
+ removeInvalid(CACHE_NAME_3);
+
+ putInvalid(CACHE_NAME_4);
+ removeInvalid(CACHE_NAME_4);
+
+ startGrid(1);
+
+ putValid(DEFAULT_CACHE_NAME);
+ remove(DEFAULT_CACHE_NAME);
+
+ putValid(CACHE_NAME_1);
+
+ putValid(CACHE_NAME_2);
+ remove(CACHE_NAME_2);
+
+ putValid(CACHE_NAME_3);
+
+ putValid(CACHE_NAME_4);
+ remove(CACHE_NAME_4);
+
+ startGrid(2);
+
+ putValid(DEFAULT_CACHE_NAME);
+ remove(DEFAULT_CACHE_NAME);
+
+ getInvalid(CACHE_NAME_1);
+ putInvalid(CACHE_NAME_1);
+ removeInvalid(CACHE_NAME_1);
+
+ putInvalid(CACHE_NAME_2);
+ removeInvalid(CACHE_NAME_2);
+
+ remove(CACHE_NAME_3);
+ putValid(CACHE_NAME_3);
+
+ putValid(CACHE_NAME_4);
+ remove(CACHE_NAME_4);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorGridSplitCacheTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorGridSplitCacheTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorGridSplitCacheTest.java
index 057b0d6..2e551f9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorGridSplitCacheTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorGridSplitCacheTest.java
@@ -202,6 +202,8 @@ public class IgniteTopologyValidatorGridSplitCacheTest extends GridCommonAbstrac
/**
* Resolves split by client node join.
+ *
+ * @throws Exception If failed.
*/
private void resolveSplit() throws Exception {
startGrid(RESOLVER_GRID_IDX);
@@ -305,6 +307,7 @@ public class IgniteTopologyValidatorGridSplitCacheTest extends GridCommonAbstrac
return true;
}
+ /** {@inheritDoc} */
@Override public void start() throws IgniteException {
if (ignite.cluster().localNode().isClient())
return;
@@ -327,12 +330,15 @@ public class IgniteTopologyValidatorGridSplitCacheTest extends GridCommonAbstrac
/**
* @param node Node.
+ * @return {@code True} if this is marker node.
*/
private boolean isMarkerNode(ClusterNode node) {
return node.isClient() && node.attribute(ACTIVATOR_NODE_ATTR) != null;
}
- @Override public void stop() throws IgniteException {
+ /** {@inheritDoc} */
+ @Override public void stop() {
+ // No-op.
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest.java
new file mode 100644
index 0000000..185c18f
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.configuration.NearCacheConfiguration;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest extends
+ IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest {
+ /** {@inheritDoc} */
+ @Override protected NearCacheConfiguration nearConfiguration() {
+ return new NearCacheConfiguration();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest.java
new file mode 100644
index 0000000..acfad80
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.configuration.NearCacheConfiguration;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest extends
+ IgniteTopologyValidatorPartitionedTxCacheGroupsTest {
+ /** {@inheritDoc} */
+ @Override protected NearCacheConfiguration nearConfiguration() {
+ return new NearCacheConfiguration();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest.java
new file mode 100644
index 0000000..f063a74
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest extends
+ IgniteTopologyValidatorCacheGroupsAbstractTest {
+ /** {@inheritDoc} */
+ @Override protected CacheMode cacheMode() {
+ return CacheMode.PARTITIONED;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected CacheAtomicityMode atomicityMode() {
+ return ATOMIC;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected NearCacheConfiguration nearConfiguration() {
+ return null;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedTxCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedTxCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedTxCacheGroupsTest.java
new file mode 100644
index 0000000..d39d00d
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorPartitionedTxCacheGroupsTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorPartitionedTxCacheGroupsTest extends
+ IgniteTopologyValidatorAbstractTxCacheGroupsTest {
+ /** {@inheritDoc} */
+ @Override protected CacheMode cacheMode() {
+ return CacheMode.PARTITIONED;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest.java
new file mode 100644
index 0000000..d7993e0
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest extends
+ IgniteTopologyValidatorCacheGroupsAbstractTest {
+ /** {@inheritDoc} */
+ @Override protected CacheMode cacheMode() {
+ return CacheMode.REPLICATED;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected CacheAtomicityMode atomicityMode() {
+ return ATOMIC;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected NearCacheConfiguration nearConfiguration() {
+ return null;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedTxCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedTxCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedTxCacheGroupsTest.java
new file mode 100644
index 0000000..26628f3
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTopologyValidatorReplicatedTxCacheGroupsTest.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.CacheMode;
+
+/**
+ * Topology validator test.
+ */
+public class IgniteTopologyValidatorReplicatedTxCacheGroupsTest extends
+ IgniteTopologyValidatorAbstractTxCacheGroupsTest {
+ /** {@inheritDoc} */
+ @Override protected CacheMode cacheMode() {
+ return CacheMode.REPLICATED;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxStoreExceptionAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxStoreExceptionAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxStoreExceptionAbstractSelfTest.java
index 872fe77..863ab38 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxStoreExceptionAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteTxStoreExceptionAbstractSelfTest.java
@@ -370,7 +370,7 @@ public abstract class IgniteTxStoreExceptionAbstractSelfTest extends GridCacheAb
GridCacheAdapter cache = grid.internalCache(DEFAULT_CACHE_NAME);
- GridCacheMapEntry entry = cache.map().getEntry(cache.context().toCacheKeyObject(key));
+ GridCacheMapEntry entry = cache.map().getEntry(cache.context(), cache.context().toCacheKeyObject(key));
log.info("Entry: " + entry);
@@ -383,7 +383,7 @@ public abstract class IgniteTxStoreExceptionAbstractSelfTest extends GridCacheAb
}
if (cache.isNear()) {
- entry = ((GridNearCacheAdapter)cache).dht().map().getEntry(cache.context().toCacheKeyObject(key));
+ entry = ((GridNearCacheAdapter)cache).dht().map().getEntry(cache.context(), cache.context().toCacheKeyObject(key));
log.info("Dht entry: " + entry);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/GridCacheBinaryObjectsAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/GridCacheBinaryObjectsAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/GridCacheBinaryObjectsAbstractSelfTest.java
index 06d62e4..5dace92 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/GridCacheBinaryObjectsAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/binary/GridCacheBinaryObjectsAbstractSelfTest.java
@@ -175,7 +175,7 @@ public abstract class GridCacheBinaryObjectsAbstractSelfTest extends GridCommonA
for (int i = 0; i < gridCount(); i++) {
GridCacheAdapter<Object, Object> c = ((IgniteKernal)grid(i)).internalCache(DEFAULT_CACHE_NAME);
- for (GridCacheEntryEx e : c.map().entries()) {
+ for (GridCacheEntryEx e : c.map().entries(c.context().cacheId())) {
Object key = e.key().value(c.context().cacheObjectContext(), false);
Object val = CU.value(e.rawGet(), c.context(), false);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueCleanupSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueCleanupSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueCleanupSelfTest.java
index 654e729..75183b0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueCleanupSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheQueueCleanupSelfTest.java
@@ -21,9 +21,11 @@ import java.util.Iterator;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteQueue;
import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CachePeekMode;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CollectionConfiguration;
import org.apache.ignite.internal.IgniteInternalFuture;
@@ -177,20 +179,15 @@ public class GridCacheQueueCleanupSelfTest extends IgniteCollectionAbstractTest
// Check that items of removed queue are removed, items of new queue not.
assertTrue(GridTestUtils.waitForCondition(new PAX() {
@SuppressWarnings("WhileLoopReplaceableByForEach")
- @Override public boolean applyx() {
+ @Override public boolean applyx() throws IgniteCheckedException {
int cnt = 0;
for (int i = 0; i < gridCount(); i++) {
GridCacheAdapter<Object, Object> cache =
- ((IgniteKernal)grid(i)).context().cache().internalCache(queueCacheName);
-
- Iterator<GridCacheMapEntry> entries = cache.map().entries().iterator();
+ grid(i).context().cache().internalCache(queueCacheName);
- while (entries.hasNext()) {
+ for (Object e : cache.localEntries(new CachePeekMode[]{CachePeekMode.ALL}))
cnt++;
-
- entries.next();
- }
}
if (cnt > 501) { // 500 items + header.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/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 517a7ad..53c1eb7 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
@@ -34,14 +34,14 @@ 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.cache.CachePeekMode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.CollectionConfiguration;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
-import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -804,17 +804,12 @@ public abstract class GridCacheSetAbstractSelfTest extends IgniteCollectionAbstr
GridCacheContext cctx = GridTestUtils.getFieldValue(set0, "cctx");
for (int i = 0; i < gridCount(); i++) {
- Iterator<GridCacheMapEntry> entries =
- (grid(i)).context().cache().internalCache(cctx.name()).map().entries().iterator();
+ GridCacheAdapter cache = grid(i).context().cache().internalCache(cctx.name());
- while (entries.hasNext()) {
- GridCacheEntryEx entry = entries.next();
+ for (Object e : cache.localEntries(new CachePeekMode[]{CachePeekMode.ALL})) {
+ cnt++;
- if (entry.hasValue()) {
- cnt++;
-
- log.info("Unexpected entry: " + entry);
- }
+ log.info("Unexpected entry: " + e);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetFailoverAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetFailoverAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetFailoverAbstractSelfTest.java
index 1e11c06..f8af2a2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetFailoverAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/GridCacheSetFailoverAbstractSelfTest.java
@@ -29,6 +29,7 @@ import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteSet;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.internal.processors.datastructures.SetItemKey;
@@ -174,8 +175,9 @@ public abstract class GridCacheSetFailoverAbstractSelfTest extends IgniteCollect
Set<IgniteUuid> setIds = new HashSet<>();
for (int i = 0; i < gridCount(); i++) {
- Iterator<GridCacheMapEntry> entries =
- grid(i).context().cache().internalCache(DEFAULT_CACHE_NAME).map().entries().iterator();
+ GridCacheAdapter cache = grid(i).context().cache().internalCache(DEFAULT_CACHE_NAME);
+
+ Iterator<GridCacheMapEntry> entries = cache.map().entries(cache.context().cacheId()).iterator();
while (entries.hasNext()) {
GridCacheEntryEx entry = entries.next();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedQueueNoBackupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedQueueNoBackupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedQueueNoBackupsTest.java
index 67b7f8f..aa075c0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedQueueNoBackupsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedQueueNoBackupsTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.configuration.CollectionConfiguration;
import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.testframework.GridTestUtils;
@@ -72,8 +73,9 @@ public class IgnitePartitionedQueueNoBackupsTest extends GridCachePartitionedQue
for (int i = 0; i < gridCount(); i++) {
IgniteKernal grid = (IgniteKernal)grid(i);
- Iterator<GridCacheMapEntry> entries =
- grid.context().cache().internalCache(cctx.name()).map().entries().iterator();
+ GridCacheAdapter cache = grid.context().cache().internalCache(cctx.name());
+
+ Iterator<GridCacheMapEntry> entries = cache.map().entries(cache.context().cacheId()).iterator();
if (entries.hasNext()) {
if (setNodeId == null)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedSetNoBackupsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedSetNoBackupsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedSetNoBackupsSelfTest.java
index a73aa4a..4daaeca 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedSetNoBackupsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/partitioned/IgnitePartitionedSetNoBackupsSelfTest.java
@@ -22,6 +22,7 @@ import java.util.Set;
import java.util.UUID;
import org.apache.ignite.configuration.CollectionConfiguration;
import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.testframework.GridTestUtils;
@@ -57,8 +58,9 @@ public class IgnitePartitionedSetNoBackupsSelfTest extends GridCachePartitionedS
for (int i = 0; i < gridCount(); i++) {
IgniteKernal grid = (IgniteKernal)grid(i);
- Iterator<GridCacheMapEntry> entries =
- grid.context().cache().internalCache(cctx.name()).map().entries().iterator();
+ GridCacheAdapter cache = grid.context().cache().internalCache(cctx.name());
+
+ Iterator<GridCacheMapEntry> entries = cache.map().entries(cache.context().cacheId()).iterator();
if (entries.hasNext()) {
if (setNodeId == null)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDiscoveryDataConcurrentJoinTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDiscoveryDataConcurrentJoinTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDiscoveryDataConcurrentJoinTest.java
index a80830a..4cf89b2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDiscoveryDataConcurrentJoinTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDiscoveryDataConcurrentJoinTest.java
@@ -57,6 +57,9 @@ public class CacheDiscoveryDataConcurrentJoinTest extends GridCommonAbstractTest
/** */
private ThreadLocal<Integer> staticCaches = new ThreadLocal<>();
+ /** */
+ private boolean withCacheGrp;
+
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(gridName);
@@ -158,11 +161,22 @@ public class CacheDiscoveryDataConcurrentJoinTest extends GridCommonAbstractTest
}
}
+ checkCacheDiscoveryDataConsistent();
+
stopAllGrids();
}
}
/**
+ * @throws Exception If failed.
+ */
+ public void testConcurrentJoinCacheWithGroup() throws Exception {
+ withCacheGrp = true;
+
+ testConcurrentJoin();
+ }
+
+ /**
* @param caches Number of caches.
* @return Cache configurations.
*/
@@ -186,6 +200,9 @@ public class CacheDiscoveryDataConcurrentJoinTest extends GridCommonAbstractTest
ccfg.setAtomicityMode(TRANSACTIONAL);
ccfg.setAffinity(new RendezvousAffinityFunction(false, 16));
+ if (withCacheGrp)
+ ccfg.setGroupName("group1");
+
return ccfg;
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
index bc435e2..20cef30 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
@@ -2008,12 +2008,14 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
* @param cacheName Cache name.
*/
private void blockSupplySend(TestRecordingCommunicationSpi spi, final String cacheName) {
+ final int grpId = groupIdForCache(spi.ignite(), cacheName);
+
spi.blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode node, Message msg) {
if (!msg.getClass().equals(GridDhtPartitionSupplyMessage.class))
return false;
- return ((GridDhtPartitionSupplyMessage)msg).cacheId() == CU.cacheId(cacheName);
+ return ((GridDhtPartitionSupplyMessage)msg).groupId() == grpId;
}
});
}
@@ -2420,7 +2422,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
Collection<ClusterNode> allNodes = ctx.discovery().cacheNodes(topVer0);
- for (DynamicCacheDescriptor cacheDesc : ctx.cache().cacheDescriptors()) {
+ for (DynamicCacheDescriptor cacheDesc : ctx.cache().cacheDescriptors().values()) {
if (assignments.get(cacheDesc.cacheId()) != null)
continue;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGroupsPartitionLossPolicySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGroupsPartitionLossPolicySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGroupsPartitionLossPolicySelfTest.java
new file mode 100644
index 0000000..1862553
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheGroupsPartitionLossPolicySelfTest.java
@@ -0,0 +1,355 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.Collection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import javax.cache.CacheException;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.PartitionLossPolicy;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.CacheRebalancingEvent;
+import org.apache.ignite.events.Event;
+import org.apache.ignite.events.EventType;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.internal.util.typedef.P1;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsPartitionLossPolicySelfTest extends GridCommonAbstractTest {
+ /** */
+ private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+ /** */
+ private boolean client;
+
+ /** */
+ private PartitionLossPolicy partLossPlc;
+
+ /** */
+ private static final String GROUP_NAME = "group";
+
+ /** */
+ private static final String CACHE_1 = "cache1";
+
+ /** */
+ private static final String CACHE_2 = "cache2";
+
+ /** {@inheritDoc} */
+ @SuppressWarnings("unchecked")
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+ ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+ cfg.setClientMode(client);
+
+ CacheConfiguration ccfg1 = new CacheConfiguration(CACHE_1)
+ .setGroupName(GROUP_NAME)
+ .setCacheMode(PARTITIONED)
+ .setBackups(0)
+ .setWriteSynchronizationMode(FULL_SYNC)
+ .setPartitionLossPolicy(partLossPlc)
+ .setAffinity(new RendezvousAffinityFunction(false, 32));
+
+ CacheConfiguration ccfg2 = new CacheConfiguration(ccfg1)
+ .setName(CACHE_2);
+
+ cfg.setCacheConfiguration(ccfg1, ccfg2);
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ stopAllGrids();
+ }
+
+ /**
+ * @throws Exception if failed.
+ */
+ public void testReadOnlySafe() throws Exception {
+ partLossPlc = PartitionLossPolicy.READ_ONLY_SAFE;
+
+ checkLostPartition(false, true);
+ }
+
+ /**
+ * @throws Exception if failed.
+ */
+ public void testReadOnlyAll() throws Exception {
+ partLossPlc = PartitionLossPolicy.READ_ONLY_ALL;
+
+ checkLostPartition(false, false);
+ }
+
+ /**
+ * @throws Exception if failed.
+ */
+ public void testReadWriteSafe() throws Exception {
+ partLossPlc = PartitionLossPolicy.READ_WRITE_SAFE;
+
+ checkLostPartition(true, true);
+ }
+
+ /**
+ * @throws Exception if failed.
+ */
+ public void testReadWriteAll() throws Exception {
+ partLossPlc = PartitionLossPolicy.READ_WRITE_ALL;
+
+ checkLostPartition(true, false);
+ }
+
+ /**
+ * @throws Exception if failed.
+ */
+ public void testIgnore() throws Exception {
+ fail("https://issues.apache.org/jira/browse/IGNITE-5078");
+
+ prepareTopology();
+
+ String cacheName = ThreadLocalRandom.current().nextBoolean() ? CACHE_1 : CACHE_2;
+
+ for (Ignite ig : G.allGrids()) {
+ IgniteCache<Integer, Integer> cache = ig.cache(cacheName);
+
+ Collection<Integer> lost = cache.lostPartitions();
+
+ assertTrue("[grid=" + ig.name() + ", lost=" + lost.toString() + ']', lost.isEmpty());
+
+ int parts = ig.affinity(cacheName).partitions();
+
+ for (int i = 0; i < parts; i++) {
+ cache.get(i);
+
+ cache.put(i, i);
+ }
+ }
+ }
+
+ /**
+ * @param canWrite {@code True} if writes are allowed.
+ * @param safe {@code True} if lost partition should trigger exception.
+ * @throws Exception if failed.
+ */
+ private void checkLostPartition(boolean canWrite, boolean safe) throws Exception {
+ assert partLossPlc != null;
+
+ String cacheName = ThreadLocalRandom.current().nextBoolean() ? CACHE_1 : CACHE_2;
+
+ int part = prepareTopology();
+
+ for (Ignite ig : G.allGrids()) {
+ info("Checking node: " + ig.cluster().localNode().id());
+
+ verifyCacheOps(cacheName, canWrite, safe, part, ig);
+
+ IgniteCache<Integer, Integer> cache = ig.cache(cacheName);
+
+ // Check we can read and write to lost partition in recovery mode.
+ IgniteCache<Integer, Integer> recoverCache = cache.withPartitionRecover();
+
+ for (int lostPart : recoverCache.lostPartitions()) {
+ recoverCache.get(lostPart);
+ recoverCache.put(lostPart, lostPart);
+ }
+
+ // Check that writing in recover mode does not clear partition state.
+ verifyCacheOps(cacheName, canWrite, safe, part, ig);
+ }
+
+ // Check that partition state does not change after we start a new node.
+ IgniteEx grd = startGrid(3);
+
+ info("Newly started node: " + grd.cluster().localNode().id());
+
+ for (Ignite ig : G.allGrids())
+ verifyCacheOps(cacheName, canWrite, safe, part, ig);
+
+ ignite(0).resetLostPartitions(F.asList(CACHE_1, CACHE_2));
+
+ awaitPartitionMapExchange(true, true, null);
+
+ for (Ignite ig : G.allGrids()) {
+ IgniteCache<Integer, Integer> cache = ig.cache(cacheName);
+
+ assertTrue(cache.lostPartitions().isEmpty());
+
+ int parts = ig.affinity(cacheName).partitions();
+
+ for (int i = 0; i < parts; i++) {
+ cache.get(i);
+
+ cache.put(i, i);
+ }
+ }
+ }
+
+ /**
+ *
+ * @param canWrite {@code True} if writes are allowed.
+ * @param safe {@code True} if lost partition should trigger exception.
+ * @param part Lost partition ID.
+ * @param ig Ignite instance.
+ */
+ private void verifyCacheOps(String cacheName, boolean canWrite, boolean safe, int part, Ignite ig) {
+ IgniteCache<Integer, Integer> cache = ig.cache(cacheName);
+
+ Collection<Integer> lost = cache.lostPartitions();
+
+ assertTrue("Failed to find expected lost partition [exp=" + part + ", lost=" + lost + ']',
+ lost.contains(part));
+
+ int parts = ig.affinity(cacheName).partitions();
+
+ // Check read.
+ for (int i = 0; i < parts; i++) {
+ try {
+ Integer actual = cache.get(i);
+
+ if (cache.lostPartitions().contains(i)) {
+ if (safe)
+ fail("Reading from a lost partition should have failed: " + i);
+ // else we could have read anything.
+ }
+ else
+ assertEquals((Integer)i, actual);
+ }
+ catch (CacheException e) {
+ assertTrue("Read exception should only be triggered in safe mode: " + e, safe);
+ assertTrue("Read exception should only be triggered for a lost partition " +
+ "[ex=" + e + ", part=" + i + ']', cache.lostPartitions().contains(i));
+ }
+ }
+
+ // Check write.
+ for (int i = 0; i < parts; i++) {
+ try {
+ cache.put(i, i);
+
+ assertTrue("Write in read-only mode should be forbidden: " + i, canWrite);
+
+ if (cache.lostPartitions().contains(i))
+ assertFalse("Writing to a lost partition should have failed: " + i, safe);
+ }
+ catch (CacheException e) {
+ if (canWrite) {
+ assertTrue("Write exception should only be triggered in safe mode: " + e, safe);
+ assertTrue("Write exception should only be triggered for a lost partition: " + e,
+ cache.lostPartitions().contains(i));
+ }
+ // else expected exception regardless of partition.
+ }
+ }
+ }
+
+ /**
+ * @return Lost partition ID.
+ * @throws Exception If failed.
+ */
+ private int prepareTopology() throws Exception {
+ startGrids(4);
+
+ final String cacheName = ThreadLocalRandom.current().nextBoolean() ? CACHE_1 : CACHE_2;
+
+ Affinity<Object> aff = ignite(0).affinity(cacheName);
+
+ for (int i = 0; i < aff.partitions(); i++) {
+ ignite(0).cache(CACHE_1).put(i, i);
+ ignite(0).cache(CACHE_2).put(i, i);
+ }
+
+ client = true;
+
+ startGrid(4);
+
+ client = false;
+
+ for (int i = 0; i < 5; i++)
+ info(">>> Node [idx=" + i + ", nodeId=" + ignite(i).cluster().localNode().id() + ']');
+
+ awaitPartitionMapExchange();
+
+ ClusterNode killNode = ignite(3).cluster().localNode();
+
+ int part = -1;
+
+ for (int i = 0; i < aff.partitions(); i++) {
+ if (aff.isPrimary(killNode, i)) {
+ part = i;
+
+ break;
+ }
+ }
+
+ if (part == -1)
+ throw new IllegalStateException("No partition on node: " + killNode);
+
+ final CountDownLatch[] partLost = new CountDownLatch[3];
+
+ // Check events.
+ for (int i = 0; i < 3; i++) {
+ final CountDownLatch latch = new CountDownLatch(1);
+ partLost[i] = latch;
+
+ final int part0 = part;
+
+ grid(i).events().localListen(new P1<Event>() {
+ @Override public boolean apply(Event evt) {
+ assert evt.type() == EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST;
+
+ CacheRebalancingEvent cacheEvt = (CacheRebalancingEvent)evt;
+
+ if (cacheEvt.partition() == part0 && F.eq(cacheName, cacheEvt.cacheName())) {
+ latch.countDown();
+
+ // Auto-unsubscribe.
+ return false;
+ }
+
+ return true;
+ }
+ }, EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST);
+ }
+
+ ignite(3).close();
+
+ for (CountDownLatch latch : partLost)
+ assertTrue("Failed to wait for partition LOST event", latch.await(10, TimeUnit.SECONDS));
+
+ return part;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
index 5bbeef9..47fefe5 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCachePartitionLossPolicySelfTest.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.processors.cache.distributed;
import java.util.Collection;
import java.util.Collections;
-import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.cache.CacheException;
@@ -42,7 +41,6 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.apache.ignite.util.TestTcpCommunicationSpi;
import static org.apache.ignite.cache.CacheMode.PARTITIONED;
import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -67,23 +65,8 @@ public class IgniteCachePartitionLossPolicySelfTest extends GridCommonAbstractTe
@Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(gridName);
- TcpDiscoverySpi disco = new TcpDiscoverySpi();
- disco.setIpFinder(ipFinder);
- cfg.setDiscoverySpi(disco);
+ ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
- if (gridName.matches(".*\\d")) {
- String idStr = UUID.randomUUID().toString();
-
- char[] chars = idStr.toCharArray();
-
- chars[chars.length - 3] = '0';
- chars[chars.length - 2] = '0';
- chars[chars.length - 1] = gridName.charAt(gridName.length() - 1);
-
- cfg.setNodeId(UUID.fromString(new String(chars)));
- }
-
- cfg.setCommunicationSpi(new TestTcpCommunicationSpi());
cfg.setClientMode(client);
CacheConfiguration<Integer, Integer> cacheCfg = new CacheConfiguration<>(CACHE_NAME);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheReadFromBackupTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheReadFromBackupTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheReadFromBackupTest.java
index 1433daa..9907937 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheReadFromBackupTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheReadFromBackupTest.java
@@ -41,7 +41,6 @@ import org.apache.ignite.internal.TestRecordingCommunicationSpi;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearSingleGetRequest;
-import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.lang.IgniteBiPredicate;
import org.apache.ignite.plugin.extensions.communication.Message;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
@@ -196,12 +195,14 @@ public class IgniteCacheReadFromBackupTest extends GridCommonAbstractTest {
TestRecordingCommunicationSpi spi =
(TestRecordingCommunicationSpi)ignite.configuration().getCommunicationSpi();
+ final int grpId = groupIdForCache(ignite, ccfg.getName());
+
spi.blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode node, Message msg) {
if (!msg.getClass().equals(GridDhtPartitionSupplyMessage.class))
return false;
- return ((GridDhtPartitionSupplyMessage)msg).cacheId() == CU.cacheId(ccfg.getName());
+ return ((GridDhtPartitionSupplyMessage)msg).groupId() == grpId;
}
});
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..3eafe68
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed.dht;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest
+ extends GridCachePartitionedNearDisabledMultiNodeFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
index 888fae3..749ebe8 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/IgniteCacheAtomicProtocolTest.java
@@ -34,12 +34,11 @@ import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.TestRecordingCommunicationSpi;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.G;
-import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiPredicate;
import org.apache.ignite.lang.IgniteFuture;
@@ -100,11 +99,13 @@ public class IgniteCacheAtomicProtocolTest extends GridCommonAbstractTest {
*
*/
private void blockRebalance() {
+ final int grpId = groupIdForCache(ignite(0), TEST_CACHE);
+
for (Ignite node : G.allGrids()) {
testSpi(node).blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
@Override public boolean apply(ClusterNode node, Message msg) {
return (msg instanceof GridDhtPartitionSupplyMessage)
- && ((GridCacheMessage)msg).cacheId() == CU.cacheId(TEST_CACHE);
+ && ((GridCacheGroupIdMessage)msg).groupId() == grpId;
}
});
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicMultiNodeWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicMultiNodeWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicMultiNodeWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..30337d9
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicMultiNodeWithGroupFullApiSelfTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed.near;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCacheAtomicMultiNodeWithGroupFullApiSelfTest extends GridCacheAtomicMultiNodeFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..f57d81a
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed.near;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest extends
+ GridCacheAtomicNearEnabledMultiNodeFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearReadersSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearReadersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearReadersSelfTest.java
index 40a3af2..cbb2032 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearReadersSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheNearReadersSelfTest.java
@@ -253,11 +253,12 @@ public class GridCacheNearReadersSelfTest extends GridCommonAbstractTest {
awaitPartitionMapExchange();
- GridCacheContext ctx = ((IgniteKernal) g1).internalCache(DEFAULT_CACHE_NAME).context();
+ GridCacheContext ctx = ((IgniteKernal)g1).internalCache(DEFAULT_CACHE_NAME).context();
List<KeyCacheObject> cacheKeys = F.asList(ctx.toCacheKeyObject(1), ctx.toCacheKeyObject(2));
IgniteInternalFuture<Object> f1 = ((IgniteKernal)g1).internalCache(DEFAULT_CACHE_NAME).preloader().request(
+ ctx,
cacheKeys,
new AffinityTopologyVersion(2));
@@ -266,6 +267,7 @@ public class GridCacheNearReadersSelfTest extends GridCommonAbstractTest {
IgniteInternalFuture<Object> f2 = ((IgniteKernal)g2).internalCache(DEFAULT_CACHE_NAME).preloader().request(
+ ((IgniteKernal)g2).internalCache(DEFAULT_CACHE_NAME).context(),
cacheKeys,
new AffinityTopologyVersion(2));
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedMultiNodeWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedMultiNodeWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedMultiNodeWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..542628a
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedMultiNodeWithGroupFullApiSelfTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed.near;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCachePartitionedMultiNodeWithGroupFullApiSelfTest extends GridCachePartitionedMultiNodeFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/replicated/preloader/GridCacheReplicatedPreloadSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/replicated/preloader/GridCacheReplicatedPreloadSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/replicated/preloader/GridCacheReplicatedPreloadSelfTest.java
index 346f908..e90b7e1 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/replicated/preloader/GridCacheReplicatedPreloadSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/replicated/preloader/GridCacheReplicatedPreloadSelfTest.java
@@ -268,7 +268,8 @@ public class GridCacheReplicatedPreloadSelfTest extends GridCommonAbstractTest {
break;
}
- assert evts != null && evts.size() == 2 : "Wrong events received: " + evts;
+ assertNotNull(evts);
+ assertEquals("Wrong events received: " + evts, 2, evts.size());
Iterator<Event> iter = evts.iterator();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheClientNearCacheExpiryTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheClientNearCacheExpiryTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheClientNearCacheExpiryTest.java
index f7164a0..3417ba8 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheClientNearCacheExpiryTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheClientNearCacheExpiryTest.java
@@ -28,8 +28,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.NearCacheConfiguration;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
-import org.apache.ignite.internal.processors.cache.GridCacheConcurrentMap;
-import org.apache.ignite.internal.processors.cache.GridCacheProxyImpl;
+import org.apache.ignite.internal.processors.cache.GridCacheLocalConcurrentMap;
import org.apache.ignite.internal.processors.cache.IgniteCacheAbstractTest;
import org.apache.ignite.internal.processors.cache.IgniteCacheProxy;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -84,6 +83,13 @@ public class IgniteCacheClientNearCacheExpiryTest extends IgniteCacheAbstractTes
public void testExpirationOnClient() throws Exception {
Ignite ignite = grid(NODES - 1);
+ // Check size of near entries via reflection because entries is filtered for size() API call.
+ IgniteEx igniteEx = (IgniteEx)ignite;
+
+ GridCacheAdapter internalCache = igniteEx.context().cache().internalCache(DEFAULT_CACHE_NAME);
+
+ GridCacheLocalConcurrentMap map = GridTestUtils.getFieldValue(internalCache, GridCacheAdapter.class, "map");
+
assertTrue(ignite.configuration().isClientMode());
IgniteCache<Object, Object> cache = ignite.cache(DEFAULT_CACHE_NAME);
@@ -103,17 +109,11 @@ public class IgniteCacheClientNearCacheExpiryTest extends IgniteCacheAbstractTes
assertEquals(i, cacheWithExpiry.localPeek(i));
}
+ assertEquals(KEYS_COUNT * 2, map.publicSize(internalCache.context().cacheId()));
U.sleep(1000);
- // Check size of near entries via reflection because entries is filtered for size() API call.
- IgniteEx igniteEx = (IgniteEx)ignite;
- GridCacheConcurrentMap map = GridTestUtils.getFieldValue(
- ((GridCacheProxyImpl)igniteEx.cachex(DEFAULT_CACHE_NAME)).delegate(),
- GridCacheAdapter.class,
- "map");
-
- assertEquals(KEYS_COUNT, map.publicSize());
+ assertEquals(KEYS_COUNT, map.publicSize(internalCache.context().cacheId()));
assertEquals(KEYS_COUNT, cache.size());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTtlCleanupSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTtlCleanupSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTtlCleanupSelfTest.java
index 9d21823..227fe1f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTtlCleanupSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/expiry/IgniteCacheTtlCleanupSelfTest.java
@@ -82,6 +82,6 @@ public class IgniteCacheTtlCleanupSelfTest extends GridCacheAbstractSelfTest {
CacheObjectContext cacheObjCtx = cacheAdapter.context().cacheObjectContext();
for (int i = 0; i < 100; i++)
- assertNull(cacheAdapter.map().getEntry(cacheObjects.toCacheKeyObject(cacheObjCtx, null, i, true)));
+ assertNull(cacheAdapter.map().getEntry(cacheAdapter.context(), cacheObjects.toCacheKeyObject(cacheObjCtx, null, i, true)));
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheJdbcBlobStoreNodeRestartTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheJdbcBlobStoreNodeRestartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheJdbcBlobStoreNodeRestartTest.java
index 1c29098..83ddf67 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheJdbcBlobStoreNodeRestartTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/integration/IgniteCacheJdbcBlobStoreNodeRestartTest.java
@@ -23,6 +23,9 @@ import org.apache.ignite.cache.store.CacheStore;
import org.apache.ignite.cache.store.jdbc.CacheJdbcBlobStore;
import org.apache.ignite.configuration.NearCacheConfiguration;
+/**
+ *
+ */
public class IgniteCacheJdbcBlobStoreNodeRestartTest extends IgniteCacheStoreNodeRestartAbstractTest {
/** {@inheritDoc} */
@Override protected CacheStore getStore() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalAtomicWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalAtomicWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalAtomicWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..4597a75
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalAtomicWithGroupFullApiSelfTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.local;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCacheLocalAtomicWithGroupFullApiSelfTest extends GridCacheLocalAtomicFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalFullApiSelfTest.java
index 0c7a217..8cb9369 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalFullApiSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalFullApiSelfTest.java
@@ -22,7 +22,6 @@ import java.util.Map;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.CacheMode;
import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.processors.cache.GridCacheAbstractFullApiSelfTest;
import org.apache.ignite.internal.util.typedef.F;
[12/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
index bb31645..a251047 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
@@ -110,16 +110,11 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
/** Number of retries using to send messages. */
private int retryCnt;
- /** Indexed class handlers. */
- private volatile Map<Integer, IgniteBiInClosure[]> idxClsHandlers = new HashMap<>();
+ /** */
+ private final MessageHandlers cacheHandlers = new MessageHandlers();
- /** Handler registry. */
- private ConcurrentMap<ListenerKey, IgniteBiInClosure<UUID, GridCacheMessage>>
- clsHandlers = new ConcurrentHashMap8<>();
-
- /** Ordered handler registry. */
- private ConcurrentMap<Object, IgniteBiInClosure<UUID, ? extends GridCacheMessage>> orderedHandlers =
- new ConcurrentHashMap8<>();
+ /** */
+ private final MessageHandlers grpHandlers = new MessageHandlers();
/** Stopping flag. */
private boolean stopping;
@@ -144,17 +139,19 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
if (cacheMsg.partitionExchangeMessage()) {
if (cacheMsg instanceof GridDhtAffinityAssignmentRequest) {
+ GridDhtAffinityAssignmentRequest msg0 = (GridDhtAffinityAssignmentRequest)cacheMsg;
+
assert cacheMsg.topologyVersion() != null : cacheMsg;
AffinityTopologyVersion startTopVer = new AffinityTopologyVersion(cctx.localNode().order());
- DynamicCacheDescriptor cacheDesc = cctx.cache().cacheDescriptor(cacheMsg.cacheId());
+ CacheGroupDescriptor desc = cctx.cache().cacheGroupDescriptors().get(msg0.groupId());
- if (cacheDesc != null) {
- if (cacheDesc.startTopologyVersion() != null)
- startTopVer = cacheDesc.startTopologyVersion();
- else if (cacheDesc.receivedFromStartVersion() != null)
- startTopVer = cacheDesc.receivedFromStartVersion();
+ if (desc != null) {
+ if (desc.startTopologyVersion() != null)
+ startTopVer = desc.startTopologyVersion();
+ else if (desc.receivedFromStartVersion() != null)
+ startTopVer = desc.receivedFromStartVersion();
}
// Need to wait for exchange to avoid race between cache start and affinity request.
@@ -165,7 +162,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
log.debug("Wait for exchange before processing message [msg=" + msg +
", node=" + nodeId +
", waitVer=" + startTopVer +
- ", cacheDesc=" + cacheDesc + ']');
+ ", cacheDesc=" + descriptorForMessage(cacheMsg) + ']');
}
fut.listen(new CI1<IgniteInternalFuture<?>>() {
@@ -260,21 +257,31 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
*/
@SuppressWarnings("unchecked")
private void handleMessage(UUID nodeId, GridCacheMessage cacheMsg) {
+ handleMessage(nodeId, cacheMsg, cacheMsg.cacheGroupMessage() ? grpHandlers : cacheHandlers);
+ }
+
+ /**
+ * @param nodeId Sender node ID.
+ * @param cacheMsg Message.
+ * @param msgHandlers Message handlers.
+ */
+ @SuppressWarnings("unchecked")
+ private void handleMessage(UUID nodeId, GridCacheMessage cacheMsg, MessageHandlers msgHandlers) {
int msgIdx = cacheMsg.lookupIndex();
IgniteBiInClosure<UUID, GridCacheMessage> c = null;
if (msgIdx >= 0) {
- Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = idxClsHandlers;
+ Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = msgHandlers.idxClsHandlers;
- IgniteBiInClosure[] cacheClsHandlers = idxClsHandlers0.get(cacheMsg.cacheId());
+ IgniteBiInClosure[] cacheClsHandlers = idxClsHandlers0.get(cacheMsg.handlerId());
if (cacheClsHandlers != null)
c = cacheClsHandlers[msgIdx];
}
if (c == null)
- c = clsHandlers.get(new ListenerKey(cacheMsg.cacheId(), cacheMsg.getClass()));
+ c = msgHandlers.clsHandlers.get(new ListenerKey(cacheMsg.handlerId(), cacheMsg.getClass()));
if (c == null) {
IgniteLogger log = cacheMsg.messageLogger(cctx);
@@ -285,12 +292,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
msg0.append(", locTopVer=").append(cctx.exchange().readyAffinityVersion()).
append(", msgTopVer=").append(cacheMsg.topologyVersion()).
- append(", cacheDesc=").append(cctx.cache().cacheDescriptor(cacheMsg.cacheId())).
+ append(", desc=").append(descriptorForMessage(cacheMsg)).
append(']');
msg0.append(U.nl()).append("Registered listeners:");
- Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = idxClsHandlers;
+ Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = msgHandlers.idxClsHandlers;
for (Map.Entry<Integer, IgniteBiInClosure[]> e : idxClsHandlers0.entrySet())
msg0.append(U.nl()).append(e.getKey()).append("=").append(Arrays.toString(e.getValue()));
@@ -323,7 +330,10 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
@Override protected void onKernalStop0(boolean cancel) {
cctx.gridIO().removeMessageListener(TOPIC_CACHE);
- for (Object ordTopic : orderedHandlers.keySet())
+ for (Object ordTopic : cacheHandlers.orderedHandlers.keySet())
+ cctx.gridIO().removeMessageListener(ordTopic);
+
+ for (Object ordTopic : grpHandlers.orderedHandlers.keySet())
cctx.gridIO().removeMessageListener(ordTopic);
boolean interrupted = false;
@@ -520,14 +530,17 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
*/
private void processFailedMessage(UUID nodeId, GridCacheMessage msg, IgniteBiInClosure<UUID, GridCacheMessage> c)
throws IgniteCheckedException {
- GridCacheContext ctx = cctx.cacheContext(msg.cacheId());
+ assert msg != null;
+
+ GridCacheContext ctx = msg instanceof GridCacheIdMessage ?
+ cctx.cacheContext(((GridCacheIdMessage)msg).cacheId()) : null;
switch (msg.directType()) {
case 30: {
GridDhtLockRequest req = (GridDhtLockRequest)msg;
GridDhtLockResponse res = new GridDhtLockResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.version(),
req.futureId(),
req.miniId(),
@@ -560,17 +573,17 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridDhtAtomicUpdateRequest req = (GridDhtAtomicUpdateRequest)msg;
GridDhtAtomicUpdateResponse res = new GridDhtAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.partition(),
req.futureId(),
- ctx.deploymentEnabled());
+ false);
res.onError(req.classError());
sendResponseOnFailedMessage(nodeId, res, cctx, ctx.ioPolicy());
if (req.nearNodeId() != null) {
- GridDhtAtomicNearResponse nearRes = new GridDhtAtomicNearResponse(ctx.cacheId(),
+ GridDhtAtomicNearResponse nearRes = new GridDhtAtomicNearResponse(req.cacheId(),
req.partition(),
req.nearFutureId(),
nodeId,
@@ -588,12 +601,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearAtomicFullUpdateRequest req = (GridNearAtomicFullUpdateRequest)msg;
GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
nodeId,
req.futureId(),
req.partition(),
false,
- ctx.deploymentEnabled());
+ false);
res.error(req.classError());
@@ -606,10 +619,10 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridDhtForceKeysRequest req = (GridDhtForceKeysRequest)msg;
GridDhtForceKeysResponse res = new GridDhtForceKeysResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.futureId(),
req.miniId(),
- ctx.deploymentEnabled()
+ false
);
res.error(req.classError());
@@ -629,7 +642,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearGetRequest req = (GridNearGetRequest)msg;
GridNearGetResponse res = new GridNearGetResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.futureId(),
req.miniId(),
req.version(),
@@ -645,7 +658,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
case 50: {
GridNearGetResponse res = (GridNearGetResponse)msg;
- CacheGetFuture fut = (CacheGetFuture)ctx.mvcc().future(res.futureId());
+ CacheGetFuture fut = (CacheGetFuture)cctx.mvcc().future(res.futureId());
if (fut == null) {
if (log.isDebugEnabled())
@@ -665,7 +678,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearLockRequest req = (GridNearLockRequest)msg;
GridNearLockResponse res = new GridNearLockResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.version(),
req.futureId(),
req.miniId(),
@@ -673,7 +686,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
0,
req.classError(),
null,
- ctx.deploymentEnabled());
+ false);
sendResponseOnFailedMessage(nodeId, res, cctx, ctx.ioPolicy());
}
@@ -712,7 +725,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
cctx.deploymentEnabled());
cctx.io().sendOrderedMessage(
- ctx.node(nodeId),
+ cctx.node(nodeId),
TOPIC_CACHE.topic(QUERY_TOPIC_PREFIX, nodeId, req.id()),
res,
ctx.ioPolicy(),
@@ -731,7 +744,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearSingleGetRequest req = (GridNearSingleGetRequest)msg;
GridNearSingleGetResponse res = new GridNearSingleGetResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.futureId(),
req.topologyVersion(),
null,
@@ -748,7 +761,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
case 117: {
GridNearSingleGetResponse res = (GridNearSingleGetResponse)msg;
- GridPartitionedSingleGetFuture fut = (GridPartitionedSingleGetFuture)ctx.mvcc()
+ GridPartitionedSingleGetFuture fut = (GridPartitionedSingleGetFuture)cctx.mvcc()
.future(new IgniteUuid(IgniteUuid.VM_ID, res.futureId()));
if (fut == null) {
@@ -769,12 +782,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearAtomicSingleUpdateRequest req = (GridNearAtomicSingleUpdateRequest)msg;
GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
nodeId,
req.futureId(),
req.partition(),
false,
- ctx.deploymentEnabled());
+ false);
res.error(req.classError());
@@ -787,12 +800,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearAtomicSingleUpdateInvokeRequest req = (GridNearAtomicSingleUpdateInvokeRequest)msg;
GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
nodeId,
req.futureId(),
req.partition(),
false,
- ctx.deploymentEnabled());
+ false);
res.error(req.classError());
@@ -805,12 +818,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridNearAtomicSingleUpdateFilterRequest req = (GridNearAtomicSingleUpdateFilterRequest)msg;
GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
nodeId,
req.futureId(),
req.partition(),
false,
- ctx.deploymentEnabled());
+ false);
res.error(req.classError());
@@ -823,17 +836,17 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
GridDhtAtomicSingleUpdateRequest req = (GridDhtAtomicSingleUpdateRequest)msg;
GridDhtAtomicUpdateResponse res = new GridDhtAtomicUpdateResponse(
- ctx.cacheId(),
+ req.cacheId(),
req.partition(),
req.futureId(),
- ctx.deploymentEnabled());
+ false);
res.onError(req.classError());
sendResponseOnFailedMessage(nodeId, res, cctx, ctx.ioPolicy());
if (req.nearNodeId() != null) {
- GridDhtAtomicNearResponse nearRes = new GridDhtAtomicNearResponse(ctx.cacheId(),
+ GridDhtAtomicNearResponse nearRes = new GridDhtAtomicNearResponse(req.cacheId(),
req.partition(),
req.nearFutureId(),
nodeId,
@@ -887,8 +900,8 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
if (txState != null)
txState.unwindEvicts(cctx);
}
- else {
- GridCacheContext ctx = cctx.cacheContext(msg.cacheId());
+ else if (msg instanceof GridCacheIdMessage) {
+ GridCacheContext ctx = cctx.cacheContext(((GridCacheIdMessage)msg).cacheId());
if (ctx != null)
CU.unwindEvicts(ctx);
@@ -1180,79 +1193,125 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
}
/**
- * Adds message handler.
- *
- * @param cacheId Cache ID.
+ * @param hndId Message handler ID.
* @param type Type of message.
* @param c Handler.
*/
- @SuppressWarnings({"unchecked"})
- public void addHandler(
- int cacheId,
+ public void addCacheHandler(
+ int hndId,
Class<? extends GridCacheMessage> type,
IgniteBiInClosure<UUID, ? extends GridCacheMessage> c) {
+ assert !type.isAssignableFrom(GridCacheGroupIdMessage.class) : type;
+
+ addHandler(hndId, type, c, cacheHandlers);
+ }
+
+ /**
+ * @param hndId Message handler ID.
+ * @param type Type of message.
+ * @param c Handler.
+ */
+ public void addCacheGroupHandler(
+ int hndId,
+ Class<? extends GridCacheGroupIdMessage> type,
+ IgniteBiInClosure<UUID, ? extends GridCacheMessage> c) {
+ assert !type.isAssignableFrom(GridCacheIdMessage.class) : type;
+
+ addHandler(hndId, type, c, grpHandlers);
+ }
+
+ /**
+ * @param hndId Message handler ID.
+ * @param type Type of message.
+ * @param c Handler.
+ * @param msgHandlers Message handlers.
+ */
+ @SuppressWarnings({"unchecked"})
+ private void addHandler(
+ int hndId,
+ Class<? extends GridCacheMessage> type,
+ IgniteBiInClosure<UUID, ? extends GridCacheMessage> c,
+ MessageHandlers msgHandlers) {
int msgIdx = messageIndex(type);
if (msgIdx != -1) {
- Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = idxClsHandlers;
+ Map<Integer, IgniteBiInClosure[]> idxClsHandlers0 = msgHandlers.idxClsHandlers;
- IgniteBiInClosure[] cacheClsHandlers = idxClsHandlers0.get(cacheId);
+ IgniteBiInClosure[] cacheClsHandlers = idxClsHandlers0.get(hndId);
if (cacheClsHandlers == null) {
cacheClsHandlers = new IgniteBiInClosure[GridCacheMessage.MAX_CACHE_MSG_LOOKUP_INDEX];
- idxClsHandlers0.put(cacheId, cacheClsHandlers);
+ idxClsHandlers0.put(hndId, cacheClsHandlers);
}
if (cacheClsHandlers[msgIdx] != null)
- throw new IgniteException("Duplicate cache message ID found [cacheId=" + cacheId +
+ throw new IgniteException("Duplicate cache message ID found [hndId=" + hndId +
", type=" + type + ']');
cacheClsHandlers[msgIdx] = c;
- idxClsHandlers = idxClsHandlers0;
+ msgHandlers.idxClsHandlers = idxClsHandlers0;
return;
}
else {
- ListenerKey key = new ListenerKey(cacheId, type);
+ ListenerKey key = new ListenerKey(hndId, type);
- if (clsHandlers.putIfAbsent(key,
+ if (msgHandlers.clsHandlers.putIfAbsent(key,
(IgniteBiInClosure<UUID, GridCacheMessage>)c) != null)
- assert false : "Handler for class already registered [cacheId=" + cacheId + ", cls=" + type +
- ", old=" + clsHandlers.get(key) + ", new=" + c + ']';
+ assert false : "Handler for class already registered [hndId=" + hndId + ", cls=" + type +
+ ", old=" + msgHandlers.clsHandlers.get(key) + ", new=" + c + ']';
}
IgniteLogger log0 = log;
if (log0 != null && log0.isTraceEnabled())
log0.trace(
- "Registered cache communication handler [cacheId=" + cacheId + ", type=" + type +
+ "Registered cache communication handler [hndId=" + hndId + ", type=" + type +
", msgIdx=" + msgIdx + ", handler=" + c + ']');
}
/**
* @param cacheId Cache ID to remove handlers for.
*/
- public void removeHandlers(int cacheId) {
- assert cacheId != 0;
+ void removeCacheHandlers(int cacheId) {
+ removeHandlers(cacheHandlers, cacheId);
+ }
+
+ /**
+ * @param grpId Cache group ID to remove handlers for.
+ */
+ void removeCacheGroupHandlers(int grpId) {
+ removeHandlers(grpHandlers, grpId);
+ }
+
+ /**
+ * @param msgHandlers Handlers.
+ * @param hndId ID to remove handlers for.
+ */
+ private void removeHandlers(MessageHandlers msgHandlers, int hndId) {
+ assert hndId != 0;
- idxClsHandlers.remove(cacheId);
+ msgHandlers.idxClsHandlers.remove(hndId);
- for (Iterator<ListenerKey> iter = clsHandlers.keySet().iterator(); iter.hasNext(); ) {
+ for (Iterator<ListenerKey> iter = msgHandlers.clsHandlers.keySet().iterator(); iter.hasNext(); ) {
ListenerKey key = iter.next();
- if (key.cacheId == cacheId)
+ if (key.hndId == hndId)
iter.remove();
}
}
/**
- * @param cacheId Cache ID to remove handlers for.
+ * @param cacheGrp {@code True} if cache group handler, {@code false} if cache handler.
+ * @param hndId Handler ID.
* @param type Message type.
*/
- public void removeHandler(int cacheId, Class<? extends GridCacheMessage> type) {
- clsHandlers.remove(new ListenerKey(cacheId, type));
+ public void removeHandler(boolean cacheGrp, int hndId, Class<? extends GridCacheMessage> type) {
+ MessageHandlers msgHandlers = cacheGrp ? grpHandlers : cacheHandlers;
+
+ msgHandlers.clsHandlers.remove(new ListenerKey(hndId, type));
}
/**
@@ -1274,16 +1333,35 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
}
/**
+ * @param topic Topic.
+ * @param c Handler.
+ */
+ public void addOrderedCacheHandler(Object topic, IgniteBiInClosure<UUID, ? extends GridCacheIdMessage> c) {
+ addOrderedHandler(false, topic, c);
+ }
+
+ /**
+ * @param topic Topic.
+ * @param c Handler.
+ */
+ public void addOrderedCacheGroupHandler(Object topic, IgniteBiInClosure<UUID, ? extends GridCacheGroupIdMessage> c) {
+ addOrderedHandler(true, topic, c);
+ }
+
+ /**
* Adds ordered message handler.
*
+ * @param cacheGrp {@code True} if cache group message, {@code false} if cache message.
* @param topic Topic.
* @param c Handler.
*/
@SuppressWarnings({"unchecked"})
- public void addOrderedHandler(Object topic, IgniteBiInClosure<UUID, ? extends GridCacheMessage> c) {
+ private void addOrderedHandler(boolean cacheGrp, Object topic, IgniteBiInClosure<UUID, ? extends GridCacheMessage> c) {
+ MessageHandlers msgHandlers = cacheGrp ? grpHandlers : cacheHandlers;
+
IgniteLogger log0 = log;
- if (orderedHandlers.putIfAbsent(topic, c) == null) {
+ if (msgHandlers.orderedHandlers.putIfAbsent(topic, c) == null) {
cctx.gridIO().addMessageListener(topic, new OrderedMessageListener(
(IgniteBiInClosure<UUID, GridCacheMessage>)c));
@@ -1298,10 +1376,13 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
/**
* Removed ordered message handler.
*
+ * @param cacheGrp {@code True} if cache group message, {@code false} if cache message.
* @param topic Topic.
*/
- public void removeOrderedHandler(Object topic) {
- if (orderedHandlers.remove(topic) != null) {
+ public void removeOrderedHandler(boolean cacheGrp, Object topic) {
+ MessageHandlers msgHandlers = cacheGrp ? grpHandlers : cacheHandlers;
+
+ if (msgHandlers.orderedHandlers.remove(topic) != null) {
cctx.gridIO().removeMessageListener(topic);
if (log != null && log.isDebugEnabled())
@@ -1352,12 +1433,43 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
}
}
+ /**
+ * @param msg Message.
+ * @return Cache or group descriptor.
+ */
+ private Object descriptorForMessage(GridCacheMessage msg) {
+ if (msg instanceof GridCacheIdMessage)
+ return cctx.cache().cacheDescriptor(((GridCacheIdMessage)msg).cacheId());
+ else if (msg instanceof GridCacheGroupIdMessage)
+ return cctx.cache().cacheGroupDescriptors().get(((GridCacheGroupIdMessage)msg).groupId());
+
+ return null;
+ }
+
/** {@inheritDoc} */
@Override public void printMemoryStats() {
X.println(">>> ");
X.println(">>> Cache IO manager memory stats [igniteInstanceName=" + cctx.igniteInstanceName() + ']');
- X.println(">>> clsHandlersSize: " + clsHandlers.size());
- X.println(">>> orderedHandlersSize: " + orderedHandlers.size());
+ X.println(">>> cacheClsHandlersSize: " + cacheHandlers.clsHandlers.size());
+ X.println(">>> cacheOrderedHandlersSize: " + cacheHandlers.orderedHandlers.size());
+ X.println(">>> cacheGrpClsHandlersSize: " + grpHandlers.clsHandlers.size());
+ X.println(">>> cacheGrpOrderedHandlersSize: " + grpHandlers.orderedHandlers.size());
+ }
+
+ /**
+ *
+ */
+ static class MessageHandlers {
+ /** Indexed class handlers. */
+ volatile Map<Integer, IgniteBiInClosure[]> idxClsHandlers = new HashMap<>();
+
+ /** Handler registry. */
+ ConcurrentMap<ListenerKey, IgniteBiInClosure<UUID, GridCacheMessage>>
+ clsHandlers = new ConcurrentHashMap8<>();
+
+ /** Ordered handler registry. */
+ ConcurrentMap<Object, IgniteBiInClosure<UUID, ? extends GridCacheMessage>> orderedHandlers =
+ new ConcurrentHashMap8<>();
}
/**
@@ -1391,17 +1503,17 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
*/
private static class ListenerKey {
/** Cache ID. */
- private int cacheId;
+ private int hndId;
/** Message class. */
private Class<? extends GridCacheMessage> msgCls;
/**
- * @param cacheId Cache ID.
+ * @param hndId Handler ID.
* @param msgCls Message class.
*/
- private ListenerKey(int cacheId, Class<? extends GridCacheMessage> msgCls) {
- this.cacheId = cacheId;
+ private ListenerKey(int hndId, Class<? extends GridCacheMessage> msgCls) {
+ this.hndId = hndId;
this.msgCls = msgCls;
}
@@ -1415,12 +1527,12 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
ListenerKey that = (ListenerKey)o;
- return cacheId == that.cacheId && msgCls.equals(that.msgCls);
+ return hndId == that.hndId && msgCls.equals(that.msgCls);
}
/** {@inheritDoc} */
@Override public int hashCode() {
- int res = cacheId;
+ int res = hndId;
res = 31 * res + msgCls.hashCode();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheLocalConcurrentMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheLocalConcurrentMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheLocalConcurrentMap.java
index db99272..63cfe1f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheLocalConcurrentMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheLocalConcurrentMap.java
@@ -18,37 +18,65 @@
package org.apache.ignite.internal.processors.cache;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.jetbrains.annotations.Nullable;
+import org.jsr166.ConcurrentHashMap8;
/**
* GridCacheConcurrentMap implementation for local and near caches.
*/
public class GridCacheLocalConcurrentMap extends GridCacheConcurrentMapImpl {
/** */
- private final AtomicInteger pubSize = new AtomicInteger();
+ private final int cacheId;
- public GridCacheLocalConcurrentMap(GridCacheContext ctx,
- GridCacheMapEntryFactory factory, int initialCapacity) {
- super(ctx, factory, initialCapacity);
+ /** */
+ private final CacheMapHolder entryMap;
+
+ /**
+ * @param cctx Cache context.
+ * @param factory Entry factory.
+ * @param initCap Initial capacity.
+ */
+ public GridCacheLocalConcurrentMap(GridCacheContext cctx, GridCacheMapEntryFactory factory, int initCap) {
+ super(factory);
+
+ this.cacheId = cctx.cacheId();
+ this.entryMap = new CacheMapHolder(cctx,
+ new ConcurrentHashMap8<KeyCacheObject, GridCacheMapEntry>(initCap, 0.75f, Runtime.getRuntime().availableProcessors() * 2));
}
- public GridCacheLocalConcurrentMap(GridCacheContext ctx,
- GridCacheMapEntryFactory factory, int initialCapacity, float loadFactor, int concurrencyLevel) {
- super(ctx, factory, initialCapacity, loadFactor, concurrencyLevel);
+ /** {@inheritDoc} */
+ @Override public int internalSize() {
+ return entryMap.map.size();
}
/** {@inheritDoc} */
- @Override public int publicSize() {
- return pubSize.get();
+ @Nullable @Override protected CacheMapHolder entriesMap(GridCacheContext cctx) {
+ return entryMap;
}
/** {@inheritDoc} */
- @Override public void incrementPublicSize(GridCacheEntryEx e) {
- pubSize.incrementAndGet();
+ @Nullable @Override protected CacheMapHolder entriesMapIfExists(Integer cacheId) {
+ return entryMap;
}
/** {@inheritDoc} */
- @Override public void decrementPublicSize(GridCacheEntryEx e) {
- pubSize.decrementAndGet();
+ @Override public int publicSize(int cacheId) {
+ assert this.cacheId == cacheId;
+
+ return entryMap.size.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void incrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
+ assert cacheId == e.context().cacheId();
+
+ entryMap.size.incrementAndGet();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void decrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
+ assert cacheId == e.context().cacheId();
+
+ entryMap.size.decrementAndGet();
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index 7c7fc99..01677a8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -981,7 +981,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
if (cctx.deferredDelete() && deletedUnlocked() && !isInternal() && !detached())
deletedUnlocked(false);
- updateCntr0 = nextPartCounter(topVer);
+ updateCntr0 = nextPartitionCounter(topVer, tx == null || tx.local(), updateCntr);
if (updateCntr != null && updateCntr != 0)
updateCntr0 = updateCntr;
@@ -1160,7 +1160,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
}
}
- updateCntr0 = nextPartCounter(topVer);
+ updateCntr0 = nextPartitionCounter(topVer, tx == null || tx.local(), updateCntr);
if (updateCntr != null && updateCntr != 0)
updateCntr0 = updateCntr;
@@ -1562,7 +1562,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
updateMetrics(op, metrics);
if (lsnrCol != null) {
- long updateCntr = nextPartCounter(AffinityTopologyVersion.NONE);
+ long updateCntr = nextPartitionCounter(AffinityTopologyVersion.NONE, true, null);
cctx.continuousQueries().onEntryUpdated(
lsnrCol,
@@ -1651,6 +1651,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
(op == GridCacheOperation.TRANSFORM || cctx.loadPreviousValue()));
c = new AtomicCacheUpdateClosure(this,
+ topVer,
newVer,
op,
writeObj,
@@ -1677,7 +1678,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
c.call(dataRow);
}
else
- cctx.offheap().invoke(key, localPartition(), c);
+ cctx.offheap().invoke(cctx, key, localPartition(), c);
GridCacheUpdateAtomicResult updateRes = c.updateRes;
@@ -1722,7 +1723,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
else
evtVal = (CacheObject)writeObj;
- long updateCntr0 = nextPartCounter();
+ long updateCntr0 = nextPartitionCounter(topVer, primary, updateCntr);
if (updateCntr != null)
updateCntr0 = updateCntr;
@@ -2612,7 +2613,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
long updateCntr = 0;
if (!preload)
- updateCntr = nextPartCounter(topVer);
+ updateCntr = nextPartitionCounter(topVer, true, null);
if (walEnabled) {
cctx.shared().wal().log(new DataRecord(new DataEntry(
@@ -2668,33 +2669,15 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
}
/**
+ * @param topVer Topology version for current operation.
+ * @param primary Primary node update flag.
+ * @param primaryCntr Counter assigned on primary node.
* @return Update counter.
*/
- protected long nextPartCounter() {
+ protected long nextPartitionCounter(AffinityTopologyVersion topVer, boolean primary, @Nullable Long primaryCntr) {
return 0;
}
- /**
- * @param topVer Topology version.
- * @return Update counter.
- */
- private long nextPartCounter(AffinityTopologyVersion topVer) {
- long updateCntr;
-
- if (!cctx.isLocal() && !isNear()) {
- GridDhtLocalPartition locPart = cctx.topology().localPartition(partition(), topVer, false);
-
- if (locPart == null)
- return 0;
-
- updateCntr = locPart.nextUpdateCounter();
- }
- else
- updateCntr = 0;
-
- return updateCntr;
- }
-
/** {@inheritDoc} */
@Override public synchronized GridCacheVersionedEntryEx versionedEntry(final boolean keepBinary)
throws IgniteCheckedException, GridCacheEntryRemovedException {
@@ -3218,14 +3201,14 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
* @param oldRow Old row if available.
* @throws IgniteCheckedException If update failed.
*/
- protected void storeValue(@Nullable CacheObject val,
+ protected void storeValue(CacheObject val,
long expireTime,
GridCacheVersion ver,
@Nullable CacheDataRow oldRow) throws IgniteCheckedException {
assert Thread.holdsLock(this);
assert val != null : "null values in update for key: " + key;
- cctx.offheap().invoke(key, localPartition(), new UpdateClosure(this, val, ver, expireTime));
+ cctx.offheap().invoke(cctx, key, localPartition(), new UpdateClosure(this, val, ver, expireTime));
}
/**
@@ -3267,7 +3250,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
protected void removeValue() throws IgniteCheckedException {
assert Thread.holdsLock(this);
- cctx.offheap().remove(key, partition(), localPartition());
+ cctx.offheap().remove(cctx, key, partition(), localPartition());
}
/** {@inheritDoc} */
@@ -3597,7 +3580,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
GridDhtLocalPartition locPart = localPartition();
if (locPart != null)
- locPart.incrementPublicSize(this);
+ locPart.incrementPublicSize(null, this);
else
cctx.incrementPublicSize(this);
}
@@ -3609,7 +3592,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
GridDhtLocalPartition locPart = localPartition();
if (locPart != null)
- locPart.decrementPublicSize(this);
+ locPart.decrementPublicSize(null, this);
else
cctx.decrementPublicSize(this);
}
@@ -3921,7 +3904,9 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
if (oldRow != null)
oldRow.key(entry.key);
- newRow = entry.cctx.offheap().dataStore(entry.localPartition()).createRow(entry.key,
+ newRow = entry.cctx.offheap().dataStore(entry.localPartition()).createRow(
+ entry.cctx,
+ entry.key,
val,
ver,
expireTime,
@@ -3955,6 +3940,9 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
private final GridCacheMapEntry entry;
/** */
+ private final AffinityTopologyVersion topVer;
+
+ /** */
private GridCacheVersion newVer;
/** */
@@ -4017,7 +4005,9 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
/** */
private CacheDataRow oldRow;
- AtomicCacheUpdateClosure(GridCacheMapEntry entry,
+ AtomicCacheUpdateClosure(
+ GridCacheMapEntry entry,
+ AffinityTopologyVersion topVer,
GridCacheVersion newVer,
GridCacheOperation op,
Object writeObj,
@@ -4038,6 +4028,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
assert op == UPDATE || op == DELETE || op == TRANSFORM : op;
this.entry = entry;
+ this.topVer = topVer;
this.newVer = newVer;
this.op = op;
this.writeObj = writeObj;
@@ -4273,7 +4264,9 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
}
if (needUpdate) {
- newRow = entry.localPartition().dataStore().createRow(entry.key,
+ newRow = entry.localPartition().dataStore().createRow(
+ entry.cctx,
+ entry.key,
storeLoadedVal,
newVer,
entry.expireTimeExtras(),
@@ -4404,7 +4397,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
", locNodeId=" + cctx.localNodeId() + ']';
}
- long updateCntr0 = entry.nextPartCounter();
+ long updateCntr0 = entry.nextPartitionCounter(topVer, primary, updateCntr);
if (updateCntr != null)
updateCntr0 = updateCntr;
@@ -4412,7 +4405,9 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
entry.logUpdate(op, updated, newVer, newExpireTime, updateCntr0);
if (!entry.isNear()) {
- newRow = entry.localPartition().dataStore().createRow(entry.key,
+ newRow = entry.localPartition().dataStore().createRow(
+ entry.cctx,
+ entry.key,
updated,
newVer,
newExpireTime,
@@ -4486,7 +4481,7 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
// Must persist inside synchronization in non-tx mode.
cctx.store().remove(null, entry.key);
- long updateCntr0 = entry.nextPartCounter();
+ long updateCntr0 = entry.nextPartitionCounter(topVer, primary, updateCntr);
if (updateCntr != null)
updateCntr0 = updateCntr;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
index 4de465c..11916e9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
@@ -84,9 +84,15 @@ public abstract class GridCacheMessage implements Message {
@GridDirectTransient
private boolean skipPrepare;
- /** Cache ID. */
- @GridToStringInclude
- protected int cacheId;
+ /**
+ * @return ID to distinguish message handlers for the same messages but for different caches/cache groups.
+ */
+ public abstract int handlerId();
+
+ /**
+ * @return {@code True} if cache group message.
+ */
+ public abstract boolean cacheGroupMessage();
/**
* @return Error, if any.
@@ -170,20 +176,6 @@ public abstract class GridCacheMessage implements Message {
}
/**
- * @return Cache ID.
- */
- public int cacheId() {
- return cacheId;
- }
-
- /**
- * @param cacheId Cache ID.
- */
- public void cacheId(int cacheId) {
- this.cacheId = cacheId;
- }
-
- /**
* Gets topology version or -1 in case of topology version is not required for this message.
*
* @return Topology version.
@@ -205,6 +197,15 @@ public abstract class GridCacheMessage implements Message {
* @throws IgniteCheckedException If failed.
*/
protected final void prepareObject(@Nullable Object o, GridCacheContext ctx) throws IgniteCheckedException {
+ prepareObject(o, ctx.shared());
+ }
+
+ /**
+ * @param o Object to prepare for marshalling.
+ * @param ctx Context.
+ * @throws IgniteCheckedException If failed.
+ */
+ protected final void prepareObject(@Nullable Object o, GridCacheSharedContext ctx) throws IgniteCheckedException {
assert addDepInfo || forceAddDepInfo;
if (!skipPrepare && o != null) {
@@ -279,24 +280,28 @@ public abstract class GridCacheMessage implements Message {
/**
* @param info Entry to marshal.
* @param ctx Context.
+ * @param cacheObjCtx Cache object context.
* @throws IgniteCheckedException If failed.
*/
- protected final void marshalInfo(GridCacheEntryInfo info, GridCacheContext ctx) throws IgniteCheckedException {
+ protected final void marshalInfo(GridCacheEntryInfo info,
+ GridCacheSharedContext ctx,
+ CacheObjectContext cacheObjCtx
+ ) throws IgniteCheckedException {
assert ctx != null;
if (info != null) {
- info.marshal(ctx);
+ info.marshal(cacheObjCtx);
if (addDepInfo) {
if (info.key() != null)
- prepareObject(info.key().value(ctx.cacheObjectContext(), false), ctx);
+ prepareObject(info.key().value(cacheObjCtx, false), ctx);
CacheObject val = info.value();
if (val != null) {
- val.finishUnmarshal(ctx.cacheObjectContext(), ctx.deploy().globalLoader());
+ val.finishUnmarshal(cacheObjCtx, ctx.deploy().globalLoader());
- prepareObject(CU.value(val, ctx, false), ctx);
+ prepareObject(val.value(cacheObjCtx, false), ctx);
}
}
}
@@ -314,7 +319,7 @@ public abstract class GridCacheMessage implements Message {
assert ctx != null;
if (info != null)
- info.unmarshal(ctx, ldr);
+ info.unmarshal(ctx.cacheObjectContext(), ldr);
}
/**
@@ -324,13 +329,14 @@ public abstract class GridCacheMessage implements Message {
*/
protected final void marshalInfos(
Iterable<? extends GridCacheEntryInfo> infos,
- GridCacheContext ctx
+ GridCacheSharedContext ctx,
+ CacheObjectContext cacheObjCtx
) throws IgniteCheckedException {
assert ctx != null;
if (infos != null)
for (GridCacheEntryInfo e : infos)
- marshalInfo(e, ctx);
+ marshalInfo(e, ctx, cacheObjCtx);
}
/**
@@ -369,14 +375,14 @@ public abstract class GridCacheMessage implements Message {
if (addDepInfo) {
if (e.key() != null)
- prepareObject(e.key().value(cctx.cacheObjectContext(), false), cctx);
+ prepareObject(e.key().value(cctx.cacheObjectContext(), false), ctx);
if (e.value() != null)
- prepareObject(e.value().value(cctx.cacheObjectContext(), false), cctx);
+ prepareObject(e.value().value(cctx.cacheObjectContext(), false), ctx);
if (e.entryProcessors() != null) {
for (T2<EntryProcessor<Object, Object, Object>, Object[]> entProc : e.entryProcessors())
- prepareObject(entProc.get1(), cctx);
+ prepareObject(entProc.get1(), ctx);
}
}
else if (p2pEnabled && e.entryProcessors() != null) {
@@ -384,7 +390,7 @@ public abstract class GridCacheMessage implements Message {
forceAddDepInfo = true;
for (T2<EntryProcessor<Object, Object, Object>, Object[]> entProc : e.entryProcessors())
- prepareObject(entProc.get1(), cctx);
+ prepareObject(entProc.get1(), ctx);
}
}
}
@@ -435,7 +441,7 @@ public abstract class GridCacheMessage implements Message {
Object arg = args[i];
if (addDepInfo)
- prepareObject(arg, ctx);
+ prepareObject(arg, ctx.shared());
argsBytes[i] = arg == null ? null : CU.marshal(ctx, arg);
}
@@ -487,7 +493,7 @@ public abstract class GridCacheMessage implements Message {
for (Object o : col) {
if (addDepInfo)
- prepareObject(o, ctx);
+ prepareObject(o, ctx.shared());
byteCol.add(o == null ? null : CU.marshal(ctx, o));
}
@@ -522,7 +528,7 @@ public abstract class GridCacheMessage implements Message {
obj.prepareMarshal(ctx.cacheObjectContext());
if (addDepInfo)
- prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx);
+ prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx.shared());
}
}
@@ -541,7 +547,7 @@ public abstract class GridCacheMessage implements Message {
obj.prepareMarshal(ctx.cacheObjectContext());
if (addDepInfo)
- prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx);
+ prepareObject(obj.value(ctx.cacheObjectContext(), false), ctx.shared());
}
}
}
@@ -630,6 +636,11 @@ public abstract class GridCacheMessage implements Message {
}
/** {@inheritDoc} */
+ @Override public byte fieldsCount() {
+ return 2;
+ }
+
+ /** {@inheritDoc} */
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
writer.setBuffer(buf);
@@ -642,18 +653,12 @@ public abstract class GridCacheMessage implements Message {
switch (writer.state()) {
case 0:
- if (!writer.writeInt("cacheId", cacheId))
- return false;
-
- writer.incrementState();
-
- case 1:
if (!writer.writeMessage("depInfo", depInfo))
return false;
writer.incrementState();
- case 2:
+ case 1:
if (!writer.writeLong("msgId", msgId))
return false;
@@ -673,14 +678,6 @@ public abstract class GridCacheMessage implements Message {
switch (reader.state()) {
case 0:
- cacheId = reader.readInt("cacheId");
-
- if (!reader.isLastRead())
- return false;
-
- reader.incrementState();
-
- case 1:
depInfo = reader.readMessage("depInfo");
if (!reader.isLastRead())
@@ -688,7 +685,7 @@ public abstract class GridCacheMessage implements Message {
reader.incrementState();
- case 2:
+ case 1:
msgId = reader.readLong("msgId");
if (!reader.isLastRead())
@@ -714,6 +711,6 @@ public abstract class GridCacheMessage implements Message {
/** {@inheritDoc} */
@Override public String toString() {
- return S.toString(GridCacheMessage.class, this, "cacheId", cacheId);
+ return S.toString(GridCacheMessage.class, this);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index 2eec8f6..2d1aa05 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -94,7 +94,6 @@ import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.util.worker.GridWorker;
import org.apache.ignite.lang.IgniteBiInClosure;
-import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.lang.IgniteProductVersion;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.thread.IgniteThread;
@@ -308,21 +307,21 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
cctx.gridEvents().addDiscoveryEventListener(discoLsnr, EVT_NODE_JOINED, EVT_NODE_LEFT, EVT_NODE_FAILED,
EVT_DISCOVERY_CUSTOM_EVT);
- cctx.io().addHandler(0, GridDhtPartitionsSingleMessage.class,
+ cctx.io().addCacheHandler(0, GridDhtPartitionsSingleMessage.class,
new MessageHandler<GridDhtPartitionsSingleMessage>() {
@Override public void onMessage(ClusterNode node, GridDhtPartitionsSingleMessage msg) {
processSinglePartitionUpdate(node, msg);
}
});
- cctx.io().addHandler(0, GridDhtPartitionsFullMessage.class,
+ cctx.io().addCacheHandler(0, GridDhtPartitionsFullMessage.class,
new MessageHandler<GridDhtPartitionsFullMessage>() {
@Override public void onMessage(ClusterNode node, GridDhtPartitionsFullMessage msg) {
processFullPartitionUpdate(node, msg);
}
});
- cctx.io().addHandler(0, GridDhtPartitionsSingleRequest.class,
+ cctx.io().addCacheHandler(0, GridDhtPartitionsSingleRequest.class,
new MessageHandler<GridDhtPartitionsSingleRequest>() {
@Override public void onMessage(ClusterNode node, GridDhtPartitionsSingleRequest msg) {
processSinglePartitionRequest(node, msg);
@@ -381,24 +380,28 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
for (int cnt = 0; cnt < cctx.gridConfig().getRebalanceThreadPoolSize(); cnt++) {
final int idx = cnt;
- cctx.io().addOrderedHandler(rebalanceTopic(cnt), new CI2<UUID, GridCacheMessage>() {
- @Override public void apply(final UUID id, final GridCacheMessage m) {
+ cctx.io().addOrderedCacheGroupHandler(rebalanceTopic(cnt), new CI2<UUID, GridCacheGroupIdMessage>() {
+ @Override public void apply(final UUID id, final GridCacheGroupIdMessage m) {
if (!enterBusy())
return;
try {
- GridCacheContext cacheCtx = cctx.cacheContext(m.cacheId);
-
- if (cacheCtx != null) {
- if (m instanceof GridDhtPartitionSupplyMessage)
- cacheCtx.preloader().handleSupplyMessage(
- idx, id, (GridDhtPartitionSupplyMessage)m);
- else if (m instanceof GridDhtPartitionDemandMessage)
- cacheCtx.preloader().handleDemandMessage(
- idx, id, (GridDhtPartitionDemandMessage)m);
- else
- U.error(log, "Unsupported message type: " + m.getClass().getName());
+ CacheGroupContext grp = cctx.cache().cacheGroup(m.groupId());
+
+ if (grp != null) {
+ if (m instanceof GridDhtPartitionSupplyMessage) {
+ grp.preloader().handleSupplyMessage(idx, id, (GridDhtPartitionSupplyMessage) m);
+
+ return;
+ }
+ else if (m instanceof GridDhtPartitionDemandMessage) {
+ grp.preloader().handleDemandMessage(idx, id, (GridDhtPartitionDemandMessage) m);
+
+ return;
+ }
}
+
+ U.error(log, "Unsupported message type: " + m.getClass().getName());
}
finally {
leaveBusy();
@@ -416,14 +419,14 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
try {
fut.get();
- for (GridCacheContext cacheCtx : cctx.cacheContexts())
- cacheCtx.preloader().onInitialExchangeComplete(null);
+ for (CacheGroupContext grp : cctx.cache().cacheGroups())
+ grp.preloader().onInitialExchangeComplete(null);
reconnectExchangeFut.onDone();
}
catch (IgniteCheckedException e) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts())
- cacheCtx.preloader().onInitialExchangeComplete(e);
+ for (CacheGroupContext grp : cctx.cache().cacheGroups())
+ grp.preloader().onInitialExchangeComplete(e);
reconnectExchangeFut.onDone(e);
}
@@ -468,9 +471,9 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
AffinityTopologyVersion nodeStartVer = new AffinityTopologyVersion(discoEvt.topologyVersion(), 0);
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (nodeStartVer.equals(cacheCtx.startTopologyVersion()))
- cacheCtx.preloader().onInitialExchangeComplete(null);
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (nodeStartVer.equals(grp.localStartVersion()))
+ grp.preloader().onInitialExchangeComplete(null);
}
if (log.isDebugEnabled())
@@ -490,9 +493,9 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
@Override protected void onKernalStop0(boolean cancel) {
cctx.gridEvents().removeDiscoveryEventListener(discoLsnr);
- cctx.io().removeHandler(0, GridDhtPartitionsSingleMessage.class);
- cctx.io().removeHandler(0, GridDhtPartitionsFullMessage.class);
- cctx.io().removeHandler(0, GridDhtPartitionsSingleRequest.class);
+ cctx.io().removeHandler(false, 0, GridDhtPartitionsSingleMessage.class);
+ cctx.io().removeHandler(false, 0, GridDhtPartitionsFullMessage.class);
+ cctx.io().removeHandler(false, 0, GridDhtPartitionsSingleRequest.class);
stopErr = cctx.kernalContext().clientDisconnected() ?
new IgniteClientDisconnectedCheckedException(cctx.kernalContext().cluster().clientReconnectFuture(),
@@ -512,7 +515,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
if (!cctx.kernalContext().clientNode()) {
for (int cnt = 0; cnt < cctx.gridConfig().getRebalanceThreadPoolSize(); cnt++)
- cctx.io().removeOrderedHandler(rebalanceTopic(cnt));
+ cctx.io().removeOrderedHandler(true, rebalanceTopic(cnt));
}
U.cancel(exchWorker);
@@ -547,22 +550,22 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param exchFut Exchange future.
* @return Topology.
*/
- public GridDhtPartitionTopology clientTopology(int cacheId, GridDhtPartitionsExchangeFuture exchFut) {
- GridClientPartitionTopology top = clientTops.get(cacheId);
+ public GridDhtPartitionTopology clientTopology(int grpId, GridDhtPartitionsExchangeFuture exchFut) {
+ GridClientPartitionTopology top = clientTops.get(grpId);
if (top != null)
return top;
Object affKey = null;
- DynamicCacheDescriptor desc = cctx.cache().cacheDescriptor(cacheId);
+ CacheGroupDescriptor grpDesc = cctx.cache().cacheGroupDescriptors().get(grpId);
- if (desc != null) {
- CacheConfiguration ccfg = desc.cacheConfiguration();
+ if (grpDesc != null) {
+ CacheConfiguration<?, ?> ccfg = grpDesc.config();
AffinityFunction aff = ccfg.getAffinity();
@@ -572,8 +575,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
aff.partitions());
}
- GridClientPartitionTopology old = clientTops.putIfAbsent(cacheId,
- top = new GridClientPartitionTopology(cctx, cacheId, exchFut, affKey));
+ GridClientPartitionTopology old = clientTops.putIfAbsent(grpId,
+ top = new GridClientPartitionTopology(cctx, grpId, exchFut, affKey));
return old != null ? old : top;
}
@@ -586,11 +589,11 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @return Client partition topology.
*/
- public GridClientPartitionTopology clearClientTopology(int cacheId) {
- return clientTops.remove(cacheId);
+ public GridClientPartitionTopology clearClientTopology(int grpId) {
+ return clientTops.remove(grpId);
}
/**
@@ -804,18 +807,12 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
// If this is the oldest node.
if (oldest.id().equals(cctx.localNodeId())) {
// Check rebalance state & send CacheAffinityChangeMessage if need.
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (!cacheCtx.isLocal()) {
- if (cacheCtx == null)
- continue;
-
- GridDhtPartitionTopology top = null;
-
- if (!cacheCtx.isLocal())
- top = cacheCtx.topology();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (!grp.isLocal()) {
+ GridDhtPartitionTopology top = grp.topology();
if (top != null)
- cctx.affinity().checkRebalanceState(top, cacheCtx.cacheId());
+ cctx.affinity().checkRebalanceState(top, grp.groupId());
}
}
@@ -825,7 +822,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
AffinityTopologyVersion rmtTopVer =
lastFut != null ? lastFut.topologyVersion() : AffinityTopologyVersion.NONE;
- Collection<ClusterNode> rmts = CU.remoteNodes(cctx, AffinityTopologyVersion.NONE);
+ Collection<ClusterNode> rmts = CU.remoteNodes(cctx, rmtTopVer);
if (log.isDebugEnabled())
log.debug("Refreshing partitions from oldest node: " + cctx.localNodeId());
@@ -843,9 +840,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
/**
* @param nodes Nodes.
- * @return {@code True} if message was sent, {@code false} if node left grid.
*/
- private boolean sendAllPartitions(Collection<ClusterNode> nodes) {
+ private void sendAllPartitions(Collection<ClusterNode> nodes) {
GridDhtPartitionsFullMessage m = createPartitionsFullMessage(nodes, null, null, true);
if (log.isDebugEnabled())
@@ -866,8 +862,6 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
U.warn(log, "Failed to send partitions full message [node=" + node + ", err=" + e + ']');
}
}
-
- return true;
}
/**
@@ -889,51 +883,48 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
final Map<Object, T2<Integer, GridDhtPartitionFullMap>> dupData = new HashMap<>();
- cctx.forAllCaches(new IgniteInClosure<GridCacheContext>() {
- @Override public void apply(GridCacheContext cacheCtx) {
- if (!cacheCtx.isLocal()) {
- boolean ready;
-
- if (exchId != null) {
- AffinityTopologyVersion startTopVer = cacheCtx.startTopologyVersion();
-
- ready = startTopVer.compareTo(exchId.topologyVersion()) <= 0;
- }
- else
- ready = cacheCtx.started();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (!grp.isLocal()) {
+ if (exchId != null) {
+ AffinityTopologyVersion startTopVer = grp.localStartVersion();
- if (ready) {
- GridAffinityAssignmentCache affCache = cacheCtx.affinity().affinityCache();
+ if (startTopVer.compareTo(exchId.topologyVersion()) > 0)
+ continue;
+ }
- GridDhtPartitionFullMap locMap = cacheCtx.topology().partitionMap(true);
+ GridAffinityAssignmentCache affCache = grp.affinity();
- addFullPartitionsMap(m,
- dupData,
- compress,
- cacheCtx.cacheId(),
- locMap,
- affCache.similarAffinityKey());
+ GridDhtPartitionFullMap locMap = grp.topology().partitionMap(true);
- if (exchId != null)
- m.addPartitionUpdateCounters(cacheCtx.cacheId(), cacheCtx.topology().updateCounters(true));
- }
+ if (locMap != null) {
+ addFullPartitionsMap(m,
+ dupData,
+ compress,
+ grp.groupId(),
+ locMap,
+ affCache.similarAffinityKey());
}
+
+ if (exchId != null)
+ m.addPartitionUpdateCounters(grp.groupId(), grp.topology().updateCounters(true));
}
- });
+ }
// It is important that client topologies be added after contexts.
for (GridClientPartitionTopology top : cctx.exchange().clientTopologies()) {
GridDhtPartitionFullMap map = top.partitionMap(true);
- addFullPartitionsMap(m,
- dupData,
- compress,
- top.cacheId(),
- map,
- top.similarAffinityKey());
+ if (map != null) {
+ addFullPartitionsMap(m,
+ dupData,
+ compress,
+ top.groupId(),
+ map,
+ top.similarAffinityKey());
+ }
if (exchId != null)
- m.addPartitionUpdateCounters(top.cacheId(), top.updateCounters(true));
+ m.addPartitionUpdateCounters(top.groupId(), top.updateCounters(true));
}
return m;
@@ -943,19 +934,21 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
* @param m Message.
* @param dupData Duplicated data map.
* @param compress {@code True} if need check for duplicated partition state data.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param map Map to add.
* @param affKey Cache affinity key.
*/
private void addFullPartitionsMap(GridDhtPartitionsFullMessage m,
Map<Object, T2<Integer, GridDhtPartitionFullMap>> dupData,
boolean compress,
- Integer cacheId,
+ Integer grpId,
GridDhtPartitionFullMap map,
Object affKey) {
+ assert map != null;
+
Integer dupDataCache = null;
- if (compress && affKey != null && !m.containsCache(cacheId)) {
+ if (compress && affKey != null && !m.containsGroup(grpId)) {
T2<Integer, GridDhtPartitionFullMap> state0 = dupData.get(affKey);
if (state0 != null && state0.get2().partitionStateEquals(map)) {
@@ -971,10 +964,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
dupDataCache = state0.get1();
}
else
- dupData.put(affKey, new T2<>(cacheId, map));
+ dupData.put(affKey, new T2<>(grpId, map));
}
- m.addFullPartitionsMap(cacheId, map, dupDataCache);
+ m.addFullPartitionsMap(grpId, map, dupDataCache);
}
/**
@@ -1022,24 +1015,24 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
Map<Object, T2<Integer,Map<Integer, GridDhtPartitionState>>> dupData = new HashMap<>();
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (!cacheCtx.isLocal()) {
- GridDhtPartitionMap locMap = cacheCtx.topology().localPartitionMap();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (!grp.isLocal()) {
+ GridDhtPartitionMap locMap = grp.topology().localPartitionMap();
addPartitionMap(m,
dupData,
true,
- cacheCtx.cacheId(),
+ grp.groupId(),
locMap,
- cacheCtx.affinity().affinityCache().similarAffinityKey());
+ grp.affinity().similarAffinityKey());
if (sndCounters)
- m.partitionUpdateCounters(cacheCtx.cacheId(), cacheCtx.topology().updateCounters(true));
+ m.partitionUpdateCounters(grp.groupId(), grp.topology().updateCounters(true));
}
}
for (GridClientPartitionTopology top : clientTops.values()) {
- if (m.partitions() != null && m.partitions().containsKey(top.cacheId()))
+ if (m.partitions() != null && m.partitions().containsKey(top.groupId()))
continue;
GridDhtPartitionMap locMap = top.localPartitionMap();
@@ -1047,12 +1040,12 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
addPartitionMap(m,
dupData,
true,
- top.cacheId(),
+ top.groupId(),
locMap,
top.similarAffinityKey());
if (sndCounters)
- m.partitionUpdateCounters(top.cacheId(), top.updateCounters(true));
+ m.partitionUpdateCounters(top.groupId(), top.updateCounters(true));
}
return m;
@@ -1250,19 +1243,16 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
boolean updated = false;
for (Map.Entry<Integer, GridDhtPartitionFullMap> entry : msg.partitions().entrySet()) {
- Integer cacheId = entry.getKey();
+ Integer grpId = entry.getKey();
- GridCacheContext<K, V> cacheCtx = cctx.cacheContext(cacheId);
-
- if (cacheCtx != null && !cacheCtx.started())
- continue; // Can safely ignore background exchange.
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
GridDhtPartitionTopology top = null;
- if (cacheCtx == null)
- top = clientTops.get(cacheId);
- else if (!cacheCtx.isLocal())
- top = cacheCtx.topology();
+ if (grp == null)
+ top = clientTops.get(grpId);
+ else if (!grp.isLocal())
+ top = grp.topology();
if (top != null)
updated |= top.update(null, entry.getValue(), null) != null;
@@ -1296,25 +1286,25 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
boolean updated = false;
for (Map.Entry<Integer, GridDhtPartitionMap> entry : msg.partitions().entrySet()) {
- Integer cacheId = entry.getKey();
+ Integer grpId = entry.getKey();
- GridCacheContext<K, V> cacheCtx = cctx.cacheContext(cacheId);
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- if (cacheCtx != null &&
- cacheCtx.startTopologyVersion().compareTo(entry.getValue().topologyVersion()) > 0)
+ if (grp != null &&
+ grp.localStartVersion().compareTo(entry.getValue().topologyVersion()) > 0)
continue;
GridDhtPartitionTopology top = null;
- if (cacheCtx == null)
- top = clientTops.get(cacheId);
- else if (!cacheCtx.isLocal())
- top = cacheCtx.topology();
+ if (grp == null)
+ top = clientTops.get(grpId);
+ else if (!grp.isLocal())
+ top = grp.topology();
if (top != null) {
updated |= top.update(null, entry.getValue()) != null;
- cctx.affinity().checkRebalanceState(top, cacheId);
+ cctx.affinity().checkRebalanceState(top, grpId);
}
}
@@ -1404,8 +1394,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
dumpPendingObjects(exchTopVer);
- for (GridCacheContext cacheCtx : cctx.cacheContexts())
- cacheCtx.preloader().dumpDebugInfo();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups())
+ grp.preloader().dumpDebugInfo();
cctx.affinity().dumpDebugInfo();
@@ -1568,21 +1558,19 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
}
}
- for (GridCacheContext ctx : cctx.cacheContexts()) {
- if (ctx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- GridCacheContext ctx0 = ctx.isNear() ? ctx.near().dht().context() : ctx;
-
- GridCachePreloader preloader = ctx0.preloader();
+ GridCachePreloader preloader = grp.preloader();
if (preloader != null)
preloader.dumpDebugInfo();
- GridCacheAffinityManager affMgr = ctx0.affinity();
+ GridAffinityAssignmentCache aff = grp.affinity();
- if (affMgr != null)
- affMgr.dumpDebugInfo();
+ if (aff != null)
+ aff.dumpDebugInfo();
}
}
@@ -1725,8 +1713,11 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
try {
boolean preloadFinished = true;
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- preloadFinished &= cacheCtx.preloader() != null && cacheCtx.preloader().syncFuture().isDone();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
+ continue;
+
+ preloadFinished &= grp.preloader() != null && grp.preloader().syncFuture().isDone();
if (!preloadFinished)
break;
@@ -1833,11 +1824,11 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
boolean changed = false;
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- changed |= cacheCtx.topology().afterExchange(exchFut);
+ changed |= grp.topology().afterExchange(exchFut);
}
if (!cctx.kernalContext().clientNode() && changed && !hasPendingExchange())
@@ -1857,16 +1848,16 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
if (!exchFut.skipPreload() && cctx.kernalContext().state().active()) {
assignsMap = new HashMap<>();
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- long delay = cacheCtx.config().getRebalanceDelay();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ long delay = grp.config().getRebalanceDelay();
GridDhtPreloaderAssignments assigns = null;
// Don't delay for dummy reassigns to avoid infinite recursion.
if (delay == 0 || forcePreload)
- assigns = cacheCtx.preloader().assign(exchFut);
+ assigns = grp.preloader().assign(exchFut);
- assignsMap.put(cacheCtx.cacheId(), assigns);
+ assignsMap.put(grp.groupId(), assigns);
}
}
}
@@ -1881,16 +1872,16 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
NavigableMap<Integer, List<Integer>> orderMap = new TreeMap<>();
for (Map.Entry<Integer, GridDhtPreloaderAssignments> e : assignsMap.entrySet()) {
- int cacheId = e.getKey();
+ int grpId = e.getKey();
- GridCacheContext<K, V> cacheCtx = cctx.cacheContext(cacheId);
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- int order = cacheCtx.config().getRebalanceOrder();
+ int order = grp.config().getRebalanceOrder();
if (orderMap.get(order) == null)
orderMap.put(order, new ArrayList<Integer>(size));
- orderMap.get(order).add(cacheId);
+ orderMap.get(order).add(grpId);
}
Runnable r = null;
@@ -1900,35 +1891,27 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
boolean assignsCancelled = false;
for (Integer order : orderMap.descendingKeySet()) {
- for (Integer cacheId : orderMap.get(order)) {
- GridCacheContext<K, V> cacheCtx = cctx.cacheContext(cacheId);
+ for (Integer grpId : orderMap.get(order)) {
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- GridDhtPreloaderAssignments assigns = assignsMap.get(cacheId);
+ GridDhtPreloaderAssignments assigns = assignsMap.get(grpId);
if (assigns != null)
assignsCancelled |= assigns.cancelled();
- List<String> waitList = new ArrayList<>(size - 1);
-
- for (List<Integer> cIds : orderMap.headMap(order).values()) {
- for (Integer cId : cIds)
- waitList.add(cctx.cacheContext(cId).name());
- }
-
// Cancels previous rebalance future (in case it's not done yet).
// Sends previous rebalance stopped event (if necessary).
// Creates new rebalance future.
// Sends current rebalance started event (if necessary).
// Finishes cache sync future (on empty assignments).
- Runnable cur = cacheCtx.preloader().addAssignments(assigns,
+ Runnable cur = grp.preloader().addAssignments(assigns,
forcePreload,
- waitList,
cnt,
r,
exchFut.forcedRebalanceFuture());
if (cur != null) {
- rebList.add(U.maskName(cacheCtx.name()));
+ rebList.add(grp.cacheOrGroupName());
r = cur;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloader.java
index 5ae68e8..0ac0272 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloader.java
@@ -22,6 +22,7 @@ import java.util.UUID;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtFuture;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateRequest;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemandMessage;
@@ -45,18 +46,6 @@ public interface GridCachePreloader {
public void start() throws IgniteCheckedException;
/**
- * Stops preloading.
- */
- public void stop();
-
- /**
- * Kernal start callback.
- *
- * @throws IgniteCheckedException If failed.
- */
- public void onKernalStart() throws IgniteCheckedException;
-
- /**
* Kernal stop callback.
*/
public void onKernalStop();
@@ -90,7 +79,6 @@ public interface GridCachePreloader {
*/
public Runnable addAssignments(GridDhtPreloaderAssignments assignments,
boolean forcePreload,
- Collection<String> caches,
int cnt,
Runnable next,
@Nullable GridFutureAdapter<Boolean> forcedRebFut);
@@ -136,20 +124,25 @@ public interface GridCachePreloader {
/**
* Requests that preloader sends the request for the key.
*
+ * @param cctx Cache context.
* @param keys Keys to request.
* @param topVer Topology version, {@code -1} if not required.
* @return Future to complete when all keys are preloaded.
*/
- public IgniteInternalFuture<Object> request(Collection<KeyCacheObject> keys, AffinityTopologyVersion topVer);
+ public GridDhtFuture<Object> request(GridCacheContext cctx,
+ Collection<KeyCacheObject> keys,
+ AffinityTopologyVersion topVer);
/**
* Requests that preloader sends the request for the key.
*
+ * @param cctx Cache context.
* @param req Message with keys to request.
* @param topVer Topology version, {@code -1} if not required.
* @return Future to complete when all keys are preloaded.
*/
- public IgniteInternalFuture<Object> request(GridNearAtomicAbstractUpdateRequest req,
+ public GridDhtFuture<Object> request(GridCacheContext cctx,
+ GridNearAtomicAbstractUpdateRequest req,
AffinityTopologyVersion topVer);
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloaderAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloaderAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloaderAdapter.java
index 47c37f5..98874e4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloaderAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePreloaderAdapter.java
@@ -21,9 +21,9 @@ import java.util.Collection;
import java.util.UUID;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.cache.affinity.AffinityFunction;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtFuture;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicAbstractUpdateRequest;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemandMessage;
@@ -39,15 +39,15 @@ import org.jetbrains.annotations.Nullable;
* Adapter for preloading which always assumes that preloading finished.
*/
public class GridCachePreloaderAdapter implements GridCachePreloader {
- /** Cache context. */
- protected final GridCacheContext<?, ?> cctx;
+ /** */
+ protected final CacheGroupContext grp;
+
+ /** */
+ protected final GridCacheSharedContext ctx;
/** Logger. */
protected final IgniteLogger log;
- /** Affinity. */
- protected final AffinityFunction aff;
-
/** Start future (always completed by default). */
private final IgniteInternalFuture finFut;
@@ -55,15 +55,16 @@ public class GridCachePreloaderAdapter implements GridCachePreloader {
protected IgnitePredicate<GridCacheEntryInfo> preloadPred;
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
*/
- public GridCachePreloaderAdapter(GridCacheContext<?, ?> cctx) {
- assert cctx != null;
+ public GridCachePreloaderAdapter(CacheGroupContext grp) {
+ assert grp != null;
- this.cctx = cctx;
+ this.grp = grp;
- log = cctx.logger(getClass());
- aff = cctx.config().getAffinity();
+ ctx = grp.shared();
+
+ log = ctx.logger(getClass());
finFut = new GridFinishedFuture();
}
@@ -74,16 +75,6 @@ public class GridCachePreloaderAdapter implements GridCachePreloader {
}
/** {@inheritDoc} */
- @Override public void stop() {
- // No-op.
- }
-
- /** {@inheritDoc} */
- @Override public void onKernalStart() throws IgniteCheckedException {
- // No-op.
- }
-
- /** {@inheritDoc} */
@Override public void onKernalStop() {
// No-op.
}
@@ -130,7 +121,7 @@ public class GridCachePreloaderAdapter implements GridCachePreloader {
/** {@inheritDoc} */
@Override public void unwindUndeploys() {
- cctx.deploy().unwind(cctx);
+ grp.unwindUndeploys();
}
/** {@inheritDoc} */
@@ -144,15 +135,15 @@ public class GridCachePreloaderAdapter implements GridCachePreloader {
}
/** {@inheritDoc} */
- @Override public IgniteInternalFuture<Object> request(Collection<KeyCacheObject> keys,
+ @Override public GridDhtFuture<Object> request(GridCacheContext ctx, Collection<KeyCacheObject> keys,
AffinityTopologyVersion topVer) {
- return new GridFinishedFuture<>();
+ return null;
}
/** {@inheritDoc} */
- @Override public IgniteInternalFuture<Object> request(GridNearAtomicAbstractUpdateRequest req,
+ @Override public GridDhtFuture<Object> request(GridCacheContext ctx, GridNearAtomicAbstractUpdateRequest req,
AffinityTopologyVersion topVer) {
- return new GridFinishedFuture<>();
+ return null;
}
/** {@inheritDoc} */
@@ -168,7 +159,6 @@ public class GridCachePreloaderAdapter implements GridCachePreloader {
/** {@inheritDoc} */
@Override public Runnable addAssignments(GridDhtPreloaderAssignments assignments,
boolean forcePreload,
- Collection<String> caches,
int cnt,
Runnable next,
@Nullable GridFutureAdapter<Boolean> forcedRebFut) {
[11/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index c7e8670..ad83b14 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -74,6 +74,7 @@ import org.apache.ignite.internal.pagemem.store.IgnitePageStoreManager;
import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache;
import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
import org.apache.ignite.internal.processors.cache.database.IgniteCacheDatabaseSharedManager;
import org.apache.ignite.internal.processors.cache.database.MemoryPolicy;
@@ -174,6 +175,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
private GridCacheSharedContext<?, ?> sharedCtx;
/** */
+ private final ConcurrentMap<Integer, CacheGroupContext> cacheGrps = new ConcurrentHashMap<>();
+
+ /** */
private final Map<String, GridCacheAdapter<?, ?>> caches;
/** Caches stopped from onKernalStop callback. */
@@ -524,7 +528,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
*/
private List<GridCacheManager> dhtManagers(GridCacheContext ctx) {
return F.asList(ctx.store(), ctx.events(), ctx.evicts(), ctx.queries(), ctx.continuousQueries(),
- ctx.dr(), ctx.offheap());
+ ctx.dr());
}
/**
@@ -536,7 +540,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
if (ctx.config().getCacheMode() == LOCAL || !isNearEnabled(ctx))
return Collections.emptyList();
else
- return F.asList(ctx.queries(), ctx.continuousQueries(), ctx.store(), ctx.offheap());
+ return F.asList(ctx.queries(), ctx.continuousQueries(), ctx.store());
}
/**
@@ -550,7 +554,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
prepare(cfg, cfg.getAffinityMapper(), false);
prepare(cfg, cfg.getEvictionFilter(), false);
prepare(cfg, cfg.getInterceptor(), false);
- prepare(cfg, cfg.getTopologyValidator(), false);
NearCacheConfiguration nearCfg = cfg.getNearConfiguration();
@@ -588,7 +591,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
cleanup(cfg, cfg.getAffinityMapper(), false);
cleanup(cfg, cfg.getEvictionFilter(), false);
cleanup(cfg, cfg.getInterceptor(), false);
- cleanup(cfg, cfg.getTopologyValidator(), false);
cleanup(cfg, cctx.store().configuredStore(), false);
if (!CU.isUtilityCache(cfg.getName()) && !CU.isSystemCache(cfg.getName())) {
@@ -605,6 +607,16 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
/**
+ * @param grp Cache group.
+ */
+ private void cleanup(CacheGroupContext grp) {
+ CacheConfiguration cfg = grp.config();
+
+ for (Object obj : grp.configuredUserObjects())
+ cleanup(cfg, obj, false);
+ }
+
+ /**
* @param cfg Cache configuration.
* @param rsrc Resource.
* @param near Near flag.
@@ -718,10 +730,10 @@ public class GridCacheProcessor extends GridProcessorAdapter {
else
stopSeq.addFirst(cfg.getName());
- caches.put(cfg.getName(), new CacheJoinNodeDiscoveryData.CacheInfo(cfg, cacheType, sql, (byte)0));
+ caches.put(cfg.getName(), new CacheJoinNodeDiscoveryData.CacheInfo(cfg, cacheType, sql, 0));
}
else
- templates.put(cfg.getName(), new CacheJoinNodeDiscoveryData.CacheInfo(cfg, CacheType.USER, false, (byte)0));
+ templates.put(cfg.getName(), new CacheJoinNodeDiscoveryData.CacheInfo(cfg, CacheType.USER, false, 0));
}
/**
@@ -798,6 +810,21 @@ public class GridCacheProcessor extends GridProcessorAdapter {
internalCaches.add(CU.ATOMICS_CACHE_NAME);
}
+ /**
+ * @param grpId Group ID.
+ * @return Cache group.
+ */
+ @Nullable public CacheGroupContext cacheGroup(int grpId) {
+ return cacheGrps.get(grpId);
+ }
+
+ /**
+ * @return Cache groups.
+ */
+ public Collection<CacheGroupContext> cacheGroups() {
+ return cacheGrps.values();
+ }
+
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public void onKernalStart(boolean activeOnStart) throws IgniteCheckedException {
@@ -822,14 +849,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
for (CacheConfiguration conf : ctx.config().getCacheConfiguration()) {
assert conf.getName() != null;
- for (DynamicCacheDescriptor desc : cacheDescriptors()) {
+ for (DynamicCacheDescriptor desc : cacheDescriptors().values()) {
CacheConfiguration c = desc.cacheConfiguration();
- IgnitePredicate filter = c.getNodeFilter();
+ IgnitePredicate filter = desc.groupDescriptor().config().getNodeFilter();
if (c.getName().equals(conf.getName()) &&
((desc.receivedOnDiscovery() && CU.affinityNode(locNode, filter)) ||
CU.isSystemCache(c.getName()))) {
-
tmpCacheCfg.add(c);
break;
@@ -966,6 +992,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
stopCache(cache, cancel, false);
}
+ for (CacheGroupContext grp : cacheGrps.values())
+ stopCacheGroup(grp.groupId());
+
cachesInfo.clearCaches();
}
@@ -988,6 +1017,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
// No new caches should be added after this point.
exch.onKernalStop(cancel);
+ for (CacheGroupContext grp : cacheGrps.values())
+ grp.onKernalStop();
+
onKernalStopCaches(cancel);
cancelFutures();
@@ -1007,11 +1039,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @param cancel Cancel.
*/
public void onKernalStopCaches(boolean cancel){
- for (GridCacheAdapter<?, ?> cache : caches.values()) {
- GridCacheAffinityManager aff = cache.context().affinity();
+ IgniteCheckedException affErr =
+ new IgniteCheckedException("Failed to wait for topology update, node is stopping.");
+
+ for (CacheGroupContext grp : cacheGrps.values()) {
+ GridAffinityAssignmentCache aff = grp.affinity();
- if (aff != null)
- aff.cancelFutures();
+ aff.cancelFutures(affErr);
}
for (String cacheName : stopSeq) {
@@ -1047,6 +1081,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
for (IgniteInternalFuture fut : pendingTemplateFuts.values())
((GridFutureAdapter)fut).onDone(err);
+ for (CacheGroupContext grp : cacheGrps.values())
+ grp.onDisconnected(reconnectFut);
+
for (GridCacheAdapter cache : caches.values()) {
GridCacheContext cctx = cache.context();
@@ -1066,37 +1103,35 @@ public class GridCacheProcessor extends GridProcessorAdapter {
cachesInfo.onDisconnect();
}
- /** {@inheritDoc} */
- @Override public IgniteInternalFuture<?> onReconnected(boolean clusterRestarted) throws IgniteCheckedException {
- List<GridCacheAdapter> reconnected = new ArrayList<>(caches.size());
-
- GridCompoundFuture<?, ?> stopFut = null;
+ /**
+ * @param cctx Cache context.
+ * @param stoppedCaches List where stopped cache should be added.
+ */
+ private void stopCacheOnReconnect(GridCacheContext cctx, List<GridCacheAdapter> stoppedCaches) {
+ cctx.gate().reconnected(true);
- Set<String> stoppedCaches = cachesInfo.onReconnected();
+ sharedCtx.removeCacheContext(cctx);
- for (final GridCacheAdapter cache : caches.values()) {
- boolean stopped = stoppedCaches.contains(cache.name());
+ caches.remove(cctx.name());
+ jCacheProxies.remove(cctx.name());
- if (stopped) {
- cache.context().gate().reconnected(true);
+ stoppedCaches.add(cctx.cache());
+ }
- sharedCtx.removeCacheContext(cache.ctx);
+ /** {@inheritDoc} */
+ @Override public IgniteInternalFuture<?> onReconnected(boolean clusterRestarted) throws IgniteCheckedException {
+ List<GridCacheAdapter> reconnected = new ArrayList<>(caches.size());
- caches.remove(cache.name());
- jCacheProxies.remove(cache.name());
+ ClusterCachesReconnectResult reconnectRes = cachesInfo.onReconnected();
- IgniteInternalFuture<?> fut = ctx.closure().runLocalSafe(new Runnable() {
- @Override public void run() {
- onKernalStop(cache, true);
- stopCache(cache, true, false);
- }
- });
+ final List<GridCacheAdapter> stoppedCaches = new ArrayList<>();
- if (stopFut == null)
- stopFut = new GridCompoundFuture<>();
+ for (final GridCacheAdapter cache : caches.values()) {
+ boolean stopped = reconnectRes.stoppedCacheGroups().contains(cache.context().groupId())
+ || reconnectRes.stoppedCaches().contains(cache.name());
- stopFut.add((IgniteInternalFuture)fut);
- }
+ if (stopped)
+ stopCacheOnReconnect(cache.context(), stoppedCaches);
else {
cache.onReconnected();
@@ -1108,7 +1143,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
DynamicCacheDescriptor desc = cacheDescriptor(cctx.name());
- assert desc != null;
+ assert desc != null : cctx.name();
ctx.query().onCacheStop0(cctx.name());
ctx.query().onCacheStart0(cctx, desc.schema());
@@ -1116,13 +1151,37 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
}
+ final Set<Integer> stoppedGrps = reconnectRes.stoppedCacheGroups();
+
+ for (CacheGroupContext grp : cacheGrps.values()) {
+ if (stoppedGrps.contains(grp.groupId()))
+ cacheGrps.remove(grp.groupId());
+ else
+ grp.onReconnected();
+ }
+
sharedCtx.onReconnected();
for (GridCacheAdapter cache : reconnected)
cache.context().gate().reconnected(false);
- if (stopFut != null)
- stopFut.markInitialized();
+ IgniteInternalFuture<?> stopFut = null;
+
+ if (!stoppedCaches.isEmpty()) {
+ stopFut = ctx.closure().runLocalSafe(new Runnable() {
+ @Override public void run() {
+ for (GridCacheAdapter cache : stoppedCaches) {
+ CacheGroupContext grp = cache.context().group();
+
+ onKernalStop(cache, true);
+ stopCache(cache, true, false);
+
+ if (!grp.hasCaches())
+ stopCacheGroup(grp);
+ }
+ }
+ });
+ }
return stopFut;
}
@@ -1136,8 +1195,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
private void startCache(GridCacheAdapter<?, ?> cache, QuerySchema schema) throws IgniteCheckedException {
GridCacheContext<?, ?> cacheCtx = cache.context();
- ctx.continuous().onCacheStart(cacheCtx);
-
if (sharedCtx.pageStore() != null)
sharedCtx.pageStore().initializeForCache(cacheCtx.config());
@@ -1171,16 +1228,22 @@ public class GridCacheProcessor extends GridProcessorAdapter {
log.debug("Started DHT cache: " + dhtCtx.cache().name());
}
+ ctx.continuous().onCacheStart(cacheCtx);
+
cacheCtx.cache().start();
ctx.query().onCacheStart(cacheCtx, schema);
cacheCtx.onStarted();
- if (log.isInfoEnabled())
- log.info("Started cache [name=" + U.maskName(cfg.getName()) +
- ", memoryPolicyName=" + cfg.getMemoryPolicyName() + ", mode=" + cfg.getCacheMode() +
+
+ if (log.isInfoEnabled()) {
+ log.info("Started cache [name=" + cfg.getName() +
+ (cfg.getGroupName() != null ? ", group=" + cfg.getGroupName() : "") +
+ ", memoryPolicyName=" + cfg.getMemoryPolicyName() +
+ ", mode=" + cfg.getCacheMode() +
", atomicity=" + cfg.getAtomicityMode() + ']');
+}
}
/**
@@ -1242,10 +1305,16 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ctx.kernalContext().cache().context().database().onCacheStop(ctx);
- U.stopLifecycleAware(log, lifecycleAwares(cache.configuration(), ctx.store().configuredStore()));
+ ctx.group().stopCache(ctx, destroy);
- if (log.isInfoEnabled())
- log.info("Stopped cache: " + cache.name());
+ U.stopLifecycleAware(log, lifecycleAwares(ctx.group(), cache.configuration(), ctx.store().configuredStore()));
+
+ if (log.isInfoEnabled()) {
+ if (ctx.group().sharedGroup())
+ log.info("Stopped cache [cacheName=" + cache.name() + ", group=" + ctx.group().name() + ']');
+ else
+ log.info("Stopped cache [cacheName=" + cache.name() + ']');
+ }
if (sharedCtx.pageStore() != null) {
try {
@@ -1344,6 +1413,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
/**
* @param cfg Cache configuration to use to create cache.
+ * @param grp Cache group.
* @param pluginMgr Cache plugin manager.
* @param desc Cache descriptor.
* @param locStartTopVer Current topology version.
@@ -1354,6 +1424,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @throws IgniteCheckedException If failed to create cache.
*/
private GridCacheContext createCache(CacheConfiguration<?, ?> cfg,
+ CacheGroupContext grp,
@Nullable CachePluginManager pluginMgr,
DynamicCacheDescriptor desc,
AffinityTopologyVersion locStartTopVer,
@@ -1398,7 +1469,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
prepare(cfg, toPrepare);
- U.startLifecycleAware(lifecycleAwares(cfg, cfgStore));
+ U.startLifecycleAware(lifecycleAwares(grp, cfg, cfgStore));
boolean nearEnabled = GridCacheUtils.isNearEnabled(cfg);
@@ -1413,29 +1484,18 @@ public class GridCacheProcessor extends GridProcessorAdapter {
CacheConflictResolutionManager rslvrMgr = pluginMgr.createComponent(CacheConflictResolutionManager.class);
GridCacheDrManager drMgr = pluginMgr.createComponent(GridCacheDrManager.class);
CacheStoreManager storeMgr = pluginMgr.createComponent(CacheStoreManager.class);
- IgniteCacheOffheapManager offheapMgr = pluginMgr.createComponent(IgniteCacheOffheapManager.class);
storeMgr.initialize(cfgStore, sesHolders);
- String memPlcName = cfg.getMemoryPolicyName();
-
- MemoryPolicy memPlc = sharedCtx.database().memoryPolicy(memPlcName);
- FreeList freeList = sharedCtx.database().freeList(memPlcName);
- ReuseList reuseList = sharedCtx.database().reuseList(memPlcName);
-
GridCacheContext<?, ?> cacheCtx = new GridCacheContext(
ctx,
sharedCtx,
cfg,
+ grp,
desc.cacheType(),
locStartTopVer,
- desc.receivedFrom(),
affNode,
updatesAllowed,
- memPlc,
- freeList,
- reuseList,
-
/*
* Managers in starting order!
* ===========================
@@ -1448,7 +1508,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
dataStructuresMgr,
ttlMgr,
drMgr,
- offheapMgr,
rslvrMgr,
pluginMgr,
affMgr
@@ -1504,14 +1563,14 @@ public class GridCacheProcessor extends GridProcessorAdapter {
case TRANSACTIONAL: {
cache = cacheCtx.affinityNode() ?
new GridDhtColocatedCache(cacheCtx) :
- new GridDhtColocatedCache(cacheCtx, new GridNoStorageCacheMap(cacheCtx));
+ new GridDhtColocatedCache(cacheCtx, new GridNoStorageCacheMap());
break;
}
case ATOMIC: {
cache = cacheCtx.affinityNode() ?
new GridDhtAtomicCache(cacheCtx) :
- new GridDhtAtomicCache(cacheCtx, new GridNoStorageCacheMap(cacheCtx));
+ new GridDhtAtomicCache(cacheCtx, new GridNoStorageCacheMap());
break;
}
@@ -1560,15 +1619,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ctx,
sharedCtx,
cfg,
+ grp,
desc.cacheType(),
locStartTopVer,
- desc.receivedFrom(),
affNode,
true,
- memPlc,
- freeList,
- reuseList,
-
/*
* Managers in starting order!
* ===========================
@@ -1581,7 +1636,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
dataStructuresMgr,
ttlMgr,
drMgr,
- offheapMgr,
rslvrMgr,
pluginMgr,
affMgr
@@ -1599,7 +1653,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
GridDhtCache dhtCache = cacheCtx.affinityNode() ?
new GridDhtCache(cacheCtx) :
- new GridDhtCache(cacheCtx, new GridNoStorageCacheMap(cacheCtx));
+ new GridDhtCache(cacheCtx, new GridNoStorageCacheMap());
dhtCache.near(near);
@@ -1616,7 +1670,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
GridDhtAtomicCache dhtCache = cacheCtx.affinityNode() ?
new GridDhtAtomicCache(cacheCtx) :
- new GridDhtAtomicCache(cacheCtx, new GridNoStorageCacheMap(cacheCtx));
+ new GridDhtAtomicCache(cacheCtx, new GridNoStorageCacheMap());
dhtCache.near(near);
@@ -1649,11 +1703,12 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @return Collection of started cache names.
*/
public Collection<String> cacheNames() {
- return F.viewReadOnly(cacheDescriptors(), new IgniteClosure<DynamicCacheDescriptor, String>() {
- @Override public String apply(DynamicCacheDescriptor desc) {
- return desc.cacheConfiguration().getName();
- }
- });
+ return F.viewReadOnly(cacheDescriptors().values(),
+ new IgniteClosure<DynamicCacheDescriptor, String>() {
+ @Override public String apply(DynamicCacheDescriptor desc) {
+ return desc.cacheConfiguration().getName();
+ }
+ });
}
/**
@@ -1698,7 +1753,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @return Collection of currently started public cache names
*/
public Collection<String> publicCacheNames() {
- return F.viewReadOnly(cacheDescriptors(),
+ return F.viewReadOnly(cacheDescriptors().values(),
new IgniteClosure<DynamicCacheDescriptor, String>() {
@Override public String apply(DynamicCacheDescriptor desc) {
return desc.cacheConfiguration().getName();
@@ -1737,6 +1792,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
AffinityTopologyVersion exchTopVer)
throws IgniteCheckedException {
prepareCacheStart(
+ cacheDesc.groupDescriptor(),
cacheDesc.cacheConfiguration(),
nearCfg,
cacheDesc,
@@ -1757,6 +1813,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
DynamicCacheDescriptor desc = t.get1();
prepareCacheStart(
+ desc.groupDescriptor(),
desc.cacheConfiguration(),
t.get2(),
desc,
@@ -1781,10 +1838,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
if (started != null) {
for (DynamicCacheDescriptor desc : started) {
- IgnitePredicate<ClusterNode> filter = desc.cacheConfiguration().getNodeFilter();
+ IgnitePredicate<ClusterNode> filter = desc.groupDescriptor().config().getNodeFilter();
if (CU.affinityNode(ctx.discovery().localNode(), filter)) {
prepareCacheStart(
+ desc.groupDescriptor(),
desc.cacheConfiguration(),
null,
desc,
@@ -1799,6 +1857,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
/**
+ * @param grpDesc Cache group descriptor.
* @param startCfg Start configuration.
* @param reqNearCfg Near configuration if specified for client cache start request.
* @param desc Cache descriptor.
@@ -1807,6 +1866,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @throws IgniteCheckedException If failed.
*/
private void prepareCacheStart(
+ CacheGroupDescriptor grpDesc,
CacheConfiguration startCfg,
@Nullable NearCacheConfiguration reqNearCfg,
DynamicCacheDescriptor desc,
@@ -1826,7 +1886,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ccfg.setNearConfiguration(null);
}
- else if (CU.affinityNode(ctx.discovery().localNode(), ccfg.getNodeFilter()))
+ else if (CU.affinityNode(ctx.discovery().localNode(), grpDesc.config().getNodeFilter()))
affNode = true;
else {
affNode = false;
@@ -1834,7 +1894,37 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ccfg.setNearConfiguration(reqNearCfg);
}
+ String grpName = startCfg.getGroupName();
+
+ CacheGroupContext grp = null;
+
+ if (grpName != null) {
+ for (CacheGroupContext grp0 : cacheGrps.values()) {
+ if (grp0.sharedGroup() && grpName.equals(grp0.name())) {
+ grp = grp0;
+
+ break;
+ }
+ }
+
+ if (grp == null) {
+ grp = startCacheGroup(grpDesc,
+ desc.cacheType(),
+ affNode,
+ cacheObjCtx,
+ exchTopVer);
+ }
+ }
+ else {
+ grp = startCacheGroup(grpDesc,
+ desc.cacheType(),
+ affNode,
+ cacheObjCtx,
+ exchTopVer);
+ }
+
GridCacheContext cacheCtx = createCache(ccfg,
+ grp,
null,
desc,
exchTopVer,
@@ -1852,10 +1942,62 @@ public class GridCacheProcessor extends GridProcessorAdapter {
startCache(cache, schema != null ? schema : new QuerySchema());
+ grp.onCacheStarted(cacheCtx);
+
onKernalStart(cache);
}
/**
+ * @param desc Group descriptor.
+ * @param cacheType Cache type.
+ * @param affNode Affinity node flag.
+ * @param cacheObjCtx Cache object context.
+ * @param exchTopVer Current topology version.
+ * @return Started cache group.
+ * @throws IgniteCheckedException If failed.
+ */
+ private CacheGroupContext startCacheGroup(
+ CacheGroupDescriptor desc,
+ CacheType cacheType,
+ boolean affNode,
+ CacheObjectContext cacheObjCtx,
+ AffinityTopologyVersion exchTopVer)
+ throws IgniteCheckedException {
+ CacheConfiguration cfg = new CacheConfiguration(desc.config());
+
+ String memPlcName = cfg.getMemoryPolicyName();
+
+ MemoryPolicy memPlc = sharedCtx.database().memoryPolicy(memPlcName);
+ FreeList freeList = sharedCtx.database().freeList(memPlcName);
+ ReuseList reuseList = sharedCtx.database().reuseList(memPlcName);
+
+ CacheGroupContext grp = new CacheGroupContext(sharedCtx,
+ desc.groupId(),
+ desc.receivedFrom(),
+ cacheType,
+ cfg,
+ affNode,
+ memPlc,
+ cacheObjCtx,
+ freeList,
+ reuseList,
+ exchTopVer);
+
+ for (Object obj : grp.configuredUserObjects())
+ prepare(cfg, obj, false);
+
+ U.startLifecycleAware(grp.configuredUserObjects());
+
+ grp.start();
+
+ CacheGroupContext old = cacheGrps.put(desc.groupId(), grp);
+
+ assert old == null : old.name();
+
+ return grp;
+ }
+
+ /**
* @param req Stop request.
*/
void blockGateway(DynamicCacheChangeRequest req) {
@@ -1889,8 +2031,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
/**
* @param req Stop request.
+ * @return Cache group for stopped cache.
*/
- private void prepareCacheStop(DynamicCacheChangeRequest req, boolean forceClose) {
+ private CacheGroupContext prepareCacheStop(DynamicCacheChangeRequest req, boolean forceClose) {
assert req.stop() || req.close() || forceClose : req;
GridCacheAdapter<?, ?> cache = caches.remove(req.cacheName());
@@ -1903,7 +2046,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
onKernalStop(cache, req.destroy());
stopCache(cache, true, req.destroy());
+
+ return ctx.group();
}
+
+ return null;
}
/**
@@ -1919,8 +2066,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
Throwable err
) {
ExchangeActions actions = new ExchangeActions(){
- @Override List<DynamicCacheChangeRequest> closeRequests(UUID nodeId) {
- return Collections.singletonList(act.request());
+ @Override List<ActionData> closeRequests(UUID nodeId) {
+ return Collections.singletonList(act);
}
};
@@ -1959,8 +2106,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
prepareCacheStop(action.request(), forceClose);
}
- for (DynamicCacheChangeRequest req : exchActions.closeRequests(ctx.localNodeId())) {
- String cacheName = req.cacheName();
+ for (CacheGroupDescriptor grpDesc : exchActions.cacheGroupsToStop())
+ stopCacheGroup(grpDesc.groupId());
+
+ for (ExchangeActions.ActionData req : exchActions.closeRequests(ctx.localNodeId())) {
+ String cacheName = req.request().cacheName();
IgniteCacheProxy<?, ?> proxy = jCacheProxies.get(cacheName);
@@ -1977,17 +2127,41 @@ public class GridCacheProcessor extends GridProcessorAdapter {
proxy.context().gate().onStopped();
- prepareCacheStop(req, forceClose);
+ CacheGroupContext grp = prepareCacheStop(req.request(), forceClose);
+
+ if (grp != null && !grp.hasCaches())
+ stopCacheGroup(grp.groupId());
}
}
if (forceClose)
- completeCacheStartFuture(req, false, err);
+ completeCacheStartFuture(req.request(), false, err);
}
}
}
/**
+ * @param grpId Group ID.
+ */
+ private void stopCacheGroup(int grpId) {
+ CacheGroupContext grp = cacheGrps.remove(grpId);
+
+ if (grp != null)
+ stopCacheGroup(grp);
+ }
+
+ /**
+ * @param grp Cache group.
+ */
+ private void stopCacheGroup(CacheGroupContext grp) {
+ grp.stopGroup();
+
+ U.stopLifecycleAware(log, grp.configuredUserObjects());
+
+ cleanup(grp);
+ }
+
+ /**
* @param cacheName Cache name.
* @param deploymentId Future deployment ID.
*/
@@ -2609,6 +2783,16 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
}
}
+ if (req.start() && req.startCacheConfiguration() != null) {
+ CacheConfiguration ccfg = req.startCacheConfiguration();
+
+ try {
+ cachesInfo.validateStartCacheConfiguration(ccfg);
+ }
+ catch (IgniteCheckedException e) {
+ fut.onDone(e);
+ }
+ }
if (fut.isDone())
continue;
@@ -2724,7 +2908,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
else if (rebalanceOrder < 0)
throw new IgniteCheckedException("Rebalance order cannot be negative for cache (fix configuration and restart " +
- "the node) [cacheName=" + U.maskName(cfg.getName()) + ", rebalanceOrder=" + rebalanceOrder + ']');
+ "the node) [cacheName=" + cfg.getName() + ", rebalanceOrder=" + rebalanceOrder + ']');
}
return maxOrder;
@@ -2741,7 +2925,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
*/
@Nullable private IgniteNodeValidationResult validateHashIdResolvers(ClusterNode node) {
if (!node.isClient()) {
- for (DynamicCacheDescriptor desc : cacheDescriptors()) {
+ for (DynamicCacheDescriptor desc : cacheDescriptors().values()) {
CacheConfiguration cfg = desc.cacheConfiguration();
if (cfg.getAffinity() instanceof RendezvousAffinityFunction) {
@@ -2755,11 +2939,11 @@ public class GridCacheProcessor extends GridProcessorAdapter {
if (nodeHashObj.hashCode() == topNodeHashObj.hashCode()) {
String errMsg = "Failed to add node to topology because it has the same hash code for " +
"partitioned affinity as one of existing nodes [cacheName=" +
- U.maskName(cfg.getName()) + ", existingNodeId=" + topNode.id() + ']';
+ cfg.getName() + ", existingNodeId=" + topNode.id() + ']';
String sndMsg = "Failed to add node to topology because it has the same hash code for " +
"partitioned affinity as one of existing nodes [cacheName=" +
- U.maskName(cfg.getName()) + ", existingNodeId=" + topNode.id() + ']';
+ cfg.getName() + ", existingNodeId=" + topNode.id() + ']';
return new IgniteNodeValidationResult(topNode.id(), errMsg, sndMsg);
}
@@ -3018,8 +3202,15 @@ public class GridCacheProcessor extends GridProcessorAdapter {
/**
* @return Cache descriptors.
*/
- public Collection<DynamicCacheDescriptor> cacheDescriptors() {
- return cachesInfo.registeredCaches().values();
+ public Map<String, DynamicCacheDescriptor> cacheDescriptors() {
+ return cachesInfo.registeredCaches();
+ }
+
+ /**
+ * @return Cache group descriptors.
+ */
+ public Map<Integer, CacheGroupDescriptor> cacheGroupDescriptors() {
+ return cachesInfo.registeredCacheGroups();
}
/**
@@ -3027,7 +3218,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
* @return Cache descriptor.
*/
@Nullable public DynamicCacheDescriptor cacheDescriptor(int cacheId) {
- for (DynamicCacheDescriptor cacheDesc : cacheDescriptors()) {
+ for (DynamicCacheDescriptor cacheDesc : cacheDescriptors().values()) {
CacheConfiguration ccfg = cacheDesc.cacheConfiguration();
assert ccfg != null : cacheDesc;
@@ -3321,19 +3512,21 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
/**
+ * @param grp Cache group.
* @param ccfg Cache configuration.
* @param objs Extra components.
* @return Components provided in cache configuration which can implement {@link LifecycleAware} interface.
*/
- private Iterable<Object> lifecycleAwares(CacheConfiguration ccfg, Object... objs) {
+ private Iterable<Object> lifecycleAwares(CacheGroupContext grp, CacheConfiguration ccfg, Object... objs) {
Collection<Object> ret = new ArrayList<>(7 + objs.length);
- ret.add(ccfg.getAffinity());
+ if (grp.affinityFunction() != ccfg.getAffinity())
+ ret.add(ccfg.getAffinity());
+
ret.add(ccfg.getAffinityMapper());
ret.add(ccfg.getEvictionFilter());
ret.add(ccfg.getEvictionPolicy());
ret.add(ccfg.getInterceptor());
- ret.add(ccfg.getTopologyValidator());
NearCacheConfiguration nearCfg = ccfg.getNearConfiguration();
@@ -3704,12 +3897,12 @@ public class GridCacheProcessor extends GridProcessorAdapter {
ctx.closure().runLocalSafe(new Runnable() {
@Override public void run() {
try {
- for (GridCacheContext cacheCtx : sharedCtx.cacheContexts()) {
- if (!cacheCtx.isLocal() && cacheCtx.affinityNode()) {
+ for (CacheGroupContext grp : sharedCtx.cache().cacheGroups()) {
+ if (!grp.isLocal() && grp.affinityNode()) {
GridDhtPartitionTopology top = null;
try {
- top = cacheCtx.topology();
+ top = grp.topology();
}
catch (IllegalStateException ignore) {
// Cache stopped.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
index 1df74ef..050e102 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
@@ -407,7 +407,7 @@ public class GridCacheSharedContext<K, V> {
/**
* @param cacheCtx Cache context to remove.
*/
- public void removeCacheContext(GridCacheContext cacheCtx) {
+ void removeCacheContext(GridCacheContext cacheCtx) {
int cacheId = cacheCtx.cacheId();
ctxMap.remove(cacheId, cacheCtx);
@@ -418,7 +418,7 @@ public class GridCacheSharedContext<K, V> {
locStoreCnt.decrementAndGet();
// Safely clean up the message listeners.
- ioMgr.removeHandlers(cacheId);
+ ioMgr.removeCacheHandlers(cacheId);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManager.java
index 614b3e3..e7e6aec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheTtlManager.java
@@ -38,7 +38,13 @@ import org.jsr166.LongAdder8;
*/
public class GridCacheTtlManager extends GridCacheManagerAdapter {
/** Entries pending removal. */
- private GridConcurrentSkipListSetEx pendingEntries;
+ private GridConcurrentSkipListSetEx pendingEntries;
+
+ /** */
+ private boolean eagerTtlEnabled;
+
+ /** */
+ private GridCacheContext dhtCtx;
/** */
private final IgniteInClosure2X<GridCacheEntryEx, GridCacheVersion> expireC =
@@ -70,6 +76,8 @@ public class GridCacheTtlManager extends GridCacheManagerAdapter {
/** {@inheritDoc} */
@Override protected void start0() throws IgniteCheckedException {
+ dhtCtx = cctx.isNear() ? cctx.near().dht().context() : cctx;
+
boolean cleanupDisabled = cctx.kernalContext().isDaemon() ||
!cctx.config().isEagerTtl() ||
CU.isAtomicsCache(cctx.name()) ||
@@ -79,11 +87,20 @@ public class GridCacheTtlManager extends GridCacheManagerAdapter {
if (cleanupDisabled)
return;
+ eagerTtlEnabled = true;
+
cctx.shared().ttl().register(this);
pendingEntries = (!cctx.isLocal() && cctx.config().getNearConfiguration() != null) ? new GridConcurrentSkipListSetEx() : null;
}
+ /**
+ * @return {@code True} if eager ttl is enabled for cache.
+ */
+ public boolean eagerTtlEnabled() {
+ return eagerTtlEnabled;
+ }
+
/** {@inheritDoc} */
@Override protected void onKernalStop0(boolean cancel) {
if (pendingEntries != null)
@@ -153,7 +170,6 @@ public class GridCacheTtlManager extends GridCacheManagerAdapter {
try {
if (pendingEntries != null) {
- //todo may be not only for near? may be for local too.
GridNearCacheAdapter nearCache = cctx.near();
GridCacheVersion obsoleteVer = null;
@@ -178,7 +194,7 @@ public class GridCacheTtlManager extends GridCacheManagerAdapter {
}
}
- boolean more = cctx.offheap().expire(expireC, amount);
+ boolean more = cctx.offheap().expire(dhtCtx, expireC, amount);
if (more)
return true;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index 27dd23d..7123c0b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -468,7 +468,7 @@ public class GridCacheUtils {
* @return All nodes on which cache with the same name is started.
*/
public static Collection<ClusterNode> affinityNodes(final GridCacheContext ctx) {
- return ctx.discovery().cacheAffinityNodes(ctx.cacheId(), AffinityTopologyVersion.NONE);
+ return ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), AffinityTopologyVersion.NONE);
}
/**
@@ -479,7 +479,7 @@ public class GridCacheUtils {
* @return Affinity nodes.
*/
public static Collection<ClusterNode> affinityNodes(GridCacheContext ctx, AffinityTopologyVersion topOrder) {
- return ctx.discovery().cacheAffinityNodes(ctx.cacheId(), topOrder);
+ return ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), topOrder);
}
/**
@@ -990,6 +990,44 @@ public class GridCacheUtils {
}
}
}
+ /**
+ * @param cfg1 Existing configuration.
+ * @param cfg2 Cache configuration to start.
+ * @param attrName Short attribute name for error message.
+ * @param attrMsg Full attribute name for error message.
+ * @param val1 Attribute value in existing configuration.
+ * @param val2 Attribute value in starting configuration.
+ * @param fail If true throws IgniteCheckedException in case of attribute values mismatch, otherwise logs warning.
+ * @throws IgniteCheckedException If validation failed.
+ */
+ public static void validateCacheGroupsAttributesMismatch(IgniteLogger log,
+ CacheConfiguration cfg1,
+ CacheConfiguration cfg2,
+ String attrName,
+ String attrMsg,
+ Object val1,
+ Object val2,
+ boolean fail) throws IgniteCheckedException {
+ if (F.eq(val1, val2))
+ return;
+
+ if (fail) {
+ throw new IgniteCheckedException(attrMsg + " mismatch for caches related to the same group " +
+ "[groupName=" + cfg1.getGroupName() +
+ ", existingCache=" + cfg1.getName() +
+ ", existing" + capitalize(attrName) + "=" + val1 +
+ ", startingCache=" + cfg2.getName() +
+ ", starting" + capitalize(attrName) + "=" + val2 + ']');
+ }
+ else {
+ U.warn(log, attrMsg + " mismatch for caches related to the same group " +
+ "[groupName=" + cfg1.getGroupName() +
+ ", existingCache=" + cfg1.getName() +
+ ", existing" + capitalize(attrName) + "=" + val1 +
+ ", startingCache=" + cfg2.getName() +
+ ", starting" + capitalize(attrName) + "=" + val2 + ']');
+ }
+ }
/**
* @param str String.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridChangeGlobalStateMessageResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridChangeGlobalStateMessageResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridChangeGlobalStateMessageResponse.java
index 62b67b1..a64c8bb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridChangeGlobalStateMessageResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridChangeGlobalStateMessageResponse.java
@@ -59,6 +59,16 @@ public class GridChangeGlobalStateMessageResponse extends GridCacheMessage {
this.err = err;
}
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
/**
*
*/
@@ -106,13 +116,13 @@ public class GridChangeGlobalStateMessageResponse extends GridCacheMessage {
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeByteArray("errBytes", errBytes))
return false;
writer.incrementState();
- case 4:
+ case 3:
if (!writer.writeUuid("requestId", requestId))
return false;
@@ -134,7 +144,7 @@ public class GridChangeGlobalStateMessageResponse extends GridCacheMessage {
return false;
switch (reader.state()) {
- case 3:
+ case 2:
errBytes = reader.readByteArray("errBytes");
if (!reader.isLastRead())
@@ -142,7 +152,7 @@ public class GridChangeGlobalStateMessageResponse extends GridCacheMessage {
reader.incrementState();
- case 4:
+ case 3:
requestId = reader.readUuid("requestId");
if (!reader.isLastRead())
@@ -162,7 +172,7 @@ public class GridChangeGlobalStateMessageResponse extends GridCacheMessage {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 5;
+ return 4;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridNoStorageCacheMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridNoStorageCacheMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridNoStorageCacheMap.java
index 5e52c8b..77a9ba4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridNoStorageCacheMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridNoStorageCacheMap.java
@@ -22,30 +22,19 @@ import java.util.Collections;
import java.util.Set;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
import org.jetbrains.annotations.Nullable;
/**
* Empty cache map that will never store any entries.
*/
public class GridNoStorageCacheMap implements GridCacheConcurrentMap {
- /** Context. */
- private final GridCacheContext ctx;
-
- /**
- * @param ctx Cache context.
- */
- public GridNoStorageCacheMap(GridCacheContext ctx) {
- this.ctx = ctx;
- }
-
/** {@inheritDoc} */
- @Nullable @Override public GridCacheMapEntry getEntry(KeyCacheObject key) {
+ @Nullable @Override public GridCacheMapEntry getEntry(GridCacheContext ctx, KeyCacheObject key) {
return null;
}
/** {@inheritDoc} */
- @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(AffinityTopologyVersion topVer,
+ @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(GridCacheContext ctx, AffinityTopologyVersion topVer,
KeyCacheObject key,
boolean create,
boolean touch) {
@@ -66,32 +55,27 @@ public class GridNoStorageCacheMap implements GridCacheConcurrentMap {
}
/** {@inheritDoc} */
- @Override public int publicSize() {
+ @Override public int publicSize(int cacheId) {
return 0;
}
/** {@inheritDoc} */
- @Override public void incrementPublicSize(GridCacheEntryEx e) {
+ @Override public void incrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
// No-op.
}
/** {@inheritDoc} */
- @Override public void decrementPublicSize(GridCacheEntryEx e) {
+ @Override public void decrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
// No-op.
}
/** {@inheritDoc} */
- @Override public Iterable<GridCacheMapEntry> entries(CacheEntryPredicate... filter) {
- return Collections.emptySet();
- }
-
- /** {@inheritDoc} */
- @Override public Iterable<GridCacheMapEntry> allEntries(CacheEntryPredicate... filter) {
+ @Override public Iterable<GridCacheMapEntry> entries(int cacheId, CacheEntryPredicate... filter) {
return Collections.emptySet();
}
/** {@inheritDoc} */
- @Override public Set<GridCacheMapEntry> entrySet(CacheEntryPredicate... filter) {
+ @Override public Set<GridCacheMapEntry> entrySet(int cacheId, CacheEntryPredicate... filter) {
return Collections.emptySet();
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
index b476aeb..2f7d945 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
@@ -38,7 +38,36 @@ import org.jetbrains.annotations.Nullable;
*
*/
@SuppressWarnings("WeakerAccess")
-public interface IgniteCacheOffheapManager extends GridCacheManager {
+public interface IgniteCacheOffheapManager {
+ /**
+ * @param ctx Context.
+ * @param grp Cache group.
+ * @throws IgniteCheckedException If failed.
+ */
+ public void start(GridCacheSharedContext ctx, CacheGroupContext grp) throws IgniteCheckedException;;
+
+ /**
+ * @param cctx Cache context.
+ * @throws IgniteCheckedException If failed.
+ */
+ public void onCacheStarted(GridCacheContext cctx) throws IgniteCheckedException;
+
+ /**
+ *
+ */
+ public void onKernalStop();
+
+ /**
+ * @param cacheId Cache ID.
+ * @param destroy Destroy data flag.
+ */
+ public void stopCache(int cacheId, boolean destroy);
+
+ /**
+ *
+ */
+ public void stop();
+
/**
* Partition counter update callback. May be overridden by plugin-provided subclasses.
*
@@ -71,11 +100,12 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
@Nullable public CacheDataRow read(GridCacheMapEntry entry) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @return Cached row, if available, null otherwise.
* @throws IgniteCheckedException If failed.
*/
- @Nullable public CacheDataRow read(KeyCacheObject key) throws IgniteCheckedException;
+ @Nullable public CacheDataRow read(GridCacheContext cctx, KeyCacheObject key) throws IgniteCheckedException;
/**
* @param p Partition.
@@ -98,6 +128,7 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
/**
* @param p Partition ID.
* @param store Data store.
+ * @throws IgniteCheckedException If failed.
*/
public void destroyCacheDataStore(int p, CacheDataStore store) throws IgniteCheckedException;
@@ -107,10 +138,12 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public boolean containsKey(GridCacheMapEntry entry);
/**
+ * @param cctx Cache context.
* @param c Closure.
* @throws IgniteCheckedException If failed.
*/
- public boolean expire(IgniteInClosure2X<GridCacheEntryEx, GridCacheVersion> c, int amount) throws IgniteCheckedException;
+ public boolean expire(GridCacheContext cctx, IgniteInClosure2X<GridCacheEntryEx, GridCacheVersion> c, int amount)
+ throws IgniteCheckedException;
/**
* Gets the number of entries pending expire.
@@ -121,15 +154,17 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public long expiredSize() throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param part Partition.
* @param c Tree update closure.
* @throws IgniteCheckedException If failed.
*/
- public void invoke(KeyCacheObject key, GridDhtLocalPartition part, OffheapInvokeClosure c)
+ public void invoke(GridCacheContext cctx, KeyCacheObject key, GridDhtLocalPartition part, OffheapInvokeClosure c)
throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param val Value.
* @param ver Version.
@@ -140,6 +175,7 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
* @throws IgniteCheckedException If failed.
*/
public void update(
+ GridCacheContext cctx,
KeyCacheObject key,
CacheObject val,
GridCacheVersion ver,
@@ -150,12 +186,14 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param partId Partition number.
* @param part Partition.
* @throws IgniteCheckedException If failed.
*/
public void remove(
+ GridCacheContext cctx,
KeyCacheObject key,
int partId,
GridDhtLocalPartition part
@@ -168,24 +206,37 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public int onUndeploy(ClassLoader ldr);
/**
+ * @param cacheId Cache ID.
* @param primary Primary entries flag.
* @param backup Backup entries flag.
* @param topVer Topology version.
* @return Rows iterator.
* @throws IgniteCheckedException If failed.
*/
- public GridIterator<CacheDataRow> iterator(boolean primary, boolean backup, final AffinityTopologyVersion topVer)
+ public GridIterator<CacheDataRow> cacheIterator(int cacheId,
+ boolean primary,
+ boolean backup,
+ final AffinityTopologyVersion topVer)
throws IgniteCheckedException;
/**
+ * @param cacheId Cache ID.
* @param part Partition.
* @return Partition data iterator.
* @throws IgniteCheckedException If failed.
*/
- public GridIterator<CacheDataRow> iterator(final int part) throws IgniteCheckedException;
+ public GridIterator<CacheDataRow> cachePartitionIterator(int cacheId, final int part) throws IgniteCheckedException;
+
+ /**
+ * @param part Partition number.
+ * @return Iterator for given partition.
+ * @throws IgniteCheckedException If failed.
+ */
+ public GridIterator<CacheDataRow> partitionIterator(final int part) throws IgniteCheckedException;
/**
* @param part Partition.
+ * @param topVer Topology version.
* @param partCntr Partition counter to get historical data if available.
* @return Partition data iterator.
* @throws IgniteCheckedException If failed.
@@ -194,6 +245,7 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param primary Primary entries flag.
* @param backup Backup entries flag.
* @param topVer Topology version.
@@ -201,40 +253,47 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
* @return Entries iterator.
* @throws IgniteCheckedException If failed.
*/
- public <K, V> GridCloseableIterator<Cache.Entry<K, V>> entriesIterator(final boolean primary,
+ public <K, V> GridCloseableIterator<Cache.Entry<K, V>> cacheEntriesIterator(
+ GridCacheContext cctx,
+ final boolean primary,
final boolean backup,
final AffinityTopologyVersion topVer,
final boolean keepBinary) throws IgniteCheckedException;
/**
+ * @param cacheId Cache ID.
* @param part Partition.
* @return Iterator.
* @throws IgniteCheckedException If failed.
*/
- public GridCloseableIterator<KeyCacheObject> keysIterator(final int part) throws IgniteCheckedException;
+ public GridCloseableIterator<KeyCacheObject> cacheKeysIterator(int cacheId, final int part)
+ throws IgniteCheckedException;
/**
+ * @param cacheId Cache ID.
* @param primary Primary entries flag.
* @param backup Backup entries flag.
* @param topVer Topology version.
* @return Entries count.
* @throws IgniteCheckedException If failed.
*/
- public long entriesCount(boolean primary, boolean backup, AffinityTopologyVersion topVer)
+ public long cacheEntriesCount(int cacheId, boolean primary, boolean backup, AffinityTopologyVersion topVer)
throws IgniteCheckedException;
/**
* Clears offheap entries.
*
+ * @param cctx Cache context.
* @param readers {@code True} to clear readers.
*/
- public void clear(boolean readers);
+ public void clearCache(GridCacheContext cctx, boolean readers);
/**
+ * @param cacheId Cache ID.
* @param part Partition.
* @return Number of entries in given partition.
*/
- public long entriesCount(int part);
+ public long cacheEntriesCount(int cacheId, int part);
/**
* @return Offheap allocated size.
@@ -260,15 +319,17 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public void dropRootPageForIndex(String idxName) throws IgniteCheckedException;
/**
+ * @param idxName Index name.
* @return Reuse list for index tree.
+ * @throws IgniteCheckedException If failed.
*/
public ReuseList reuseListForIndex(String idxName) throws IgniteCheckedException;
/**
- *
+ * @param cacheId Cache ID.
* @return Number of entries.
*/
- public long entriesCount();
+ public long cacheEntriesCount(int cacheId);
/**
*
@@ -301,9 +362,15 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
void init(long size, long updCntr);
/**
+ * @param cacheId Cache ID.
* @return Size.
*/
- int size();
+ int cacheSize(int cacheId);
+
+ /**
+ * @return Total size.
+ */
+ int fullSize();
/**
* @return Update counter.
@@ -326,6 +393,7 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public Long initialUpdateCounter();
/**
+ * @param cctx Cache context.
* @param key Key.
* @param val Value.
* @param ver Version.
@@ -334,13 +402,16 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
* @return New row.
* @throws IgniteCheckedException If failed.
*/
- CacheDataRow createRow(KeyCacheObject key,
+ CacheDataRow createRow(
+ GridCacheContext cctx,
+ KeyCacheObject key,
CacheObject val,
GridCacheVersion ver,
long expireTime,
@Nullable CacheDataRow oldRow) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param part Partition.
* @param val Value.
@@ -349,7 +420,9 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
* @param oldRow Old row if available.
* @throws IgniteCheckedException If failed.
*/
- void update(KeyCacheObject key,
+ void update(
+ GridCacheContext cctx,
+ KeyCacheObject key,
int part,
CacheObject val,
GridCacheVersion ver,
@@ -357,25 +430,28 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
@Nullable CacheDataRow oldRow) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param c Closure.
* @throws IgniteCheckedException If failed.
*/
- public void invoke(KeyCacheObject key, OffheapInvokeClosure c) throws IgniteCheckedException;
+ public void invoke(GridCacheContext cctx, KeyCacheObject key, OffheapInvokeClosure c) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @param partId Partition number.
* @throws IgniteCheckedException If failed.
*/
- public void remove(KeyCacheObject key, int partId) throws IgniteCheckedException;
+ public void remove(GridCacheContext cctx, KeyCacheObject key, int partId) throws IgniteCheckedException;
/**
+ * @param cctx Cache context.
* @param key Key.
* @return Data row.
* @throws IgniteCheckedException If failed.
*/
- public CacheDataRow find(KeyCacheObject key) throws IgniteCheckedException;
+ public CacheDataRow find(GridCacheContext cctx, KeyCacheObject key) throws IgniteCheckedException;
/**
* @return Data cursor.
@@ -384,15 +460,34 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public GridCursor<? extends CacheDataRow> cursor() throws IgniteCheckedException;
/**
+ * @param cacheId Cache ID.
+ * @return Data cursor.
+ * @throws IgniteCheckedException If failed.
+ */
+ public GridCursor<? extends CacheDataRow> cursor(int cacheId) throws IgniteCheckedException;
+
+ /**
+ * @param cacheId Cache ID.
* @param lower Lower bound.
* @param upper Upper bound.
* @return Data cursor.
* @throws IgniteCheckedException If failed.
*/
- public GridCursor<? extends CacheDataRow> cursor(KeyCacheObject lower,
+ public GridCursor<? extends CacheDataRow> cursor(int cacheId, KeyCacheObject lower,
KeyCacheObject upper) throws IgniteCheckedException;
/**
+ * @param cacheId Cache ID.
+ * @param lower Lower bound.
+ * @param upper Upper bound.
+ * @param x Implementation specific argument, {@code null} always means that we need to return full detached data row.
+ * @return Data cursor.
+ * @throws IgniteCheckedException If failed.
+ */
+ public GridCursor<? extends CacheDataRow> cursor(int cacheId, KeyCacheObject lower,
+ KeyCacheObject upper, Object x) throws IgniteCheckedException;
+
+ /**
* Destroys the tree associated with the store.
*
* @throws IgniteCheckedException If failed.
@@ -400,6 +495,14 @@ public interface IgniteCacheOffheapManager extends GridCacheManager {
public void destroy() throws IgniteCheckedException;
/**
+ * Clears all the records associated with logical cache with given ID.
+ *
+ * @param cacheId Cache ID.
+ * @throws IgniteCheckedException If failed.
+ */
+ public void clear(int cacheId) throws IgniteCheckedException;
+
+ /**
* @return Row store.
*/
public RowStore rowStore();
[21/22] ignite git commit: ignite-5125 Do not limit number of hanging
objects dumps, instead increase time between dumps.
Posted by sb...@apache.org.
ignite-5125 Do not limit number of hanging objects dumps, instead increase time between dumps.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/808ad9fe
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/808ad9fe
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/808ad9fe
Branch: refs/heads/ignite-5293
Commit: 808ad9fe4b339dbe86ae96c1915c5aa5ea0521c7
Parents: ec5c3a2
Author: Evgeny Stanilovskiy <es...@gridgain.com>
Authored: Tue Jun 6 17:58:44 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Jun 6 17:58:44 2017 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 3 +
.../GridCachePartitionExchangeManager.java | 129 ++++++++++---------
.../dht/GridDhtPartitionTopologyImpl.java | 6 +-
.../GridDhtPartitionsExchangeFuture.java | 56 +++++---
4 files changed, 117 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/808ad9fe/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index ea4b690..84f3732 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -451,6 +451,9 @@ public final class IgniteSystemProperties {
/** Cache operations that take more time than value of this property will be output to log. Set to {@code 0} to disable. */
public static final String IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT = "IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT";
+ /** Upper time limit between long running/hanging operations debug dumps. */
+ public static final String IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT_LIMIT = "IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT_LIMIT";
+
/** JDBC driver cursor remove delay. */
public static final String IGNITE_JDBC_DRIVER_CURSOR_REMOVE_DELAY = "IGNITE_JDBC_DRIVER_CURSOR_RMV_DELAY";
http://git-wip-us.apache.org/repos/asf/ignite/blob/808ad9fe/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index 2d1aa05..2be4d0f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -110,6 +110,7 @@ import static org.apache.ignite.events.EventType.EVT_NODE_LEFT;
import static org.apache.ignite.internal.GridTopic.TOPIC_CACHE;
import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT;
import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.*;
import static org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader.DFLT_PRELOAD_RESEND_TIMEOUT;
/**
@@ -175,7 +176,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
private volatile IgniteCheckedException stopErr;
/** */
- private int longRunningOpsDumpCnt;
+ private long nextLongRunningOpsDumpTime;
+
+ /** */
+ private int longRunningOpsDumpStep;
/** */
private DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
@@ -1405,84 +1409,83 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
/**
* @param timeout Operation timeout.
+ * @return {@code True} if found long running operations.
*/
- public void dumpLongRunningOperations(long timeout) {
- try {
- GridDhtPartitionsExchangeFuture lastFut = lastInitializedFut;
+ private boolean dumpLongRunningOperations0(long timeout) {
+ long curTime = U.currentTimeMillis();
- // If exchange is in progress it will dump all hanging operations if any.
- if (lastFut != null && !lastFut.isDone())
- return;
-
- long curTime = U.currentTimeMillis();
+ boolean found = false;
- boolean found = false;
+ IgniteTxManager tm = cctx.tm();
- IgniteTxManager tm = cctx.tm();
+ GridCacheMvccManager mvcc = cctx.mvcc();
- if (tm != null) {
- for (IgniteInternalTx tx : tm.activeTransactions()) {
- if (curTime - tx.startTime() > timeout) {
- found = true;
+ if (tm != null) {
+ for (IgniteInternalTx tx : tm.activeTransactions()) {
+ if (curTime - tx.startTime() > timeout) {
+ found = true;
- if (longRunningOpsDumpCnt < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
- U.warn(log, "Found long running transaction [startTime=" + formatTime(tx.startTime()) +
- ", curTime=" + formatTime(curTime) + ", tx=" + tx + ']');
- }
- else
- break;
- }
+ U.warn(log, "Found long running transaction [startTime=" + formatTime(tx.startTime()) +
+ ", curTime=" + formatTime(curTime) + ", tx=" + tx + ']');
}
}
+ }
- GridCacheMvccManager mvcc = cctx.mvcc();
-
- if (mvcc != null) {
- for (GridCacheFuture<?> fut : mvcc.activeFutures()) {
- if (curTime - fut.startTime() > timeout) {
- found = true;
+ if (mvcc != null) {
+ for (GridCacheFuture<?> fut : mvcc.activeFutures()) {
+ if (curTime - fut.startTime() > timeout) {
+ found = true;
- if (longRunningOpsDumpCnt < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
- U.warn(log, "Found long running cache future [startTime=" + formatTime(fut.startTime()) +
- ", curTime=" + formatTime(curTime) + ", fut=" + fut + ']');
- }
- else
- break;
- }
+ U.warn(log, "Found long running cache future [startTime=" + formatTime(fut.startTime()) +
+ ", curTime=" + formatTime(curTime) + ", fut=" + fut + ']');
}
+ }
- for (GridCacheFuture<?> fut : mvcc.atomicFutures()) {
- if (curTime - fut.startTime() > timeout) {
- found = true;
+ for (GridCacheFuture<?> fut : mvcc.atomicFutures()) {
+ if (curTime - fut.startTime() > timeout) {
+ found = true;
- if (longRunningOpsDumpCnt < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
- U.warn(log, "Found long running cache future [startTime=" + formatTime(fut.startTime()) +
- ", curTime=" + formatTime(curTime) + ", fut=" + fut + ']');
- }
- else
- break;
- }
+ U.warn(log, "Found long running cache future [startTime=" + formatTime(fut.startTime()) +
+ ", curTime=" + formatTime(curTime) + ", fut=" + fut + ']');
}
}
+ }
- if (found) {
- if (longRunningOpsDumpCnt < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
- longRunningOpsDumpCnt++;
+ return found;
+ }
- if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false)) {
- U.warn(log, "Found long running cache operations, dump threads.");
+ /**
+ * @param timeout Operation timeout.
+ */
+ public void dumpLongRunningOperations(long timeout) {
+ try {
+ GridDhtPartitionsExchangeFuture lastFut = lastInitializedFut;
- U.dumpThreads(log);
- }
+ // If exchange is in progress it will dump all hanging operations if any.
+ if (lastFut != null && !lastFut.isDone())
+ return;
- U.warn(log, "Found long running cache operations, dump IO statistics.");
+ if (U.currentTimeMillis() < nextLongRunningOpsDumpTime)
+ return;
- // Dump IO manager statistics.
- cctx.gridIO().dumpStats();
+ if (dumpLongRunningOperations0(timeout)) {
+ nextLongRunningOpsDumpTime = U.currentTimeMillis() + nextDumpTimeout(longRunningOpsDumpStep++, timeout);
+
+ if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false)) {
+ U.warn(log, "Found long running cache operations, dump threads.");
+
+ U.dumpThreads(log);
}
+
+ U.warn(log, "Found long running cache operations, dump IO statistics.");
+
+ // Dump IO manager statistics.
+ cctx.gridIO().dumpStats();
+ }
+ else {
+ nextLongRunningOpsDumpTime = 0;
+ longRunningOpsDumpStep = 0;
}
- else
- longRunningOpsDumpCnt = 0;
}
catch (Exception e) {
U.error(log, "Failed to dump debug information: " + e, e);
@@ -1774,11 +1777,15 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
exchFut.init();
- int dumpedObjects = 0;
+ int dumpCnt = 0;
+
+ final long futTimeout = 2 * cctx.gridConfig().getNetworkTimeout();
+
+ long nextDumpTime = 0;
while (true) {
try {
- exchFut.get(2 * cctx.gridConfig().getNetworkTimeout(), TimeUnit.MILLISECONDS);
+ exchFut.get(futTimeout, TimeUnit.MILLISECONDS);
break;
}
@@ -1788,7 +1795,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
", node=" + cctx.localNodeId() + "]. " +
"Dumping pending objects that might be the cause: ");
- if (dumpedObjects < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
+ if (nextDumpTime <= U.currentTimeMillis()) {
try {
dumpDebugInfo(exchFut.topologyVersion());
}
@@ -1799,7 +1806,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
U.dumpThreads(log);
- dumpedObjects++;
+ nextDumpTime = U.currentTimeMillis() + nextDumpTimeout(dumpCnt++, futTimeout);
}
}
catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/808ad9fe/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 248d44e..89554f3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -80,6 +80,10 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
private static final boolean FULL_MAP_DEBUG = false;
/** */
+ private static final int DUMP_PENDING_OBJECTS_THRESHOLD =
+ IgniteSystemProperties.getInteger(IgniteSystemProperties.IGNITE_DUMP_PENDING_OBJECTS_THRESHOLD, 10);
+
+ /** */
private static final Long ZERO = 0L;
/** */
@@ -234,7 +238,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
break;
}
catch (IgniteFutureTimeoutCheckedException ignored) {
- if (dumpCnt++ < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
+ if (dumpCnt++ < DUMP_PENDING_OBJECTS_THRESHOLD) {
U.warn(log, "Failed to wait for partition eviction [" +
"topVer=" + topVer +
", group=" + grp.cacheOrGroupName() +
http://git-wip-us.apache.org/repos/asf/ignite/blob/808ad9fe/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index 0c5cdd9..26406c6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -35,7 +35,6 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReadWriteLock;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.cache.PartitionLossPolicy;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.events.CacheEvent;
@@ -90,7 +89,10 @@ import org.apache.ignite.lang.IgniteRunnable;
import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentHashMap8;
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT_LIMIT;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT;
+import static org.apache.ignite.IgniteSystemProperties.getBoolean;
+import static org.apache.ignite.IgniteSystemProperties.getLong;
import static org.apache.ignite.cache.PartitionLossPolicy.READ_ONLY_ALL;
import static org.apache.ignite.cache.PartitionLossPolicy.READ_ONLY_SAFE;
import static org.apache.ignite.cache.PartitionLossPolicy.READ_WRITE_ALL;
@@ -107,10 +109,6 @@ import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYS
@SuppressWarnings({"TypeMayBeWeakened", "unchecked"})
public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityTopologyVersion>
implements Comparable<GridDhtPartitionsExchangeFuture>, GridDhtTopologyFuture, CachePartitionExchangeWorkerTask {
- /** */
- public static final int DUMP_PENDING_OBJECTS_THRESHOLD =
- IgniteSystemProperties.getInteger(IgniteSystemProperties.IGNITE_DUMP_PENDING_OBJECTS_THRESHOLD, 10);
-
/** Dummy flag. */
private final boolean dummy;
@@ -880,20 +878,24 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
if (log.isDebugEnabled())
log.debug("Before waiting for partition release future: " + this);
- int dumpedObjects = 0;
+ int dumpCnt = 0;
+
+ long nextDumpTime = 0;
+
+ long futTimeout = 2 * cctx.gridConfig().getNetworkTimeout();
while (true) {
try {
- partReleaseFut.get(2 * cctx.gridConfig().getNetworkTimeout(), TimeUnit.MILLISECONDS);
+ partReleaseFut.get(futTimeout, TimeUnit.MILLISECONDS);
break;
}
catch (IgniteFutureTimeoutCheckedException ignored) {
// Print pending transactions and locks that might have led to hang.
- if (dumpedObjects < DUMP_PENDING_OBJECTS_THRESHOLD) {
+ if (nextDumpTime <= U.currentTimeMillis()) {
dumpPendingObjects();
- dumpedObjects++;
+ nextDumpTime = U.currentTimeMillis() + nextDumpTimeout(dumpCnt++, futTimeout);
}
}
}
@@ -903,16 +905,17 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
IgniteInternalFuture<?> locksFut = cctx.mvcc().finishLocks(exchId.topologyVersion());
- dumpedObjects = 0;
+ nextDumpTime = 0;
+ dumpCnt = 0;
while (true) {
try {
- locksFut.get(2 * cctx.gridConfig().getNetworkTimeout(), TimeUnit.MILLISECONDS);
+ locksFut.get(futTimeout, TimeUnit.MILLISECONDS);
break;
}
catch (IgniteFutureTimeoutCheckedException ignored) {
- if (dumpedObjects < DUMP_PENDING_OBJECTS_THRESHOLD) {
+ if (nextDumpTime <= U.currentTimeMillis()) {
U.warn(log, "Failed to wait for locks release future. " +
"Dumping pending objects that might be the cause: " + cctx.localNodeId());
@@ -930,9 +933,9 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
for (Map.Entry<IgniteTxKey, Collection<GridCacheMvccCandidate>> e : locks.entrySet())
U.warn(log, "Awaited locked entry [key=" + e.getKey() + ", mvcc=" + e.getValue() + ']');
- dumpedObjects++;
+ nextDumpTime = U.currentTimeMillis() + nextDumpTimeout(dumpCnt++, futTimeout);
- if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
+ if (getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
U.dumpThreads(log);
}
}
@@ -1026,7 +1029,7 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
U.error(log, "Failed to dump debug information: " + e, e);
}
- if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
+ if (getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
U.dumpThreads(log);
}
@@ -2195,4 +2198,27 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
return S.toString(CounterWithNodes.class, this);
}
}
+
+ /**
+ * @param step Exponent coefficient.
+ * @param timeout Base timeout.
+ * @return Time to wait before next debug dump.
+ */
+ public static long nextDumpTimeout(int step, long timeout) {
+ long limit = getLong(IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT_LIMIT, 30 * 60_000);
+
+ if (limit <= 0)
+ limit = 30 * 60_000;
+
+ assert step >= 0 : step;
+
+ long dumpFactor = Math.round(Math.pow(2, step));
+
+ long nextTimeout = timeout * dumpFactor;
+
+ if (nextTimeout <= 0)
+ return limit;
+
+ return nextTimeout <= limit ? nextTimeout : limit;
+ }
}
[16/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
ignite-5075 Implement logical 'cache groups' sharing the same physical caches
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/db85d166
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/db85d166
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/db85d166
Branch: refs/heads/ignite-5293
Commit: db85d166b066e39777093db9d7f44589a147276e
Parents: eaf8e14
Author: sboikov <sb...@gridgain.com>
Authored: Tue Jun 6 12:33:33 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Jun 6 12:33:48 2017 +0300
----------------------------------------------------------------------
.../configuration/CacheConfiguration.java | 21 +
.../managers/communication/GridIoManager.java | 10 +-
.../internal/managers/discovery/DiscoCache.java | 30 +-
.../discovery/GridDiscoveryManager.java | 165 +-
.../ignite/internal/pagemem/PageSupport.java | 2 +-
.../affinity/GridAffinityAssignmentCache.java | 38 +-
.../cache/CacheAffinitySharedManager.java | 623 +--
.../CacheClientReconnectDiscoveryData.java | 66 +-
.../internal/processors/cache/CacheData.java | 22 +-
.../processors/cache/CacheGroupContext.java | 943 ++++
.../processors/cache/CacheGroupData.java | 147 +
.../processors/cache/CacheGroupDescriptor.java | 210 +
.../cache/CacheJoinNodeDiscoveryData.java | 4 +-
.../processors/cache/CacheMetricsImpl.java | 10 +-
.../cache/CacheNodeCommonDiscoveryData.java | 19 +
.../cache/CacheOffheapEvictionManager.java | 11 +-
.../processors/cache/ClusterCachesInfo.java | 533 ++-
.../cache/ClusterCachesReconnectResult.java | 61 +
.../cache/DynamicCacheDescriptor.java | 26 +
.../processors/cache/ExchangeActions.java | 86 +-
.../processors/cache/GridCacheAdapter.java | 60 +-
.../cache/GridCacheAffinityManager.java | 62 +-
.../processors/cache/GridCacheAttributes.java | 21 +-
.../cache/GridCacheClearAllRunnable.java | 2 +-
.../cache/GridCacheConcurrentMap.java | 55 +-
.../cache/GridCacheConcurrentMapImpl.java | 171 +-
.../processors/cache/GridCacheContext.java | 166 +-
.../processors/cache/GridCacheEntryInfo.java | 37 +-
.../processors/cache/GridCacheEventManager.java | 36 -
.../cache/GridCacheGroupIdMessage.java | 110 +
.../processors/cache/GridCacheIdMessage.java | 117 +
.../processors/cache/GridCacheIoManager.java | 282 +-
.../cache/GridCacheLocalConcurrentMap.java | 56 +-
.../processors/cache/GridCacheMapEntry.java | 73 +-
.../processors/cache/GridCacheMessage.java | 97 +-
.../GridCachePartitionExchangeManager.java | 291 +-
.../processors/cache/GridCachePreloader.java | 23 +-
.../cache/GridCachePreloaderAdapter.java | 46 +-
.../processors/cache/GridCacheProcessor.java | 391 +-
.../cache/GridCacheSharedContext.java | 4 +-
.../processors/cache/GridCacheTtlManager.java | 22 +-
.../processors/cache/GridCacheUtils.java | 42 +-
.../GridChangeGlobalStateMessageResponse.java | 20 +-
.../processors/cache/GridNoStorageCacheMap.java | 30 +-
.../cache/IgniteCacheOffheapManager.java | 143 +-
.../cache/IgniteCacheOffheapManagerImpl.java | 1194 +++--
.../cache/affinity/GridCacheAffinityImpl.java | 9 +-
.../processors/cache/database/CacheDataRow.java | 5 -
.../cache/database/CacheDataRowAdapter.java | 65 +-
.../cache/database/CacheSearchRow.java | 5 +
.../processors/cache/database/RowStore.java | 19 +-
.../cache/database/tree/BPlusTree.java | 41 +-
.../cache/database/tree/io/PageIO.java | 24 +
.../distributed/GridCacheTtlUpdateRequest.java | 4 +-
.../distributed/GridDistributedBaseMessage.java | 4 +-
.../GridDistributedCacheAdapter.java | 19 +-
.../GridDistributedTxFinishResponse.java | 28 +-
.../GridDistributedTxRemoteAdapter.java | 2 +
.../dht/GridCachePartitionedConcurrentMap.java | 76 +-
.../dht/GridClientPartitionTopology.java | 25 +-
.../dht/GridDhtAffinityAssignmentRequest.java | 10 +-
.../dht/GridDhtAffinityAssignmentResponse.java | 12 +-
.../dht/GridDhtAssignmentFetchFuture.java | 20 +-
.../distributed/dht/GridDhtCacheAdapter.java | 363 +-
.../distributed/dht/GridDhtCacheEntry.java | 16 +-
.../cache/distributed/dht/GridDhtGetFuture.java | 8 +-
.../distributed/dht/GridDhtGetSingleFuture.java | 41 +-
.../distributed/dht/GridDhtLocalPartition.java | 413 +-
.../distributed/dht/GridDhtLockResponse.java | 2 +-
.../dht/GridDhtPartitionTopology.java | 9 +-
.../dht/GridDhtPartitionTopologyImpl.java | 284 +-
.../dht/GridDhtTransactionalCacheAdapter.java | 37 +-
.../dht/GridDhtTxFinishResponse.java | 14 +-
.../dht/GridDhtTxOnePhaseCommitAckRequest.java | 16 +-
.../distributed/dht/GridDhtTxPrepareFuture.java | 4 +-
.../dht/GridPartitionedGetFuture.java | 2 +-
.../dht/GridPartitionedSingleGetFuture.java | 6 +-
.../GridDhtAtomicAbstractUpdateRequest.java | 4 +-
.../dht/atomic/GridDhtAtomicCache.java | 68 +-
.../dht/atomic/GridDhtAtomicCacheEntry.java | 53 -
.../GridDhtAtomicDeferredUpdateResponse.java | 4 +-
.../dht/atomic/GridDhtAtomicNearResponse.java | 4 +-
.../dht/atomic/GridDhtAtomicUpdateResponse.java | 5 +-
.../GridNearAtomicAbstractUpdateRequest.java | 4 +-
.../GridNearAtomicCheckUpdateRequest.java | 4 +-
.../atomic/GridNearAtomicUpdateResponse.java | 4 +-
.../dht/colocated/GridDhtColocatedCache.java | 24 +-
.../colocated/GridDhtColocatedCacheEntry.java | 52 -
.../dht/preloader/GridDhtForceKeysFuture.java | 15 +-
.../dht/preloader/GridDhtForceKeysRequest.java | 4 +-
.../dht/preloader/GridDhtForceKeysResponse.java | 8 +-
.../GridDhtPartitionDemandMessage.java | 12 +-
.../dht/preloader/GridDhtPartitionDemander.java | 207 +-
.../dht/preloader/GridDhtPartitionSupplier.java | 58 +-
.../GridDhtPartitionSupplyMessage.java | 29 +-
.../GridDhtPartitionsAbstractMessage.java | 26 +-
.../GridDhtPartitionsExchangeFuture.java | 230 +-
.../preloader/GridDhtPartitionsFullMessage.java | 60 +-
.../GridDhtPartitionsSingleMessage.java | 40 +-
.../GridDhtPartitionsSingleRequest.java | 7 +-
.../dht/preloader/GridDhtPreloader.java | 410 +-
.../distributed/near/GridNearAtomicCache.java | 2 +-
.../distributed/near/GridNearCacheAdapter.java | 16 +-
.../distributed/near/GridNearGetRequest.java | 4 +-
.../distributed/near/GridNearGetResponse.java | 4 +-
.../near/GridNearOptimisticTxPrepareFuture.java | 21 +-
.../near/GridNearSingleGetRequest.java | 4 +-
.../near/GridNearSingleGetResponse.java | 6 +-
.../near/GridNearTransactionalCache.java | 4 +-
.../near/GridNearTxFinishResponse.java | 14 +-
.../processors/cache/local/GridLocalCache.java | 21 +-
.../local/atomic/GridLocalAtomicCache.java | 4 +-
.../query/GridCacheDistributedQueryManager.java | 10 +-
.../cache/query/GridCacheQueryManager.java | 4 +-
.../cache/query/GridCacheQueryRequest.java | 3 +-
.../cache/query/GridCacheQueryResponse.java | 4 +-
.../CacheContinuousQueryBatchAck.java | 4 +-
.../CacheContinuousQueryEventBuffer.java | 5 +-
.../continuous/CacheContinuousQueryHandler.java | 66 +-
.../CacheContinuousQueryListener.java | 20 +
.../continuous/CacheContinuousQueryManager.java | 59 +-
.../query/continuous/CounterSkipContext.java | 78 +
.../cache/transactions/IgniteTxAdapter.java | 2 +-
.../cache/transactions/IgniteTxEntry.java | 4 +-
.../cache/transactions/IgniteTxHandler.java | 26 +-
.../transactions/IgniteTxLocalAdapter.java | 2 +
.../cache/transactions/TxLocksRequest.java | 20 +-
.../cache/transactions/TxLocksResponse.java | 28 +-
.../cluster/GridClusterStateProcessor.java | 6 +-
.../processors/query/GridQueryProcessor.java | 3 +-
.../internal/processors/query/QueryUtils.java | 29 +-
.../visor/cache/VisorCachePartitionsTask.java | 2 +-
.../CacheAtomicSingleMessageCountSelfTest.java | 2 +-
.../cache/CacheDeferredDeleteQueueTest.java | 2 +-
...cheDhtLocalPartitionAfterRemoveSelfTest.java | 2 +-
...CacheExchangeMessageDuplicatedStateTest.java | 54 +-
.../cache/CacheOffheapMapEntrySelfTest.java | 9 +-
.../GridCacheConditionalDeploymentSelfTest.java | 18 +
.../processors/cache/GridCacheLeakTest.java | 3 +-
.../GridCacheOrderedPreloadingSelfTest.java | 14 +-
.../cache/GridCacheTtlManagerSelfTest.java | 3 +-
.../processors/cache/IgniteCacheGroupsTest.java | 4301 ++++++++++++++++++
.../cache/IgniteCachePeekModesAbstractTest.java | 2 +-
.../processors/cache/IgniteCacheStartTest.java | 5 +-
.../cache/IgniteOnePhaseCommitInvokeTest.java | 4 +-
...ologyValidatorAbstractTxCacheGroupsTest.java | 126 +
...opologyValidatorCacheGroupsAbstractTest.java | 131 +
...niteTopologyValidatorGridSplitCacheTest.java | 8 +-
...torNearPartitionedAtomicCacheGroupsTest.java | 31 +
...lidatorNearPartitionedTxCacheGroupsTest.java | 31 +
...lidatorPartitionedAtomicCacheGroupsTest.java | 45 +
...gyValidatorPartitionedTxCacheGroupsTest.java | 31 +
...alidatorReplicatedAtomicCacheGroupsTest.java | 45 +
...ogyValidatorReplicatedTxCacheGroupsTest.java | 31 +
.../IgniteTxStoreExceptionAbstractSelfTest.java | 4 +-
.../GridCacheBinaryObjectsAbstractSelfTest.java | 2 +-
.../GridCacheQueueCleanupSelfTest.java | 13 +-
.../GridCacheSetAbstractSelfTest.java | 17 +-
.../GridCacheSetFailoverAbstractSelfTest.java | 6 +-
.../IgnitePartitionedQueueNoBackupsTest.java | 6 +-
.../IgnitePartitionedSetNoBackupsSelfTest.java | 6 +-
.../CacheDiscoveryDataConcurrentJoinTest.java | 17 +
.../CacheLateAffinityAssignmentTest.java | 6 +-
...eCacheGroupsPartitionLossPolicySelfTest.java | 355 ++
.../IgniteCachePartitionLossPolicySelfTest.java | 19 +-
.../IgniteCacheReadFromBackupTest.java | 5 +-
...sabledMultiNodeWithGroupFullApiSelfTest.java | 35 +
.../atomic/IgniteCacheAtomicProtocolTest.java | 7 +-
...AtomicMultiNodeWithGroupFullApiSelfTest.java | 34 +
...nabledMultiNodeWithGroupFullApiSelfTest.java | 35 +
.../near/GridCacheNearReadersSelfTest.java | 4 +-
...tionedMultiNodeWithGroupFullApiSelfTest.java | 34 +
.../GridCacheReplicatedPreloadSelfTest.java | 3 +-
.../IgniteCacheClientNearCacheExpiryTest.java | 20 +-
.../expiry/IgniteCacheTtlCleanupSelfTest.java | 2 +-
...IgniteCacheJdbcBlobStoreNodeRestartTest.java | 3 +
...acheLocalAtomicWithGroupFullApiSelfTest.java | 34 +
.../local/GridCacheLocalFullApiSelfTest.java | 1 -
.../GridCacheLocalWithGroupFullApiSelfTest.java | 34 +
...nuousQueryConcurrentPartitionUpdateTest.java | 229 +-
...ContinuousQueryFailoverAbstractSelfTest.java | 7 +-
.../TxOptimisticDeadlockDetectionTest.java | 2 +-
.../TxPessimisticDeadlockDetectionTest.java | 2 +-
.../loadtests/hashmap/GridCacheTestContext.java | 6 +-
.../communication/GridCacheMessageSelfTest.java | 30 +
.../testframework/junits/GridAbstractTest.java | 17 +
.../junits/common/GridCommonAbstractTest.java | 64 +
.../IgniteCacheFullApiSelfTestSuite.java | 13 +
.../testsuites/IgniteCacheTestSuite3.java | 3 +
.../testsuites/IgniteCacheTestSuite5.java | 2 +
.../IgniteTopologyValidatorTestSuite.java | 14 +
.../query/h2/database/H2PkHashIndex.java | 4 +-
.../query/h2/database/H2RowFactory.java | 2 +-
.../processors/query/h2/database/H2Tree.java | 6 +-
.../query/h2/database/H2TreeIndex.java | 7 +-
.../query/h2/ddl/DdlStatementsProcessor.java | 2 +-
.../h2/twostep/GridReduceQueryExecutor.java | 12 +-
.../cache/IgniteCacheGroupsSqlTest.java | 312 ++
.../cache/IgniteCacheNoClassQuerySelfTest.java | 20 -
.../IgniteCacheGroupsCompareQueryTest.java | 45 +
...teCacheGroupsSqlDistributedJoinSelfTest.java | 30 +
...roupsSqlSegmentedIndexMultiNodeSelfTest.java | 28 +
...iteCacheGroupsSqlSegmentedIndexSelfTest.java | 37 +
.../query/IgniteSqlDistributedJoinSelfTest.java | 2 +-
.../query/h2/sql/BaseH2CompareQueryTest.java | 35 +-
.../IgniteCacheQuerySelfTestSuite2.java | 9 +
.../IgniteCacheWithIndexingTestSuite.java | 3 +
.../yardstick/IgniteBenchmarkArguments.java | 27 +-
.../org/apache/ignite/yardstick/IgniteNode.java | 3 +
.../cache/IgniteCacheAbstractBenchmark.java | 158 +
.../yardstick/cache/IgniteGetAllBenchmark.java | 3 +
.../cache/IgniteGetAllPutAllTxBenchmark.java | 2 +
.../cache/IgniteGetAndPutBenchmark.java | 2 +
.../cache/IgniteGetAndPutTxBenchmark.java | 2 +
.../yardstick/cache/IgniteGetBenchmark.java | 35 +-
.../IgniteGetEntriesPutAllTxBenchmark.java | 2 +
.../yardstick/cache/IgniteInvokeBenchmark.java | 2 +
.../cache/IgniteInvokeTxBenchmark.java | 2 +
.../IgniteInvokeWithInjectionBenchmark.java | 2 +
.../yardstick/cache/IgnitePutAllBenchmark.java | 2 +
.../IgnitePutAllSerializableTxBenchmark.java | 2 +
.../yardstick/cache/IgnitePutBenchmark.java | 2 +
.../cache/IgnitePutGetBatchBenchmark.java | 2 +
.../yardstick/cache/IgnitePutGetBenchmark.java | 2 +
.../cache/IgnitePutGetEntryBenchmark.java | 2 +
.../cache/IgnitePutGetEntryTxBenchmark.java | 2 +
.../cache/IgnitePutGetTxBatchBenchmark.java | 2 +
.../cache/IgnitePutGetTxBenchmark.java | 2 +
...IgnitePutIfAbsentIndexedValue1Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue1Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue2Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue8Benchmark.java | 2 +
.../IgnitePutRandomValueSizeBenchmark.java | 2 +
.../cache/IgnitePutRemoveBenchmark.java | 2 +
.../yardstick/cache/IgnitePutTxBenchmark.java | 2 +
.../cache/IgnitePutTxImplicitBenchmark.java | 2 +
.../cache/IgnitePutTxPrimaryOnlyBenchmark.java | 2 +
.../IgnitePutTxSkipLocalBackupBenchmark.java | 2 +
.../cache/IgnitePutValue8Benchmark.java | 2 +
.../IgniteReplaceIndexedValue1Benchmark.java | 2 +
.../cache/IgniteScanQueryBenchmark.java | 88 +
.../cache/IgniteSqlQueryBenchmark.java | 16 +-
.../IgniteSqlQueryDistributedJoinBenchmark.java | 24 +-
.../cache/IgniteSqlQueryJoinBenchmark.java | 14 +-
.../cache/IgniteSqlQueryPutBenchmark.java | 8 +-
.../IgniteSqlQueryPutSeparatedBenchmark.java | 4 +
.../cache/jdbc/JdbcPutGetBenchmark.java | 4 +-
.../IgniteCacheRandomOperationBenchmark.java | 42 +-
.../yardstick/cache/load/model/ModelUtil.java | 3 +
249 files changed, 13546 insertions(+), 3450 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index 21f2fba..67b7590 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -202,6 +202,9 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
/** Cache name. */
private String name;
+ /** Cache group name. */
+ private String grpName;
+
/** Name of {@link MemoryPolicyConfiguration} for this cache */
private String memPlcName;
@@ -408,6 +411,7 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
evictFilter = cc.getEvictionFilter();
evictPlc = cc.getEvictionPolicy();
expiryPolicyFactory = cc.getExpiryPolicyFactory();
+ grpName = cc.getGroupName();
indexedTypes = cc.getIndexedTypes();
interceptor = cc.getInterceptor();
invalidate = cc.isInvalidate();
@@ -455,6 +459,23 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
}
/**
+ * @return Cache group name.
+ */
+ public String getGroupName() {
+ return grpName;
+ }
+
+ /**
+ * @param grpName Cache group name.
+ * @return {@code this} for chaining.
+ */
+ public CacheConfiguration<K, V> setGroupName(String grpName) {
+ this.grpName = grpName;
+
+ return this;
+ }
+
+ /**
* Cache name or {@code null} if not provided, then this will be considered a default
* cache which can be accessed via {@link Ignite#cache(String)} method. Otherwise, if name
* is provided, the cache will be accessed via {@link Ignite#cache(String)} method.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
index 698baf8..1efc4aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoManager.java
@@ -1153,10 +1153,14 @@ public class GridIoManager extends GridManagerAdapter<CommunicationSpi<Serializa
pools.poolForPolicy(plc).execute(c);
}
catch (RejectedExecutionException e) {
- U.error(log, "Failed to process regular message due to execution rejection. Will attempt to process " +
- "message in the listener thread instead.", e);
+ if (!ctx.isStopping()) {
+ U.error(log, "Failed to process regular message due to execution rejection. Will attempt to process " +
+ "message in the listener thread instead.", e);
- c.run();
+ c.run();
+ }
+ else if (log.isDebugEnabled())
+ log.debug("Failed to process regular message due to execution rejection: " + msg);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
index 5247ac1..22c2d07 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
@@ -69,7 +69,7 @@ public class DiscoCache {
/** Affinity cache nodes by cache name. */
@GridToStringInclude
- private final Map<Integer, List<ClusterNode>> affCacheNodes;
+ private final Map<Integer, List<ClusterNode>> cacheGrpAffNodes;
/** Node map. */
private final Map<UUID, ClusterNode> nodeMap;
@@ -91,7 +91,7 @@ public class DiscoCache {
* @param allNodesWithCaches All nodes with at least one cache configured.
* @param rmtNodesWithCaches Remote nodes with at least one cache configured.
* @param allCacheNodes Cache nodes by cache name.
- * @param affCacheNodes Affinity cache nodes by cache name.
+ * @param cacheGrpAffNodes Affinity nodes by cache group ID.
* @param nodeMap Node map.
* @param nearEnabledCaches Caches where at least one node has near cache enabled.
* @param alives Alive nodes.
@@ -105,7 +105,7 @@ public class DiscoCache {
List<ClusterNode> allNodesWithCaches,
List<ClusterNode> rmtNodesWithCaches,
Map<Integer, List<ClusterNode>> allCacheNodes,
- Map<Integer, List<ClusterNode>> affCacheNodes,
+ Map<Integer, List<ClusterNode>> cacheGrpAffNodes,
Map<UUID, ClusterNode> nodeMap,
Set<Integer> nearEnabledCaches,
Set<UUID> alives) {
@@ -118,7 +118,7 @@ public class DiscoCache {
this.allNodesWithCaches = allNodesWithCaches;
this.rmtNodesWithCaches = rmtNodesWithCaches;
this.allCacheNodes = allCacheNodes;
- this.affCacheNodes = affCacheNodes;
+ this.cacheGrpAffNodes = cacheGrpAffNodes;
this.nodeMap = nodeMap;
this.nearEnabledCaches = nearEnabledCaches;
this.alives.addAll(alives);
@@ -235,25 +235,11 @@ public class DiscoCache {
}
/**
- * Gets all nodes that have cache with given ID and should participate in affinity calculation. With
- * partitioned cache nodes with near-only cache do not participate in affinity node calculation.
- *
- * @param cacheName Cache name.
- * @return Collection of nodes.
- */
- public List<ClusterNode> cacheAffinityNodes(@Nullable String cacheName) {
- return cacheAffinityNodes(CU.cacheId(cacheName));
- }
-
- /**
- * Gets all nodes that have cache with given ID and should participate in affinity calculation. With
- * partitioned cache nodes with near-only cache do not participate in affinity node calculation.
- *
- * @param cacheId Cache ID.
- * @return Collection of nodes.
+ * @param grpId Cache group ID.
+ * @return All nodes that participate in affinity calculation.
*/
- public List<ClusterNode> cacheAffinityNodes(int cacheId) {
- return emptyIfNull(affCacheNodes.get(cacheId));
+ public List<ClusterNode> cacheGroupAffinityNodes(int grpId) {
+ return emptyIfNull(cacheGrpAffNodes.get(grpId));
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 7c702c2..8c2bd8c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -69,7 +69,7 @@ import org.apache.ignite.internal.managers.GridManagerAdapter;
import org.apache.ignite.internal.managers.communication.GridIoManager;
import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
+import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.jobmetrics.GridJobMetrics;
import org.apache.ignite.internal.processors.security.SecurityContext;
@@ -251,12 +251,15 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
new ConcurrentHashMap8<>();
/** Local node initialization event listeners. */
- private final Collection<IgniteInClosure<ClusterNode>> localNodeInitLsnrs = new ArrayList<>();
+ private final Collection<IgniteInClosure<ClusterNode>> locNodeInitLsnrs = new ArrayList<>();
/** Map of dynamic cache filters. */
private Map<String, CachePredicate> registeredCaches = new HashMap<>();
/** */
+ private Map<Integer, CacheGroupAffinity> registeredCacheGrps = new HashMap<>();
+
+ /** */
private final GridSpinBusyLock busyLock = new GridSpinBusyLock();
/** Received custom messages history. */
@@ -321,24 +324,55 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
}
/**
+ *
+ */
+ public void onLocalNodeJoin() {
+ registeredCacheGrps.clear();
+ registeredCaches.clear();
+ }
+
+ /**
+ * @param grpDesc Cache group descriptor.
+ * @param filter Node filter.
+ * @param cacheMode Cache mode.
+ */
+ public void addCacheGroup(CacheGroupDescriptor grpDesc, IgnitePredicate<ClusterNode> filter, CacheMode cacheMode) {
+ CacheGroupAffinity old = registeredCacheGrps.put(grpDesc.groupId(),
+ new CacheGroupAffinity(grpDesc.cacheOrGroupName(), filter, cacheMode));
+
+ assert old == null : old;
+ }
+
+ /**
+ * @param grpDesc Cache group descriptor.
+ */
+ public void removeCacheGroup(CacheGroupDescriptor grpDesc) {
+ CacheGroupAffinity rmvd = registeredCacheGrps.remove(grpDesc.groupId());
+
+ assert rmvd != null : grpDesc.cacheOrGroupName();
+ }
+
+ /**
* Adds dynamic cache filter.
*
+ * @param grpId Cache group ID.
* @param cacheName Cache name.
- * @param filter Cache filter.
* @param nearEnabled Near enabled flag.
- * @param cacheMode Cache mode.
*/
public void setCacheFilter(
+ int grpId,
String cacheName,
- IgnitePredicate<ClusterNode> filter,
- boolean nearEnabled,
- CacheMode cacheMode
+ boolean nearEnabled
) {
if (!registeredCaches.containsKey(cacheName)) {
- if (cacheMode == CacheMode.REPLICATED)
+ CacheGroupAffinity grp = registeredCacheGrps.get(grpId);
+
+ assert grp != null : "Failed to find cache group [grpId=" + grpId + ", cache=" + cacheName + ']';
+
+ if (grp.cacheMode == CacheMode.REPLICATED)
nearEnabled = false;
-
- registeredCaches.put(cacheName, new CachePredicate(filter, nearEnabled, cacheMode));
+
+ registeredCaches.put(cacheName, new CachePredicate(grp, nearEnabled));
}
}
@@ -401,7 +435,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
}
}
- return res;
+ return res == null ? Collections.<String, Map<UUID,Boolean>>emptyMap() : res;
}
/**
@@ -493,7 +527,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
/** {@inheritDoc} */
@Override public void onLocalNodeInitialized(ClusterNode locNode) {
- for (IgniteInClosure<ClusterNode> lsnr : localNodeInitLsnrs)
+ for (IgniteInClosure<ClusterNode> lsnr : locNodeInitLsnrs)
lsnr.apply(locNode);
}
@@ -639,6 +673,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
locJoin = new GridFutureAdapter<>();
registeredCaches.clear();
+ registeredCacheGrps.clear();
for (AffinityTopologyVersion histVer : discoCacheHist.keySet()) {
Object rmvd = discoCacheHist.remove(histVer);
@@ -801,7 +836,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
* @param lsnr Listener to add.
*/
public void addLocalNodeInitializedEventListener(IgniteInClosure<ClusterNode> lsnr) {
- localNodeInitLsnrs.add(lsnr);
+ locNodeInitLsnrs.add(lsnr);
}
/**
@@ -1742,27 +1777,14 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
}
/**
- * Gets cache nodes for cache with given name that participate in affinity calculation.
- *
- * @param cacheName Cache name.
- * @param topVer Topology version.
- * @return Collection of cache affinity nodes.
- */
- public Collection<ClusterNode> cacheAffinityNodes(@Nullable String cacheName, AffinityTopologyVersion topVer) {
- int cacheId = CU.cacheId(cacheName);
-
- return resolveDiscoCache(cacheId, topVer).cacheAffinityNodes(cacheId);
- }
-
- /**
* Gets cache nodes for cache with given ID that participate in affinity calculation.
*
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param topVer Topology version.
* @return Collection of cache affinity nodes.
*/
- public Collection<ClusterNode> cacheAffinityNodes(int cacheId, AffinityTopologyVersion topVer) {
- return resolveDiscoCache(cacheId, topVer).cacheAffinityNodes(cacheId);
+ public Collection<ClusterNode> cacheGroupAffinityNodes(int grpId, AffinityTopologyVersion topVer) {
+ return resolveDiscoCache(grpId, topVer).cacheGroupAffinityNodes(grpId);
}
/**
@@ -1825,7 +1847,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
if (!CU.isSystemCache(cacheName) && !CU.isIgfsCache(ctx.config(), cacheName) &&
pred != null && pred.cacheNode(node))
- caches.put(cacheName, pred.cacheMode);
+ caches.put(cacheName, pred.aff.cacheMode);
}
return caches;
@@ -1845,21 +1867,21 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
/**
* Gets discovery cache for given topology version.
*
- * @param cacheId Cache ID (participates in exception message).
+ * @param grpId Cache group ID (participates in exception message).
* @param topVer Topology version.
* @return Discovery cache.
*/
- private DiscoCache resolveDiscoCache(int cacheId, AffinityTopologyVersion topVer) {
+ private DiscoCache resolveDiscoCache(int grpId, AffinityTopologyVersion topVer) {
Snapshot snap = topSnap.get();
DiscoCache cache = AffinityTopologyVersion.NONE.equals(topVer) || topVer.equals(snap.topVer) ?
snap.discoCache : discoCacheHist.get(topVer);
if (cache == null) {
- DynamicCacheDescriptor desc = ctx.cache().cacheDescriptor(cacheId);
+ CacheGroupDescriptor desc = ctx.cache().cacheGroupDescriptors().get(grpId);
throw new IgniteException("Failed to resolve nodes topology [" +
- "cacheName=" + (desc != null ? desc.cacheConfiguration().getName() : "N/A") +
+ "cacheGrp=" + (desc != null ? desc.cacheOrGroupName() : "N/A") +
", topVer=" + topVer +
", history=" + discoCacheHist.keySet() +
", snap=" + snap +
@@ -2073,7 +2095,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
" [rmtNodes=" + rmtNodes + ", loc=" + loc + ']';
Map<Integer, List<ClusterNode>> allCacheNodes = U.newHashMap(allNodes.size());
- Map<Integer, List<ClusterNode>> affCacheNodes = U.newHashMap(allNodes.size());
+ Map<Integer, List<ClusterNode>> cacheGrpAffNodes = U.newHashMap(allNodes.size());
Set<ClusterNode> allNodesWithCaches = new TreeSet<>(GridNodeOrderComparator.INSTANCE);
Set<ClusterNode> rmtNodesWithCaches = new TreeSet<>(GridNodeOrderComparator.INSTANCE);
@@ -2085,6 +2107,20 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
assert node.order() != 0 : "Invalid node order [locNode=" + loc + ", node=" + node + ']';
assert !node.isDaemon();
+ for (Map.Entry<Integer, CacheGroupAffinity> e : registeredCacheGrps.entrySet()) {
+ CacheGroupAffinity grpAff = e.getValue();
+ Integer grpId = e.getKey();
+
+ if (CU.affinityNode(node, grpAff.cacheFilter)) {
+ List<ClusterNode> nodes = cacheGrpAffNodes.get(grpId);
+
+ if (nodes == null)
+ cacheGrpAffNodes.put(grpId, nodes = new ArrayList<>());
+
+ nodes.add(node);
+ }
+ }
+
for (Map.Entry<String, CachePredicate> entry : registeredCaches.entrySet()) {
String cacheName = entry.getKey();
CachePredicate filter = entry.getValue();
@@ -2100,9 +2136,6 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
addToMap(allCacheNodes, cacheName, node);
- if (filter.dataNode(node))
- addToMap(affCacheNodes, cacheName, node);
-
if (filter.nearNode(node))
nearEnabledCaches.add(CU.cacheId(cacheName));
}
@@ -2119,7 +2152,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
U.sealList(allNodesWithCaches),
U.sealList(rmtNodesWithCaches),
Collections.unmodifiableMap(allCacheNodes),
- Collections.unmodifiableMap(affCacheNodes),
+ Collections.unmodifiableMap(cacheGrpAffNodes),
Collections.unmodifiableMap(nodeMap),
Collections.unmodifiableSet(nearEnabledCaches),
alives);
@@ -2732,32 +2765,60 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
}
/**
+ *
+ */
+ private static class CacheGroupAffinity {
+ /** */
+ private final String name;
+
+ /** Nodes filter. */
+ private final IgnitePredicate<ClusterNode> cacheFilter;
+
+ /** Cache mode. */
+ private final CacheMode cacheMode;
+
+ /**
+ * @param name Name.
+ * @param cacheFilter Node filter.
+ * @param cacheMode Cache mode.
+ */
+ CacheGroupAffinity(
+ String name,
+ IgnitePredicate<ClusterNode> cacheFilter,
+ CacheMode cacheMode) {
+ this.name = name;
+ this.cacheFilter = cacheFilter;
+ this.cacheMode = cacheMode;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "CacheGroupAffinity [name=" + name + ']';
+ }
+ }
+
+ /**
* Cache predicate.
*/
private static class CachePredicate {
/** Cache filter. */
- private final IgnitePredicate<ClusterNode> cacheFilter;
+ private final CacheGroupAffinity aff;
/** If near cache is enabled on data nodes. */
private final boolean nearEnabled;
- /** Cache mode. */
- private final CacheMode cacheMode;
-
/** Collection of client near nodes. */
private final ConcurrentHashMap<UUID, Boolean> clientNodes;
/**
- * @param cacheFilter Cache filter.
+ * @param aff Cache group affinity.
* @param nearEnabled Near enabled flag.
- * @param cacheMode Cache mode.
*/
- private CachePredicate(IgnitePredicate<ClusterNode> cacheFilter, boolean nearEnabled, CacheMode cacheMode) {
- assert cacheFilter != null;
+ private CachePredicate(CacheGroupAffinity aff, boolean nearEnabled) {
+ assert aff != null;
- this.cacheFilter = cacheFilter;
+ this.aff = aff;
this.nearEnabled = nearEnabled;
- this.cacheMode = cacheMode;
clientNodes = new ConcurrentHashMap<>();
}
@@ -2792,7 +2853,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
* @return {@code True} if this node is a data node for given cache.
*/
public boolean dataNode(ClusterNode node) {
- return CU.affinityNode(node, cacheFilter);
+ return CU.affinityNode(node, aff.cacheFilter);
}
/**
@@ -2800,7 +2861,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
* @return {@code True} if cache is accessible on the given node.
*/
public boolean cacheNode(ClusterNode node) {
- return !node.isDaemon() && (CU.affinityNode(node, cacheFilter) || clientNodes.containsKey(node.id()));
+ return !node.isDaemon() && (CU.affinityNode(node, aff.cacheFilter) || clientNodes.containsKey(node.id()));
}
/**
@@ -2808,7 +2869,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
* @return {@code True} if near cache is present on the given nodes.
*/
public boolean nearNode(ClusterNode node) {
- if (CU.affinityNode(node, cacheFilter))
+ if (CU.affinityNode(node, aff.cacheFilter))
return nearEnabled;
Boolean near = clientNodes.get(node.id());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageSupport.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageSupport.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageSupport.java
index 0f39058..f4b2d96 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageSupport.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageSupport.java
@@ -98,7 +98,7 @@ public interface PageSupport {
* @param pageId Page ID.
* @param page Page pointer.
* @param walPlc {@code True} if page should be recorded to WAL, {@code false} if the page must not
-* be recorded and {@code null} for the default behavior.
+ * be recorded and {@code null} for the default behavior.
* @param dirtyFlag Determines whether the page was modified since the last checkpoint.
*/
public void writeUnlock(int cacheId, long pageId, long page, Boolean walPlc,
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
index 4830f06..b478462 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
@@ -60,11 +60,11 @@ public class GridAffinityAssignmentCache {
/** Cleanup history size. */
private final int MAX_HIST_SIZE = getInteger(IGNITE_AFFINITY_HISTORY_SIZE, 500);
- /** Cache name. */
- private final String cacheName;
+ /** Group name if specified or cache name. */
+ private final String cacheOrGrpName;
- /** */
- private final int cacheId;
+ /** Group ID. */
+ private final int grpId;
/** Number of backups. */
private final int backups;
@@ -115,7 +115,8 @@ public class GridAffinityAssignmentCache {
* Constructs affinity cached calculations.
*
* @param ctx Kernal context.
- * @param cacheName Cache name.
+ * @param cacheOrGrpName Cache or cache group name.
+ * @param grpId Group ID.
* @param aff Affinity function.
* @param nodeFilter Node filter.
* @param backups Number of backups.
@@ -123,7 +124,8 @@ public class GridAffinityAssignmentCache {
*/
@SuppressWarnings("unchecked")
public GridAffinityAssignmentCache(GridKernalContext ctx,
- String cacheName,
+ String cacheOrGrpName,
+ int grpId,
AffinityFunction aff,
IgnitePredicate<ClusterNode> nodeFilter,
int backups,
@@ -132,16 +134,16 @@ public class GridAffinityAssignmentCache {
assert ctx != null;
assert aff != null;
assert nodeFilter != null;
+ assert grpId != 0;
this.ctx = ctx;
this.aff = aff;
this.nodeFilter = nodeFilter;
- this.cacheName = cacheName;
+ this.cacheOrGrpName = cacheOrGrpName;
+ this.grpId = grpId;
this.backups = backups;
this.locCache = locCache;
- cacheId = CU.cacheId(cacheName);
-
log = ctx.log(GridAffinityAssignmentCache.class);
partsCnt = aff.partitions();
@@ -161,17 +163,17 @@ public class GridAffinityAssignmentCache {
}
/**
- * @return Cache name.
+ * @return Group name if it is specified, otherwise cache name.
*/
- public String cacheName() {
- return cacheName;
+ public String cacheOrGroupName() {
+ return cacheOrGrpName;
}
/**
- * @return Cache ID.
+ * @return Cache group ID.
*/
- public int cacheId() {
- return cacheId;
+ public int groupId() {
+ return grpId;
}
/**
@@ -269,7 +271,7 @@ public class GridAffinityAssignmentCache {
List<ClusterNode> sorted;
if (!locCache) {
- sorted = new ArrayList<>(discoCache.cacheAffinityNodes(cacheId()));
+ sorted = new ArrayList<>(discoCache.cacheGroupAffinityNodes(groupId()));
Collections.sort(sorted, GridNodeOrderComparator.INSTANCE);
}
@@ -432,7 +434,7 @@ public class GridAffinityAssignmentCache {
*/
public void dumpDebugInfo() {
if (!readyFuts.isEmpty()) {
- U.warn(log, "Pending affinity ready futures [cache=" + cacheName + ", lastVer=" + lastVersion() + "]:");
+ U.warn(log, "Pending affinity ready futures [grp=" + cacheOrGrpName + ", lastVer=" + lastVersion() + "]:");
for (AffinityReadyFuture fut : readyFuts.values())
U.warn(log, ">>> " + fut);
@@ -461,7 +463,7 @@ public class GridAffinityAssignmentCache {
if (cache == null) {
throw new IllegalStateException("Getting affinity for topology version earlier than affinity is " +
"calculated [locNode=" + ctx.discovery().localNode() +
- ", cache=" + cacheName +
+ ", grp=" + cacheOrGrpName +
", topVer=" + topVer +
", head=" + head.get().topologyVersion() +
", history=" + affCache.keySet() +
[06/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index 2cd5629..0c5cdd9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -55,6 +55,7 @@ import org.apache.ignite.internal.pagemem.snapshot.StartFullSnapshotAckDiscovery
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache;
import org.apache.ignite.internal.processors.cache.CacheAffinityChangeMessage;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.CacheInvalidStateException;
import org.apache.ignite.internal.processors.cache.CachePartitionExchangeWorkerTask;
import org.apache.ignite.internal.processors.cache.ClusterState;
@@ -193,8 +194,8 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
/** */
private CacheAffinityChangeMessage affChangeMsg;
- /** Cache validation results. */
- private volatile Map<Integer, CacheValidation> cacheValidRes;
+ /** Cache groups validation results. */
+ private volatile Map<Integer, CacheValidation> grpValidRes;
/** Skip preload flag. */
private boolean skipPreload;
@@ -379,8 +380,8 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
}
/**
- * @param cacheId Cache ID to check.
- * @param rcvdFrom Topology version.
+ * @param cacheId Cache ID.
+ * @param rcvdFrom Node ID cache was received from.
* @return {@code True} if cache was added during this exchange.
*/
public boolean cacheAddedOnExchange(int cacheId, UUID rcvdFrom) {
@@ -388,14 +389,32 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
}
/**
+ * @param grpId Cache group ID.
+ * @param rcvdFrom Node ID cache group was received from.
+ * @return {@code True} if cache group was added during this exchange.
+ */
+ public boolean cacheGroupAddedOnExchange(int grpId, UUID rcvdFrom) {
+ return dynamicCacheGroupStarted(grpId) ||
+ (exchId.isJoined() && exchId.nodeId().equals(rcvdFrom));
+ }
+
+ /**
* @param cacheId Cache ID.
* @return {@code True} if non-client cache was added during this exchange.
*/
- public boolean dynamicCacheStarted(int cacheId) {
+ private boolean dynamicCacheStarted(int cacheId) {
return exchActions != null && exchActions.cacheStarted(cacheId);
}
/**
+ * @param grpId Cache group ID.
+ * @return {@code True} if non-client cache group was added during this exchange.
+ */
+ public boolean dynamicCacheGroupStarted(int grpId) {
+ return exchActions != null && exchActions.cacheGroupStarting(grpId);
+ }
+
+ /**
* @return {@code True}
*/
public boolean onAdded() {
@@ -598,11 +617,11 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
try {
if (crd != null) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- cacheCtx.topology().beforeExchange(this, !centralizedAff);
+ grp.topology().beforeExchange(this, !centralizedAff);
}
}
}
@@ -616,28 +635,28 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
* @throws IgniteCheckedException If failed.
*/
private void updateTopologies(boolean crd) throws IgniteCheckedException {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- GridClientPartitionTopology clientTop = cctx.exchange().clearClientTopology(cacheCtx.cacheId());
+ GridClientPartitionTopology clientTop = cctx.exchange().clearClientTopology(grp.groupId());
long updSeq = clientTop == null ? -1 : clientTop.lastUpdateSequence();
- GridDhtPartitionTopology top = cacheCtx.topology();
+ GridDhtPartitionTopology top = grp.topology();
if (crd) {
- boolean updateTop = exchId.topologyVersion().equals(cacheCtx.startTopologyVersion());
+ boolean updateTop = exchId.topologyVersion().equals(grp.localStartVersion());
if (updateTop && clientTop != null)
top.update(exchId, clientTop.partitionMap(true), clientTop.updateCounters(false));
}
- top.updateTopologyVersion(exchId, this, updSeq, stopping(cacheCtx.cacheId()));
+ top.updateTopologyVersion(exchId, this, updSeq, cacheGroupStopping(grp.groupId()));
}
for (GridClientPartitionTopology top : cctx.exchange().clientTopologies())
- top.updateTopologyVersion(exchId, this, -1, stopping(top.cacheId()));
+ top.updateTopologyVersion(exchId, this, -1, cacheGroupStopping(top.groupId()));
}
/**
@@ -731,16 +750,18 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
if (crd != null) {
if (crd.isLocal()) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- boolean updateTop = !cacheCtx.isLocal() &&
- exchId.topologyVersion().equals(cacheCtx.startTopologyVersion());
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ boolean updateTop = !grp.isLocal() &&
+ exchId.topologyVersion().equals(grp.localStartVersion());
if (updateTop) {
for (GridClientPartitionTopology top : cctx.exchange().clientTopologies()) {
- if (top.cacheId() == cacheCtx.cacheId()) {
- cacheCtx.topology().update(exchId,
- top.partitionMap(true),
- top.updateCounters(false));
+ if (top.groupId() == grp.groupId()) {
+ GridDhtPartitionFullMap fullMap = top.partitionMap(true);
+
+ assert fullMap != null;
+
+ grp.topology().update(exchId, fullMap, top.updateCounters(false));
break;
}
@@ -759,8 +780,8 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
}
else {
if (centralizedAff) { // Last server node failed.
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- GridAffinityAssignmentCache aff = cacheCtx.affinity().affinityCache();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ GridAffinityAssignmentCache aff = grp.affinity();
aff.initialize(topologyVersion(), aff.idealAssignment());
}
@@ -778,11 +799,11 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
assert !cctx.kernalContext().clientNode();
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- cacheCtx.preloader().onTopologyChanged(this);
+ grp.preloader().onTopologyChanged(this);
}
waitPartitionRelease();
@@ -790,25 +811,30 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
boolean topChanged = discoEvt.type() != EVT_DISCOVERY_CUSTOM_EVT || affChangeMsg != null;
for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal() || stopping(cacheCtx.cacheId()))
+ if (cacheCtx.isLocal() || cacheStopping(cacheCtx.cacheId()))
continue;
if (topChanged) {
// Partition release future is done so we can flush the write-behind store.
cacheCtx.store().forceFlush();
}
+ }
+
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal() || cacheGroupStopping(grp.groupId()))
+ continue;
- cacheCtx.topology().beforeExchange(this, !centralizedAff);
+ grp.topology().beforeExchange(this, !centralizedAff);
}
cctx.database().beforeExchange(this);
// If a backup request, synchronously wait for backup start.
if (discoEvt.type() == EVT_DISCOVERY_CUSTOM_EVT) {
- DiscoveryCustomMessage customMessage = ((DiscoveryCustomEvent)discoEvt).customMessage();
+ DiscoveryCustomMessage customMsg = ((DiscoveryCustomEvent)discoEvt).customMessage();
- if (customMessage instanceof StartFullSnapshotAckDiscoveryMessage) {
- StartFullSnapshotAckDiscoveryMessage backupMsg = (StartFullSnapshotAckDiscoveryMessage)customMessage;
+ if (customMsg instanceof StartFullSnapshotAckDiscoveryMessage) {
+ StartFullSnapshotAckDiscoveryMessage backupMsg = (StartFullSnapshotAckDiscoveryMessage)customMsg;
if (!cctx.localNode().isClient() && !cctx.localNode().isDaemon()) {
ClusterNode node = cctx.discovery().node(backupMsg.initiatorNodeId());
@@ -917,11 +943,11 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
*
*/
private void onLeft() {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- cacheCtx.preloader().unwindUndeploys();
+ grp.preloader().unwindUndeploys();
}
cctx.mvcc().removeExplicitNodeLocks(exchId.nodeId(), exchId.topologyVersion());
@@ -933,17 +959,17 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
private void warnNoAffinityNodes() {
List<String> cachesWithoutNodes = null;
- for (String name : cctx.cache().cacheNames()) {
- if (discoCache.cacheAffinityNodes(name).isEmpty()) {
+ for (DynamicCacheDescriptor cacheDesc : cctx.cache().cacheDescriptors().values()) {
+ if (discoCache.cacheGroupAffinityNodes(cacheDesc.groupId()).isEmpty()) {
if (cachesWithoutNodes == null)
cachesWithoutNodes = new ArrayList<>();
- cachesWithoutNodes.add(name);
+ cachesWithoutNodes.add(cacheDesc.cacheName());
// Fire event even if there is no client cache started.
if (cctx.gridEvents().isRecordable(EventType.EVT_CACHE_NODES_LEFT)) {
Event evt = new CacheEvent(
- name,
+ cacheDesc.cacheName(),
cctx.localNode(),
cctx.localNode(),
"All server nodes have left the cluster.",
@@ -1005,10 +1031,18 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
}
/**
+ * @param grpId Cache group ID to check.
+ * @return {@code True} if cache group us stopping by this exchange.
+ */
+ private boolean cacheGroupStopping(int grpId) {
+ return exchActions != null && exchActions.cacheGroupStopping(grpId);
+ }
+
+ /**
* @param cacheId Cache ID to check.
* @return {@code True} if cache is stopping by this exchange.
*/
- public boolean stopping(int cacheId) {
+ private boolean cacheStopping(int cacheId) {
return exchActions != null && exchActions.cacheStopped(cacheId);
}
@@ -1124,18 +1158,20 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
}
if (err == null && realExchange) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
try {
if (centralizedAff)
- cacheCtx.topology().initPartitions(this);
+ grp.topology().initPartitions(this);
}
catch (IgniteInterruptedCheckedException e) {
U.error(log, "Failed to initialize partitions.", e);
}
+ }
+ for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
GridCacheContext drCacheCtx = cacheCtx.isNear() ? cacheCtx.near().dht().context() : cacheCtx;
if (drCacheCtx.isDrEnabled()) {
@@ -1153,21 +1189,21 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
discoEvt.type() == EVT_NODE_JOINED)
detectLostPartitions();
- Map<Integer, CacheValidation> m = new HashMap<>(cctx.cacheContexts().size());
+ Map<Integer, CacheValidation> m = new HashMap<>(cctx.cache().cacheGroups().size());
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- Collection<Integer> lostParts = cacheCtx.isLocal() ?
- Collections.<Integer>emptyList() : cacheCtx.topology().lostPartitions();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ Collection<Integer> lostParts = grp.isLocal() ?
+ Collections.<Integer>emptyList() : grp.topology().lostPartitions();
boolean valid = true;
- if (cacheCtx.config().getTopologyValidator() != null && !CU.isSystemCache(cacheCtx.name()))
- valid = cacheCtx.config().getTopologyValidator().validate(discoEvt.topologyNodes());
+ if (grp.topologyValidator() != null && !grp.systemCache())
+ valid = grp.topologyValidator().validate(discoEvt.topologyNodes());
- m.put(cacheCtx.cacheId(), new CacheValidation(valid, lostParts));
+ m.put(grp.groupId(), new CacheValidation(valid, lostParts));
}
- cacheValidRes = m;
+ grpValidRes = m;
}
cctx.cache().onExchangeDone(exchId.topologyVersion(), exchActions, err, false);
@@ -1188,8 +1224,8 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
initFut.onDone(err == null);
if (exchId.isLeft()) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts())
- cacheCtx.config().getAffinity().removeNode(exchId.nodeId());
+ for (CacheGroupContext grp : cctx.cache().cacheGroups())
+ grp.affinityFunction().removeNode(exchId.nodeId());
}
exchActions = null;
@@ -1224,16 +1260,18 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
return new CacheInvalidStateException(
"Failed to perform cache operation (cluster is not activated): " + cctx.name());
- PartitionLossPolicy partLossPlc = cctx.config().getPartitionLossPolicy();
+ CacheGroupContext grp = cctx.group();
+
+ PartitionLossPolicy partLossPlc = grp.config().getPartitionLossPolicy();
- if (cctx.needsRecovery() && !recovery) {
+ if (grp.needsRecovery() && !recovery) {
if (!read && (partLossPlc == READ_ONLY_SAFE || partLossPlc == READ_ONLY_ALL))
return new IgniteCheckedException("Failed to write to cache (cache is moved to a read-only state): " +
cctx.name());
}
- if (cctx.needsRecovery() || cctx.config().getTopologyValidator() != null) {
- CacheValidation validation = cacheValidRes.get(cctx.cacheId());
+ if (grp.needsRecovery() || grp.topologyValidator() != null) {
+ CacheValidation validation = grpValidRes.get(grp.groupId());
if (validation == null)
return null;
@@ -1242,7 +1280,7 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
return new IgniteCheckedException("Failed to perform cache operation " +
"(cache topology is not valid): " + cctx.name());
- if (recovery || !cctx.needsRecovery())
+ if (recovery || !grp.needsRecovery())
return null;
if (key != null) {
@@ -1472,9 +1510,9 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
Map<Integer, CounterWithNodes> maxCntrs = new HashMap<>();
for (Map.Entry<UUID, GridDhtPartitionsAbstractMessage> e : msgs.entrySet()) {
- assert e.getValue().partitionUpdateCounters(top.cacheId()) != null;
+ assert e.getValue().partitionUpdateCounters(top.groupId()) != null;
- for (Map.Entry<Integer, T2<Long, Long>> e0 : e.getValue().partitionUpdateCounters(top.cacheId()).entrySet()) {
+ for (Map.Entry<Integer, T2<Long, Long>> e0 : e.getValue().partitionUpdateCounters(top.groupId()).entrySet()) {
int p = e0.getKey();
UUID uuid = e.getKey();
@@ -1536,24 +1574,32 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
if (Thread.currentThread().isInterrupted())
return;
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (!cacheCtx.isLocal())
- cacheCtx.topology().detectLostPartitions(discoEvt);
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (!grp.isLocal())
+ grp.topology().detectLostPartitions(discoEvt);
}
}
}
/**
- *
+ * @param cacheNames Cache names.
*/
private void resetLostPartitions(Collection<String> cacheNames) {
synchronized (cctx.exchange().interruptLock()) {
if (Thread.currentThread().isInterrupted())
return;
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (!cacheCtx.isLocal() && cacheNames.contains(cacheCtx.name()))
- cacheCtx.topology().resetLostPartitions();
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
+ continue;
+
+ for (String cacheName : cacheNames) {
+ if (grp.hasCache(cacheName)) {
+ grp.topology().resetLostPartitions();
+
+ break;
+ }
+ }
}
}
}
@@ -1566,9 +1612,9 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
assert crd.isLocal();
if (!crd.equals(discoCache.serverNodes().get(0))) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (!cacheCtx.isLocal())
- cacheCtx.topology().beforeExchange(this, !centralizedAff);
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (!grp.isLocal())
+ grp.topology().beforeExchange(this, !centralizedAff);
}
}
@@ -1577,13 +1623,13 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
GridDhtPartitionsSingleMessage msg0 = (GridDhtPartitionsSingleMessage)msg;
for (Map.Entry<Integer, GridDhtPartitionMap> entry : msg0.partitions().entrySet()) {
- Integer cacheId = entry.getKey();
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ Integer grpId = entry.getKey();
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- GridDhtPartitionTopology top = cacheCtx != null ? cacheCtx.topology() :
- cctx.exchange().clientTopology(cacheId, this);
+ GridDhtPartitionTopology top = grp != null ? grp.topology() :
+ cctx.exchange().clientTopology(grpId, this);
- Map<Integer, T2<Long, Long>> cntrs = msg0.partitionUpdateCounters(cacheId);
+ Map<Integer, T2<Long, Long>> cntrs = msg0.partitionUpdateCounters(grpId);
if (cntrs != null)
top.applyUpdateCounters(cntrs);
@@ -1661,11 +1707,11 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
*/
private void assignPartitionsStates() {
if (cctx.database().persistenceEnabled()) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- assignPartitionStates(cacheCtx.topology());
+ assignPartitionStates(grp.topology());
}
}
}
@@ -1790,19 +1836,19 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
cctx.versions().onExchange(msg.lastVersion().order());
for (Map.Entry<Integer, GridDhtPartitionFullMap> entry : msg.partitions().entrySet()) {
- Integer cacheId = entry.getKey();
+ Integer grpId = entry.getKey();
- Map<Integer, T2<Long, Long>> cntrMap = msg.partitionUpdateCounters(cacheId);
+ Map<Integer, T2<Long, Long>> cntrMap = msg.partitionUpdateCounters(grpId);
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- if (cacheCtx != null)
- cacheCtx.topology().update(exchId, entry.getValue(), cntrMap);
+ if (grp != null)
+ grp.topology().update(exchId, entry.getValue(), cntrMap);
else {
ClusterNode oldest = cctx.discovery().oldestAliveCacheServerNode(AffinityTopologyVersion.NONE);
if (oldest != null && oldest.isLocal())
- cctx.exchange().clientTopology(cacheId, this).update(exchId, entry.getValue(), cntrMap);
+ cctx.exchange().clientTopology(grpId, this).update(exchId, entry.getValue(), cntrMap);
}
}
}
@@ -1816,11 +1862,11 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
msgs.put(node.id(), msg);
for (Map.Entry<Integer, GridDhtPartitionMap> entry : msg.partitions().entrySet()) {
- Integer cacheId = entry.getKey();
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ Integer grpId = entry.getKey();
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- GridDhtPartitionTopology top = cacheCtx != null ? cacheCtx.topology() :
- cctx.exchange().clientTopology(cacheId, this);
+ GridDhtPartitionTopology top = grp != null ? grp.topology() :
+ cctx.exchange().clientTopology(grpId, this);
top.update(exchId, entry.getValue());
}
@@ -1972,13 +2018,13 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
List<ClusterNode> empty = Collections.emptyList();
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- List<List<ClusterNode>> affAssignment = new ArrayList<>(cacheCtx.affinity().partitions());
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ List<List<ClusterNode>> affAssignment = new ArrayList<>(grp.affinity().partitions());
- for (int i = 0; i < cacheCtx.affinity().partitions(); i++)
+ for (int i = 0; i < grp.affinity().partitions(); i++)
affAssignment.add(empty);
- cacheCtx.affinity().affinityCache().initialize(topologyVersion(), affAssignment);
+ grp.affinity().initialize(topologyVersion(), affAssignment);
}
onDone(topologyVersion());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
index 73a3481..f9bc5df 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
@@ -104,6 +104,11 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
this.topVer = topVer;
}
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
/**
* @param compress {@code True} if it is possible to use compression for message.
*/
@@ -122,24 +127,26 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @return {@code True} if message contains full map for given cache.
*/
- public boolean containsCache(int cacheId) {
- return parts != null && parts.containsKey(cacheId);
+ public boolean containsGroup(int grpId) {
+ return parts != null && parts.containsKey(grpId);
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param fullMap Full partitions map.
* @param dupDataCache Optional ID of cache with the same partition state map.
*/
- public void addFullPartitionsMap(int cacheId, GridDhtPartitionFullMap fullMap, @Nullable Integer dupDataCache) {
+ public void addFullPartitionsMap(int grpId, GridDhtPartitionFullMap fullMap, @Nullable Integer dupDataCache) {
+ assert fullMap != null;
+
if (parts == null)
parts = new HashMap<>();
- if (!parts.containsKey(cacheId)) {
- parts.put(cacheId, fullMap);
+ if (!parts.containsKey(grpId)) {
+ parts.put(grpId, fullMap);
if (dupDataCache != null) {
assert compress;
@@ -148,30 +155,30 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
if (dupPartsData == null)
dupPartsData = new HashMap<>();
- dupPartsData.put(cacheId, dupDataCache);
+ dupPartsData.put(grpId, dupDataCache);
}
}
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param cntrMap Partition update counters.
*/
- public void addPartitionUpdateCounters(int cacheId, Map<Integer, T2<Long, Long>> cntrMap) {
+ public void addPartitionUpdateCounters(int grpId, Map<Integer, T2<Long, Long>> cntrMap) {
if (partCntrs == null)
partCntrs = new HashMap<>();
- if (!partCntrs.containsKey(cacheId))
- partCntrs.put(cacheId, cntrMap);
+ if (!partCntrs.containsKey(grpId))
+ partCntrs.put(grpId, cntrMap);
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @return Partition update counters.
*/
- @Override public Map<Integer, T2<Long, Long>> partitionUpdateCounters(int cacheId) {
+ @Override public Map<Integer, T2<Long, Long>> partitionUpdateCounters(int grpId) {
if (partCntrs != null) {
- Map<Integer, T2<Long, Long>> res = partCntrs.get(cacheId);
+ Map<Integer, T2<Long, Long>> res = partCntrs.get(grpId);
return res != null ? res : Collections.<Integer, T2<Long, Long>>emptyMap();
}
@@ -331,31 +338,31 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
}
switch (writer.state()) {
- case 6:
+ case 5:
if (!writer.writeMap("dupPartsData", dupPartsData, MessageCollectionItemType.INT, MessageCollectionItemType.INT))
return false;
writer.incrementState();
- case 7:
+ case 6:
if (!writer.writeByteArray("exsBytes", exsBytes))
return false;
writer.incrementState();
- case 8:
+ case 7:
if (!writer.writeByteArray("partCntrsBytes", partCntrsBytes))
return false;
writer.incrementState();
- case 9:
+ case 8:
if (!writer.writeByteArray("partsBytes", partsBytes))
return false;
writer.incrementState();
- case 10:
+ case 9:
if (!writer.writeMessage("topVer", topVer))
return false;
@@ -377,7 +384,7 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
return false;
switch (reader.state()) {
- case 6:
+ case 5:
dupPartsData = reader.readMap("dupPartsData", MessageCollectionItemType.INT, MessageCollectionItemType.INT, false);
if (!reader.isLastRead())
@@ -385,7 +392,7 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
reader.incrementState();
- case 7:
+ case 6:
exsBytes = reader.readByteArray("exsBytes");
if (!reader.isLastRead())
@@ -393,7 +400,7 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
reader.incrementState();
- case 8:
+ case 7:
partCntrsBytes = reader.readByteArray("partCntrsBytes");
if (!reader.isLastRead())
@@ -401,7 +408,7 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
reader.incrementState();
- case 9:
+ case 8:
partsBytes = reader.readByteArray("partsBytes");
if (!reader.isLastRead())
@@ -409,7 +416,7 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
reader.incrementState();
- case 10:
+ case 9:
topVer = reader.readMessage("topVer");
if (!reader.isLastRead())
@@ -427,10 +434,9 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
return 46;
}
- //todo
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 11;
+ return 10;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java
index 9003f3a..416b127 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java
@@ -103,6 +103,11 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
this.compress = compress;
}
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
/**
* @return {@code True} if sent from client node.
*/
@@ -134,23 +139,23 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param cntrMap Partition update counters.
*/
- public void partitionUpdateCounters(int cacheId, Map<Integer, T2<Long, Long>> cntrMap) {
+ public void partitionUpdateCounters(int grpId, Map<Integer, T2<Long, Long>> cntrMap) {
if (partCntrs == null)
partCntrs = new HashMap<>();
- partCntrs.put(cacheId, cntrMap);
+ partCntrs.put(grpId, cntrMap);
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @return Partition update counters.
*/
- @Override public Map<Integer, T2<Long, Long>> partitionUpdateCounters(int cacheId) {
+ @Override public Map<Integer, T2<Long, Long>> partitionUpdateCounters(int grpId) {
if (partCntrs != null) {
- Map<Integer, T2<Long, Long>> res = partCntrs.get(cacheId);
+ Map<Integer, T2<Long, Long>> res = partCntrs.get(grpId);
return res != null ? res : Collections.<Integer, T2<Long, Long>>emptyMap();
}
@@ -291,31 +296,31 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
}
switch (writer.state()) {
- case 6:
+ case 5:
if (!writer.writeBoolean("client", client))
return false;
writer.incrementState();
- case 7:
+ case 6:
if (!writer.writeMap("dupPartsData", dupPartsData, MessageCollectionItemType.INT, MessageCollectionItemType.INT))
return false;
writer.incrementState();
- case 8:
+ case 7:
if (!writer.writeByteArray("exBytes", exBytes))
return false;
writer.incrementState();
- case 9:
+ case 8:
if (!writer.writeByteArray("partCntrsBytes", partCntrsBytes))
return false;
writer.incrementState();
- case 10:
+ case 9:
if (!writer.writeByteArray("partsBytes", partsBytes))
return false;
@@ -337,7 +342,7 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
return false;
switch (reader.state()) {
- case 6:
+ case 5:
client = reader.readBoolean("client");
if (!reader.isLastRead())
@@ -345,7 +350,7 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
reader.incrementState();
- case 7:
+ case 6:
dupPartsData = reader.readMap("dupPartsData", MessageCollectionItemType.INT, MessageCollectionItemType.INT, false);
if (!reader.isLastRead())
@@ -353,7 +358,7 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
reader.incrementState();
- case 8:
+ case 7:
exBytes = reader.readByteArray("exBytes");
if (!reader.isLastRead())
@@ -361,7 +366,7 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
reader.incrementState();
- case 9:
+ case 8:
partCntrsBytes = reader.readByteArray("partCntrsBytes");
if (!reader.isLastRead())
@@ -369,7 +374,7 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
reader.incrementState();
- case 10:
+ case 9:
partsBytes = reader.readByteArray("partsBytes");
if (!reader.isLastRead())
@@ -387,10 +392,9 @@ public class GridDhtPartitionsSingleMessage extends GridDhtPartitionsAbstractMes
return 47;
}
- //todo add ex
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 11;
+ return 10;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleRequest.java
index b4ce939..4b80ee0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleRequest.java
@@ -48,6 +48,11 @@ public class GridDhtPartitionsSingleRequest extends GridDhtPartitionsAbstractMes
}
/** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
@Override public Map<Integer, T2<Long, Long>> partitionUpdateCounters(int cacheId) {
return Collections.emptyMap();
}
@@ -89,7 +94,7 @@ public class GridDhtPartitionsSingleRequest extends GridDhtPartitionsAbstractMes
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 6;
+ return 5;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
index 57616ed..a931ef4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
@@ -23,30 +23,20 @@ import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.events.DiscoveryEvent;
-import org.apache.ignite.events.Event;
import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.NodeStoppingException;
-import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
-import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
-import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
import org.apache.ignite.internal.processors.cache.GridCachePreloaderAdapter;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtFuture;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
@@ -60,23 +50,14 @@ import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.GPC;
import org.apache.ignite.internal.util.typedef.internal.LT;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.lang.IgniteBiInClosure;
import org.apache.ignite.lang.IgnitePredicate;
-import org.apache.ignite.lang.IgniteUuid;
import org.jetbrains.annotations.Nullable;
-import org.jsr166.ConcurrentLinkedDeque8;
import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST;
import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_UNLOADED;
-import static org.apache.ignite.events.EventType.EVT_NODE_FAILED;
-import static org.apache.ignite.events.EventType.EVT_NODE_JOINED;
-import static org.apache.ignite.events.EventType.EVT_NODE_LEFT;
-import static org.apache.ignite.internal.managers.communication.GridIoPolicy.AFFINITY_POOL;
import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.MOVING;
import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.OWNING;
import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.RENTING;
-import static org.apache.ignite.internal.util.GridConcurrentFactory.newMap;
/**
* DHT cache preloader.
@@ -88,9 +69,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** */
private GridDhtPartitionTopology top;
- /** Force key futures. */
- private final ConcurrentMap<IgniteUuid, GridDhtForceKeysFuture<?, ?>> forceKeyFuts = newMap();
-
/** Partition suppliers. */
private GridDhtPartitionSupplier supplier;
@@ -113,47 +91,15 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
private final AtomicInteger partsEvictOwning = new AtomicInteger();
/** */
- private volatile boolean stopping;
-
- /** */
private boolean stopped;
- /** Discovery listener. */
- private final GridLocalEventListener discoLsnr = new GridLocalEventListener() {
- @Override public void onEvent(Event evt) {
- if (!enterBusy())
- return;
-
- DiscoveryEvent e = (DiscoveryEvent)evt;
-
- try {
- ClusterNode loc = cctx.localNode();
-
- assert e.type() == EVT_NODE_JOINED || e.type() == EVT_NODE_LEFT || e.type() == EVT_NODE_FAILED;
-
- final ClusterNode n = e.eventNode();
-
- assert !loc.id().equals(n.id());
-
- for (GridDhtForceKeysFuture<?, ?> f : forceKeyFuts.values())
- f.onDiscoveryEvent(e);
-
- assert e.type() != EVT_NODE_JOINED || n.order() > loc.order() : "Node joined with smaller-than-local " +
- "order [newOrder=" + n.order() + ", locOrder=" + loc.order() + ']';
- }
- finally {
- leaveBusy();
- }
- }
- };
-
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
*/
- public GridDhtPreloader(GridCacheContext<?, ?> cctx) {
- super(cctx);
+ public GridDhtPreloader(CacheGroupContext grp) {
+ super(grp);
- top = cctx.dht().topology();
+ top = grp.topology();
startFut = new GridFutureAdapter<>();
}
@@ -163,37 +109,10 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
if (log.isDebugEnabled())
log.debug("Starting DHT rebalancer...");
- cctx.io().addHandler(cctx.cacheId(), GridDhtForceKeysRequest.class,
- new MessageHandler<GridDhtForceKeysRequest>() {
- @Override public void onMessage(ClusterNode node, GridDhtForceKeysRequest msg) {
- processForceKeysRequest(node, msg);
- }
- });
-
- cctx.io().addHandler(cctx.cacheId(), GridDhtForceKeysResponse.class,
- new MessageHandler<GridDhtForceKeysResponse>() {
- @Override public void onMessage(ClusterNode node, GridDhtForceKeysResponse msg) {
- processForceKeyResponse(node, msg);
- }
- });
-
- if (!cctx.kernalContext().clientNode()) {
- cctx.io().addHandler(cctx.cacheId(), GridDhtAffinityAssignmentRequest.class,
- new MessageHandler<GridDhtAffinityAssignmentRequest>() {
- @Override protected void onMessage(ClusterNode node, GridDhtAffinityAssignmentRequest msg) {
- processAffinityAssignmentRequest(node, msg);
- }
- });
- }
-
- cctx.shared().affinity().onCacheCreated(cctx);
-
- supplier = new GridDhtPartitionSupplier(cctx);
- demander = new GridDhtPartitionDemander(cctx);
+ supplier = new GridDhtPartitionSupplier(grp);
+ demander = new GridDhtPartitionDemander(grp);
demander.start();
-
- cctx.events().addListener(discoLsnr, EVT_NODE_JOINED, EVT_NODE_LEFT, EVT_NODE_FAILED);
}
/** {@inheritDoc} */
@@ -212,10 +131,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
if (log.isDebugEnabled())
log.debug("DHT rebalancer onKernalStop callback.");
- stopping = true;
-
- cctx.events().removeListener(discoLsnr);
-
// Acquire write busy lock.
busyLock.writeLock().lock();
@@ -226,11 +141,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
if (demander != null)
demander.stop();
- IgniteCheckedException err = stopError();
-
- for (GridDhtForceKeysFuture fut : forceKeyFuts.values())
- fut.onDone(err);
-
top = null;
stopped = true;
@@ -239,12 +149,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
busyLock.writeLock().unlock();
}
}
- /**
- * @return Node stop exception.
- */
- private IgniteCheckedException stopError() {
- return new NodeStoppingException("Operation has been cancelled (cache or node is stopping).");
- }
/** {@inheritDoc} */
@Override public void onInitialExchangeComplete(@Nullable Throwable err) {
@@ -264,25 +168,27 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** {@inheritDoc} */
@Override public GridDhtPreloaderAssignments assign(GridDhtPartitionsExchangeFuture exchFut) {
// No assignments for disabled preloader.
- GridDhtPartitionTopology top = cctx.dht().topology();
+ GridDhtPartitionTopology top = grp.topology();
- if (!cctx.rebalanceEnabled() || !cctx.shared().kernalContext().state().active())
+ if (!grp.rebalanceEnabled() || !grp.shared().kernalContext().state().active())
return new GridDhtPreloaderAssignments(exchFut, top.topologyVersion());
- int partCnt = cctx.affinity().partitions();
+ int partCnt = grp.affinity().partitions();
assert exchFut.forcePreload() || exchFut.dummyReassign() ||
exchFut.exchangeId().topologyVersion().equals(top.topologyVersion()) :
"Topology version mismatch [exchId=" + exchFut.exchangeId() +
- ", cache=" + cctx.name() +
+ ", grp=" + grp.name() +
", topVer=" + top.topologyVersion() + ']';
GridDhtPreloaderAssignments assigns = new GridDhtPreloaderAssignments(exchFut, top.topologyVersion());
AffinityTopologyVersion topVer = assigns.topologyVersion();
+ AffinityAssignment aff = grp.affinity().cachedAffinity(topVer);
+
for (int p = 0; p < partCnt; p++) {
- if (cctx.shared().exchange().hasPendingExchange()) {
+ if (ctx.exchange().hasPendingExchange()) {
if (log.isDebugEnabled())
log.debug("Skipping assignments creation, exchange worker has pending assignments: " +
exchFut.exchangeId());
@@ -293,7 +199,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
}
// If partition belongs to local node.
- if (cctx.affinity().partitionLocalNode(p, topVer)) {
+ if (aff.get(p).contains(ctx.localNode())) {
GridDhtLocalPartition part = top.localPartition(p, topVer, true);
assert part != null;
@@ -311,12 +217,14 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
if (picked.isEmpty()) {
top.own(part);
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
DiscoveryEvent discoEvt = exchFut.discoveryEvent();
- cctx.events().addPreloadEvent(p,
- EVT_CACHE_REBALANCE_PART_DATA_LOST, discoEvt.eventNode(),
- discoEvt.type(), discoEvt.timestamp());
+ grp.addRebalanceEvent(p,
+ EVT_CACHE_REBALANCE_PART_DATA_LOST,
+ discoEvt.eventNode(),
+ discoEvt.type(),
+ discoEvt.timestamp());
}
if (log.isDebugEnabled())
@@ -331,7 +239,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
assigns.put(n, msg = new GridDhtPartitionDemandMessage(
top.updateSequence(),
exchFut.exchangeId().topologyVersion(),
- cctx.cacheId()));
+ grp.groupId()));
}
msg.addPartition(p);
@@ -353,7 +261,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
* @return Picked owners.
*/
private Collection<ClusterNode> pickedOwners(int p, AffinityTopologyVersion topVer) {
- Collection<ClusterNode> affNodes = cctx.affinity().nodesByPartition(p, topVer);
+ Collection<ClusterNode> affNodes = grp.affinity().cachedAffinity(topVer).get(p);
int affCnt = affNodes.size();
@@ -379,7 +287,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
* @return Nodes owning this partition.
*/
private Collection<ClusterNode> remoteOwners(int p, AffinityTopologyVersion topVer) {
- return F.view(cctx.dht().topology().owners(p, topVer), F.remoteNodes(cctx.nodeId()));
+ return F.view(grp.topology().owners(p, topVer), F.remoteNodes(ctx.localNodeId()));
}
/** {@inheritDoc} */
@@ -418,7 +326,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** {@inheritDoc} */
@Override public Runnable addAssignments(GridDhtPreloaderAssignments assignments,
boolean forceRebalance,
- Collection<String> caches,
int cnt,
Runnable next,
@Nullable GridFutureAdapter<Boolean> forcedRebFut) {
@@ -434,12 +341,12 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** {@inheritDoc} */
@Override public IgniteInternalFuture<?> syncFuture() {
- return cctx.kernalContext().clientNode() ? startFut : demander.syncFuture();
+ return ctx.kernalContext().clientNode() ? startFut : demander.syncFuture();
}
/** {@inheritDoc} */
@Override public IgniteInternalFuture<Boolean> rebalanceFuture() {
- return cctx.kernalContext().clientNode() ? new GridFinishedFuture<>(true) : demander.rebalanceFuture();
+ return ctx.kernalContext().clientNode() ? new GridFinishedFuture<>(true) : demander.rebalanceFuture();
}
/**
@@ -466,171 +373,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
}
/**
- * @param node Node originated request.
- * @param msg Force keys message.
- */
- private void processForceKeysRequest(final ClusterNode node, final GridDhtForceKeysRequest msg) {
- IgniteInternalFuture<?> fut = cctx.mvcc().finishKeys(msg.keys(), msg.cacheId(), msg.topologyVersion());
-
- if (fut.isDone())
- processForceKeysRequest0(node, msg);
- else
- fut.listen(new CI1<IgniteInternalFuture<?>>() {
- @Override public void apply(IgniteInternalFuture<?> t) {
- processForceKeysRequest0(node, msg);
- }
- });
- }
-
- /**
- * @param node Node originated request.
- * @param msg Force keys message.
- */
- private void processForceKeysRequest0(ClusterNode node, GridDhtForceKeysRequest msg) {
- if (!enterBusy())
- return;
-
- try {
- ClusterNode loc = cctx.localNode();
-
- GridDhtForceKeysResponse res = new GridDhtForceKeysResponse(
- cctx.cacheId(),
- msg.futureId(),
- msg.miniId(),
- cctx.deploymentEnabled());
-
- for (KeyCacheObject k : msg.keys()) {
- int p = cctx.affinity().partition(k);
-
- GridDhtLocalPartition locPart = top.localPartition(p, AffinityTopologyVersion.NONE, false);
-
- // If this node is no longer an owner.
- if (locPart == null && !top.owners(p).contains(loc)) {
- res.addMissed(k);
-
- continue;
- }
-
- GridCacheEntryEx entry = null;
-
- while (true) {
- try {
- entry = cctx.dht().entryEx(k);
-
- entry.unswap();
-
- GridCacheEntryInfo info = entry.info();
-
- if (info == null) {
- assert entry.obsolete() : entry;
-
- continue;
- }
-
- if (!info.isNew())
- res.addInfo(info);
-
- cctx.evicts().touch(entry, msg.topologyVersion());
-
- break;
- }
- catch (GridCacheEntryRemovedException ignore) {
- if (log.isDebugEnabled())
- log.debug("Got removed entry: " + k);
- }
- catch (GridDhtInvalidPartitionException ignore) {
- if (log.isDebugEnabled())
- log.debug("Local node is no longer an owner: " + p);
-
- res.addMissed(k);
-
- break;
- }
- }
- }
-
- if (log.isDebugEnabled())
- log.debug("Sending force key response [node=" + node.id() + ", res=" + res + ']');
-
- cctx.io().send(node, res, cctx.ioPolicy());
- }
- catch (ClusterTopologyCheckedException ignore) {
- if (log.isDebugEnabled())
- log.debug("Received force key request form failed node (will ignore) [nodeId=" + node.id() +
- ", req=" + msg + ']');
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to reply to force key request [nodeId=" + node.id() + ", req=" + msg + ']', e);
- }
- finally {
- leaveBusy();
- }
- }
-
- /**
- * @param node Node.
- * @param msg Message.
- */
- private void processForceKeyResponse(ClusterNode node, GridDhtForceKeysResponse msg) {
- if (!enterBusy())
- return;
-
- try {
- GridDhtForceKeysFuture<?, ?> f = forceKeyFuts.get(msg.futureId());
-
- if (f != null)
- f.onResult(msg);
- else if (log.isDebugEnabled())
- log.debug("Receive force key response for unknown future (is it duplicate?) [nodeId=" + node.id() +
- ", res=" + msg + ']');
- }
- finally {
- leaveBusy();
- }
- }
-
- /**
- * @param node Node.
- * @param req Request.
- */
- private void processAffinityAssignmentRequest(final ClusterNode node,
- final GridDhtAffinityAssignmentRequest req) {
- final AffinityTopologyVersion topVer = req.topologyVersion();
-
- if (log.isDebugEnabled())
- log.debug("Processing affinity assignment request [node=" + node + ", req=" + req + ']');
-
- cctx.affinity().affinityReadyFuture(req.topologyVersion()).listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
- @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
- if (log.isDebugEnabled())
- log.debug("Affinity is ready for topology version, will send response [topVer=" + topVer +
- ", node=" + node + ']');
-
- AffinityAssignment assignment = cctx.affinity().assignment(topVer);
-
- GridDhtAffinityAssignmentResponse res = new GridDhtAffinityAssignmentResponse(
- req.futureId(),
- cctx.cacheId(),
- topVer,
- assignment.assignment());
-
- if (cctx.affinity().affinityCache().centralizedAffinityFunction()) {
- assert assignment.idealAssignment() != null;
-
- res.idealAffinityAssignment(assignment.idealAssignment());
- }
-
- try {
- cctx.io().send(node, res, AFFINITY_POOL);
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to send affinity assignment response to remote node [node=" + node + ']', e);
- }
- }
- });
- }
-
- /**
* Resends partitions on partition evict within configured timeout.
*
* @param part Evicted partition.
@@ -643,11 +385,11 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
try {
top.onEvicted(part, updateSeq);
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_UNLOADED))
- cctx.events().addUnloadEvent(part.id());
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_PART_UNLOADED))
+ grp.addUnloadEvent(part.id());
if (updateSeq)
- cctx.shared().exchange().scheduleResendPartitions();
+ ctx.exchange().scheduleResendPartitions();
}
finally {
leaveBusy();
@@ -656,7 +398,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** {@inheritDoc} */
@Override public boolean needForceKeys() {
- if (cctx.rebalanceEnabled()) {
+ if (grp.rebalanceEnabled()) {
IgniteInternalFuture<Boolean> rebalanceFut = rebalanceFuture();
if (rebalanceFut.isDone() && Boolean.TRUE.equals(rebalanceFut.result()))
@@ -667,12 +409,13 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
}
/** {@inheritDoc} */
- @Override public IgniteInternalFuture<Object> request(GridNearAtomicAbstractUpdateRequest req,
+ @Override public GridDhtFuture<Object> request(GridCacheContext cctx,
+ GridNearAtomicAbstractUpdateRequest req,
AffinityTopologyVersion topVer) {
if (!needForceKeys())
return null;
- return request0(req.keys(), topVer);
+ return request0(cctx, req.keys(), topVer);
}
/**
@@ -680,21 +423,27 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
* @return Future for request.
*/
@SuppressWarnings({"unchecked", "RedundantCast"})
- @Override public GridDhtFuture<Object> request(Collection<KeyCacheObject> keys, AffinityTopologyVersion topVer) {
+ @Override public GridDhtFuture<Object> request(GridCacheContext cctx,
+ Collection<KeyCacheObject> keys,
+ AffinityTopologyVersion topVer) {
if (!needForceKeys())
return null;
- return request0(keys, topVer);
+ return request0(cctx, keys, topVer);
}
/**
+ * @param cctx Cache context.
* @param keys Keys to request.
* @param topVer Topology version.
* @return Future for request.
*/
@SuppressWarnings({"unchecked", "RedundantCast"})
- private GridDhtFuture<Object> request0(Collection<KeyCacheObject> keys, AffinityTopologyVersion topVer) {
- final GridDhtForceKeysFuture<?, ?> fut = new GridDhtForceKeysFuture<>(cctx, topVer, keys, this);
+ private GridDhtFuture<Object> request0(GridCacheContext cctx, Collection<KeyCacheObject> keys, AffinityTopologyVersion topVer) {
+ if (cctx.isNear())
+ cctx = cctx.near().dht().context();
+
+ final GridDhtForceKeysFuture<?, ?> fut = new GridDhtForceKeysFuture<>(cctx, topVer, keys);
IgniteInternalFuture<?> topReadyFut = cctx.affinity().affinityReadyFuturex(topVer);
@@ -704,7 +453,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
if (topReadyFut == null)
startFut.listen(new CI1<IgniteInternalFuture<?>>() {
@Override public void apply(IgniteInternalFuture<?> syncFut) {
- cctx.kernalContext().closure().runLocalSafe(
+ ctx.kernalContext().closure().runLocalSafe(
new GridPlainRunnable() {
@Override public void run() {
fut.init();
@@ -741,46 +490,19 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
demandLock.writeLock().lock();
try {
- cctx.deploy().unwind(cctx);
+ grp.unwindUndeploys();
}
finally {
demandLock.writeLock().unlock();
}
}
- /**
- * Adds future to future map.
- *
- * @param fut Future to add.
- * @return {@code False} if node cache is stopping and future was completed with error.
- */
- boolean addFuture(GridDhtForceKeysFuture<?, ?> fut) {
- forceKeyFuts.put(fut.futureId(), fut);
-
- if (stopping) {
- fut.onDone(stopError());
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Removes future from future map.
- *
- * @param fut Future to remove.
- */
- void remoteFuture(GridDhtForceKeysFuture<?, ?> fut) {
- forceKeyFuts.remove(fut.futureId(), fut);
- }
-
/** {@inheritDoc} */
@Override public void evictPartitionAsync(GridDhtLocalPartition part) {
partsToEvict.putIfAbsent(part.id(), part);
if (partsEvictOwning.get() == 0 && partsEvictOwning.compareAndSet(0, 1)) {
- cctx.closures().callLocalSafe(new GPC<Boolean>() {
+ ctx.kernalContext().closure().callLocalSafe(new GPC<Boolean>() {
@Override public Boolean call() {
boolean locked = true;
@@ -801,7 +523,7 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
partsToEvict.put(part.id(), part);
}
catch (Throwable ex) {
- if (cctx.kernalContext().isStopping()) {
+ if (ctx.kernalContext().isStopping()) {
LT.warn(log, ex, "Partition eviction failed (current node is stopping).",
false,
true);
@@ -836,44 +558,6 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
/** {@inheritDoc} */
@Override public void dumpDebugInfo() {
- if (!forceKeyFuts.isEmpty()) {
- U.warn(log, "Pending force key futures [cache=" + cctx.name() + "]:");
-
- for (GridDhtForceKeysFuture fut : forceKeyFuts.values())
- U.warn(log, ">>> " + fut);
- }
-
supplier.dumpDebugInfo();
}
-
- /**
- *
- */
- private abstract class MessageHandler<M> implements IgniteBiInClosure<UUID, M> {
- /** */
- private static final long serialVersionUID = 0L;
-
- /** {@inheritDoc} */
- @Override public void apply(UUID nodeId, M msg) {
- ClusterNode node = cctx.node(nodeId);
-
- if (node == null) {
- if (log.isDebugEnabled())
- log.debug("Received message from failed node [node=" + nodeId + ", msg=" + msg + ']');
-
- return;
- }
-
- if (log.isDebugEnabled())
- log.debug("Received message from node [node=" + nodeId + ", msg=" + msg + ']');
-
- onMessage(node, msg);
- }
-
- /**
- * @param node Node.
- * @param msg Message.
- */
- protected abstract void onMessage(ClusterNode node, M msg);
- }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java
index 2d5c8a5..e6c5c10 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearAtomicCache.java
@@ -103,7 +103,7 @@ public class GridNearAtomicCache<K, V> extends GridNearCacheAdapter<K, V> {
@Override public void start() throws IgniteCheckedException {
super.start();
- ctx.io().addHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
@Override public void apply(UUID nodeId, GridNearGetResponse res) {
processGetResponse(nodeId, res);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
index f8240f3..5b53935 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
@@ -86,11 +86,23 @@ public abstract class GridNearCacheAdapter<K, V> extends GridDistributedCacheAda
* @param ctx Context.
*/
protected GridNearCacheAdapter(GridCacheContext<K, V> ctx) {
- super(ctx, ctx.config().getNearConfiguration().getNearStartSize());
+ super(ctx);
}
/** {@inheritDoc} */
- @Override protected GridCacheMapEntryFactory entryFactory() {
+ @Override public void start() throws IgniteCheckedException {
+ if (map == null) {
+ map = new GridCacheLocalConcurrentMap(
+ ctx,
+ entryFactory(),
+ ctx.config().getNearConfiguration().getNearStartSize());
+ }
+ }
+
+ /**
+ * @return Entry factory.
+ */
+ private GridCacheMapEntryFactory entryFactory() {
return new GridCacheMapEntryFactory() {
@Override public GridCacheMapEntry create(
GridCacheContext ctx,
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java
index 757bfbd..6092511 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java
@@ -32,7 +32,7 @@ import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -50,7 +50,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Get request.
*/
-public class GridNearGetRequest extends GridCacheMessage implements GridCacheDeployable,
+public class GridNearGetRequest extends GridCacheIdMessage implements GridCacheDeployable,
GridCacheVersionable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
index 50af754..b4e4424 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
@@ -28,7 +28,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersionable;
@@ -45,7 +45,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Get response.
*/
-public class GridNearGetResponse extends GridCacheMessage implements GridCacheDeployable,
+public class GridNearGetResponse extends GridCacheIdMessage implements GridCacheDeployable,
GridCacheVersionable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
index f4ce1ac..edddf7d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
@@ -58,6 +58,7 @@ import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiClosure;
+import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.transactions.TransactionDeadlockException;
import org.apache.ignite.transactions.TransactionTimeoutException;
import org.jetbrains.annotations.Nullable;
@@ -159,12 +160,20 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
if (e instanceof IgniteTxRollbackCheckedException) {
if (marked) {
- try {
- tx.rollback();
- }
- catch (IgniteCheckedException ex) {
- U.error(log, "Failed to automatically rollback transaction: " + tx, ex);
- }
+ tx.rollbackAsync().listen(new IgniteInClosure<IgniteInternalFuture<IgniteInternalTx>>() {
+ @Override public void apply(IgniteInternalFuture<IgniteInternalTx> fut) {
+ try {
+ fut.get();
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to automatically rollback transaction: " + tx, e);
+ }
+
+ onComplete();
+ }
+ });
+
+ return;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
index 0faa8ec..00ff4bb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
@@ -23,7 +23,7 @@ import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -35,7 +35,7 @@ import org.jetbrains.annotations.NotNull;
/**
*
*/
-public class GridNearSingleGetRequest extends GridCacheMessage implements GridCacheDeployable {
+public class GridNearSingleGetRequest extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
index 554fca1..2cb75c2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
@@ -25,7 +25,7 @@ import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -37,7 +37,7 @@ import org.jetbrains.annotations.Nullable;
/**
*
*/
-public class GridNearSingleGetResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridNearSingleGetResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
@@ -115,7 +115,7 @@ public class GridNearSingleGetResponse extends GridCacheMessage implements GridC
* @return Topology version.
*/
@Override public AffinityTopologyVersion topologyVersion() {
- return topVer;
+ return topVer != null ? topVer : super.topologyVersion();
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
index cc90be0..a691cbc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTransactionalCache.java
@@ -87,13 +87,13 @@ public class GridNearTransactionalCache<K, V> extends GridNearCacheAdapter<K, V>
@Override public void start() throws IgniteCheckedException {
super.start();
- ctx.io().addHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
@Override public void apply(UUID nodeId, GridNearGetResponse res) {
processGetResponse(nodeId, res);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearLockResponse.class, new CI2<UUID, GridNearLockResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearLockResponse.class, new CI2<UUID, GridNearLockResponse>() {
@Override public void apply(UUID nodeId, GridNearLockResponse res) {
processLockResponse(nodeId, res);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java
index e3dcbf8..a1a2b57 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxFinishResponse.java
@@ -133,19 +133,19 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse {
}
switch (writer.state()) {
- case 7:
+ case 6:
if (!writer.writeByteArray("errBytes", errBytes))
return false;
writer.incrementState();
- case 8:
+ case 7:
if (!writer.writeInt("miniId", miniId))
return false;
writer.incrementState();
- case 9:
+ case 8:
if (!writer.writeLong("nearThreadId", nearThreadId))
return false;
@@ -167,7 +167,7 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse {
return false;
switch (reader.state()) {
- case 7:
+ case 6:
errBytes = reader.readByteArray("errBytes");
if (!reader.isLastRead())
@@ -175,7 +175,7 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse {
reader.incrementState();
- case 8:
+ case 7:
miniId = reader.readInt("miniId");
if (!reader.isLastRead())
@@ -183,7 +183,7 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse {
reader.incrementState();
- case 9:
+ case 8:
nearThreadId = reader.readLong("nearThreadId");
if (!reader.isLastRead())
@@ -203,7 +203,7 @@ public class GridNearTxFinishResponse extends GridDistributedTxFinishResponse {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 10;
+ return 9;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCache.java
index 8b538ee..69d1260 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCache.java
@@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
+import org.apache.ignite.internal.processors.cache.GridCacheLocalConcurrentMap;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntryFactory;
import org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate;
@@ -65,9 +66,15 @@ public class GridLocalCache<K, V> extends GridCacheAdapter<K, V> {
* @param ctx Cache registry.
*/
public GridLocalCache(GridCacheContext<K, V> ctx) {
- super(ctx, DFLT_START_CACHE_SIZE);
+ super(ctx);
- preldr = new GridCachePreloaderAdapter(ctx);
+ preldr = new GridCachePreloaderAdapter(ctx.group());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void start() throws IgniteCheckedException {
+ if (map == null)
+ map = new GridCacheLocalConcurrentMap(ctx, entryFactory(), DFLT_START_CACHE_SIZE);
}
/** {@inheritDoc} */
@@ -80,8 +87,10 @@ public class GridLocalCache<K, V> extends GridCacheAdapter<K, V> {
return preldr;
}
- /** {@inheritDoc} */
- @Override protected GridCacheMapEntryFactory entryFactory() {
+ /**
+ * @return Entry factory.
+ */
+ private GridCacheMapEntryFactory entryFactory() {
return new GridCacheMapEntryFactory() {
@Override public GridCacheMapEntry create(
GridCacheContext ctx,
@@ -97,7 +106,7 @@ public class GridLocalCache<K, V> extends GridCacheAdapter<K, V> {
* @param key Key of entry.
* @return Cache entry.
*/
- @Nullable GridLocalCacheEntry peekExx(KeyCacheObject key) {
+ @Nullable private GridLocalCacheEntry peekExx(KeyCacheObject key) {
return (GridLocalCacheEntry)peekEx(key);
}
@@ -215,7 +224,7 @@ public class GridLocalCache<K, V> extends GridCacheAdapter<K, V> {
modes.backup = true;
if (modes.offheap)
- return ctx.offheap().entriesCount();
+ return ctx.offheap().cacheEntriesCount(ctx.cacheId());
else if (modes.heap)
return size();
else
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
index 56041ee..384cd41 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -104,7 +104,7 @@ public class GridLocalAtomicCache<K, V> extends GridLocalCache<K, V> {
public GridLocalAtomicCache(GridCacheContext<K, V> ctx) {
super(ctx);
- preldr = new GridCachePreloaderAdapter(ctx);
+ preldr = new GridCachePreloaderAdapter(ctx.group());
}
/** {@inheritDoc} */
@@ -405,7 +405,7 @@ public class GridLocalAtomicCache<K, V> extends GridLocalCache<K, V> {
boolean skipEntry = readNoEntry;
if (readNoEntry) {
- CacheDataRow row = ctx.offheap().read(cacheKey);
+ CacheDataRow row = ctx.offheap().read(ctx, cacheKey);
if (row != null) {
long expireTime = row.expireTime();
[14/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
new file mode 100644
index 0000000..4844a55
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupContext.java
@@ -0,0 +1,943 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.cache.affinity.AffinityFunction;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataPageEvictionMode;
+import org.apache.ignite.configuration.TopologyValidator;
+import org.apache.ignite.events.CacheRebalancingEvent;
+import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache;
+import org.apache.ignite.internal.processors.cache.database.MemoryPolicy;
+import org.apache.ignite.internal.processors.cache.database.freelist.FreeList;
+import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader;
+import org.apache.ignite.internal.processors.cache.query.continuous.CounterSkipContext;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.util.typedef.CI1;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.LT;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiInClosure;
+import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.cache.CacheMode.LOCAL;
+import static org.apache.ignite.cache.CacheRebalanceMode.NONE;
+import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_UNLOADED;
+import static org.apache.ignite.internal.managers.communication.GridIoPolicy.AFFINITY_POOL;
+
+/**
+ *
+ */
+public class CacheGroupContext {
+ /**
+ * Unique group ID. Currently for shared group it is generated as group name hash,
+ * for non-shared as cache name hash (see {@link ClusterCachesInfo#checkCacheConflict}).
+ */
+ private final int grpId;
+
+ /** Node ID cache group was received from. */
+ private final UUID rcvdFrom;
+
+ /** Flag indicating that this cache group is in a recovery mode due to partitions loss. */
+ private boolean needsRecovery;
+
+ /** */
+ private final AffinityTopologyVersion locStartVer;
+
+ /** */
+ private final CacheConfiguration<?, ?> ccfg;
+
+ /** */
+ private final GridCacheSharedContext ctx;
+
+ /** */
+ private final boolean affNode;
+
+ /** */
+ private final CacheType cacheType;
+
+ /** */
+ private final byte ioPlc;
+
+ /** */
+ private final boolean depEnabled;
+
+ /** */
+ private final boolean storeCacheId;
+
+ /** */
+ private volatile List<GridCacheContext> caches;
+
+ /** */
+ private volatile List<GridCacheContext> contQryCaches;
+
+ /** */
+ private final IgniteLogger log;
+
+ /** */
+ private GridAffinityAssignmentCache aff;
+
+ /** */
+ private GridDhtPartitionTopologyImpl top;
+
+ /** */
+ private IgniteCacheOffheapManager offheapMgr;
+
+ /** */
+ private GridCachePreloader preldr;
+
+ /** */
+ private final MemoryPolicy memPlc;
+
+ /** */
+ private final CacheObjectContext cacheObjCtx;
+
+ /** */
+ private final FreeList freeList;
+
+ /** */
+ private final ReuseList reuseList;
+
+ /** */
+ private boolean drEnabled;
+
+ /** */
+ private boolean qryEnabled;
+
+ /**
+ * @param grpId Group ID.
+ * @param ctx Context.
+ * @param rcvdFrom Node ID cache group was received from.
+ * @param cacheType Cache type.
+ * @param ccfg Cache configuration.
+ * @param affNode Affinity node flag.
+ * @param memPlc Memory policy.
+ * @param cacheObjCtx Cache object context.
+ * @param freeList Free list.
+ * @param reuseList Reuse list.
+ * @param locStartVer Topology version when group was started on local node.
+ */
+ CacheGroupContext(
+ GridCacheSharedContext ctx,
+ int grpId,
+ UUID rcvdFrom,
+ CacheType cacheType,
+ CacheConfiguration ccfg,
+ boolean affNode,
+ MemoryPolicy memPlc,
+ CacheObjectContext cacheObjCtx,
+ FreeList freeList,
+ ReuseList reuseList,
+ AffinityTopologyVersion locStartVer) {
+ assert ccfg != null;
+ assert memPlc != null || !affNode;
+ assert grpId != 0 : "Invalid group ID [cache=" + ccfg.getName() + ", grpName=" + ccfg.getGroupName() + ']';
+
+ this.grpId = grpId;
+ this.rcvdFrom = rcvdFrom;
+ this.ctx = ctx;
+ this.ccfg = ccfg;
+ this.affNode = affNode;
+ this.memPlc = memPlc;
+ this.cacheObjCtx = cacheObjCtx;
+ this.freeList = freeList;
+ this.reuseList = reuseList;
+ this.locStartVer = locStartVer;
+ this.cacheType = cacheType;
+
+ ioPlc = cacheType.ioPolicy();
+
+ depEnabled = ctx.kernalContext().deploy().enabled() && !ctx.kernalContext().cacheObjects().isBinaryEnabled(ccfg);
+
+ storeCacheId = affNode && memPlc.config().getPageEvictionMode() != DataPageEvictionMode.DISABLED;
+
+ log = ctx.kernalContext().log(getClass());
+
+ caches = new ArrayList<>();
+ }
+
+ /**
+ * @return {@code True} if this is cache group for one of system caches.
+ */
+ public boolean systemCache() {
+ return !sharedGroup() && CU.isSystemCache(ccfg.getName());
+ }
+
+ /**
+ * @return Node ID initiated cache group start.
+ */
+ public UUID receivedFrom() {
+ return rcvdFrom;
+ }
+
+ /**
+ * @return {@code True} if cacheId should be stored in data pages.
+ */
+ public boolean storeCacheIdInDataPage() {
+ return storeCacheId;
+ }
+
+ /**
+ * @return {@code True} if deployment is enabled.
+ */
+ public boolean deploymentEnabled() {
+ return depEnabled;
+ }
+
+ /**
+ * @return Preloader.
+ */
+ public GridCachePreloader preloader() {
+ return preldr;
+ }
+
+ /**
+ * @return IO policy for the given cache group.
+ */
+ public byte ioPolicy() {
+ return ioPlc;
+ }
+
+ /**
+ * @param cctx Cache context.
+ * @throws IgniteCheckedException If failed.
+ */
+ void onCacheStarted(GridCacheContext cctx) throws IgniteCheckedException {
+ addCacheContext(cctx);
+
+ offheapMgr.onCacheStarted(cctx);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @return {@code True} if group contains cache with given name.
+ */
+ public boolean hasCache(String cacheName) {
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ if (caches.get(i).name().equals(cacheName))
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @param cctx Cache context.
+ */
+ private void addCacheContext(GridCacheContext cctx) {
+ assert cacheType.userCache() == cctx.userCache() : cctx.name();
+ assert grpId == cctx.groupId() : cctx.name();
+
+ ArrayList<GridCacheContext> caches = new ArrayList<>(this.caches);
+
+ assert sharedGroup() || caches.isEmpty();
+
+ boolean add = caches.add(cctx);
+
+ assert add : cctx.name();
+
+ if (!qryEnabled && QueryUtils.isEnabled(cctx.config()))
+ qryEnabled = true;
+
+ if (!drEnabled && cctx.isDrEnabled())
+ drEnabled = true;
+
+ this.caches = caches;
+ }
+
+ /**
+ * @param cctx Cache context.
+ */
+ private void removeCacheContext(GridCacheContext cctx) {
+ ArrayList<GridCacheContext> caches = new ArrayList<>(this.caches);
+
+ // It is possible cache was not added in case of errors on cache start.
+ for (Iterator<GridCacheContext> it = caches.iterator(); it.hasNext();) {
+ GridCacheContext next = it.next();
+
+ if (next == cctx) {
+ assert sharedGroup() || caches.size() == 1 : caches.size();
+
+ it.remove();
+
+ break;
+ }
+ }
+
+ if (QueryUtils.isEnabled(cctx.config())) {
+ boolean qryEnabled = false;
+
+ for (int i = 0; i < caches.size(); i++) {
+ if (QueryUtils.isEnabled(caches.get(i).config())) {
+ qryEnabled = true;
+
+ break;
+ }
+ }
+
+ this.qryEnabled = qryEnabled;
+ }
+
+ if (cctx.isDrEnabled()) {
+ boolean drEnabled = false;
+
+ for (int i = 0; i < caches.size(); i++) {
+ if (caches.get(i).isDrEnabled()) {
+ drEnabled = true;
+
+ break;
+ }
+ }
+
+ this.drEnabled = drEnabled;
+ }
+
+ this.caches = caches;
+ }
+
+ /**
+ * @return Cache context if group contains single cache.
+ */
+ public GridCacheContext singleCacheContext() {
+ List<GridCacheContext> caches = this.caches;
+
+ assert !sharedGroup() && caches.size() == 1;
+
+ return caches.get(0);
+ }
+
+ /**
+ *
+ */
+ public void unwindUndeploys() {
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ GridCacheContext cctx = caches.get(i);
+
+ cctx.deploy().unwind(cctx);
+ }
+ }
+
+ /**
+ * @param type Event type to check.
+ * @return {@code True} if given event type should be recorded.
+ */
+ public boolean eventRecordable(int type) {
+ return cacheType.userCache() && ctx.gridEvents().isRecordable(type);
+ }
+
+ /**
+ * Adds rebalancing event.
+ *
+ * @param part Partition.
+ * @param type Event type.
+ * @param discoNode Discovery node.
+ * @param discoType Discovery event type.
+ * @param discoTs Discovery event timestamp.
+ */
+ public void addRebalanceEvent(int part, int type, ClusterNode discoNode, int discoType, long discoTs) {
+ assert discoNode != null;
+ assert type > 0;
+ assert discoType > 0;
+ assert discoTs > 0;
+
+ if (!eventRecordable(type))
+ LT.warn(log, "Added event without checking if event is recordable: " + U.gridEventName(type));
+
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ GridCacheContext cctx = caches.get(i);
+
+ if (cctx.recordEvent(type)) {
+ cctx.gridEvents().record(new CacheRebalancingEvent(cctx.name(),
+ cctx.localNode(),
+ "Cache rebalancing event.",
+ type,
+ part,
+ discoNode,
+ discoType,
+ discoTs));
+ }
+ }
+ }
+ /**
+ * Adds partition unload event.
+ *
+ * @param part Partition.
+ */
+ public void addUnloadEvent(int part) {
+ if (!eventRecordable(EVT_CACHE_REBALANCE_PART_UNLOADED))
+ LT.warn(log, "Added event without checking if event is recordable: " +
+ U.gridEventName(EVT_CACHE_REBALANCE_PART_UNLOADED));
+
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ GridCacheContext cctx = caches.get(i);
+
+ cctx.gridEvents().record(new CacheRebalancingEvent(cctx.name(),
+ cctx.localNode(),
+ "Cache unloading event.",
+ EVT_CACHE_REBALANCE_PART_UNLOADED,
+ part,
+ null,
+ 0,
+ 0));
+ }
+ }
+
+ /**
+ * @param part Partition.
+ * @param key Key.
+ * @param evtNodeId Event node ID.
+ * @param type Event type.
+ * @param newVal New value.
+ * @param hasNewVal Has new value flag.
+ * @param oldVal Old values.
+ * @param hasOldVal Has old value flag.
+ * @param keepBinary Keep binary flag.
+ */
+ public void addCacheEvent(
+ int part,
+ KeyCacheObject key,
+ UUID evtNodeId,
+ int type,
+ @Nullable CacheObject newVal,
+ boolean hasNewVal,
+ @Nullable CacheObject oldVal,
+ boolean hasOldVal,
+ boolean keepBinary
+ ) {
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ GridCacheContext cctx = caches.get(i);
+
+ cctx.events().addEvent(part,
+ key,
+ evtNodeId,
+ (IgniteUuid)null,
+ null,
+ type,
+ newVal,
+ hasNewVal,
+ oldVal,
+ hasOldVal,
+ null,
+ null,
+ null,
+ keepBinary);
+ }
+ }
+
+ /**
+ * @return {@code True} if contains cache with query indexing enabled.
+ */
+ public boolean queriesEnabled() {
+ return qryEnabled;
+ }
+
+ /**
+ * @return {@code True} if fast eviction is allowed.
+ */
+ public boolean allowFastEviction() {
+ return ctx.database().persistenceEnabled() && !queriesEnabled();
+ }
+
+ /**
+ * @return {@code True} in case replication is enabled.
+ */
+ public boolean isDrEnabled() {
+ return drEnabled;
+ }
+
+ /**
+ * @return Free List.
+ */
+ public FreeList freeList() {
+ return freeList;
+ }
+
+ /**
+ * @return Reuse List.
+ */
+ public ReuseList reuseList() {
+ return reuseList;
+ }
+
+ /**
+ * @return Cache object context.
+ */
+ public CacheObjectContext cacheObjectContext() {
+ return cacheObjCtx;
+ }
+
+ /**
+ * @return Cache shared context.
+ */
+ public GridCacheSharedContext shared() {
+ return ctx;
+ }
+
+ /**
+ * @return Memory policy.
+ */
+ public MemoryPolicy memoryPolicy() {
+ return memPlc;
+ }
+
+ /**
+ * @return {@code True} if local node is affinity node.
+ */
+ public boolean affinityNode() {
+ return affNode;
+ }
+
+ /**
+ * @return Topology.
+ */
+ public GridDhtPartitionTopology topology() {
+ if (top == null)
+ throw new IllegalStateException("Topology is not initialized: " + name());
+
+ return top;
+ }
+
+ /**
+ * @return Offheap manager.
+ */
+ public IgniteCacheOffheapManager offheap() {
+ return offheapMgr;
+ }
+
+ /**
+ * @return Current cache state. Must only be modified during exchange.
+ */
+ public boolean needsRecovery() {
+ return needsRecovery;
+ }
+
+ /**
+ * @param needsRecovery Needs recovery flag.
+ */
+ public void needsRecovery(boolean needsRecovery) {
+ this.needsRecovery = needsRecovery;
+ }
+
+ /**
+ * @return Topology version when group was started on local node.
+ */
+ public AffinityTopologyVersion localStartVersion() {
+ return locStartVer;
+ }
+
+ /**
+ * @return {@code True} if cache is local.
+ */
+ public boolean isLocal() {
+ return ccfg.getCacheMode() == LOCAL;
+ }
+
+ /**
+ * @return Cache configuration.
+ */
+ public CacheConfiguration config() {
+ return ccfg;
+ }
+
+ /**
+ * @return Cache node filter.
+ */
+ public IgnitePredicate<ClusterNode> nodeFilter() {
+ return ccfg.getNodeFilter();
+ }
+
+ /**
+ * @return Configured user objects which should be initialized/stopped on group start/stop.
+ */
+ Collection<?> configuredUserObjects() {
+ return Arrays.asList(ccfg.getAffinity(), ccfg.getNodeFilter(), ccfg.getTopologyValidator());
+ }
+
+ /**
+ * @return Configured topology validator.
+ */
+ @Nullable public TopologyValidator topologyValidator() {
+ return ccfg.getTopologyValidator();
+ }
+
+ /**
+ * @return Configured affinity function.
+ */
+ public AffinityFunction affinityFunction() {
+ return ccfg.getAffinity();
+ }
+
+ /**
+ * @return Affinity.
+ */
+ public GridAffinityAssignmentCache affinity() {
+ return aff;
+ }
+
+ /**
+ * @return Group name or {@code null} if group name was not specified for cache.
+ */
+ @Nullable public String name() {
+ return ccfg.getGroupName();
+ }
+
+ /**
+ * @return Group name if it is specified, otherwise cache name.
+ */
+ public String cacheOrGroupName() {
+ return ccfg.getGroupName() != null ? ccfg.getGroupName() : ccfg.getName();
+ }
+
+ /**
+ * @return Group ID.
+ */
+ public int groupId() {
+ return grpId;
+ }
+
+ /**
+ * @return {@code True} if group can contain multiple caches.
+ */
+ public boolean sharedGroup() {
+ return ccfg.getGroupName() != null;
+ }
+
+ /**
+ *
+ */
+ public void onKernalStop() {
+ aff.cancelFutures(new IgniteCheckedException("Failed to wait for topology update, node is stopping."));
+
+ preldr.onKernalStop();
+
+ offheapMgr.onKernalStop();
+ }
+
+ /**
+ * @param cctx Cache context.
+ * @param destroy Destroy flag.
+ */
+ void stopCache(GridCacheContext cctx, boolean destroy) {
+ if (top != null)
+ top.onCacheStopped(cctx.cacheId());
+
+ offheapMgr.stopCache(cctx.cacheId(), destroy);
+
+ removeCacheContext(cctx);
+ }
+
+ /**
+ *
+ */
+ void stopGroup() {
+ IgniteCheckedException err =
+ new IgniteCheckedException("Failed to wait for topology update, cache (or node) is stopping.");
+
+ aff.cancelFutures(err);
+
+ offheapMgr.stop();
+
+ ctx.io().removeCacheGroupHandlers(grpId);
+ }
+
+ /**
+ * @return IDs of caches in this group.
+ */
+ public Set<Integer> cacheIds() {
+ List<GridCacheContext> caches = this.caches;
+
+ Set<Integer> ids = U.newHashSet(caches.size());
+
+ for (int i = 0; i < caches.size(); i++)
+ ids.add(caches.get(i).cacheId());
+
+ return ids;
+ }
+
+ /**
+ * @return {@code True} if group contains caches.
+ */
+ boolean hasCaches() {
+ List<GridCacheContext> caches = this.caches;
+
+ return !caches.isEmpty();
+ }
+
+ /**
+ * @param part Partition ID.
+ */
+ public void onPartitionEvicted(int part) {
+ List<GridCacheContext> caches = this.caches;
+
+ for (int i = 0; i < caches.size(); i++) {
+ GridCacheContext cctx = caches.get(i);
+
+ if (cctx.isDrEnabled())
+ cctx.dr().partitionEvicted(part);
+
+ cctx.continuousQueries().onPartitionEvicted(part);
+
+ cctx.dataStructures().onPartitionEvicted(part);
+ }
+ }
+
+ /**
+ * @param cctx Cache context.
+ */
+ public void addCacheWithContinuousQuery(GridCacheContext cctx) {
+ assert sharedGroup() : cacheOrGroupName();
+ assert cctx.group() == this : cctx.name();
+ assert !cctx.isLocal() : cctx.name();
+
+ synchronized (this) {
+ List<GridCacheContext> contQryCaches = this.contQryCaches;
+
+ if (contQryCaches == null)
+ contQryCaches = new ArrayList<>();
+
+ contQryCaches.add(cctx);
+
+ this.contQryCaches = contQryCaches;
+ }
+ }
+
+ /**
+ * @param cctx Cache context.
+ */
+ public void removeCacheWithContinuousQuery(GridCacheContext cctx) {
+ assert sharedGroup() : cacheOrGroupName();
+ assert cctx.group() == this : cctx.name();
+ assert !cctx.isLocal() : cctx.name();
+
+ synchronized (this) {
+ List<GridCacheContext> contQryCaches = this.contQryCaches;
+
+ if (contQryCaches == null)
+ return;
+
+ contQryCaches.remove(cctx);
+
+ if (contQryCaches.isEmpty())
+ contQryCaches = null;
+
+ this.contQryCaches = contQryCaches;
+ }
+ }
+
+ /**
+ * @param cacheId ID of cache initiated counter update.
+ * @param part Partition number.
+ * @param cntr Counter.
+ * @param topVer Topology version for current operation.
+ */
+ public void onPartitionCounterUpdate(int cacheId,
+ int part,
+ long cntr,
+ AffinityTopologyVersion topVer,
+ boolean primary) {
+ assert sharedGroup();
+
+ if (isLocal())
+ return;
+
+ List<GridCacheContext> contQryCaches = this.contQryCaches;
+
+ if (contQryCaches == null)
+ return;
+
+ CounterSkipContext skipCtx = null;
+
+ for (int i = 0; i < contQryCaches.size(); i++) {
+ GridCacheContext cctx = contQryCaches.get(i);
+
+ if (cacheId != cctx.cacheId())
+ skipCtx = cctx.continuousQueries().skipUpdateCounter(skipCtx, part, cntr, topVer, primary);
+ }
+
+ final List<Runnable> procC = skipCtx != null ? skipCtx.processClosures() : null;
+
+ if (procC != null) {
+ ctx.kernalContext().closure().runLocalSafe(new Runnable() {
+ @Override public void run() {
+ for (Runnable c : procC)
+ c.run();
+ }
+ });
+ }
+ }
+
+ /**
+ * @throws IgniteCheckedException If failed.
+ */
+ public void start() throws IgniteCheckedException {
+ aff = new GridAffinityAssignmentCache(ctx.kernalContext(),
+ cacheOrGroupName(),
+ grpId,
+ ccfg.getAffinity(),
+ ccfg.getNodeFilter(),
+ ccfg.getBackups(),
+ ccfg.getCacheMode() == LOCAL);
+
+ if (ccfg.getCacheMode() != LOCAL) {
+ top = new GridDhtPartitionTopologyImpl(ctx, this);
+
+ if (!ctx.kernalContext().clientNode()) {
+ ctx.io().addCacheGroupHandler(groupId(), GridDhtAffinityAssignmentRequest.class,
+ new IgniteBiInClosure<UUID, GridDhtAffinityAssignmentRequest>() {
+ @Override public void apply(UUID nodeId, GridDhtAffinityAssignmentRequest msg) {
+ processAffinityAssignmentRequest(nodeId, msg);
+ }
+ });
+ }
+
+ preldr = new GridDhtPreloader(this);
+
+ preldr.start();
+ }
+ else
+ preldr = new GridCachePreloaderAdapter(this);
+
+ offheapMgr = new IgniteCacheOffheapManagerImpl();
+
+ offheapMgr.start(ctx, this);
+
+ ctx.affinity().onCacheGroupCreated(this);
+ }
+
+ /**
+ * @param nodeId Node ID.
+ * @param req Request.
+ */
+ private void processAffinityAssignmentRequest(final UUID nodeId,
+ final GridDhtAffinityAssignmentRequest req) {
+ if (log.isDebugEnabled())
+ log.debug("Processing affinity assignment request [node=" + nodeId + ", req=" + req + ']');
+
+ IgniteInternalFuture<AffinityTopologyVersion> fut = aff.readyFuture(req.topologyVersion());
+
+ if (fut != null) {
+ fut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
+ @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
+ processAffinityAssignmentRequest0(nodeId, req);
+ }
+ });
+ }
+ else
+ processAffinityAssignmentRequest0(nodeId, req);
+ }
+
+ /**
+ * @param nodeId Node ID.
+ * @param req Request.
+ */
+ private void processAffinityAssignmentRequest0(UUID nodeId, final GridDhtAffinityAssignmentRequest req) {
+ AffinityTopologyVersion topVer = req.topologyVersion();
+
+ if (log.isDebugEnabled())
+ log.debug("Affinity is ready for topology version, will send response [topVer=" + topVer +
+ ", node=" + nodeId + ']');
+
+ AffinityAssignment assignment = aff.cachedAffinity(topVer);
+
+ GridDhtAffinityAssignmentResponse res = new GridDhtAffinityAssignmentResponse(
+ req.futureId(),
+ grpId,
+ topVer,
+ assignment.assignment());
+
+ if (aff.centralizedAffinityFunction()) {
+ assert assignment.idealAssignment() != null;
+
+ res.idealAffinityAssignment(assignment.idealAssignment());
+ }
+
+ try {
+ ctx.io().send(nodeId, res, AFFINITY_POOL);
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to send affinity assignment response to remote node [node=" + nodeId + ']', e);
+ }
+ }
+
+ /**
+ * @param reconnectFut Reconnect future.
+ */
+ public void onDisconnected(IgniteFuture reconnectFut) {
+ IgniteCheckedException err = new IgniteClientDisconnectedCheckedException(reconnectFut,
+ "Failed to wait for topology update, client disconnected.");
+
+ if (aff != null)
+ aff.cancelFutures(err);
+ }
+
+ /**
+ * @return {@code True} if rebalance is enabled.
+ */
+ public boolean rebalanceEnabled() {
+ return ccfg.getRebalanceMode() != NONE;
+ }
+
+ /**
+ *
+ */
+ public void onReconnected() {
+ aff.onReconnected();
+
+ if (top != null)
+ top.onReconnected();
+
+ preldr.onReconnected();
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "CacheGroupContext [grp=" + cacheOrGroupName() + ']';
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
new file mode 100644
index 0000000..a290caf
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ *
+ */
+public class CacheGroupData implements Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ private final int grpId;
+
+ /** */
+ private final String grpName;
+
+ /** */
+ private final AffinityTopologyVersion startTopVer;
+
+ /** */
+ private final UUID rcvdFrom;
+
+ /** */
+ private final IgniteUuid deploymentId;
+
+ /** */
+ private final CacheConfiguration<?, ?> cacheCfg;
+
+ /** */
+ @GridToStringInclude
+ private final Map<String, Integer> caches;
+
+ /** */
+ private long flags;
+
+ /**
+ * @param cacheCfg Cache configuration.
+ * @param grpName Group name.
+ * @param grpId Group ID.
+ * @param rcvdFrom Node ID cache group received from.
+ * @param startTopVer Start version for dynamically started group.
+ * @param deploymentId Deployment ID.
+ * @param caches Cache group caches.
+ */
+ CacheGroupData(
+ CacheConfiguration cacheCfg,
+ @Nullable String grpName,
+ int grpId,
+ UUID rcvdFrom,
+ @Nullable AffinityTopologyVersion startTopVer,
+ IgniteUuid deploymentId,
+ Map<String, Integer> caches,
+ long flags) {
+ assert cacheCfg != null;
+ assert grpId != 0;
+ assert deploymentId != null;
+
+ this.cacheCfg = cacheCfg;
+ this.grpName = grpName;
+ this.grpId = grpId;
+ this.rcvdFrom = rcvdFrom;
+ this.startTopVer = startTopVer;
+ this.deploymentId = deploymentId;
+ this.caches = caches;
+ this.flags = flags;
+ }
+
+ /**
+ * @return Start version for dynamically started group.
+ */
+ @Nullable public AffinityTopologyVersion startTopologyVersion() {
+ return startTopVer;
+ }
+
+ /**
+ * @return Node ID group was received from.
+ */
+ public UUID receivedFrom() {
+ return rcvdFrom;
+ }
+
+ /**
+ * @return Group name.
+ */
+ @Nullable public String groupName() {
+ return grpName;
+ }
+
+ /**
+ * @return Group ID.
+ */
+ public int groupId() {
+ return grpId;
+ }
+
+ /**
+ * @return Deployment ID.
+ */
+ public IgniteUuid deploymentId() {
+ return deploymentId;
+ }
+
+ /**
+ * @return Configuration.
+ */
+ public CacheConfiguration<?, ?> config() {
+ return cacheCfg;
+ }
+
+ /**
+ * @return Group caches.
+ */
+ Map<String, Integer> caches() {
+ return caches;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(CacheGroupData.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
new file mode 100644
index 0000000..c4976e5
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
@@ -0,0 +1,210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.util.tostring.GridToStringExclude;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ *
+ */
+public class CacheGroupDescriptor {
+ /** */
+ private final int grpId;
+
+ /** */
+ private final String grpName;
+
+ /** */
+ private final AffinityTopologyVersion startTopVer;
+
+ /** */
+ private final UUID rcvdFrom;
+
+ /** */
+ private final IgniteUuid deploymentId;
+
+ /** */
+ @GridToStringExclude
+ private final CacheConfiguration<?, ?> cacheCfg;
+
+ /** */
+ @GridToStringInclude
+ private Map<String, Integer> caches;
+
+ /** */
+ private AffinityTopologyVersion rcvdFromVer;
+
+ /**
+ * @param cacheCfg Cache configuration.
+ * @param grpName Group name.
+ * @param grpId Group ID.
+ * @param rcvdFrom Node ID cache group received from.
+ * @param startTopVer Start version for dynamically started group.
+ * @param deploymentId Deployment ID.
+ * @param caches Cache group caches.
+ */
+ CacheGroupDescriptor(
+ CacheConfiguration cacheCfg,
+ @Nullable String grpName,
+ int grpId,
+ UUID rcvdFrom,
+ @Nullable AffinityTopologyVersion startTopVer,
+ IgniteUuid deploymentId,
+ Map<String, Integer> caches) {
+ assert cacheCfg != null;
+ assert grpId != 0;
+
+ this.grpName = grpName;
+ this.grpId = grpId;
+ this.rcvdFrom = rcvdFrom;
+ this.startTopVer = startTopVer;
+ this.deploymentId = deploymentId;
+ this.cacheCfg = cacheCfg;
+ this.caches = caches;
+ }
+
+ /**
+ * @return Node ID group was received from.
+ */
+ public UUID receivedFrom() {
+ return rcvdFrom;
+ }
+
+ /**
+ * @return Deployment ID.
+ */
+ public IgniteUuid deploymentId() {
+ return deploymentId;
+ }
+
+ /**
+ * @param cacheName Cache name
+ * @param cacheId Cache ID.
+ */
+ void onCacheAdded(String cacheName, int cacheId) {
+ assert cacheName != null;
+ assert cacheId != 0 : cacheName;
+
+ Map<String, Integer> caches = new HashMap<>(this.caches);
+
+ caches.put(cacheName, cacheId);
+
+ this.caches = caches;
+ }
+
+ /**
+ * @param cacheName Cache name
+ * @param cacheId Cache ID.
+ */
+ void onCacheStopped(String cacheName, int cacheId) {
+ assert cacheName != null;
+ assert cacheId != 0;
+
+ Map<String, Integer> caches = new HashMap<>(this.caches);
+
+ Integer rmvd = caches.remove(cacheName);
+
+ assert rmvd != null && rmvd == cacheId : cacheName;
+
+ this.caches = caches;
+ }
+
+ /**
+ * @return {@code True} if group contains cache.
+ */
+ boolean hasCaches() {
+ return caches != null && !caches.isEmpty();
+ }
+
+ /**
+ * @return {@code True} if group can contain multiple caches.
+ */
+ public boolean sharedGroup() {
+ return grpName != null;
+ }
+
+ /**
+ * @return Group name if it is specified, otherwise cache name.
+ */
+ public String cacheOrGroupName() {
+ return grpName != null ? grpName : cacheCfg.getName();
+ }
+
+ /**
+ * @return Group name or {@code null} if group name was not specified for cache.
+ */
+ @Nullable public String groupName() {
+ return grpName;
+ }
+
+ /**
+ * @return Group ID.
+ */
+ public int groupId() {
+ return grpId;
+ }
+
+ /**
+ * @return Configuration.
+ */
+ public CacheConfiguration<?, ?> config() {
+ return cacheCfg;
+ }
+
+ /**
+ * @return Group caches.
+ */
+ public Map<String, Integer> caches() {
+ return caches;
+ }
+
+ /**
+ * @return Topology version when node provided cache configuration was started.
+ */
+ @Nullable AffinityTopologyVersion receivedFromStartVersion() {
+ return rcvdFromVer;
+ }
+
+ /**
+ * @param rcvdFromVer Topology version when node provided cache configuration was started.
+ */
+ void receivedFromStartVersion(AffinityTopologyVersion rcvdFromVer) {
+ this.rcvdFromVer = rcvdFromVer;
+ }
+
+ /**
+ * @return Start version for dynamically started group.
+ */
+ @Nullable public AffinityTopologyVersion startTopologyVersion() {
+ return startTopVer;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(CacheGroupDescriptor.class, this, "cacheName", cacheCfg.getName());
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
index afc01c9..58c9d82 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
@@ -111,7 +111,7 @@ class CacheJoinNodeDiscoveryData implements Serializable {
private final boolean sql;
/** Flags added for future usage. */
- private final byte flags;
+ private final long flags;
/**
* @param ccfg Cache configuration.
@@ -119,7 +119,7 @@ class CacheJoinNodeDiscoveryData implements Serializable {
* @param sql SQL flag - {@code true} if cache was created with {@code CREATE TABLE}.
* @param flags Flags (for future usage).
*/
- CacheInfo(CacheConfiguration ccfg, CacheType cacheType, boolean sql, byte flags) {
+ CacheInfo(CacheConfiguration ccfg, CacheType cacheType, boolean sql, long flags) {
this.ccfg = ccfg;
this.cacheType = cacheType;
this.sql = sql;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
index d4ad8e4..c9ee641 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
@@ -195,7 +195,10 @@ public class CacheMetricsImpl implements CacheMetrics {
/** {@inheritDoc} */
@Override public long getOffHeapPrimaryEntriesCount() {
try {
- return cctx.offheap().entriesCount(true, false, cctx.affinity().affinityTopologyVersion());
+ return cctx.offheap().cacheEntriesCount(cctx.cacheId(),
+ true,
+ false,
+ cctx.affinity().affinityTopologyVersion());
}
catch (IgniteCheckedException ignored) {
return 0;
@@ -205,7 +208,10 @@ public class CacheMetricsImpl implements CacheMetrics {
/** {@inheritDoc} */
@Override public long getOffHeapBackupEntriesCount() {
try {
- return cctx.offheap().entriesCount(false, true, cctx.affinity().affinityTopologyVersion());
+ return cctx.offheap().cacheEntriesCount(cctx.cacheId(),
+ false,
+ true,
+ cctx.affinity().affinityTopologyVersion());
}
catch (IgniteCheckedException ignored) {
return 0;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
index 84a33dc..4c70cb9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
@@ -39,22 +39,41 @@ class CacheNodeCommonDiscoveryData implements Serializable {
private final Map<String, CacheData> templates;
/** */
+ @GridToStringInclude
+ private final Map<Integer, CacheGroupData> cacheGrps;
+
+ /** */
private final Map<String, Map<UUID, Boolean>> clientNodesMap;
/**
* @param caches Started caches.
* @param templates Configured templates.
+ * @param cacheGrps Started cache groups.
* @param clientNodesMap Information about cache client nodes.
*/
CacheNodeCommonDiscoveryData(Map<String, CacheData> caches,
Map<String, CacheData> templates,
+ Map<Integer, CacheGroupData> cacheGrps,
Map<String, Map<UUID, Boolean>> clientNodesMap) {
+ assert caches != null;
+ assert templates != null;
+ assert cacheGrps != null;
+ assert clientNodesMap != null;
+
this.caches = caches;
this.templates = templates;
+ this.cacheGrps = cacheGrps;
this.clientNodesMap = clientNodesMap;
}
/**
+ * @return Started cache groups.
+ */
+ Map<Integer, CacheGroupData> cacheGroups() {
+ return cacheGrps;
+ }
+
+ /**
* @return Started caches.
*/
Map<String, CacheData> caches() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOffheapEvictionManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOffheapEvictionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOffheapEvictionManager.java
index f8e9f32..d737c8b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOffheapEvictionManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheOffheapEvictionManager.java
@@ -41,15 +41,10 @@ public class CacheOffheapEvictionManager extends GridCacheManagerAdapter impleme
return;
try {
- if (e.markObsoleteIfEmpty(null) || e.obsolete()) {
- e.context().cache().removeEntry(e);
+ boolean evicted = e.evictInternal(GridCacheVersionManager.EVICT_VER, null, false)
+ || e.markObsoleteIfEmpty(null);
- return;
- }
-
- boolean evicted = e.evictInternal(GridCacheVersionManager.EVICT_VER, null, false);
-
- if (evicted)
+ if (evicted && !e.isDht()) // GridDhtCacheEntry removes entry when obsoleted.
cctx.cache().removeEntry(e);
}
catch (IgniteCheckedException ex) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
index e4d2668..0fcc740 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
@@ -45,8 +45,11 @@ import org.apache.ignite.internal.processors.query.schema.SchemaOperationExcepti
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteInClosure;
+import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
+import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.cache.CacheMode.LOCAL;
import static org.apache.ignite.cache.CacheMode.PARTITIONED;
@@ -63,6 +66,9 @@ class ClusterCachesInfo {
/** Dynamic caches. */
private final ConcurrentMap<String, DynamicCacheDescriptor> registeredCaches = new ConcurrentHashMap<>();
+ /** */
+ private final ConcurrentMap<Integer, CacheGroupDescriptor> registeredCacheGrps = new ConcurrentHashMap<>();
+
/** Cache templates. */
private final ConcurrentMap<String, DynamicCacheDescriptor> registeredTemplates = new ConcurrentHashMap<>();
@@ -70,13 +76,13 @@ class ClusterCachesInfo {
private final IgniteLogger log;
/** */
- private Map<String, DynamicCacheDescriptor> cachesOnDisconnect;
+ private CachesOnDisconnect cachesOnDisconnect;
/** */
private CacheJoinNodeDiscoveryData joinDiscoData;
/** */
- private CacheNodeCommonDiscoveryData gridData;
+ private GridData gridData;
/** */
private List<T2<DynamicCacheDescriptor, NearCacheConfiguration>> locJoinStartCaches;
@@ -95,11 +101,40 @@ class ClusterCachesInfo {
/**
* @param joinDiscoData Information about configured caches and templates.
+ * @throws IgniteCheckedException If configuration validation failed.
*/
- void onStart(CacheJoinNodeDiscoveryData joinDiscoData) {
+ void onStart(CacheJoinNodeDiscoveryData joinDiscoData) throws IgniteCheckedException {
this.joinDiscoData = joinDiscoData;
- processJoiningNode(joinDiscoData, ctx.localNodeId());
+ Map<String, CacheConfiguration> grpCfgs = new HashMap<>();
+
+ for (CacheJoinNodeDiscoveryData.CacheInfo info : joinDiscoData.caches().values()) {
+ if (info.config().getGroupName() == null)
+ continue;
+
+ CacheConfiguration ccfg = grpCfgs.get(info.config().getGroupName());
+
+ if (ccfg == null)
+ grpCfgs.put(info.config().getGroupName(), info.config());
+ else
+ validateCacheGroupConfiguration(ccfg, info.config());
+ }
+
+ String conflictErr = processJoiningNode(joinDiscoData, ctx.localNodeId(), true);
+
+ if (conflictErr != null)
+ throw new IgniteCheckedException("Failed to start configured cache. " + conflictErr);
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @param grpName Group name.
+ * @return Group ID.
+ */
+ private int cacheGroupId(String cacheName, @Nullable String grpName) {
+ assert cacheName != null;
+
+ return grpName != null ? CU.cacheId(grpName) : CU.cacheId(cacheName);
}
/**
@@ -107,14 +142,19 @@ class ClusterCachesInfo {
* @throws IgniteCheckedException If failed.
*/
void onKernalStart(boolean checkConsistency) throws IgniteCheckedException {
+ if (gridData != null && gridData.conflictErr != null)
+ throw new IgniteCheckedException(gridData.conflictErr);
+
if (checkConsistency && joinDiscoData != null && gridData != null) {
for (CacheJoinNodeDiscoveryData.CacheInfo locCacheInfo : joinDiscoData.caches().values()) {
CacheConfiguration locCfg = locCacheInfo.config();
- CacheData cacheData = gridData.caches().get(locCfg.getName());
+ CacheData cacheData = gridData.gridData.caches().get(locCfg.getName());
if (cacheData != null)
checkCache(locCacheInfo, cacheData, cacheData.receivedFrom());
+
+ validateStartCacheConfiguration(locCfg);
}
}
@@ -138,6 +178,9 @@ class ClusterCachesInfo {
CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cacheMode", "Cache mode",
locAttr.cacheMode(), rmtAttr.cacheMode(), true);
+ CU.checkAttributeMismatch(log, rmtAttr.groupName(), rmt, "groupName", "Cache group name",
+ locAttr.groupName(), rmtAttr.groupName(), true);
+
CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "sql", "SQL flag",
locAttr.sql(), rmtAttr.sql(), true);
@@ -151,6 +194,9 @@ class ClusterCachesInfo {
CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "cachePreloadMode",
"Cache preload mode", locAttr.cacheRebalanceMode(), rmtAttr.cacheRebalanceMode(), true);
+ CU.checkAttributeMismatch(log, rmtAttr.cacheName(), rmt, "topologyValidator",
+ "Cache topology validator", locAttr.topologyValidatorClassName(), rmtAttr.topologyValidatorClassName(), true);
+
ClusterNode rmtNode = ctx.discovery().node(rmt);
if (CU.affinityNode(ctx.discovery().localNode(), locInfo.config().getNodeFilter())
@@ -251,6 +297,7 @@ class ClusterCachesInfo {
DynamicCacheDescriptor templateDesc = new DynamicCacheDescriptor(ctx,
ccfg,
req.cacheType(),
+ null,
true,
req.initiatingNodeId(),
false,
@@ -278,13 +325,24 @@ class ClusterCachesInfo {
if (req.start()) {
if (desc == null) {
+ String conflictErr = checkCacheConflict(req.startCacheConfiguration());
+
+ if (conflictErr != null) {
+ U.warn(log, "Ignore cache start request. " + conflictErr);
+
+ ctx.cache().completeCacheStartFuture(req, false, new IgniteCheckedException("Failed to start " +
+ "cache. " + conflictErr));
+
+ continue;
+ }
+
if (req.clientStartOnly()) {
ctx.cache().completeCacheStartFuture(req, false, new IgniteCheckedException("Failed to start " +
"client cache (a cache with the given name is not started): " + req.cacheName()));
}
else {
SchemaOperationException err = QueryUtils.checkQueryEntityConflicts(
- req.startCacheConfiguration(), ctx.cache().cacheDescriptors());
+ req.startCacheConfiguration(), ctx.cache().cacheDescriptors().values());
if (err != null) {
ctx.cache().completeCacheStartFuture(req, false, err);
@@ -297,9 +355,19 @@ class ClusterCachesInfo {
assert req.cacheType() != null : req;
assert F.eq(ccfg.getName(), req.cacheName()) : req;
+ int cacheId = CU.cacheId(req.cacheName());
+
+ CacheGroupDescriptor grpDesc = registerCacheGroup(exchangeActions,
+ topVer,
+ ccfg,
+ cacheId,
+ req.initiatingNodeId(),
+ req.deploymentId());
+
DynamicCacheDescriptor startDesc = new DynamicCacheDescriptor(ctx,
ccfg,
req.cacheType(),
+ grpDesc,
false,
req.initiatingNodeId(),
false,
@@ -312,10 +380,9 @@ class ClusterCachesInfo {
assert old == null;
ctx.discovery().setCacheFilter(
+ grpDesc.groupId(),
ccfg.getName(),
- ccfg.getNodeFilter(),
- ccfg.getNearConfiguration() != null,
- ccfg.getCacheMode());
+ ccfg.getNearConfiguration() != null);
ctx.discovery().addClientNode(req.cacheName(),
req.initiatingNodeId(),
@@ -391,8 +458,6 @@ class ClusterCachesInfo {
}
}
else if (req.stop()) {
- assert req.stop() ^ req.close() : req;
-
if (desc != null) {
if (req.sql() && !desc.sql()) {
ctx.cache().completeCacheStartFuture(req, false,
@@ -412,13 +477,27 @@ class ClusterCachesInfo {
DynamicCacheDescriptor old = registeredCaches.remove(req.cacheName());
- assert old != null : "Dynamic cache map was concurrently modified [req=" + req + ']';
+ assert old != null && old == desc : "Dynamic cache map was concurrently modified [req=" + req + ']';
ctx.discovery().removeCacheFilter(req.cacheName());
needExchange = true;
exchangeActions.addCacheToStop(req, desc);
+
+ CacheGroupDescriptor grpDesc = registeredCacheGrps.get(desc.groupId());
+
+ assert grpDesc != null && grpDesc.groupId() == desc.groupId() : desc;
+
+ grpDesc.onCacheStopped(desc.cacheName(), desc.cacheId());
+
+ if (!grpDesc.hasCaches()) {
+ registeredCacheGrps.remove(grpDesc.groupId());
+
+ ctx.discovery().removeCacheGroup(grpDesc);
+
+ exchangeActions.addCacheGroupToStop(grpDesc);
+ }
}
}
else if (req.close()) {
@@ -498,10 +577,24 @@ class ClusterCachesInfo {
*/
private Serializable joinDiscoveryData() {
if (cachesOnDisconnect != null) {
+ Map<Integer, CacheClientReconnectDiscoveryData.CacheGroupInfo> cacheGrpsInfo = new HashMap<>();
Map<String, CacheClientReconnectDiscoveryData.CacheInfo> cachesInfo = new HashMap<>();
+ Map<Integer, CacheGroupDescriptor> grps = cachesOnDisconnect.cacheGrps;
+ Map<String, DynamicCacheDescriptor> caches = cachesOnDisconnect.caches;
+
+ for (CacheGroupContext grp : ctx.cache().cacheGroups()) {
+ CacheGroupDescriptor desc = grps.get(grp.groupId());
+
+ assert desc != null : grp.cacheOrGroupName();
+
+ cacheGrpsInfo.put(grp.groupId(), new CacheClientReconnectDiscoveryData.CacheGroupInfo(desc.config(),
+ desc.deploymentId(),
+ 0));
+ }
+
for (IgniteInternalCache cache : ctx.cache().caches()) {
- DynamicCacheDescriptor desc = cachesOnDisconnect.get(cache.name());
+ DynamicCacheDescriptor desc = caches.get(cache.name());
assert desc != null : cache.name();
@@ -509,10 +602,10 @@ class ClusterCachesInfo {
desc.cacheType(),
desc.deploymentId(),
cache.context().isNear(),
- (byte)0));
+ 0));
}
- return new CacheClientReconnectDiscoveryData(cachesInfo);
+ return new CacheClientReconnectDiscoveryData(cacheGrpsInfo, cachesInfo);
}
else {
assert ctx.config().isDaemon() || joinDiscoData != null || !ctx.state().active();
@@ -575,6 +668,11 @@ class ClusterCachesInfo {
*/
void onDiscoveryEvent(int type, ClusterNode node, AffinityTopologyVersion topVer) {
if (type == EVT_NODE_JOINED && !ctx.isDaemon()) {
+ for (CacheGroupDescriptor desc : registeredCacheGrps.values()) {
+ if (node.id().equals(desc.receivedFrom()))
+ desc.receivedFromStartVersion(topVer);
+ }
+
for (DynamicCacheDescriptor desc : registeredCaches.values()) {
if (node.id().equals(desc.receivedFrom()))
desc.receivedFromStartVersion(topVer);
@@ -610,11 +708,27 @@ class ClusterCachesInfo {
* @return Information about started caches.
*/
private CacheNodeCommonDiscoveryData collectCommonDiscoveryData() {
+ Map<Integer, CacheGroupData> cacheGrps = new HashMap<>();
+
+ for (CacheGroupDescriptor grpDesc : registeredCacheGrps.values()) {
+ CacheGroupData grpData = new CacheGroupData(grpDesc.config(),
+ grpDesc.groupName(),
+ grpDesc.groupId(),
+ grpDesc.receivedFrom(),
+ grpDesc.startTopologyVersion(),
+ grpDesc.deploymentId(),
+ grpDesc.caches(),
+ 0);
+
+ cacheGrps.put(grpDesc.groupId(), grpData);
+ }
+
Map<String, CacheData> caches = new HashMap<>();
for (DynamicCacheDescriptor desc : registeredCaches.values()) {
CacheData cacheData = new CacheData(desc.cacheConfiguration(),
desc.cacheId(),
+ desc.groupId(),
desc.cacheType(),
desc.deploymentId(),
desc.schema(),
@@ -622,7 +736,7 @@ class ClusterCachesInfo {
desc.staticallyConfigured(),
desc.sql(),
false,
- (byte)0);
+ 0);
caches.put(desc.cacheName(), cacheData);
}
@@ -632,6 +746,7 @@ class ClusterCachesInfo {
for (DynamicCacheDescriptor desc : registeredTemplates.values()) {
CacheData cacheData = new CacheData(desc.cacheConfiguration(),
0,
+ 0,
desc.cacheType(),
desc.deploymentId(),
desc.schema(),
@@ -639,12 +754,15 @@ class ClusterCachesInfo {
desc.staticallyConfigured(),
false,
true,
- (byte)0);
+ 0);
templates.put(desc.cacheName(), cacheData);
}
- return new CacheNodeCommonDiscoveryData(caches, templates, ctx.discovery().clientNodesMap());
+ return new CacheNodeCommonDiscoveryData(caches,
+ templates,
+ cacheGrps,
+ ctx.discovery().clientNodesMap());
}
/**
@@ -659,11 +777,36 @@ class ClusterCachesInfo {
CacheNodeCommonDiscoveryData cachesData = (CacheNodeCommonDiscoveryData)data.commonData();
+ // Replace locally registered data with actual data received from cluster.
+ registeredCaches.clear();
+ registeredCacheGrps.clear();
+ ctx.discovery().onLocalNodeJoin();
+
+ for (CacheGroupData grpData : cachesData.cacheGroups().values()) {
+ CacheGroupDescriptor grpDesc = new CacheGroupDescriptor(
+ grpData.config(),
+ grpData.groupName(),
+ grpData.groupId(),
+ grpData.receivedFrom(),
+ grpData.startTopologyVersion(),
+ grpData.deploymentId(),
+ grpData.caches());
+
+ CacheGroupDescriptor old = registeredCacheGrps.put(grpDesc.groupId(), grpDesc);
+
+ assert old == null : old;
+
+ ctx.discovery().addCacheGroup(grpDesc,
+ grpData.config().getNodeFilter(),
+ grpData.config().getCacheMode());
+ }
+
for (CacheData cacheData : cachesData.templates().values()) {
DynamicCacheDescriptor desc = new DynamicCacheDescriptor(
ctx,
cacheData.cacheConfiguration(),
cacheData.cacheType(),
+ null,
true,
cacheData.receivedFrom(),
cacheData.staticallyConfigured(),
@@ -675,12 +818,17 @@ class ClusterCachesInfo {
}
for (CacheData cacheData : cachesData.caches().values()) {
+ CacheGroupDescriptor grpDesc = registeredCacheGrps.get(cacheData.groupId());
+
+ assert grpDesc != null : cacheData.cacheConfiguration().getName();
+
CacheConfiguration<?, ?> cfg = cacheData.cacheConfiguration();
DynamicCacheDescriptor desc = new DynamicCacheDescriptor(
ctx,
cacheData.cacheConfiguration(),
cacheData.cacheType(),
+ grpDesc,
false,
cacheData.receivedFrom(),
cacheData.staticallyConfigured(),
@@ -693,10 +841,9 @@ class ClusterCachesInfo {
registeredCaches.put(cacheData.cacheConfiguration().getName(), desc);
ctx.discovery().setCacheFilter(
+ grpDesc.groupId(),
cfg.getName(),
- cfg.getNodeFilter(),
- cfg.getNearConfiguration() != null,
- cfg.getCacheMode());
+ cfg.getNearConfiguration() != null);
}
if (!F.isEmpty(cachesData.clientNodesMap())) {
@@ -708,7 +855,24 @@ class ClusterCachesInfo {
}
}
- gridData = cachesData;
+ String conflictErr = null;
+
+ if (joinDiscoData != null) {
+ for (Map.Entry<String, CacheJoinNodeDiscoveryData.CacheInfo> e : joinDiscoData.caches().entrySet()) {
+ if (!registeredCaches.containsKey(e.getKey())) {
+ conflictErr = checkCacheConflict(e.getValue().config());
+
+ if (conflictErr != null) {
+ conflictErr = "Failed to start configured cache due to conflict with started caches. " +
+ conflictErr;
+
+ break;
+ }
+ }
+ }
+ }
+
+ gridData = new GridData(cachesData, conflictErr);
if (!disconnectedState())
initStartCachesForLocalJoin(false);
@@ -741,6 +905,7 @@ class ClusterCachesInfo {
DynamicCacheDescriptor desc0 = new DynamicCacheDescriptor(ctx,
locCfg.config(),
desc.cacheType(),
+ desc.groupDescriptor(),
desc.template(),
desc.receivedFrom(),
desc.staticallyConfigured(),
@@ -755,7 +920,9 @@ class ClusterCachesInfo {
desc = desc0;
}
- if (locCfg != null || joinDiscoData.startCaches() || CU.affinityNode(ctx.discovery().localNode(), cfg.getNodeFilter())) {
+ if (locCfg != null ||
+ joinDiscoData.startCaches() ||
+ CU.affinityNode(ctx.discovery().localNode(), desc.groupDescriptor().config().getNodeFilter())) {
// Move system and internal caches first.
if (desc.cacheType().userCache())
locJoinStartCaches.add(new T2<>(desc, nearCfg));
@@ -784,7 +951,7 @@ class ClusterCachesInfo {
processClientReconnectData((CacheClientReconnectDiscoveryData) joiningNodeData, data.joiningNodeId());
}
else if (joiningNodeData instanceof CacheJoinNodeDiscoveryData)
- processJoiningNode((CacheJoinNodeDiscoveryData)joiningNodeData, data.joiningNodeId());
+ processJoiningNode((CacheJoinNodeDiscoveryData)joiningNodeData, data.joiningNodeId(), false);
}
}
@@ -808,10 +975,59 @@ class ClusterCachesInfo {
}
/**
+ * @param cfg Cache configuration.
+ * @return {@code True} if validation passed.
+ */
+ private String checkCacheConflict(CacheConfiguration<?, ?> cfg) {
+ int cacheId = CU.cacheId(cfg.getName());
+
+ if (cacheGroupByName(cfg.getName()) != null)
+ return "Cache name conflict with existing cache group (change cache name) [cacheName=" + cfg.getName() + ']';
+
+ if (cfg.getGroupName() != null) {
+ DynamicCacheDescriptor desc = registeredCaches.get(cfg.getGroupName());
+
+ if (desc != null)
+ return "Cache group name conflict with existing cache (change group name) [cacheName=" + cfg.getName() +
+ ", conflictingCacheName=" + desc.cacheName() + ']';
+ }
+
+ for (DynamicCacheDescriptor desc : registeredCaches.values()) {
+ if (desc.cacheId() == cacheId)
+ return "Cache ID conflict (change cache name) [cacheName=" + cfg.getName() +
+ ", conflictingCacheName=" + desc.cacheName() + ']';
+ }
+
+ int grpId = cacheGroupId(cfg.getName(), cfg.getGroupName());
+
+ if (cfg.getGroupName() != null) {
+ if (cacheGroupByName(cfg.getGroupName()) == null) {
+ CacheGroupDescriptor desc = registeredCacheGrps.get(grpId);
+
+ if (desc != null)
+ return "Cache group ID conflict (change cache group name) [cacheName=" + cfg.getName() +
+ ", groupName=" + cfg.getGroupName() +
+ (desc.sharedGroup() ? ", conflictingGroupName=" : ", conflictingCacheName=") + desc.cacheOrGroupName() + ']';
+ }
+ }
+ else {
+ CacheGroupDescriptor desc = registeredCacheGrps.get(grpId);
+
+ if (desc != null)
+ return "Cache group ID conflict (change cache name) [cacheName=" + cfg.getName() +
+ (desc.sharedGroup() ? ", conflictingGroupName=" : ", conflictingCacheName=") + desc.cacheOrGroupName() + ']';
+ }
+
+ return null;
+ }
+
+ /**
* @param joinData Joined node discovery data.
* @param nodeId Joined node ID.
+ * @param locJoin {@code True} if called on local node join.
+ * @return Configuration conflict error.
*/
- private void processJoiningNode(CacheJoinNodeDiscoveryData joinData, UUID nodeId) {
+ private String processJoiningNode(CacheJoinNodeDiscoveryData joinData, UUID nodeId, boolean locJoin) {
for (CacheJoinNodeDiscoveryData.CacheInfo cacheInfo : joinData.templates().values()) {
CacheConfiguration<?, ?> cfg = cacheInfo.config();
@@ -819,6 +1035,7 @@ class ClusterCachesInfo {
DynamicCacheDescriptor desc = new DynamicCacheDescriptor(ctx,
cfg,
cacheInfo.cacheType(),
+ null,
true,
nodeId,
true,
@@ -836,9 +1053,35 @@ class ClusterCachesInfo {
CacheConfiguration<?, ?> cfg = cacheInfo.config();
if (!registeredCaches.containsKey(cfg.getName())) {
+ String conflictErr = checkCacheConflict(cfg);
+
+ if (conflictErr != null) {
+ if (locJoin)
+ return conflictErr;
+
+ U.warn(log, "Ignore cache received from joining node. " + conflictErr);
+
+ continue;
+ }
+
+ int cacheId = CU.cacheId(cfg.getName());
+
+ CacheGroupDescriptor grpDesc = registerCacheGroup(null,
+ null,
+ cfg,
+ cacheId,
+ nodeId,
+ joinData.cacheDeploymentId());
+
+ ctx.discovery().setCacheFilter(
+ grpDesc.groupId(),
+ cfg.getName(),
+ cfg.getNearConfiguration() != null);
+
DynamicCacheDescriptor desc = new DynamicCacheDescriptor(ctx,
cfg,
cacheInfo.cacheType(),
+ grpDesc,
false,
nodeId,
true,
@@ -849,12 +1092,6 @@ class ClusterCachesInfo {
DynamicCacheDescriptor old = registeredCaches.put(cfg.getName(), desc);
assert old == null : old;
-
- ctx.discovery().setCacheFilter(
- cfg.getName(),
- cfg.getNodeFilter(),
- cfg.getNearConfiguration() != null,
- cfg.getCacheMode());
}
ctx.discovery().addClientNode(cfg.getName(), nodeId, cfg.getNearConfiguration() != null);
@@ -867,6 +1104,158 @@ class ClusterCachesInfo {
desc.cacheConfiguration().getNearConfiguration() != null);
}
}
+
+ return null;
+ }
+
+ /**
+ * @param grpName Group name.
+ * @return Group descriptor if group found.
+ */
+ @Nullable private CacheGroupDescriptor cacheGroupByName(String grpName) {
+ assert grpName != null;
+
+ for (CacheGroupDescriptor grpDesc : registeredCacheGrps.values()) {
+ if (grpName.equals(grpDesc.groupName()))
+ return grpDesc;
+ }
+
+ return null;
+ }
+
+ /**
+ * @param cacheName Cache name.
+ * @return Group descriptor.
+ */
+ @Nullable private CacheGroupDescriptor nonSharedCacheGroupByCacheName(String cacheName) {
+ assert cacheName != null;
+
+ for (CacheGroupDescriptor grpDesc : registeredCacheGrps.values()) {
+ if (!grpDesc.sharedGroup() && grpDesc.caches().containsKey(cacheName))
+ return grpDesc;
+ }
+
+ return null;
+ }
+
+ /**
+ * @param exchActions Optional exchange actions to update if new group was added.
+ * @param curTopVer Current topology version if dynamic cache started.
+ * @param startedCacheCfg Cache configuration.
+ * @param cacheId Cache ID.
+ * @param rcvdFrom Node ID cache was recived from.
+ * @param deploymentId Deployment ID.
+ * @return Group descriptor.
+ */
+ private CacheGroupDescriptor registerCacheGroup(
+ @Nullable ExchangeActions exchActions,
+ @Nullable AffinityTopologyVersion curTopVer,
+ CacheConfiguration<?, ?> startedCacheCfg,
+ Integer cacheId,
+ UUID rcvdFrom,
+ IgniteUuid deploymentId) {
+ if (startedCacheCfg.getGroupName() != null) {
+ CacheGroupDescriptor desc = cacheGroupByName(startedCacheCfg.getGroupName());
+
+ if (desc != null) {
+ desc.onCacheAdded(startedCacheCfg.getName(), cacheId);
+
+ return desc;
+ }
+ }
+
+ int grpId = cacheGroupId(startedCacheCfg.getName(), startedCacheCfg.getGroupName());
+
+ Map<String, Integer> caches = Collections.singletonMap(startedCacheCfg.getName(), cacheId);
+
+ CacheGroupDescriptor grpDesc = new CacheGroupDescriptor(
+ startedCacheCfg,
+ startedCacheCfg.getGroupName(),
+ grpId,
+ rcvdFrom,
+ curTopVer != null ? curTopVer.nextMinorVersion() : null,
+ deploymentId,
+ caches);
+
+ CacheGroupDescriptor old = registeredCacheGrps.put(grpId, grpDesc);
+
+ assert old == null : old;
+
+ ctx.discovery().addCacheGroup(grpDesc, grpDesc.config().getNodeFilter(), startedCacheCfg.getCacheMode());
+
+ if (exchActions != null)
+ exchActions.addCacheGroupToStart(grpDesc);
+
+ return grpDesc;
+ }
+
+ /**
+ * @return Registered cache groups.
+ */
+ ConcurrentMap<Integer, CacheGroupDescriptor> registeredCacheGroups() {
+ return registeredCacheGrps;
+ }
+
+ /**
+ * @param ccfg Cache configuration to start.
+ * @throws IgniteCheckedException If failed.
+ */
+ void validateStartCacheConfiguration(CacheConfiguration ccfg) throws IgniteCheckedException {
+ if (ccfg.getGroupName() != null) {
+ CacheGroupDescriptor grpDesc = cacheGroupByName(ccfg.getGroupName());
+
+ if (grpDesc != null) {
+ assert ccfg.getGroupName().equals(grpDesc.groupName());
+
+ validateCacheGroupConfiguration(grpDesc.config(), ccfg);
+ }
+ }
+ }
+
+ /**
+ * @param cfg Existing configuration.
+ * @param startCfg Cache configuration to start.
+ * @throws IgniteCheckedException If validation failed.
+ */
+ private void validateCacheGroupConfiguration(CacheConfiguration cfg, CacheConfiguration startCfg)
+ throws IgniteCheckedException {
+ GridCacheAttributes attr1 = new GridCacheAttributes(cfg, false);
+ GridCacheAttributes attr2 = new GridCacheAttributes(startCfg, false);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "cacheMode", "Cache mode",
+ cfg.getCacheMode(), startCfg.getCacheMode(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "affinity", "Affinity function",
+ attr1.cacheAffinityClassName(), attr2.cacheAffinityClassName(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "affinityPartitionsCount",
+ "Affinity partitions count", attr1.affinityPartitionsCount(), attr2.affinityPartitionsCount(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "nodeFilter", "Node filter",
+ attr1.nodeFilterClassName(), attr2.nodeFilterClassName(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "memoryPolicyName", "Memory policy",
+ cfg.getMemoryPolicyName(), startCfg.getMemoryPolicyName(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "topologyValidator", "Topology validator",
+ attr1.topologyValidatorClassName(), attr2.topologyValidatorClassName(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "partitionLossPolicy", "Partition Loss Policy",
+ cfg.getPartitionLossPolicy(), startCfg.getPartitionLossPolicy(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "rebalanceMode", "Rebalance mode",
+ cfg.getRebalanceMode(), startCfg.getRebalanceMode(), true);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "rebalanceDelay", "Rebalance delay",
+ cfg.getRebalanceDelay(), startCfg.getRebalanceDelay(), false);
+
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "rebalanceOrder", "Rebalance order",
+ cfg.getRebalanceOrder(), startCfg.getRebalanceOrder(), false);
+
+ if (cfg.getCacheMode() == PARTITIONED) {
+ CU.validateCacheGroupsAttributesMismatch(log, cfg, startCfg, "backups", "Backups",
+ cfg.getBackups(), startCfg.getBackups(), true);
+ }
}
/**
@@ -887,8 +1276,11 @@ class ClusterCachesInfo {
*
*/
void onDisconnect() {
- cachesOnDisconnect = new HashMap<>(registeredCaches);
+ cachesOnDisconnect = new CachesOnDisconnect(
+ new HashMap<>(registeredCacheGrps),
+ new HashMap<>(registeredCaches));
+ registeredCacheGrps.clear();
registeredCaches.clear();
registeredTemplates.clear();
@@ -896,14 +1288,41 @@ class ClusterCachesInfo {
}
/**
- * @return Stopped caches names.
+ * @return Information about stopped caches and cache groups.
*/
- Set<String> onReconnected() {
+ ClusterCachesReconnectResult onReconnected() {
assert disconnectedState();
Set<String> stoppedCaches = new HashSet<>();
+ Set<Integer> stoppedCacheGrps = new HashSet<>();
+
+ for (Map.Entry<Integer, CacheGroupDescriptor> e : cachesOnDisconnect.cacheGrps.entrySet()) {
+ CacheGroupDescriptor locDesc = e.getValue();
+
+ CacheGroupDescriptor desc;
+ boolean stopped = true;
- for(Map.Entry<String, DynamicCacheDescriptor> e : cachesOnDisconnect.entrySet()) {
+ if (locDesc.sharedGroup()) {
+ desc = cacheGroupByName(locDesc.groupName());
+
+ if (desc != null && desc.deploymentId().equals(locDesc.deploymentId()))
+ stopped = false;
+ }
+ else {
+ desc = nonSharedCacheGroupByCacheName(locDesc.config().getName());
+
+ if (desc != null &&
+ (surviveReconnect(locDesc.config().getName()) || desc.deploymentId().equals(locDesc.deploymentId())))
+ stopped = false;
+ }
+
+ if (stopped)
+ stoppedCacheGrps.add(locDesc.groupId());
+ else
+ assert locDesc.groupId() == desc.groupId();
+ }
+
+ for (Map.Entry<String, DynamicCacheDescriptor> e : cachesOnDisconnect.caches.entrySet()) {
DynamicCacheDescriptor desc = e.getValue();
String cacheName = e.getKey();
@@ -931,7 +1350,7 @@ class ClusterCachesInfo {
cachesOnDisconnect = null;
- return stoppedCaches;
+ return new ClusterCachesReconnectResult(stoppedCacheGrps, stoppedCaches);
}
/**
@@ -953,6 +1372,48 @@ class ClusterCachesInfo {
*
*/
void clearCaches() {
+ registeredCacheGrps.clear();
+
registeredCaches.clear();
}
+
+ /**
+ *
+ */
+ static class GridData {
+ /** */
+ private final CacheNodeCommonDiscoveryData gridData;
+
+ /** */
+ private final String conflictErr;
+
+ /**
+ * @param gridData Grid data.
+ * @param conflictErr Cache configuration conflict error.
+ */
+ GridData(CacheNodeCommonDiscoveryData gridData, String conflictErr) {
+ this.gridData = gridData;
+ this.conflictErr = conflictErr;
+ }
+ }
+
+ /**
+ *
+ */
+ private static class CachesOnDisconnect {
+ /** */
+ final Map<Integer, CacheGroupDescriptor> cacheGrps;
+
+ /** */
+ final Map<String, DynamicCacheDescriptor> caches;
+
+ /**
+ * @param cacheGrps Cache groups.
+ * @param caches Caches.
+ */
+ CachesOnDisconnect(Map<Integer, CacheGroupDescriptor> cacheGrps, Map<String, DynamicCacheDescriptor> caches) {
+ this.cacheGrps = cacheGrps;
+ this.caches = caches;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesReconnectResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesReconnectResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesReconnectResult.java
new file mode 100644
index 0000000..23854c3
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesReconnectResult.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.Set;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ *
+ */
+class ClusterCachesReconnectResult {
+ /** */
+ private final Set<Integer> stoppedCacheGrps;
+
+ /** */
+ private final Set<String> stoppedCaches;
+
+ /**
+ * @param stoppedCacheGrps Stopped cache groups.
+ * @param stoppedCaches Stopped caches.
+ */
+ ClusterCachesReconnectResult(Set<Integer> stoppedCacheGrps,
+ Set<String> stoppedCaches) {
+ this.stoppedCacheGrps = stoppedCacheGrps;
+ this.stoppedCaches = stoppedCaches;
+ }
+
+ /**
+ * @return Stopped cache groups.
+ */
+ Set<Integer> stoppedCacheGroups() {
+ return stoppedCacheGrps;
+ }
+
+ /**
+ * @return Stopped caches.
+ */
+ Set<String> stoppedCaches() {
+ return stoppedCaches;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(ClusterCachesReconnectResult.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
index a682f63..315013d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheDescriptor.java
@@ -93,10 +93,14 @@ public class DynamicCacheDescriptor {
/** Current schema. */
private QuerySchema schema;
+ /** */
+ private final CacheGroupDescriptor grpDesc;
+
/**
* @param ctx Context.
* @param cacheCfg Cache configuration.
* @param cacheType Cache type.
+ * @param grpDesc Group descriptor.
* @param template {@code True} if this is template configuration.
* @param rcvdFrom ID of node provided cache configuration
* @param staticCfg {@code True} if cache statically configured.
@@ -108,6 +112,7 @@ public class DynamicCacheDescriptor {
public DynamicCacheDescriptor(GridKernalContext ctx,
CacheConfiguration cacheCfg,
CacheType cacheType,
+ CacheGroupDescriptor grpDesc,
boolean template,
UUID rcvdFrom,
boolean staticCfg,
@@ -115,6 +120,7 @@ public class DynamicCacheDescriptor {
IgniteUuid deploymentId,
QuerySchema schema) {
assert cacheCfg != null;
+ assert grpDesc != null || template;
assert schema != null;
if (cacheCfg.getCacheMode() == CacheMode.REPLICATED && cacheCfg.getNearConfiguration() != null) {
@@ -125,6 +131,7 @@ public class DynamicCacheDescriptor {
this.cacheCfg = cacheCfg;
this.cacheType = cacheType;
+ this.grpDesc = grpDesc;
this.template = template;
this.rcvdFrom = rcvdFrom;
this.staticCfg = staticCfg;
@@ -141,6 +148,24 @@ public class DynamicCacheDescriptor {
}
/**
+ * @return Cache group ID.
+ */
+ public int groupId() {
+ assert grpDesc != null : this;
+
+ return grpDesc.groupId();
+ }
+
+ /**
+ * @return Cache group descriptor.
+ */
+ public CacheGroupDescriptor groupDescriptor() {
+ assert grpDesc != null : this;
+
+ return grpDesc;
+ }
+
+ /**
* @return Cache ID.
*/
public Integer cacheId() {
@@ -203,6 +228,7 @@ public class DynamicCacheDescriptor {
*
* @param proc Object processor.
* @return Cache object context.
+ * @throws IgniteCheckedException If failed.
*/
public CacheObjectContext cacheObjectContext(IgniteCacheObjectProcessor proc) throws IgniteCheckedException {
if (objCtx == null) {
[20/22] ignite git commit: IGNITE-5410: Fixed assertion in
HadoopDataOutStream. This closes #2084.
Posted by sb...@apache.org.
IGNITE-5410: Fixed assertion in HadoopDataOutStream. This closes #2084.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ec5c3a2d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ec5c3a2d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ec5c3a2d
Branch: refs/heads/ignite-5293
Commit: ec5c3a2de426ccdea619548821472291e900f28d
Parents: f3c6b3c
Author: Ivan Veselovskiy <iv...@gridgain.com>
Authored: Tue Jun 6 16:56:09 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Jun 6 16:56:09 2017 +0300
----------------------------------------------------------------------
.../processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/ec5c3a2d/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java
index d15e7eb..ed6feae 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopOffheapBuffer.java
@@ -92,7 +92,7 @@ public class HadoopOffheapBuffer {
* @return Old position pointer or {@code 0} if move goes beyond the end of the buffer.
*/
public long move(long size) {
- assert size > 0 : size;
+ assert size >= 0 : size;
long oldPos = posPtr;
long newPos = oldPos + size;
[17/22] ignite git commit: IGNITE-5376: JDBC thin: added "collocated"
and "replicatedOnly" flags (3).
Posted by sb...@apache.org.
IGNITE-5376: JDBC thin: added "collocated" and "replicatedOnly" flags (3).
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/915ea32e
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/915ea32e
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/915ea32e
Branch: refs/heads/ignite-5293
Commit: 915ea32e5fbe73fbc58255328081003251706850
Parents: db85d16
Author: devozerov <vo...@gridgain.com>
Authored: Tue Jun 6 14:47:39 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Jun 6 14:47:39 2017 +0300
----------------------------------------------------------------------
.../ignite/internal/processors/odbc/SqlListenerNioListener.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/915ea32e/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java
index fb3359a..bff5519 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java
@@ -243,7 +243,7 @@ public class SqlListenerNioListener extends GridNioServerListenerAdapter<byte[]>
SqlListenerRequestHandler handler = new OdbcRequestHandler(ctx, busyLock, maxCursors, distributedJoins,
enforceJoinOrder);
- SqlListenerMessageParser parser = new JdbcMessageParser(ctx);
+ SqlListenerMessageParser parser = new OdbcMessageParser(ctx);
return new SqlListenerConnectionContext(handler, parser);
}
[18/22] ignite git commit: Fixed hang in GridServiceProcessor.stop in
deactivated state.
Posted by sb...@apache.org.
Fixed hang in GridServiceProcessor.stop in deactivated state.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/98cdcfdf
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/98cdcfdf
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/98cdcfdf
Branch: refs/heads/ignite-5293
Commit: 98cdcfdff72aa5a7ec9efb9b7f06a67b56c4ab0d
Parents: 915ea32
Author: sboikov <sb...@gridgain.com>
Authored: Tue Jun 6 15:44:38 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Jun 6 15:44:38 2017 +0300
----------------------------------------------------------------------
.../service/GridServiceProcessor.java | 32 +++++++++++++++-----
1 file changed, 25 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/98cdcfdf/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
index fd8141c..e3d365f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
@@ -149,7 +149,7 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
private volatile ExecutorService depExe;
/** Busy lock. */
- private final GridSpinBusyLock busyLock = new GridSpinBusyLock();
+ private volatile GridSpinBusyLock busyLock = new GridSpinBusyLock();
/** Thread factory. */
private ThreadFactory threadFactory = new IgniteThreadFactory(ctx.igniteInstanceName());
@@ -281,8 +281,14 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
if (ctx.isDaemon())
return;
+ GridSpinBusyLock busyLock = this.busyLock;
+
// Will not release it.
- busyLock.block();
+ if (busyLock != null) {
+ busyLock.block();
+
+ this.busyLock = null;
+ }
U.shutdownNow(GridServiceProcessor.class, depExe, log);
@@ -338,6 +344,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
log.debug("Activate service processor [nodeId=" + ctx.localNodeId() +
" topVer=" + ctx.discovery().topologyVersionEx() + " ]");
+ busyLock = new GridSpinBusyLock();
+
depExe = Executors.newSingleThreadExecutor(new IgniteThreadFactory(ctx.igniteInstanceName(), "srvc-deploy"));
start(true);
@@ -1338,7 +1346,9 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
private class ServiceEntriesListener implements CacheEntryUpdatedListener<Object, Object> {
/** {@inheritDoc} */
@Override public void onUpdated(final Iterable<CacheEntryEvent<?, ?>> deps) {
- if (!busyLock.enterBusy())
+ GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
+
+ if (busyLock == null || !busyLock.enterBusy())
return;
try {
@@ -1483,7 +1493,9 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
}
@Override public void onTimeout() {
- if (!busyLock.enterBusy())
+ GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
+
+ if (busyLock == null || !busyLock.enterBusy())
return;
try {
@@ -1504,7 +1516,9 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
private class TopologyListener implements DiscoveryEventListener {
/** {@inheritDoc} */
@Override public void onEvent(DiscoveryEvent evt, final DiscoCache discoCache) {
- if (!busyLock.enterBusy())
+ GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
+
+ if (busyLock == null || !busyLock.enterBusy())
return;
try {
@@ -1626,7 +1640,9 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
*/
private void onReassignmentFailed(final AffinityTopologyVersion topVer,
final Collection<GridServiceDeployment> retries) {
- if (!busyLock.enterBusy())
+ GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
+
+ if (busyLock == null || !busyLock.enterBusy())
return;
try {
@@ -1744,7 +1760,9 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
private abstract class DepRunnable implements Runnable {
/** {@inheritDoc} */
@Override public void run() {
- if (!busyLock.enterBusy())
+ GridSpinBusyLock busyLock = GridServiceProcessor.this.busyLock;
+
+ if (busyLock == null || !busyLock.enterBusy())
return;
// Won't block ServiceProcessor stopping process.
[07/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
index 579796d..d2dc817 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicAbstractUpdateRequest.java
@@ -27,7 +27,7 @@ import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -40,7 +40,7 @@ import org.jetbrains.annotations.Nullable;
/**
*
*/
-public abstract class GridDhtAtomicAbstractUpdateRequest extends GridCacheMessage implements GridCacheDeployable {
+public abstract class GridDhtAtomicAbstractUpdateRequest extends GridCacheIdMessage implements GridCacheDeployable {
/** Skip store flag bit mask. */
private static final int DHT_ATOMIC_SKIP_STORE_FLAG_MASK = 0x01;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index 47572fd..443b1b1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -69,7 +69,8 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvali
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedGetFuture;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridPartitionedSingleGetFuture;
-import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysRequest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearAtomicCache;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest;
@@ -192,19 +193,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
/** {@inheritDoc} */
- @Override protected GridCacheMapEntryFactory entryFactory() {
- return new GridCacheMapEntryFactory() {
- @Override public GridCacheMapEntry create(
- GridCacheContext ctx,
- AffinityTopologyVersion topVer,
- KeyCacheObject key
- ) {
- return new GridDhtAtomicCacheEntry(ctx, topVer, key);
- }
- };
- }
-
- /** {@inheritDoc} */
@Override protected void init() {
super.init();
@@ -238,11 +226,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
metrics = m;
- preldr = new GridDhtPreloader(ctx);
-
- preldr.start();
-
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridNearGetRequest.class,
new CI2<UUID, GridNearGetRequest>() {
@@ -256,7 +240,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridNearSingleGetRequest.class,
new CI2<UUID, GridNearSingleGetRequest>() {
@@ -270,7 +254,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridNearAtomicAbstractUpdateRequest.class,
new CI2<UUID, GridNearAtomicAbstractUpdateRequest>() {
@@ -289,7 +273,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(ctx.cacheId(),
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
GridNearAtomicUpdateResponse.class,
new CI2<UUID, GridNearAtomicUpdateResponse>() {
@Override public void apply(
@@ -307,7 +292,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridDhtAtomicAbstractUpdateRequest.class,
new CI2<UUID, GridDhtAtomicAbstractUpdateRequest>() {
@@ -326,7 +311,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridDhtAtomicUpdateResponse.class,
new CI2<UUID, GridDhtAtomicUpdateResponse>() {
@@ -345,7 +330,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(ctx.cacheId(),
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
GridDhtAtomicDeferredUpdateResponse.class,
new CI2<UUID, GridDhtAtomicDeferredUpdateResponse>() {
@Override public void apply(
@@ -363,7 +349,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(ctx.cacheId(),
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
GridDhtAtomicNearResponse.class,
new CI2<UUID, GridDhtAtomicNearResponse>() {
@Override public void apply(UUID uuid, GridDhtAtomicNearResponse msg) {
@@ -376,7 +363,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(ctx.cacheId(),
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
GridNearAtomicCheckUpdateRequest.class,
new CI2<UUID, GridNearAtomicCheckUpdateRequest>() {
@Override public void apply(UUID uuid, GridNearAtomicCheckUpdateRequest msg) {
@@ -389,8 +377,26 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
+ GridDhtForceKeysRequest.class,
+ new MessageHandler<GridDhtForceKeysRequest>() {
+ @Override public void onMessage(ClusterNode node, GridDhtForceKeysRequest msg) {
+ processForceKeysRequest(node, msg);
+ }
+ });
+
+ ctx.io().addCacheHandler(
+ ctx.cacheId(),
+ GridDhtForceKeysResponse.class,
+ new MessageHandler<GridDhtForceKeysResponse>() {
+ @Override public void onMessage(ClusterNode node, GridDhtForceKeysResponse msg) {
+ processForceKeyResponse(node, msg);
+ }
+ });
+
if (near == null) {
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridNearGetResponse.class,
new CI2<UUID, GridNearGetResponse>() {
@@ -404,7 +410,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
});
- ctx.io().addHandler(
+ ctx.io().addCacheHandler(
ctx.cacheId(),
GridNearSingleGetResponse.class,
new CI2<UUID, GridNearSingleGetResponse>() {
@@ -1485,7 +1491,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
// Optimistically expect that all keys are available locally (avoid creation of get future).
for (KeyCacheObject key : keys) {
if (readNoEntry) {
- CacheDataRow row = ctx.offheap().read(key);
+ CacheDataRow row = ctx.offheap().read(ctx, key);
if (row != null) {
long expireTime = row.expireTime();
@@ -1661,7 +1667,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
final GridNearAtomicAbstractUpdateRequest req,
final UpdateReplyClosure completionCb
) {
- IgniteInternalFuture<Object> forceFut = preldr.request(req, req.topologyVersion());
+ IgniteInternalFuture<Object> forceFut = ctx.group().preloader().request(ctx, req, req.topologyVersion());
if (forceFut == null || forceFut.isDone()) {
try {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCacheEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCacheEntry.java
deleted file mode 100644
index b0c9a64..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCacheEntry.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.cache.distributed.dht.atomic;
-
-import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
-import org.apache.ignite.internal.util.typedef.internal.CU;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * DHT atomic cache entry.
- */
-public class GridDhtAtomicCacheEntry extends GridDhtCacheEntry {
- /**
- * @param ctx Cache context.
- * @param topVer Topology version at the time of creation (if negative, then latest topology is assumed).
- * @param key Cache key.
- */
- GridDhtAtomicCacheEntry(
- GridCacheContext ctx,
- AffinityTopologyVersion topVer,
- KeyCacheObject key
- ) {
- super(ctx, topVer, key);
- }
-
- /** {@inheritDoc} */
- @Override protected String cacheName() {
- return CU.isNearEnabled(cctx) ? super.cacheName() : cctx.dht().name();
- }
-
- /** {@inheritDoc} */
- @Override public synchronized String toString() {
- return S.toString(GridDhtAtomicCacheEntry.class, this, super.toString());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicDeferredUpdateResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicDeferredUpdateResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicDeferredUpdateResponse.java
index 92ef149..0c069da 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicDeferredUpdateResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicDeferredUpdateResponse.java
@@ -22,7 +22,7 @@ import java.nio.ByteBuffer;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
import org.apache.ignite.internal.util.GridLongList;
@@ -35,7 +35,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Deferred dht atomic update response.
*/
-public class GridDhtAtomicDeferredUpdateResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridDhtAtomicDeferredUpdateResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java
index d6e2db0..71d2321 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.processors.cache.distributed.dht.atomic;
import java.nio.ByteBuffer;
import java.util.UUID;
import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheReturn;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -36,7 +36,7 @@ import static org.apache.ignite.internal.processors.cache.distributed.dht.atomic
/**
* Message sent from DHT nodes to near node in FULL_SYNC mode.
*/
-public class GridDhtAtomicNearResponse extends GridCacheMessage {
+public class GridDhtAtomicNearResponse extends GridCacheIdMessage {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java
index 693d658..7b2547a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.processors.cache.distributed.dht.atomic;
import java.io.Externalizable;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.ignite.IgniteCheckedException;
@@ -27,7 +26,7 @@ import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -39,7 +38,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* DHT atomic cache backup update response.
*/
-public class GridDhtAtomicUpdateResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridDhtAtomicUpdateResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateRequest.java
index 4b3ea5bc..bb47af4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateRequest.java
@@ -29,7 +29,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheEntryPredicate;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheOperation;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -44,7 +44,7 @@ import org.jetbrains.annotations.Nullable;
/**
*
*/
-public abstract class GridNearAtomicAbstractUpdateRequest extends GridCacheMessage implements GridCacheDeployable {
+public abstract class GridNearAtomicAbstractUpdateRequest extends GridCacheIdMessage implements GridCacheDeployable {
/** Message index. */
public static final int CACHE_MSG_IDX = nextIndexId();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicCheckUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicCheckUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicCheckUpdateRequest.java
index 4b9109e..96be023 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicCheckUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicCheckUpdateRequest.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.processors.cache.distributed.dht.atomic;
import java.nio.ByteBuffer;
import org.apache.ignite.internal.GridDirectTransient;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.plugin.extensions.communication.MessageReader;
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
@@ -27,7 +27,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
*
*/
-public class GridNearAtomicCheckUpdateRequest extends GridCacheMessage {
+public class GridNearAtomicCheckUpdateRequest extends GridCacheIdMessage {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java
index 55953ea..5ba024f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java
@@ -30,7 +30,7 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheReturn;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
@@ -45,7 +45,7 @@ import org.jetbrains.annotations.Nullable;
/**
* DHT atomic cache near update response.
*/
-public class GridNearAtomicUpdateResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridNearAtomicUpdateResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
index 12a3912..708df49 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
@@ -38,7 +38,6 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
import org.apache.ignite.internal.processors.cache.GridCacheLockTimeoutException;
-import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntryFactory;
import org.apache.ignite.internal.processors.cache.GridCacheMvccCandidate;
import org.apache.ignite.internal.processors.cache.GridCacheReturn;
@@ -116,35 +115,22 @@ public class GridDhtColocatedCache<K, V> extends GridDhtTransactionalCacheAdapte
}
/** {@inheritDoc} */
- @Override protected GridCacheMapEntryFactory entryFactory() {
- return new GridCacheMapEntryFactory() {
- @Override public GridCacheMapEntry create(
- GridCacheContext ctx,
- AffinityTopologyVersion topVer,
- KeyCacheObject key
- ) {
- return new GridDhtColocatedCacheEntry(ctx, topVer, key);
- }
- };
- }
-
- /** {@inheritDoc} */
@Override public void start() throws IgniteCheckedException {
super.start();
- ctx.io().addHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearGetResponse.class, new CI2<UUID, GridNearGetResponse>() {
@Override public void apply(UUID nodeId, GridNearGetResponse res) {
processNearGetResponse(nodeId, res);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearSingleGetResponse.class, new CI2<UUID, GridNearSingleGetResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearSingleGetResponse.class, new CI2<UUID, GridNearSingleGetResponse>() {
@Override public void apply(UUID nodeId, GridNearSingleGetResponse res) {
processNearSingleGetResponse(nodeId, res);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearLockResponse.class, new CI2<UUID, GridNearLockResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearLockResponse.class, new CI2<UUID, GridNearLockResponse>() {
@Override public void apply(UUID nodeId, GridNearLockResponse res) {
processLockResponse(nodeId, res);
}
@@ -467,7 +453,7 @@ public class GridDhtColocatedCache<K, V> extends GridDhtTransactionalCacheAdapte
for (KeyCacheObject key : keys) {
if (readNoEntry) {
- CacheDataRow row = ctx.offheap().read(key);
+ CacheDataRow row = ctx.offheap().read(ctx, key);
if (row != null) {
long expireTime = row.expireTime();
@@ -941,7 +927,7 @@ public class GridDhtColocatedCache<K, V> extends GridDhtTransactionalCacheAdapte
) {
assert keys != null;
- IgniteInternalFuture<Object> keyFut = ctx.dht().dhtPreloader().request(keys, topVer);
+ IgniteInternalFuture<Object> keyFut = ctx.group().preloader().request(cacheCtx, keys, topVer);
// Prevent embedded future creation if possible.
if (keyFut == null || keyFut.isDone()) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCacheEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCacheEntry.java
deleted file mode 100644
index f7cc5a7..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCacheEntry.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal.processors.cache.distributed.dht.colocated;
-
-import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
-import org.apache.ignite.internal.util.typedef.internal.S;
-
-/**
- * Cache entry for colocated cache.
- */
-public class GridDhtColocatedCacheEntry extends GridDhtCacheEntry {
- /**
- * @param ctx Cache context.
- * @param topVer Topology version at the time of creation (if negative, then latest topology is assumed).
- * @param key Cache key.
- */
- GridDhtColocatedCacheEntry(
- GridCacheContext ctx,
- AffinityTopologyVersion topVer,
- KeyCacheObject key
- ) {
- super(ctx, topVer, key);
- }
-
- /** {@inheritDoc} */
- @Override protected String cacheName() {
- return cctx.colocated().name();
- }
-
- /** {@inheritDoc} */
- @Override public synchronized String toString() {
- return S.toString(GridDhtColocatedCacheEntry.class, this, super.toString());
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysFuture.java
index 562a165..a5a1eb3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysFuture.java
@@ -102,9 +102,6 @@ public final class GridDhtForceKeysFuture<K, V> extends GridCompoundFuture<Objec
/** Future ID. */
private IgniteUuid futId = IgniteUuid.randomUuid();
- /** Preloader. */
- private GridDhtPreloader preloader;
-
/** Trackable flag. */
private boolean trackable;
@@ -112,21 +109,19 @@ public final class GridDhtForceKeysFuture<K, V> extends GridCompoundFuture<Objec
* @param cctx Cache context.
* @param topVer Topology version.
* @param keys Keys.
- * @param preloader Preloader.
*/
public GridDhtForceKeysFuture(
GridCacheContext<K, V> cctx,
AffinityTopologyVersion topVer,
- Collection<KeyCacheObject> keys,
- GridDhtPreloader preloader
+ Collection<KeyCacheObject> keys
) {
assert topVer.topologyVersion() != 0 : topVer;
assert !F.isEmpty(keys) : keys;
+ assert !cctx.isNear();
this.cctx = cctx;
this.keys = keys;
this.topVer = topVer;
- this.preloader = preloader;
top = cctx.dht().topology();
@@ -158,7 +153,7 @@ public final class GridDhtForceKeysFuture<K, V> extends GridCompoundFuture<Objec
@Override public boolean onDone(@Nullable Collection<K> res, @Nullable Throwable err) {
if (super.onDone(res, err)) {
if (trackable)
- preloader.remoteFuture(this);
+ cctx.dht().removeFuture(this);
return true;
}
@@ -170,7 +165,7 @@ public final class GridDhtForceKeysFuture<K, V> extends GridCompoundFuture<Objec
* @param evt Discovery event.
*/
@SuppressWarnings( {"unchecked"})
- void onDiscoveryEvent(DiscoveryEvent evt) {
+ public void onDiscoveryEvent(DiscoveryEvent evt) {
topCntr.incrementAndGet();
int type = evt.type();
@@ -244,7 +239,7 @@ public final class GridDhtForceKeysFuture<K, V> extends GridCompoundFuture<Objec
int curTopVer = topCntr.get();
- if (!preloader.addFuture(this)) {
+ if (!cctx.dht().addFuture(this)) {
assert isDone() : this;
return false;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java
index d129ae8..124ae44 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java
@@ -25,7 +25,7 @@ import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -40,7 +40,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
* Force keys request. This message is sent by node while preloading to force
* another node to put given keys into the next batch of transmitting entries.
*/
-public class GridDhtForceKeysRequest extends GridCacheMessage implements GridCacheDeployable {
+public class GridDhtForceKeysRequest extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java
index c4c57a7..977e9ba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java
@@ -29,7 +29,7 @@ import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -43,7 +43,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* Force keys response. Contains absent keys.
*/
-public class GridDhtForceKeysResponse extends GridCacheMessage implements GridCacheDeployable {
+public class GridDhtForceKeysResponse extends GridCacheIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
@@ -168,7 +168,7 @@ public class GridDhtForceKeysResponse extends GridCacheMessage implements GridCa
if (infos != null) {
for (GridCacheEntryInfo info : infos)
- info.marshal(cctx);
+ info.marshal(cctx.cacheObjectContext());
}
if (err != null && errBytes == null)
@@ -186,7 +186,7 @@ public class GridDhtForceKeysResponse extends GridCacheMessage implements GridCa
if (infos != null) {
for (GridCacheEntryInfo info : infos)
- info.unmarshal(cctx, ldr);
+ info.unmarshal(cctx.cacheObjectContext(), ldr);
}
if (errBytes != null && err == null)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemandMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemandMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemandMessage.java
index 24b1de1..04a7e97 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemandMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemandMessage.java
@@ -27,7 +27,7 @@ import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.GridDirectMap;
import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -39,7 +39,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Partition demand request.
*/
-public class GridDhtPartitionDemandMessage extends GridCacheMessage {
+public class GridDhtPartitionDemandMessage extends GridCacheGroupIdMessage {
/** */
private static final long serialVersionUID = 0L;
@@ -73,10 +73,10 @@ public class GridDhtPartitionDemandMessage extends GridCacheMessage {
/**
* @param updateSeq Update sequence for this node.
* @param topVer Topology version.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
*/
- GridDhtPartitionDemandMessage(long updateSeq, @NotNull AffinityTopologyVersion topVer, int cacheId) {
- this.cacheId = cacheId;
+ GridDhtPartitionDemandMessage(long updateSeq, @NotNull AffinityTopologyVersion topVer, int grpId) {
+ this.grpId = grpId;
this.updateSeq = updateSeq;
this.topVer = topVer;
}
@@ -86,7 +86,7 @@ public class GridDhtPartitionDemandMessage extends GridCacheMessage {
* @param parts Partitions.
*/
GridDhtPartitionDemandMessage(GridDhtPartitionDemandMessage cp, Collection<Integer> parts, Map<Integer, Long> partsCntrs) {
- cacheId = cp.cacheId;
+ grpId = cp.grpId;
updateSeq = cp.updateSeq;
topic = cp.topic;
timeout = cp.timeout;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
index cdbae1a..a1b45df 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
@@ -27,7 +27,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
@@ -38,13 +37,16 @@ import org.apache.ignite.events.DiscoveryEvent;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
+import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
import org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
@@ -78,7 +80,10 @@ import static org.apache.ignite.internal.processors.dr.GridDrType.DR_PRELOAD;
@SuppressWarnings("NonConstantFieldWithUpperCaseName")
public class GridDhtPartitionDemander {
/** */
- private final GridCacheContext<?, ?> cctx;
+ private final GridCacheSharedContext<?, ?> ctx;
+
+ /** */
+ private final CacheGroupContext grp;
/** */
private final IgniteLogger log;
@@ -104,30 +109,20 @@ public class GridDhtPartitionDemander {
private final Map<Integer, Object> rebalanceTopics;
/**
- * Started event sent.
- * Make sense for replicated cache only.
+ * @param grp Ccahe group.
*/
- private final AtomicBoolean startedEvtSent = new AtomicBoolean();
+ public GridDhtPartitionDemander(CacheGroupContext grp) {
+ assert grp != null;
- /**
- * Stopped event sent.
- * Make sense for replicated cache only.
- */
- private final AtomicBoolean stoppedEvtSent = new AtomicBoolean();
+ this.grp = grp;
- /**
- * @param cctx Cctx.
- */
- public GridDhtPartitionDemander(GridCacheContext<?, ?> cctx) {
- assert cctx != null;
+ ctx = grp.shared();
- this.cctx = cctx;
+ log = ctx.logger(getClass());
- log = cctx.logger(getClass());
+ boolean enabled = grp.rebalanceEnabled() && !ctx.kernalContext().clientNode();
- boolean enabled = cctx.rebalanceEnabled() && !cctx.kernalContext().clientNode();
-
- rebalanceFut = new RebalanceFuture();//Dummy.
+ rebalanceFut = new RebalanceFuture(); //Dummy.
if (!enabled) {
// Calling onDone() immediately since preloading is disabled.
@@ -137,7 +132,7 @@ public class GridDhtPartitionDemander {
Map<Integer, Object> tops = new HashMap<>();
- for (int idx = 0; idx < cctx.gridConfig().getRebalanceThreadPoolSize(); idx++)
+ for (int idx = 0; idx < grp.shared().kernalContext().config().getRebalanceThreadPoolSize(); idx++)
tops.put(idx, GridCachePartitionExchangeManager.rebalanceTopic(idx));
rebalanceTopics = tops;
@@ -196,7 +191,7 @@ public class GridDhtPartitionDemander {
GridTimeoutObject obj = lastTimeoutObj.getAndSet(null);
if (obj != null)
- cctx.time().removeTimeoutObject(obj);
+ ctx.time().removeTimeoutObject(obj);
final GridDhtPartitionsExchangeFuture exchFut = lastExchangeFut;
@@ -208,7 +203,7 @@ public class GridDhtPartitionDemander {
exchFut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
@Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> t) {
- IgniteInternalFuture<Boolean> fut0 = cctx.shared().exchange().forceRebalance(exchFut);
+ IgniteInternalFuture<Boolean> fut0 = ctx.exchange().forceRebalance(exchFut);
fut0.listen(new IgniteInClosure<IgniteInternalFuture<Boolean>>() {
@Override public void apply(IgniteInternalFuture<Boolean> future) {
@@ -237,7 +232,7 @@ public class GridDhtPartitionDemander {
*/
private boolean topologyChanged(RebalanceFuture fut) {
return
- !cctx.affinity().affinityTopologyVersion().equals(fut.topologyVersion()) || // Topology already changed.
+ !grp.affinity().lastVersion().equals(fut.topologyVersion()) || // Topology already changed.
fut != rebalanceFut; // Same topology, but dummy exchange forced because of missing partitions.
}
@@ -268,12 +263,12 @@ public class GridDhtPartitionDemander {
assert force == (forcedRebFut != null);
- long delay = cctx.config().getRebalanceDelay();
+ long delay = grp.config().getRebalanceDelay();
if (delay == 0 || force) {
final RebalanceFuture oldFut = rebalanceFut;
- final RebalanceFuture fut = new RebalanceFuture(assigns, cctx, log, startedEvtSent, stoppedEvtSent, cnt);
+ final RebalanceFuture fut = new RebalanceFuture(grp, assigns, log, cnt);
if (!oldFut.isInitial())
oldFut.cancel();
@@ -319,7 +314,7 @@ public class GridDhtPartitionDemander {
fut.onDone(true);
- ((GridFutureAdapter)cctx.preloader().syncFuture()).onDone();
+ ((GridFutureAdapter)grp.preloader().syncFuture()).onDone();
fut.sendRebalanceFinishedEvent();
@@ -350,7 +345,7 @@ public class GridDhtPartitionDemander {
GridTimeoutObject obj = lastTimeoutObj.get();
if (obj != null)
- cctx.time().removeTimeoutObject(obj);
+ ctx.time().removeTimeoutObject(obj);
final GridDhtPartitionsExchangeFuture exchFut = lastExchangeFut;
@@ -360,7 +355,7 @@ public class GridDhtPartitionDemander {
@Override public void onTimeout() {
exchFut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
@Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> f) {
- cctx.shared().exchange().forceRebalance(exchFut);
+ ctx.exchange().forceRebalance(exchFut);
}
});
}
@@ -368,7 +363,7 @@ public class GridDhtPartitionDemander {
lastTimeoutObj.set(obj);
- cctx.time().addTimeoutObject(obj);
+ ctx.time().addTimeoutObject(obj);
}
return null;
@@ -399,17 +394,19 @@ public class GridDhtPartitionDemander {
Collection<Integer> parts= e.getValue().partitions();
- assert parts != null : "Partitions are null [cache=" + cctx.name() + ", fromNode=" + nodeId + "]";
+ assert parts != null : "Partitions are null [grp=" + grp.cacheOrGroupName() + ", fromNode=" + nodeId + "]";
fut.remaining.put(nodeId, new T2<>(U.currentTimeMillis(), parts));
}
}
+ final CacheConfiguration cfg = grp.config();
+
+ int lsnrCnt = ctx.gridConfig().getRebalanceThreadPoolSize();
+
for (Map.Entry<ClusterNode, GridDhtPartitionDemandMessage> e : assigns.entrySet()) {
final ClusterNode node = e.getKey();
- final CacheConfiguration cfg = cctx.config();
-
final Collection<Integer> parts = fut.remaining.get(node.id()).get2();
GridDhtPartitionDemandMessage d = e.getValue();
@@ -418,8 +415,6 @@ public class GridDhtPartitionDemander {
", fromNode=" + node.id() + ", partitionsCount=" + parts.size() +
", topology=" + fut.topologyVersion() + ", updateSeq=" + fut.updateSeq + "]");
- int lsnrCnt = cctx.gridConfig().getRebalanceThreadPoolSize();
-
final List<Set<Integer>> sParts = new ArrayList<>(lsnrCnt);
for (int cnt = 0; cnt < lsnrCnt; cnt++)
@@ -439,16 +434,16 @@ public class GridDhtPartitionDemander {
initD.topic(rebalanceTopics.get(cnt));
initD.updateSequence(fut.updateSeq);
- initD.timeout(cctx.config().getRebalanceTimeout());
+ initD.timeout(cfg.getRebalanceTimeout());
final int finalCnt = cnt;
- cctx.kernalContext().closure().runLocalSafe(new Runnable() {
+ ctx.kernalContext().closure().runLocalSafe(new Runnable() {
@Override public void run() {
try {
if (!fut.isDone()) {
- cctx.io().sendOrderedMessage(node,
- rebalanceTopics.get(finalCnt), initD, cctx.ioPolicy(), initD.timeout());
+ ctx.io().sendOrderedMessage(node,
+ rebalanceTopics.get(finalCnt), initD, grp.ioPolicy(), initD.timeout());
// Cleanup required in case partitions demanded in parallel with cancellation.
synchronized (fut) {
@@ -495,11 +490,11 @@ public class GridDhtPartitionDemander {
for (Integer part : parts) {
try {
- if (cctx.shared().database().persistenceEnabled()) {
+ if (ctx.database().persistenceEnabled()) {
if (partCntrs == null)
partCntrs = new HashMap<>(parts.size(), 1.0f);
- GridDhtLocalPartition p = cctx.topology().localPartition(part, old.topologyVersion(), false);
+ GridDhtLocalPartition p = grp.topology().localPartition(part, old.topologyVersion(), false);
partCntrs.put(part, p.initialUpdateCounter());
}
@@ -575,7 +570,7 @@ public class GridDhtPartitionDemander {
final RebalanceFuture fut = rebalanceFut;
- ClusterNode node = cctx.node(id);
+ ClusterNode node = ctx.node(id);
if (node == null)
return;
@@ -599,14 +594,16 @@ public class GridDhtPartitionDemander {
return;
}
- final GridDhtPartitionTopology top = cctx.dht().topology();
+ final GridDhtPartitionTopology top = grp.topology();
try {
+ AffinityAssignment aff = grp.affinity().cachedAffinity(topVer);
+
// Preload.
for (Map.Entry<Integer, CacheEntryInfoCollection> e : supply.infos().entrySet()) {
int p = e.getKey();
- if (cctx.affinity().partitionLocalNode(p, topVer)) {
+ if (aff.get(p).contains(ctx.localNode())) {
GridDhtLocalPartition part = top.localPartition(p, topVer, true);
assert part != null;
@@ -617,7 +614,7 @@ public class GridDhtPartitionDemander {
boolean reserved = part.reserve();
assert reserved : "Failed to reserve partition [igniteInstanceName=" +
- cctx.igniteInstanceName() + ", cacheName=" + cctx.name() + ", part=" + part + ']';
+ ctx.igniteInstanceName() + ", grp=" + grp.cacheOrGroupName() + ", part=" + part + ']';
part.lock();
@@ -676,7 +673,7 @@ public class GridDhtPartitionDemander {
// Only request partitions based on latest topology version.
for (Integer miss : supply.missed()) {
- if (cctx.affinity().partitionLocalNode(miss, topVer))
+ if (aff.get(miss).contains(ctx.localNode()))
fut.partitionMissed(id, miss);
}
@@ -684,16 +681,18 @@ public class GridDhtPartitionDemander {
fut.partitionDone(id, miss);
GridDhtPartitionDemandMessage d = new GridDhtPartitionDemandMessage(
- supply.updateSequence(), supply.topologyVersion(), cctx.cacheId());
+ supply.updateSequence(),
+ supply.topologyVersion(),
+ grp.groupId());
- d.timeout(cctx.config().getRebalanceTimeout());
+ d.timeout(grp.config().getRebalanceTimeout());
d.topic(rebalanceTopics.get(idx));
if (!topologyChanged(fut) && !fut.isDone()) {
// Send demand message.
- cctx.io().sendOrderedMessage(node, rebalanceTopics.get(idx),
- d, cctx.ioPolicy(), cctx.config().getRebalanceTimeout());
+ ctx.io().sendOrderedMessage(node, rebalanceTopics.get(idx),
+ d, grp.ioPolicy(), grp.config().getRebalanceTimeout());
}
}
catch (IgniteCheckedException e) {
@@ -722,13 +721,15 @@ public class GridDhtPartitionDemander {
GridCacheEntryInfo entry,
AffinityTopologyVersion topVer
) throws IgniteCheckedException {
- cctx.shared().database().checkpointReadLock();
+ ctx.database().checkpointReadLock();
try {
GridCacheEntryEx cached = null;
try {
- cached = cctx.dht().entryEx(entry.key());
+ GridCacheContext cctx = grp.sharedGroup() ? ctx.cacheContext(entry.cacheId()) : grp.singleCacheContext();
+
+ cached = cctx.dhtCache().entryEx(entry.key());
if (log.isDebugEnabled())
log.debug("Rebalancing key [key=" + entry.key() + ", part=" + p + ", node=" + pick.id() + ']');
@@ -779,10 +780,10 @@ public class GridDhtPartitionDemander {
}
catch (IgniteCheckedException e) {
throw new IgniteCheckedException("Failed to cache rebalanced entry (will stop rebalancing) [local=" +
- cctx.nodeId() + ", node=" + pick.id() + ", key=" + entry.key() + ", part=" + p + ']', e);
+ ctx.localNode() + ", node=" + pick.id() + ", key=" + entry.key() + ", part=" + p + ']', e);
}
finally {
- cctx.shared().database().checkpointReadUnlock();
+ ctx.database().checkpointReadUnlock();
}
return true;
@@ -798,16 +799,10 @@ public class GridDhtPartitionDemander {
*/
public static class RebalanceFuture extends GridFutureAdapter<Boolean> {
/** */
- private static final long serialVersionUID = 1L;
-
- /** Should EVT_CACHE_REBALANCE_STARTED event be sent or not. */
- private final AtomicBoolean startedEvtSent;
-
- /** Should EVT_CACHE_REBALANCE_STOPPED event be sent or not. */
- private final AtomicBoolean stoppedEvtSent;
+ private final GridCacheSharedContext<?, ?> ctx;
/** */
- private final GridCacheContext<?, ?> cctx;
+ private final CacheGroupContext grp;
/** */
private final IgniteLogger log;
@@ -829,40 +824,37 @@ public class GridDhtPartitionDemander {
private final long updateSeq;
/**
+ * @param grp Cache group.
* @param assigns Assigns.
- * @param cctx Context.
* @param log Logger.
- * @param startedEvtSent Start event sent flag.
- * @param stoppedEvtSent Stop event sent flag.
* @param updateSeq Update sequence.
*/
- RebalanceFuture(GridDhtPreloaderAssignments assigns,
- GridCacheContext<?, ?> cctx,
+ RebalanceFuture(
+ CacheGroupContext grp,
+ GridDhtPreloaderAssignments assigns,
IgniteLogger log,
- AtomicBoolean startedEvtSent,
- AtomicBoolean stoppedEvtSent,
long updateSeq) {
assert assigns != null;
- this.exchFut = assigns.exchangeFuture();
- this.topVer = assigns.topologyVersion();
- this.cctx = cctx;
+ exchFut = assigns.exchangeFuture();
+ topVer = assigns.topologyVersion();
+
+ this.grp = grp;
this.log = log;
- this.startedEvtSent = startedEvtSent;
- this.stoppedEvtSent = stoppedEvtSent;
this.updateSeq = updateSeq;
+
+ ctx= grp.shared();
}
/**
* Dummy future. Will be done by real one.
*/
- public RebalanceFuture() {
+ RebalanceFuture() {
this.exchFut = null;
this.topVer = null;
- this.cctx = null;
+ this.ctx = null;
+ this.grp = null;
this.log = null;
- this.startedEvtSent = null;
- this.stoppedEvtSent = null;
this.updateSeq = -1;
}
@@ -900,7 +892,7 @@ public class GridDhtPartitionDemander {
U.log(log, "Cancelled rebalancing from all nodes [topology=" + topologyVersion() + ']');
- if (!cctx.kernalContext().isStopping()) {
+ if (!ctx.kernalContext().isStopping()) {
for (UUID nodeId : remaining.keySet())
cleanupRemoteContexts(nodeId);
}
@@ -921,7 +913,7 @@ public class GridDhtPartitionDemander {
if (isDone())
return;
- U.log(log, ("Cancelled rebalancing [cache=" + cctx.name() +
+ U.log(log, ("Cancelled rebalancing [cache=" + grp.cacheOrGroupName() +
", fromNode=" + nodeId + ", topology=" + topologyVersion() +
", time=" + (U.currentTimeMillis() - remaining.get(nodeId).get1()) + " ms]"));
@@ -956,22 +948,24 @@ public class GridDhtPartitionDemander {
* @param nodeId Node id.
*/
private void cleanupRemoteContexts(UUID nodeId) {
- ClusterNode node = cctx.discovery().node(nodeId);
+ ClusterNode node = ctx.discovery().node(nodeId);
if (node == null)
return;
GridDhtPartitionDemandMessage d = new GridDhtPartitionDemandMessage(
- -1/* remove supply context signal */, this.topologyVersion(), cctx.cacheId());
+ -1/* remove supply context signal */,
+ this.topologyVersion(),
+ grp.groupId());
- d.timeout(cctx.config().getRebalanceTimeout());
+ d.timeout(grp.config().getRebalanceTimeout());
try {
- for (int idx = 0; idx < cctx.gridConfig().getRebalanceThreadPoolSize(); idx++) {
+ for (int idx = 0; idx < ctx.gridConfig().getRebalanceThreadPoolSize(); idx++) {
d.topic(GridCachePartitionExchangeManager.rebalanceTopic(idx));
- cctx.io().sendOrderedMessage(node, GridCachePartitionExchangeManager.rebalanceTopic(idx),
- d, cctx.ioPolicy(), cctx.config().getRebalanceTimeout());
+ ctx.io().sendOrderedMessage(node, GridCachePartitionExchangeManager.rebalanceTopic(idx),
+ d, grp.ioPolicy(), grp.config().getRebalanceTimeout());
}
}
catch (IgniteCheckedException ignored) {
@@ -989,20 +983,19 @@ public class GridDhtPartitionDemander {
if (isDone())
return;
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_LOADED))
- preloadEvent(p, EVT_CACHE_REBALANCE_PART_LOADED,
- exchFut.discoveryEvent());
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_PART_LOADED))
+ rebalanceEvent(p, EVT_CACHE_REBALANCE_PART_LOADED, exchFut.discoveryEvent());
T2<Long, Collection<Integer>> t = remaining.get(nodeId);
- assert t != null : "Remaining not found [cache=" + cctx.name() + ", fromNode=" + nodeId +
+ assert t != null : "Remaining not found [grp=" + grp.name() + ", fromNode=" + nodeId +
", part=" + p + "]";
Collection<Integer> parts = t.get2();
boolean rmvd = parts.remove(p);
- assert rmvd : "Partition already done [cache=" + cctx.name() + ", fromNode=" + nodeId +
+ assert rmvd : "Partition already done [grp=" + grp.name() + ", fromNode=" + nodeId +
", part=" + p + ", left=" + parts + "]";
if (parts.isEmpty()) {
@@ -1022,18 +1015,18 @@ public class GridDhtPartitionDemander {
* @param type Type.
* @param discoEvt Discovery event.
*/
- private void preloadEvent(int part, int type, DiscoveryEvent discoEvt) {
+ private void rebalanceEvent(int part, int type, DiscoveryEvent discoEvt) {
assert discoEvt != null;
- cctx.events().addPreloadEvent(part, type, discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
+ grp.addRebalanceEvent(part, type, discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
}
/**
* @param type Type.
* @param discoEvt Discovery event.
*/
- private void preloadEvent(int type, DiscoveryEvent discoEvt) {
- preloadEvent(-1, type, discoEvt);
+ private void rebalanceEvent(int type, DiscoveryEvent discoEvt) {
+ rebalanceEvent(-1, type, discoEvt);
}
/**
@@ -1053,7 +1046,7 @@ public class GridDhtPartitionDemander {
if (log.isDebugEnabled())
log.debug("Completed rebalance future: " + this);
- cctx.shared().exchange().scheduleResendPartitions();
+ ctx.exchange().scheduleResendPartitions();
Collection<Integer> m = new HashSet<>();
@@ -1067,13 +1060,13 @@ public class GridDhtPartitionDemander {
onDone(false); //Finished but has missed partitions, will force dummy exchange
- cctx.shared().exchange().forceDummyExchange(true, exchFut);
+ ctx.exchange().forceDummyExchange(true, exchFut);
return;
}
- if (!cancelled && !cctx.preloader().syncFuture().isDone())
- ((GridFutureAdapter)cctx.preloader().syncFuture()).onDone();
+ if (!cancelled && !grp.preloader().syncFuture().isDone())
+ ((GridFutureAdapter)grp.preloader().syncFuture()).onDone();
onDone(!cancelled);
}
@@ -1083,24 +1076,16 @@ public class GridDhtPartitionDemander {
*
*/
private void sendRebalanceStartedEvent() {
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_STARTED) &&
- (!cctx.isReplicated() || !startedEvtSent.get())) {
- preloadEvent(EVT_CACHE_REBALANCE_STARTED, exchFut.discoveryEvent());
-
- startedEvtSent.set(true);
- }
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_STARTED))
+ rebalanceEvent(EVT_CACHE_REBALANCE_STARTED, exchFut.discoveryEvent());
}
/**
*
*/
private void sendRebalanceFinishedEvent() {
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_STOPPED) &&
- (!cctx.isReplicated() || !stoppedEvtSent.get())) {
- preloadEvent(EVT_CACHE_REBALANCE_STOPPED, exchFut.discoveryEvent());
-
- stoppedEvtSent.set(true);
- }
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_STOPPED))
+ rebalanceEvent(EVT_CACHE_REBALANCE_STOPPED, exchFut.discoveryEvent());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
index f7f0aff..afdeb8c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplier.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache.distributed.dht.preloader;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.ignite.IgniteCheckedException;
@@ -26,7 +27,7 @@ import org.apache.ignite.IgniteLogger;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
import org.apache.ignite.internal.processors.cache.IgniteRebalanceIterator;
import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
@@ -47,7 +48,7 @@ import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDh
*/
class GridDhtPartitionSupplier {
/** */
- private final GridCacheContext<?, ?> cctx;
+ private final CacheGroupContext grp;
/** */
private final IgniteLogger log;
@@ -65,18 +66,18 @@ class GridDhtPartitionSupplier {
private final Map<T3<UUID, Integer, AffinityTopologyVersion>, SupplyContext> scMap = new HashMap<>();
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
*/
- GridDhtPartitionSupplier(GridCacheContext<?, ?> cctx) {
- assert cctx != null;
+ GridDhtPartitionSupplier(CacheGroupContext grp) {
+ assert grp != null;
- this.cctx = cctx;
+ this.grp = grp;
- log = cctx.logger(getClass());
+ log = grp.shared().logger(getClass());
- top = cctx.dht().topology();
+ top = grp.topology();
- depEnabled = cctx.gridDeploy().enabled();
+ depEnabled = grp.shared().gridDeploy().enabled();
}
/**
@@ -171,7 +172,7 @@ class GridDhtPartitionSupplier {
assert d != null;
assert id != null;
- AffinityTopologyVersion cutTop = cctx.affinity().affinityTopologyVersion();
+ AffinityTopologyVersion cutTop = grp.affinity().lastVersion();
AffinityTopologyVersion demTop = d.topologyVersion();
T3<UUID, Integer, AffinityTopologyVersion> scId = new T3<>(id, idx, demTop);
@@ -197,9 +198,12 @@ class GridDhtPartitionSupplier {
", from=" + id + ", idx=" + idx + "]");
GridDhtPartitionSupplyMessage s = new GridDhtPartitionSupplyMessage(
- d.updateSequence(), cctx.cacheId(), d.topologyVersion(), cctx.deploymentEnabled());
+ d.updateSequence(),
+ grp.groupId(),
+ d.topologyVersion(),
+ grp.deploymentEnabled());
- ClusterNode node = cctx.discovery().node(id);
+ ClusterNode node = grp.shared().discovery().node(id);
if (node == null)
return; // Context will be cleaned at topology change.
@@ -225,7 +229,7 @@ class GridDhtPartitionSupplier {
boolean newReq = true;
- long maxBatchesCnt = cctx.config().getRebalanceBatchesPrefetchCount();
+ long maxBatchesCnt = grp.config().getRebalanceBatchesPrefetchCount();
if (sctx != null) {
phase = sctx.phase;
@@ -234,7 +238,7 @@ class GridDhtPartitionSupplier {
}
else {
if (log.isDebugEnabled())
- log.debug("Starting supplying rebalancing [cache=" + cctx.name() +
+ log.debug("Starting supplying rebalancing [cache=" + grp.cacheOrGroupName() +
", fromNode=" + node.id() + ", partitionsCount=" + d.partitions().size() +
", topology=" + d.topologyVersion() + ", updateSeq=" + d.updateSequence() +
", idx=" + idx + "]");
@@ -280,7 +284,7 @@ class GridDhtPartitionSupplier {
IgniteRebalanceIterator iter;
if (sctx == null || sctx.entryIt == null) {
- iter = cctx.offheap().rebalanceIterator(part, d.topologyVersion(), d.partitionCounter(part));
+ iter = grp.offheap().rebalanceIterator(part, d.topologyVersion(), d.partitionCounter(part));
if (!iter.historical())
s.clean(part);
@@ -289,7 +293,9 @@ class GridDhtPartitionSupplier {
iter = (IgniteRebalanceIterator)sctx.entryIt;
while (iter.hasNext()) {
- if (!cctx.affinity().partitionBelongs(node, part, d.topologyVersion())) {
+ List<ClusterNode> nodes = grp.affinity().cachedAffinity(d.topologyVersion()).get(part);
+
+ if (!nodes.contains(node)) {
// Demander no longer needs this partition,
// so we send '-1' partition and move on.
s.missed(part);
@@ -313,7 +319,7 @@ class GridDhtPartitionSupplier {
break;
}
- if (s.messageSize() >= cctx.config().getRebalanceBatchSize()) {
+ if (s.messageSize() >= grp.config().getRebalanceBatchSize()) {
if (++bCnt >= maxBatchesCnt) {
saveSupplyContext(scId,
phase,
@@ -335,9 +341,9 @@ class GridDhtPartitionSupplier {
return;
s = new GridDhtPartitionSupplyMessage(d.updateSequence(),
- cctx.cacheId(),
+ grp.groupId(),
d.topologyVersion(),
- cctx.deploymentEnabled());
+ grp.deploymentEnabled());
}
}
@@ -349,9 +355,10 @@ class GridDhtPartitionSupplier {
info.expireTime(row.expireTime());
info.version(row.version());
info.value(row.value());
+ info.cacheId(row.cacheId());
if (preloadPred == null || preloadPred.apply(info))
- s.addEntry0(part, info, cctx);
+ s.addEntry0(part, info, grp.shared(), grp.cacheObjectContext());
else {
if (log.isDebugEnabled())
log.debug("Rebalance predicate evaluated to false (will not send " +
@@ -400,7 +407,7 @@ class GridDhtPartitionSupplier {
reply(node, d, s, scId);
if (log.isDebugEnabled())
- log.debug("Finished supplying rebalancing [cache=" + cctx.name() +
+ log.debug("Finished supplying rebalancing [cache=" + grp.cacheOrGroupName() +
", fromNode=" + node.id() +
", topology=" + d.topologyVersion() + ", updateSeq=" + d.updateSequence() +
", idx=" + idx + "]");
@@ -427,16 +434,15 @@ class GridDhtPartitionSupplier {
GridDhtPartitionSupplyMessage s,
T3<UUID, Integer, AffinityTopologyVersion> scId)
throws IgniteCheckedException {
-
try {
if (log.isDebugEnabled())
log.debug("Replying to partition demand [node=" + n.id() + ", demand=" + d + ", supply=" + s + ']');
- cctx.io().sendOrderedMessage(n, d.topic(), s, cctx.ioPolicy(), d.timeout());
+ grp.shared().io().sendOrderedMessage(n, d.topic(), s, grp.ioPolicy(), d.timeout());
// Throttle preloading.
- if (cctx.config().getRebalanceThrottle() > 0)
- U.sleep(cctx.config().getRebalanceThrottle());
+ if (grp.config().getRebalanceThrottle() > 0)
+ U.sleep(grp.config().getRebalanceThrottle());
return true;
}
@@ -469,7 +475,7 @@ class GridDhtPartitionSupplier {
AffinityTopologyVersion topVer,
long updateSeq) {
synchronized (scMap) {
- if (cctx.affinity().affinityTopologyVersion().equals(topVer)) {
+ if (grp.affinity().lastVersion().equals(topVer)) {
assert scMap.get(t) == null;
scMap.put(t,
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java
index 903a7da..f8d4344 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java
@@ -31,10 +31,11 @@ import org.apache.ignite.internal.GridDirectMap;
import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
+import org.apache.ignite.internal.processors.cache.CacheObjectContext;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
@@ -45,7 +46,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* Partition supply message.
*/
-public class GridDhtPartitionSupplyMessage extends GridCacheMessage implements GridCacheDeployable {
+public class GridDhtPartitionSupplyMessage extends GridCacheGroupIdMessage implements GridCacheDeployable {
/** */
private static final long serialVersionUID = 0L;
@@ -79,18 +80,19 @@ public class GridDhtPartitionSupplyMessage extends GridCacheMessage implements G
/**
* @param updateSeq Update sequence for this node.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param topVer Topology version.
* @param addDepInfo Deployment info flag.
*/
GridDhtPartitionSupplyMessage(long updateSeq,
- int cacheId,
+ int grpId,
AffinityTopologyVersion topVer,
boolean addDepInfo) {
- this.cacheId = cacheId;
+ this.grpId = grpId;
this.updateSeq = updateSeq;
this.topVer = topVer;
- this.addDepInfo = addDepInfo; }
+ this.addDepInfo = addDepInfo;
+ }
/**
* Empty constructor required for {@link Externalizable}.
@@ -203,18 +205,19 @@ public class GridDhtPartitionSupplyMessage extends GridCacheMessage implements G
/**
* @param p Partition.
* @param info Entry to add.
- * @param ctx Cache context.
+ * @param ctx Cache shared context.
+ * @param cacheObjCtx Cache object context.
* @throws IgniteCheckedException If failed.
*/
- void addEntry0(int p, GridCacheEntryInfo info, GridCacheContext ctx) throws IgniteCheckedException {
+ void addEntry0(int p, GridCacheEntryInfo info, GridCacheSharedContext ctx, CacheObjectContext cacheObjCtx) throws IgniteCheckedException {
assert info != null;
assert info.key() != null : info;
assert info.value() != null : info;
// Need to call this method to initialize info properly.
- marshalInfo(info, ctx);
+ marshalInfo(info, ctx, cacheObjCtx);
- msgSize += info.marshalledSize(ctx);
+ msgSize += info.marshalledSize(cacheObjCtx);
CacheEntryInfoCollection infoCol = infos().get(p);
@@ -234,13 +237,13 @@ public class GridDhtPartitionSupplyMessage extends GridCacheMessage implements G
@Override public void finishUnmarshal(GridCacheSharedContext ctx, ClassLoader ldr) throws IgniteCheckedException {
super.finishUnmarshal(ctx, ldr);
- GridCacheContext cacheCtx = ctx.cacheContext(cacheId);
+ CacheGroupContext grp = ctx.cache().cacheGroup(grpId);
for (CacheEntryInfoCollection col : infos().values()) {
List<GridCacheEntryInfo> entries = col.infos();
for (int i = 0; i < entries.size(); i++)
- entries.get(i).unmarshal(cacheCtx, ldr);
+ entries.get(i).unmarshal(grp.cacheObjectContext(), ldr);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsAbstractMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsAbstractMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsAbstractMessage.java
index 74bbcb0..441952d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsAbstractMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsAbstractMessage.java
@@ -65,6 +65,11 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
}
/** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public int partition() {
return GridIoMessage.STRIPE_DISABLED_PART;
}
@@ -87,10 +92,10 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @return Parition update counters.
*/
- public abstract Map<Integer, T2<Long, Long>> partitionUpdateCounters(int cacheId);
+ public abstract Map<Integer, T2<Long, Long>> partitionUpdateCounters(int grpId);
/**
* @return Last used version among all nodes.
@@ -114,6 +119,11 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
}
/** {@inheritDoc} */
+ @Override public byte fieldsCount() {
+ return 5;
+ }
+
+ /** {@inheritDoc} */
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
writer.setBuffer(buf);
@@ -128,19 +138,19 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeMessage("exchId", exchId))
return false;
writer.incrementState();
- case 4:
+ case 3:
if (!writer.writeByte("flags", flags))
return false;
writer.incrementState();
- case 5:
+ case 4:
if (!writer.writeMessage("lastVer", lastVer))
return false;
@@ -162,7 +172,7 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
return false;
switch (reader.state()) {
- case 3:
+ case 2:
exchId = reader.readMessage("exchId");
if (!reader.isLastRead())
@@ -170,7 +180,7 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
reader.incrementState();
- case 4:
+ case 3:
flags = reader.readByte("flags");
if (!reader.isLastRead())
@@ -178,7 +188,7 @@ public abstract class GridDhtPartitionsAbstractMessage extends GridCacheMessage
reader.incrementState();
- case 5:
+ case 4:
lastVer = reader.readMessage("lastVer");
if (!reader.isLastRead())
[19/22] ignite git commit: IGNITE-5420: CREATE TABLE command now
generates unique key and value type names. This closes #2093.
Posted by sb...@apache.org.
IGNITE-5420: CREATE TABLE command now generates unique key and value type names. This closes #2093.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/f3c6b3c5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/f3c6b3c5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/f3c6b3c5
Branch: refs/heads/ignite-5293
Commit: f3c6b3c5a7b610f0aea3945f5378964dc60d77c4
Parents: 98cdcfd
Author: devozerov <vo...@gridgain.com>
Authored: Tue Jun 6 15:48:26 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Tue Jun 6 15:48:26 2017 +0300
----------------------------------------------------------------------
.../query/h2/ddl/DdlStatementsProcessor.java | 20 +++++++++++++++--
.../cache/index/H2DynamicTableSelfTest.java | 23 +++++---------------
2 files changed, 23 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/f3c6b3c5/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
index 060636b..251ee9f 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
@@ -22,6 +22,8 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
+
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cache.QueryIndex;
@@ -288,9 +290,11 @@ public class DdlStatementsProcessor {
res.addQueryField(e.getKey(), DataType.getTypeClassName(col.getType()), null);
}
- res.setKeyType(createTbl.tableName() + "Key");
+ String valTypeName = valueType(createTbl.schemaName(), createTbl.tableName());
+ String keyTypeName = valTypeName + "_Key";
- res.setValueType(createTbl.tableName());
+ res.setValueType(valTypeName);
+ res.setKeyType(keyTypeName);
res.setKeyFields(createTbl.primaryKeyColumns());
@@ -298,6 +302,18 @@ public class DdlStatementsProcessor {
}
/**
+ * Construct value type name for table.
+ *
+ * @param schemaName Schema name.
+ * @param tblName Table name.
+ * @return Value type name.
+ */
+ private static String valueType(String schemaName, String tblName) {
+ return "sql_" + schemaName + "_" + tblName + "_" + UUID.randomUUID().toString().replace("-", "_");
+ }
+
+
+ /**
* @param cmd Statement.
* @return Whether {@code cmd} is a DDL statement we're able to handle.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/f3c6b3c5/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
index 1d376c1..efb6cc8 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java
@@ -27,8 +27,6 @@ import java.util.concurrent.Callable;
import javax.cache.CacheException;
import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.CacheAtomicityMode;
@@ -51,7 +49,6 @@ import org.apache.ignite.internal.processors.query.h2.ddl.DdlStatementsProcessor
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
import org.apache.ignite.internal.processors.query.schema.SchemaOperationException;
import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.GridTestUtils;
/**
@@ -191,12 +188,12 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest {
QueryTypeDescriptorImpl desc = typeExisting(node, "Person", "Person");
assertEquals(Object.class, desc.keyClass());
-
- assertEquals("PersonKey", desc.keyTypeName());
-
assertEquals(Object.class, desc.valueClass());
- assertEquals("Person", desc.valueTypeName());
+ assertTrue(desc.valueTypeName(), desc.valueTypeName().contains("Person"));
+
+ assertTrue(desc.keyTypeName(), desc.keyTypeName().startsWith(desc.valueTypeName()));
+ assertTrue(desc.keyTypeName(), desc.keyTypeName().endsWith("Key"));
assertEquals(
F.asList("id", "city", "name", "surname", "age"),
@@ -204,13 +201,9 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest {
);
assertProperty(desc, "id", Integer.class, true);
-
assertProperty(desc, "city", String.class, true);
-
assertProperty(desc, "name", String.class, false);
-
assertProperty(desc, "surname", String.class, false);
-
assertProperty(desc, "age", Integer.class, false);
GridH2Table tbl = ((IgniteH2Indexing)node.context().query().getIndexing()).dataTable("PUBLIC", "Person");
@@ -465,6 +458,7 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest {
* @param params Engine parameters.
* @param expErrMsg Expected error message.
*/
+ @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
private void assertCreateTableWithParamsThrows(final String params, String expErrMsg) {
GridTestUtils.assertThrows(null, new Callable<Object>() {
@Override public Object call() throws Exception {
@@ -588,13 +582,6 @@ public class H2DynamicTableSelfTest extends AbstractSchemaSelfTest {
}
/**
- * @return Cache to issue queries upon.
- */
- private IgniteCache<?, ?> cache() {
- return client().cache(INDEXED_CACHE_NAME);
- }
-
- /**
* @return Default cache configuration.
*/
private CacheConfiguration cacheConfiguration() {
[13/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
index 5ac51ea..d577b30 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
@@ -34,6 +34,12 @@ import org.jetbrains.annotations.Nullable;
*/
public class ExchangeActions {
/** */
+ private List<CacheGroupDescriptor> cacheGrpsToStart;
+
+ /** */
+ private List<CacheGroupDescriptor> cacheGrpsToStop;
+
+ /** */
private Map<String, ActionData> cachesToStart;
/** */
@@ -57,6 +63,8 @@ public class ExchangeActions {
boolean clientOnlyExchange() {
return F.isEmpty(cachesToStart) &&
F.isEmpty(cachesToStop) &&
+ F.isEmpty(cacheGrpsToStart) &&
+ F.isEmpty(cacheGrpsToStop) &&
F.isEmpty(cachesToResetLostParts);
}
@@ -64,8 +72,8 @@ public class ExchangeActions {
* @param nodeId Local node ID.
* @return Close cache requests.
*/
- List<DynamicCacheChangeRequest> closeRequests(UUID nodeId) {
- List<DynamicCacheChangeRequest> res = null;
+ List<ActionData> closeRequests(UUID nodeId) {
+ List<ActionData> res = null;
if (cachesToClose != null) {
for (ActionData req : cachesToClose.values()) {
@@ -73,12 +81,12 @@ public class ExchangeActions {
if (res == null)
res = new ArrayList<>(cachesToClose.size());
- res.add(req.req);
+ res.add(req);
}
}
}
- return res != null ? res : Collections.<DynamicCacheChangeRequest>emptyList();
+ return res != null ? res : Collections.<ActionData>emptyList();
}
/**
@@ -289,6 +297,74 @@ public class ExchangeActions {
}
/**
+ * @param grpDesc Group descriptor.
+ */
+ void addCacheGroupToStart(CacheGroupDescriptor grpDesc) {
+ assert grpDesc != null;
+
+ if (cacheGrpsToStart == null)
+ cacheGrpsToStart = new ArrayList<>();
+
+ cacheGrpsToStart.add(grpDesc);
+ }
+
+ /**
+ * @return Cache groups to start.
+ */
+ public List<CacheGroupDescriptor> cacheGroupsToStart() {
+ return cacheGrpsToStart != null ? cacheGrpsToStart : Collections.<CacheGroupDescriptor>emptyList();
+ }
+
+ /**
+ * @param grpId Group ID.
+ * @return {@code True} if given cache group starting.
+ */
+ public boolean cacheGroupStarting(int grpId) {
+ if (cacheGrpsToStart != null) {
+ for (CacheGroupDescriptor grp : cacheGrpsToStart) {
+ if (grp.groupId() == grpId)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param grpDesc Group descriptor.
+ */
+ void addCacheGroupToStop(CacheGroupDescriptor grpDesc) {
+ assert grpDesc != null;
+
+ if (cacheGrpsToStop == null)
+ cacheGrpsToStop = new ArrayList<>();
+
+ cacheGrpsToStop.add(grpDesc);
+ }
+
+ /**
+ * @return Cache groups to start.
+ */
+ public List<CacheGroupDescriptor> cacheGroupsToStop() {
+ return cacheGrpsToStop != null ? cacheGrpsToStop : Collections.<CacheGroupDescriptor>emptyList();
+ }
+
+ /**
+ * @param grpId Group ID.
+ * @return {@code True} if given cache group stopping.
+ */
+ public boolean cacheGroupStopping(int grpId) {
+ if (cacheGrpsToStop != null) {
+ for (CacheGroupDescriptor grp : cacheGrpsToStop) {
+ if (grp.groupId() == grpId)
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
* @return {@code True} if there are no cache change actions.
*/
public boolean empty() {
@@ -296,6 +372,8 @@ public class ExchangeActions {
F.isEmpty(clientCachesToStart) &&
F.isEmpty(cachesToStop) &&
F.isEmpty(cachesToClose) &&
+ F.isEmpty(cacheGrpsToStart) &&
+ F.isEmpty(cacheGrpsToStop) &&
F.isEmpty(cachesToResetLostParts);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index cd781aa..40998ca 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -302,15 +302,6 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
*/
@SuppressWarnings("OverriddenMethodCallDuringObjectConstruction")
protected GridCacheAdapter(GridCacheContext<K, V> ctx) {
- this(ctx, DFLT_START_CACHE_SIZE);
- }
-
- /**
- * @param ctx Cache context.
- * @param startSize Start size.
- */
- @SuppressWarnings("OverriddenMethodCallDuringObjectConstruction")
- protected GridCacheAdapter(GridCacheContext<K, V> ctx, int startSize) {
this(ctx, null);
}
@@ -389,7 +380,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @param e Map entry.
*/
public void incrementSize(GridCacheMapEntry e) {
- map.incrementPublicSize(e);
+ map.incrementPublicSize(null, e);
}
/**
@@ -397,7 +388,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @param e Map entry.
*/
public void decrementSize(GridCacheMapEntry e) {
- map.decrementPublicSize(e);
+ map.decrementPublicSize(null, e);
}
/**
@@ -549,21 +540,12 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
}
/**
- * @return Entry factory.
- */
- protected abstract GridCacheMapEntryFactory entryFactory();
-
- /**
* Starts this cache. Child classes should override this method
* to provide custom start-up behavior.
*
* @throws IgniteCheckedException If start failed.
*/
- public void start() throws IgniteCheckedException {
- if (map == null) {
- map = new GridCacheLocalConcurrentMap(ctx, entryFactory(), DFLT_START_CACHE_SIZE);
- }
- }
+ public abstract void start() throws IgniteCheckedException;
/**
* Startup info.
@@ -717,7 +699,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
IgniteCacheOffheapManager offheapMgr = ctx.isNear() ? ctx.near().dht().context().offheap() : ctx.offheap();
- its.add(offheapMgr.<K, V>entriesIterator(modes.primary, modes.backup, topVer, ctx.keepBinary()));
+ its.add(offheapMgr.<K, V>cacheEntriesIterator(ctx, modes.primary, modes.backup, topVer, ctx.keepBinary()));
}
}
else if (modes.heap) {
@@ -944,7 +926,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @return Entry (never {@code null}).
*/
public GridCacheEntryEx entryEx(KeyCacheObject key, AffinityTopologyVersion topVer) {
- GridCacheEntryEx e = map.putEntryIfObsoleteOrAbsent(topVer, key, true, false);
+ GridCacheEntryEx e = map.putEntryIfObsoleteOrAbsent(ctx, topVer, key, true, false);
assert e != null;
@@ -960,10 +942,11 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
*/
@Nullable private GridCacheEntryEx entry0(KeyCacheObject key, AffinityTopologyVersion topVer, boolean create,
boolean touch) {
- GridCacheMapEntry cur = map.getEntry(key);
+ GridCacheMapEntry cur = map.getEntry(ctx, key);
if (cur == null || cur.obsolete()) {
cur = map.putEntryIfObsoleteOrAbsent(
+ ctx,
topVer,
key,
create, touch);
@@ -983,7 +966,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
* @return Set of internal cached entry representations.
*/
public final Iterable<? extends GridCacheEntryEx> allEntries() {
- return map.entries();
+ return map.entries(ctx.cacheId());
}
/** {@inheritDoc} */
@@ -993,7 +976,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
/** {@inheritDoc} */
@Override public final Set<K> keySet() {
- return new KeySet(map.entrySet());
+ return new KeySet(map.entrySet(ctx.cacheId()));
}
/**
@@ -1003,7 +986,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
public final void removeIfObsolete(KeyCacheObject key) {
assert key != null;
- GridCacheMapEntry entry = map.getEntry(key);
+ GridCacheMapEntry entry = map.getEntry(ctx, key);
if (entry != null && entry.obsolete())
removeEntry(entry);
@@ -1912,7 +1895,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
boolean skipEntry = readNoEntry;
if (readNoEntry) {
- CacheDataRow row = ctx.offheap().read(key);
+ CacheDataRow row = ctx.offheap().read(ctx, key);
if (row != null) {
long expireTime = row.expireTime();
@@ -2925,7 +2908,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
List<K> keys = new ArrayList<>(Math.min(REMOVE_ALL_KEYS_BATCH, size()));
do {
- for (Iterator<CacheDataRow> it = ctx.offheap().iterator(true, true, null);
+ for (Iterator<CacheDataRow> it = ctx.offheap().cacheIterator(ctx.cacheId(), true, true, null);
it.hasNext() && keys.size() < REMOVE_ALL_KEYS_BATCH; )
keys.add((K)it.next().key());
@@ -3791,12 +3774,12 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
/** {@inheritDoc} */
@Override public int size() {
- return map.publicSize();
+ return map.publicSize(ctx.cacheId());
}
/** {@inheritDoc} */
@Override public long sizeLong() {
- return map.publicSize();
+ return map.publicSize(ctx.cacheId());
}
/** {@inheritDoc} */
@@ -3806,12 +3789,12 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
/** {@inheritDoc} */
@Override public int primarySize() {
- return map.publicSize();
+ return map.publicSize(ctx.cacheId());
}
/** {@inheritDoc} */
@Override public long primarySizeLong() {
- return map.publicSize();
+ return map.publicSize(ctx.cacheId());
}
/** {@inheritDoc} */
@@ -3928,7 +3911,10 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
try {
IgniteCacheOffheapManager mgr = ctx.offheap();
- return mgr != null ? mgr.entriesCount(false, true, ctx.affinity().affinityTopologyVersion()) : -1;
+ return mgr != null ? mgr.cacheEntriesCount(ctx.cacheId(),
+ false,
+ true,
+ ctx.affinity().affinityTopologyVersion()) : -1;
}
catch (IgniteCheckedException ignore) {
return 0;
@@ -4450,7 +4436,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
public Set<Cache.Entry<K, V>> entrySet(@Nullable CacheEntryPredicate... filter) {
boolean keepBinary = ctx.keepBinary();
- return new EntrySet(map.entrySet(filter), keepBinary);
+ return new EntrySet(map.entrySet(ctx.cacheId(), filter), keepBinary);
}
/**
@@ -6522,7 +6508,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
/** {@inheritDoc} */
@Override public boolean contains(Object o) {
- GridCacheMapEntry entry = map.getEntry(ctx.toCacheKeyObject(o));
+ GridCacheMapEntry entry = map.getEntry(ctx, ctx.toCacheKeyObject(o));
return entry != null && internalSet.contains(entry);
}
@@ -6612,7 +6598,7 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K, V
/** {@inheritDoc} */
@Override public boolean contains(Object o) {
- GridCacheMapEntry entry = map.getEntry(ctx.toCacheKeyObject(o));
+ GridCacheMapEntry entry = map.getEntry(ctx, ctx.toCacheKeyObject(o));
return entry != null && internalSet.contains(entry);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAffinityManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAffinityManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAffinityManager.java
index 2bb6f6c..702b848 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAffinityManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAffinityManager.java
@@ -28,14 +28,12 @@ import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.cache.affinity.AffinityFunction;
import org.apache.ignite.cache.affinity.AffinityKeyMapper;
import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache;
import org.apache.ignite.internal.util.future.GridFinishedFuture;
import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.lang.IgniteFuture;
import org.jetbrains.annotations.Nullable;
/**
@@ -63,12 +61,7 @@ public class GridCacheAffinityManager extends GridCacheManagerAdapter {
affFunction = cctx.config().getAffinity();
affMapper = cctx.config().getAffinityMapper();
- aff = new GridAffinityAssignmentCache(cctx.kernalContext(),
- cctx.name(),
- affFunction,
- cctx.config().getNodeFilter(),
- cctx.config().getBackups(),
- cctx.isLocal());
+ aff = cctx.group().affinity();
}
/** {@inheritDoc} */
@@ -79,42 +72,6 @@ public class GridCacheAffinityManager extends GridCacheManagerAdapter {
}
/** {@inheritDoc} */
- @Override protected void onKernalStop0(boolean cancel) {
- cancelFutures();
- }
-
- /**
- *
- */
- public void cancelFutures() {
- if (!starting.get())
- // Ignoring attempt to stop manager that has never been started.
- return;
-
- IgniteCheckedException err =
- new IgniteCheckedException("Failed to wait for topology update, cache (or node) is stopping.");
-
- if (aff != null)
- aff.cancelFutures(err);
- }
-
- /** {@inheritDoc} */
- @Override public void onDisconnected(IgniteFuture reconnectFut) {
- IgniteCheckedException err = new IgniteClientDisconnectedCheckedException(reconnectFut,
- "Failed to wait for topology update, client disconnected.");
-
- if (aff != null)
- aff.cancelFutures(err);
- }
-
- /**
- *
- */
- public void onReconnected() {
- aff.onReconnected();
- }
-
- /** {@inheritDoc} */
@Override protected void stop0(boolean cancel, boolean destroy) {
aff = null;
}
@@ -443,23 +400,6 @@ public class GridCacheAffinityManager extends GridCacheManagerAdapter {
}
/**
- * Dumps debug information.
- */
- public void dumpDebugInfo() {
- GridAffinityAssignmentCache aff0 = aff;
-
- if (aff0 != null)
- aff0.dumpDebugInfo();
- }
-
- /**
- * @return Affinity cache.
- */
- public GridAffinityAssignmentCache affinityCache() {
- return aff;
- }
-
- /**
* @param part Partition.
* @param startVer Start version.
* @param endVer End version.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAttributes.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAttributes.java
index 4af2518..7d97159 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAttributes.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAttributes.java
@@ -52,6 +52,7 @@ public class GridCacheAttributes implements Serializable {
/**
* @param cfg Cache configuration.
+ * @param sql SQL flag.
*/
public GridCacheAttributes(CacheConfiguration cfg, boolean sql) {
ccfg = cfg;
@@ -60,10 +61,10 @@ public class GridCacheAttributes implements Serializable {
}
/**
- * Public no-arg constructor for {@link Externalizable}.
+ * @return Cache group name.
*/
- public GridCacheAttributes() {
- // No-op.
+ public String groupName() {
+ return ccfg.getGroupName();
}
/**
@@ -278,6 +279,20 @@ public class GridCacheAttributes implements Serializable {
}
/**
+ * @return Node filter class name.
+ */
+ String nodeFilterClassName() {
+ return className(ccfg.getNodeFilter());
+ }
+
+ /**
+ * @return Topology validator class name.
+ */
+ String topologyValidatorClassName() {
+ return className(ccfg.getTopologyValidator());
+ }
+
+ /**
* @return SQL flag.
*/
public boolean sql() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
index df19225..d37cecb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
@@ -82,7 +82,7 @@ public class GridCacheClearAllRunnable<K, V> implements Runnable {
if (!ctx.isNear()) {
if (id == 0)
- ctx.offheap().clear(readers);
+ ctx.offheap().clearCache(ctx, readers);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMap.java
index 9f20d64..282faaf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMap.java
@@ -18,7 +18,10 @@
package org.apache.ignite.internal.processors.cache;
import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.util.typedef.internal.S;
import org.jetbrains.annotations.Nullable;
/**
@@ -27,15 +30,17 @@ import org.jetbrains.annotations.Nullable;
public interface GridCacheConcurrentMap {
/**
* Returns the entry associated with the specified key in the
- * HashMap. Returns null if the HashMap contains no mapping
+ * HashMap. Returns null if the HashMap contains no mapping
* for this key.
*
+ * @param ctx Cache context.
* @param key Key.
* @return Entry.
*/
- @Nullable public GridCacheMapEntry getEntry(KeyCacheObject key);
+ @Nullable public GridCacheMapEntry getEntry(GridCacheContext ctx, KeyCacheObject key);
/**
+ * @param ctx Cache context.
* @param topVer Topology version.
* @param key Key.
* @param create Create flag.
@@ -44,6 +49,7 @@ public interface GridCacheConcurrentMap {
* couldn't be created.
*/
@Nullable public GridCacheMapEntry putEntryIfObsoleteOrAbsent(
+ GridCacheContext ctx,
AffinityTopologyVersion topVer,
KeyCacheObject key,
boolean create,
@@ -70,39 +76,66 @@ public interface GridCacheConcurrentMap {
* It excludes entries that are marked as deleted.
* It also does not include entries from underlying data store.
*
+ * @param cacheId Cache ID.
* @return the number of publicly available key-value mappings in this map.
*/
- public int publicSize();
+ public int publicSize(int cacheId);
/**
* Increments public size.
*
* @param e Entry that caused public size change.
+ * @param hld Cache map (passed as optimization to avoid cache map lookup for shared groups).
*/
- public void incrementPublicSize(GridCacheEntryEx e);
+ public void incrementPublicSize(@Nullable CacheMapHolder hld, GridCacheEntryEx e);
/**
* Decrements public size.
*
* @param e Entry that caused public size change.
+ * @param hld Cache map (passed as optimization to avoid cache map lookup for shared groups).
*/
- public void decrementPublicSize(GridCacheEntryEx e);
+ public void decrementPublicSize(@Nullable CacheMapHolder hld, GridCacheEntryEx e);
/**
+ * @param cacheId Cache ID.
* @param filter Filter.
* @return Iterable of the mappings contained in this map, excluding entries in unvisitable state.
*/
- public Iterable<GridCacheMapEntry> entries(CacheEntryPredicate... filter);
+ public Iterable<GridCacheMapEntry> entries(int cacheId, CacheEntryPredicate... filter);
/**
+ * @param cacheId Cache ID.
* @param filter Filter.
- * @return Iterable of the mappings contained in this map, including entries in unvisitable state.
+ * @return Set of the mappings contained in this map.
*/
- public Iterable<GridCacheMapEntry> allEntries(CacheEntryPredicate... filter);
+ public Set<GridCacheMapEntry> entrySet(int cacheId, CacheEntryPredicate... filter);
/**
- * @param filter Filter.
- * @return Set of the mappings contained in this map.
+ *
*/
- public Set<GridCacheMapEntry> entrySet(CacheEntryPredicate... filter);
+ static class CacheMapHolder {
+ /** */
+ public final GridCacheContext cctx;
+
+ /** */
+ public final AtomicInteger size = new AtomicInteger();
+
+ /** */
+ public final ConcurrentMap<KeyCacheObject, GridCacheMapEntry> map;
+
+ /**
+ * @param cctx Cache context.
+ * @param map Map.
+ */
+ public CacheMapHolder(GridCacheContext cctx, ConcurrentMap<KeyCacheObject, GridCacheMapEntry> map) {
+ this.cctx = cctx;
+ this.map = map;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(CacheMapHolder.class, this);
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMapImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMapImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMapImpl.java
index b02a2b7..37f2a51 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMapImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheConcurrentMapImpl.java
@@ -20,15 +20,14 @@ package org.apache.ignite.internal.processors.cache;
import java.util.AbstractSet;
import java.util.Collection;
+import java.util.Collections;
import java.util.Iterator;
import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteUuid;
import org.jetbrains.annotations.Nullable;
-import org.jsr166.ConcurrentHashMap8;
import static org.apache.ignite.events.EventType.EVT_CACHE_ENTRY_CREATED;
import static org.apache.ignite.events.EventType.EVT_CACHE_ENTRY_DESTROYED;
@@ -37,78 +36,49 @@ import static org.apache.ignite.events.EventType.EVT_CACHE_ENTRY_DESTROYED;
* Implementation of concurrent cache map.
*/
public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentMap {
- /** Default load factor. */
- private static final float DFLT_LOAD_FACTOR = 0.75f;
-
- /** Default concurrency level. */
- private static final int DFLT_CONCUR_LEVEL = Runtime.getRuntime().availableProcessors() * 2;
-
- /** Internal map. */
- private final ConcurrentMap<KeyCacheObject, GridCacheMapEntry> map;
-
/** Map entry factory. */
private final GridCacheMapEntryFactory factory;
- /** Cache context. */
- private final GridCacheContext ctx;
-
/**
* Creates a new, empty map with the specified initial
* capacity.
*
- * @param ctx Cache context.
* @param factory Entry factory.
- * @param initialCapacity the initial capacity. The implementation
- * performs internal sizing to accommodate this many elements.
* @throws IllegalArgumentException if the initial capacity is
* negative.
*/
- public GridCacheConcurrentMapImpl(GridCacheContext ctx, GridCacheMapEntryFactory factory, int initialCapacity) {
- this(ctx, factory, initialCapacity, DFLT_LOAD_FACTOR, DFLT_CONCUR_LEVEL);
+ public GridCacheConcurrentMapImpl(GridCacheMapEntryFactory factory) {
+ this.factory = factory;
}
- /**
- * Creates a new, empty map with the specified initial
- * capacity, load factor and concurrency level.
- *
- * @param ctx Cache context.
- * @param factory Entry factory.
- * @param initialCapacity the initial capacity. The implementation
- * performs internal sizing to accommodate this many elements.
- * @param loadFactor the load factor threshold, used to control resizing.
- * Resizing may be performed when the average number of elements per
- * bin exceeds this threshold.
- * @param concurrencyLevel the estimated number of concurrently
- * updating threads. The implementation performs internal sizing
- * to try to accommodate this many threads.
- * @throws IllegalArgumentException if the initial capacity is
- * negative or the load factor or concurrencyLevel are
- * non-positive.
- */
- public GridCacheConcurrentMapImpl(
- GridCacheContext ctx,
- GridCacheMapEntryFactory factory,
- int initialCapacity,
- float loadFactor,
- int concurrencyLevel
- ) {
- this.ctx = ctx;
- this.factory = factory;
+ /** {@inheritDoc} */
+ @Nullable @Override public GridCacheMapEntry getEntry(GridCacheContext ctx, KeyCacheObject key) {
+ CacheMapHolder hld = entriesMapIfExists(ctx.cacheIdBoxed());
- map = new ConcurrentHashMap8<>(initialCapacity, loadFactor, concurrencyLevel);
+ return hld != null ? hld.map.get(key) : null;
}
/** {@inheritDoc} */
- @Nullable @Override public GridCacheMapEntry getEntry(KeyCacheObject key) {
- return map.get(key);
+ @Nullable @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(
+ GridCacheContext ctx,
+ final AffinityTopologyVersion topVer,
+ KeyCacheObject key,
+ final boolean create,
+ final boolean touch) {
+ return putEntryIfObsoleteOrAbsent(null, ctx, topVer, key, create, touch);
}
- /** {@inheritDoc} */
- @Nullable @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(final AffinityTopologyVersion topVer,
+ protected final GridCacheMapEntry putEntryIfObsoleteOrAbsent(
+ @Nullable CacheMapHolder hld,
+ GridCacheContext ctx,
+ final AffinityTopologyVersion topVer,
KeyCacheObject key,
final boolean create,
final boolean touch) {
+ if (hld == null)
+ hld = entriesMapIfExists(ctx.cacheIdBoxed());
+
GridCacheMapEntry cur = null;
GridCacheMapEntry created = null;
GridCacheMapEntry created0 = null;
@@ -120,7 +90,7 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
try {
while (!done) {
- GridCacheMapEntry entry = map.get(key);
+ GridCacheMapEntry entry = hld != null ? hld.map.get(key) : null;
created = null;
doomed = null;
@@ -134,12 +104,18 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
reserved = true;
}
+ if (hld == null) {
+ hld = entriesMap(ctx);
+
+ assert hld != null;
+ }
+
created0 = factory.create(ctx, topVer, key);
}
cur = created = created0;
- done = map.putIfAbsent(created.key(), created) == null;
+ done = hld.map.putIfAbsent(created.key(), created) == null;
}
else
done = true;
@@ -162,10 +138,10 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
cur = created = created0;
- done = map.replace(entry.key(), doomed, created);
+ done = hld.map.replace(entry.key(), doomed, created);
}
else
- done = map.remove(entry.key(), doomed);
+ done = hld.map.remove(entry.key(), doomed);
}
else {
cur = entry;
@@ -231,18 +207,31 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
}
finally {
if (reserved)
- release(sizeChange, cur);
+ release(sizeChange, hld, cur);
else {
if (sizeChange != 0) {
assert sizeChange == -1;
+ assert doomed != null;
- decrementPublicSize(cur);
+ decrementPublicSize(hld, doomed);
}
}
}
}
/**
+ * @param cctx Cache context.
+ * @return Map for given cache ID.
+ */
+ @Nullable protected abstract CacheMapHolder entriesMap(GridCacheContext cctx);
+
+ /**
+ * @param cacheId Cache ID.
+ * @return Map for given cache ID.
+ */
+ @Nullable protected abstract CacheMapHolder entriesMapIfExists(Integer cacheId);
+
+ /**
*
*/
protected boolean reserve() {
@@ -258,63 +247,75 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
/**
* @param sizeChange Size delta.
+ * @param hld Map holder.
* @param e Map entry.
*/
- protected void release(int sizeChange, GridCacheEntryEx e) {
+ protected void release(int sizeChange, CacheMapHolder hld, GridCacheEntryEx e) {
if (sizeChange == 1)
- incrementPublicSize(e);
+ incrementPublicSize(hld, e);
else if (sizeChange == -1)
- decrementPublicSize(e);
+ decrementPublicSize(hld, e);
}
/** {@inheritDoc} */
@Override public boolean removeEntry(final GridCacheEntryEx entry) {
- boolean removed = map.remove(entry.key(), entry);
+ GridCacheContext ctx = entry.context();
+
+ CacheMapHolder hld = entriesMapIfExists(ctx.cacheIdBoxed());
+
+ boolean rmv = hld != null && hld.map.remove(entry.key(), entry);
- if (removed) {
- if (ctx.events().isRecordable(EVT_CACHE_ENTRY_DESTROYED))
+ if (rmv) {
+ if (ctx.events().isRecordable(EVT_CACHE_ENTRY_DESTROYED)) {
// Event notification.
- ctx.events().addEvent(entry.partition(), entry.key(), ctx.localNodeId(), (IgniteUuid)null, null,
- EVT_CACHE_ENTRY_DESTROYED, null, false, null, false, null, null, null, false);
+ ctx.events().addEvent(entry.partition(),
+ entry.key(),
+ ctx.localNodeId(),
+ (IgniteUuid)null,
+ null,
+ EVT_CACHE_ENTRY_DESTROYED,
+ null,
+ false,
+ null,
+ false,
+ null,
+ null,
+ null,
+ false);
+ }
synchronized (entry) {
if (!entry.deleted())
- decrementPublicSize(entry);
+ decrementPublicSize(hld, entry);
}
}
- return removed;
+ return rmv;
}
/** {@inheritDoc} */
- @Override public int internalSize() {
- return map.size();
- }
+ @Override public Collection<GridCacheMapEntry> entries(int cacheId, final CacheEntryPredicate... filter) {
+ CacheMapHolder hld = entriesMapIfExists(cacheId);
+
+ if (hld == null)
+ return Collections.emptyList();
- /** {@inheritDoc} */
- @Override public Collection<GridCacheMapEntry> entries(final CacheEntryPredicate... filter) {
final IgnitePredicate<GridCacheMapEntry> p = new IgnitePredicate<GridCacheMapEntry>() {
@Override public boolean apply(GridCacheMapEntry entry) {
return entry.visitable(filter);
}
};
- return F.viewReadOnly(map.values(), F.<GridCacheMapEntry>identity(), p);
+ return F.viewReadOnly(hld.map.values(), F.<GridCacheMapEntry>identity(), p);
}
/** {@inheritDoc} */
- @Override public Collection<GridCacheMapEntry> allEntries(final CacheEntryPredicate... filter) {
- final IgnitePredicate<GridCacheMapEntry> p = new IgnitePredicate<GridCacheMapEntry>() {
- @Override public boolean apply(GridCacheMapEntry entry) {
- return F.isAll(entry, filter);
- }
- };
+ @Override public Set<GridCacheMapEntry> entrySet(int cacheId, final CacheEntryPredicate... filter) {
+ final CacheMapHolder hld = entriesMapIfExists(cacheId);
- return F.viewReadOnly(map.values(), F.<GridCacheMapEntry>identity(), p);
- }
+ if (hld == null)
+ return Collections.emptySet();
- /** {@inheritDoc} */
- @Override public Set<GridCacheMapEntry> entrySet(final CacheEntryPredicate... filter) {
final IgnitePredicate<GridCacheMapEntry> p = new IgnitePredicate<GridCacheMapEntry>() {
@Override public boolean apply(GridCacheMapEntry entry) {
return entry.visitable(filter);
@@ -323,7 +324,7 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
return new AbstractSet<GridCacheMapEntry>() {
@Override public Iterator<GridCacheMapEntry> iterator() {
- return F.iterator0(map.values(), true, p);
+ return F.iterator0(hld.map.values(), true, p);
}
@Override public int size() {
@@ -336,7 +337,7 @@ public abstract class GridCacheConcurrentMapImpl implements GridCacheConcurrentM
GridCacheMapEntry entry = (GridCacheMapEntry)o;
- return entry.equals(map.get(entry.key())) && p.apply(entry);
+ return entry.equals(hld.map.get(entry.key())) && p.apply(entry);
}
};
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 4c1d615..839ddbd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -45,6 +45,7 @@ import org.apache.ignite.cache.affinity.AffinityKeyMapper;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.EventType;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteKernal;
@@ -56,8 +57,6 @@ import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.database.MemoryPolicy;
-import org.apache.ignite.internal.processors.cache.database.freelist.FreeList;
-import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList;
import org.apache.ignite.internal.processors.cache.datastructures.CacheDataStructuresManager;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
@@ -84,7 +83,6 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersionedEnt
import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
import org.apache.ignite.internal.processors.plugin.CachePluginManager;
-import org.apache.ignite.internal.processors.query.QueryUtils;
import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
import org.apache.ignite.internal.util.F0;
import org.apache.ignite.internal.util.lang.GridFunc;
@@ -106,9 +104,10 @@ import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
-import static org.apache.ignite.cache.CacheRebalanceMode.NONE;
import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC;
+import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STARTED;
+import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STOPPED;
import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.OWNING;
/**
@@ -135,14 +134,8 @@ public class GridCacheContext<K, V> implements Externalizable {
/** Cache shared context. */
private GridCacheSharedContext<K, V> sharedCtx;
- /** Memory policy. */
- private MemoryPolicy memPlc;
-
- /** FreeList instance this cache is associated with. */
- private FreeList freeList;
-
- /** ReuseList instance this cache is associated with */
- private ReuseList reuseList;
+ /** Cache group. */
+ private CacheGroupContext grp;
/** Logger. */
private IgniteLogger log;
@@ -177,9 +170,6 @@ public class GridCacheContext<K, V> implements Externalizable {
/** Replication manager. */
private GridCacheDrManager drMgr;
- /** */
- private IgniteCacheOffheapManager offheapMgr;
-
/** Conflict resolver manager. */
private CacheConflictResolutionManager rslvrMgr;
@@ -210,6 +200,9 @@ public class GridCacheContext<K, V> implements Externalizable {
/** Cache ID. */
private int cacheId;
+ /** Cache ID. */
+ private Integer cacheIdBoxed;
+
/** Cache type. */
private CacheType cacheType;
@@ -237,18 +230,12 @@ public class GridCacheContext<K, V> implements Externalizable {
/** Topology version when cache was started on local node. */
private AffinityTopologyVersion locStartTopVer;
- /** */
- private UUID rcvdFrom;
-
/** Dynamic cache deployment ID. */
private IgniteUuid dynamicDeploymentId;
/** Updates allowed flag. */
private boolean updatesAllowed;
- /** Flag indicating that this cache is in a recovery mode. */
- private boolean needsRecovery;
-
/** Deployment enabled flag for this specific cache */
private boolean depEnabled;
@@ -258,6 +245,12 @@ public class GridCacheContext<K, V> implements Externalizable {
/** */
private boolean customAffMapper;
+ /** Whether {@link EventType#EVT_CACHE_REBALANCE_STARTED} was sent (used only for REPLICATED cache). */
+ private volatile boolean rebalanceStartedEvtSent;
+
+ /** Whether {@link EventType#EVT_CACHE_REBALANCE_STOPPED} was sent (used only for REPLICATED cache). */
+ private volatile boolean rebalanceStoppedEvtSent;
+
/**
* Empty constructor required for {@link Externalizable}.
*/
@@ -269,9 +262,9 @@ public class GridCacheContext<K, V> implements Externalizable {
* @param ctx Kernal context.
* @param sharedCtx Cache shared context.
* @param cacheCfg Cache configuration.
+ * @param grp Cache group.
* @param cacheType Cache type.
- * @param memPlc MemoryPolicy instance.
- * @param freeList FreeList instance.
+ * @param locStartTopVer Topology version when cache was started on local node.
* @param affNode {@code True} if local node is affinity node.
* @param updatesAllowed Updates allowed flag.
* @param evtMgr Cache event manager.
@@ -291,14 +284,11 @@ public class GridCacheContext<K, V> implements Externalizable {
GridKernalContext ctx,
GridCacheSharedContext sharedCtx,
CacheConfiguration cacheCfg,
+ CacheGroupContext grp,
CacheType cacheType,
AffinityTopologyVersion locStartTopVer,
- UUID rcvdFrom,
boolean affNode,
boolean updatesAllowed,
- MemoryPolicy memPlc,
- FreeList freeList,
- ReuseList reuseList,
/*
* Managers in starting order!
@@ -313,7 +303,6 @@ public class GridCacheContext<K, V> implements Externalizable {
CacheDataStructuresManager dataStructuresMgr,
GridCacheTtlManager ttlMgr,
GridCacheDrManager drMgr,
- IgniteCacheOffheapManager offheapMgr,
CacheConflictResolutionManager<K, V> rslvrMgr,
CachePluginManager pluginMgr,
GridCacheAffinityManager affMgr
@@ -323,6 +312,7 @@ public class GridCacheContext<K, V> implements Externalizable {
assert cacheCfg != null;
assert locStartTopVer != null : cacheCfg.getName();
+ assert grp != null;
assert evtMgr != null;
assert storeMgr != null;
assert evictMgr != null;
@@ -333,22 +323,17 @@ public class GridCacheContext<K, V> implements Externalizable {
assert ttlMgr != null;
assert rslvrMgr != null;
assert pluginMgr != null;
- assert offheapMgr != null;
this.ctx = ctx;
this.sharedCtx = sharedCtx;
this.cacheCfg = cacheCfg;
+ this.grp = grp;
this.cacheType = cacheType;
this.locStartTopVer = locStartTopVer;
- this.rcvdFrom = rcvdFrom;
this.affNode = affNode;
this.updatesAllowed = updatesAllowed;
this.depEnabled = ctx.deploy().enabled() && !cacheObjects().isBinaryEnabled(cacheCfg);
- this.memPlc = memPlc;
- this.freeList = freeList;
- this.reuseList = reuseList;
-
/*
* Managers in starting order!
* ===========================
@@ -361,7 +346,6 @@ public class GridCacheContext<K, V> implements Externalizable {
this.dataStructuresMgr = add(dataStructuresMgr);
this.ttlMgr = add(ttlMgr);
this.drMgr = add(drMgr);
- this.offheapMgr = add(offheapMgr);
this.rslvrMgr = add(rslvrMgr);
this.pluginMgr = add(pluginMgr);
this.affMgr = add(affMgr);
@@ -374,6 +358,8 @@ public class GridCacheContext<K, V> implements Externalizable {
cacheId = CU.cacheId(cacheName);
+ cacheIdBoxed = cacheId;
+
plc = cacheType.ioPolicy();
Factory<ExpiryPolicy> factory = cacheCfg.getExpiryPolicyFactory();
@@ -387,6 +373,20 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
+ * @return Cache group ID.
+ */
+ public int groupId() {
+ return grp.groupId();
+ }
+
+ /**
+ * @return Cache group.
+ */
+ public CacheGroupContext group() {
+ return grp;
+ }
+
+ /**
* @return {@code True} if custom {@link AffinityKeyMapper} is configured for cache.
*/
public boolean customAffinityMapper() {
@@ -460,13 +460,6 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
- * @return Node ID cache was received from.
- */
- public UUID receivedFrom() {
- return rcvdFrom;
- }
-
- /**
* @return Topology version when cache was started on local node.
*/
public AffinityTopologyVersion startTopologyVersion() {
@@ -525,6 +518,13 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
+ * @return Cache ID.
+ */
+ public Integer cacheIdBoxed() {
+ return cacheIdBoxed;
+ }
+
+ /**
* @return {@code True} if should use system transactions which are isolated from user transactions.
*/
public boolean systemTx() {
@@ -721,21 +721,7 @@ public class GridCacheContext<K, V> implements Externalizable {
* @return Memory policy.
*/
public MemoryPolicy memoryPolicy() {
- return memPlc;
- }
-
- /**
- * @return Free List.
- */
- public FreeList freeList() {
- return freeList;
- }
-
- /**
- * @return Reuse List.
- */
- public ReuseList reuseList() {
- return reuseList;
+ return grp.memoryPolicy();
}
/**
@@ -775,7 +761,7 @@ public class GridCacheContext<K, V> implements Externalizable {
* @return {@code True} if rebalance is enabled.
*/
public boolean rebalanceEnabled() {
- return cacheCfg.getRebalanceMode() != NONE;
+ return grp.rebalanceEnabled();
}
/**
@@ -854,6 +840,18 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
+ * @return DHT cache.
+ */
+ public GridDhtCacheAdapter dhtCache() {
+ GridCacheAdapter<K, V> cache = this.cache;
+
+ if (cache == null)
+ throw new IllegalStateException("Cache stopped: " + cacheName);
+
+ return isNear() ? ((GridNearCacheAdapter<K, V>)cache).dht() : dht();
+ }
+
+ /**
* @return Topology version future.
*/
public GridDhtTopologyFuture topologyVersionFuture() {
@@ -1073,7 +1071,7 @@ public class GridCacheContext<K, V> implements Externalizable {
* @return Offheap manager.
*/
public IgniteCacheOffheapManager offheap() {
- return offheapMgr;
+ return grp.offheap();
}
/**
@@ -1945,20 +1943,6 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
- * @return Current cache state. Must only be modified during exchange.
- */
- public boolean needsRecovery() {
- return needsRecovery;
- }
-
- /**
- * @param needsRecovery Needs recovery flag.
- */
- public void needsRecovery(boolean needsRecovery) {
- this.needsRecovery = needsRecovery;
- }
-
- /**
* Nulling references to potentially leak-prone objects.
*/
public void cleanup() {
@@ -2036,13 +2020,6 @@ public class GridCacheContext<K, V> implements Externalizable {
}
/**
- * @return {@code True} if fast eviction is allowed.
- */
- public boolean allowFastEviction() {
- return shared().database().persistenceEnabled() && !QueryUtils.isEnabled(cacheCfg);
- }
-
- /**
* @param part Partition.
* @param affNodes Affinity nodes.
* @param topVer Topology version.
@@ -2057,6 +2034,35 @@ public class GridCacheContext<K, V> implements Externalizable {
|| (top.partitionState(localNodeId(), part) == OWNING);
}
+ /**
+ * @param type Event type.
+ * @return {@code True} if event should be recorded.
+ */
+ public boolean recordEvent(int type) {
+ if (isReplicated()) {
+ if (type == EVT_CACHE_REBALANCE_STARTED) {
+ if (!rebalanceStartedEvtSent) {
+ rebalanceStartedEvtSent = true;
+
+ return true;
+ }
+ else
+ return false;
+ }
+ else if (type == EVT_CACHE_REBALANCE_STOPPED) {
+ if (!rebalanceStoppedEvtSent) {
+ rebalanceStoppedEvtSent = true;
+
+ return true;
+ }
+ else
+ return false;
+ }
+ }
+
+ return true;
+ }
+
/** {@inheritDoc} */
@Override public void writeExternal(ObjectOutput out) throws IOException {
U.writeString(out, igniteInstanceName());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
index c0e1c55..7371153 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
@@ -317,17 +317,17 @@ public class GridCacheEntryInfo implements Message {
}
/**
+ * @param ctx Cache object context.
* @return Marshalled size.
+ * @throws IgniteCheckedException If failed.
*/
- public int marshalledSize(GridCacheContext ctx) throws IgniteCheckedException {
+ public int marshalledSize(CacheObjectContext ctx) throws IgniteCheckedException {
int size = 0;
- CacheObjectContext cacheObjCtx = ctx.cacheObjectContext();
-
if (val != null)
- size += val.valueBytes(cacheObjCtx).length;
+ size += val.valueBytes(ctx).length;
- size += key.valueBytes(cacheObjCtx).length;
+ size += key.valueBytes(ctx).length;
return SIZE_OVERHEAD + size;
}
@@ -337,12 +337,20 @@ public class GridCacheEntryInfo implements Message {
* @throws IgniteCheckedException In case of error.
*/
public void marshal(GridCacheContext ctx) throws IgniteCheckedException {
+ marshal(ctx.cacheObjectContext());
+ }
+
+ /**
+ * @param ctx Cache context.
+ * @throws IgniteCheckedException In case of error.
+ */
+ public void marshal(CacheObjectContext ctx) throws IgniteCheckedException {
assert key != null;
- key.prepareMarshal(ctx.cacheObjectContext());
+ key.prepareMarshal(ctx);
if (val != null)
- val.prepareMarshal(ctx.cacheObjectContext());
+ val.prepareMarshal(ctx);
if (expireTime == 0)
expireTime = -1;
@@ -362,10 +370,21 @@ public class GridCacheEntryInfo implements Message {
* @throws IgniteCheckedException If unmarshalling failed.
*/
public void unmarshal(GridCacheContext ctx, ClassLoader clsLdr) throws IgniteCheckedException {
- key.finishUnmarshal(ctx.cacheObjectContext(), clsLdr);
+ unmarshal(ctx.cacheObjectContext(), clsLdr);
+ }
+
+ /**
+ * Unmarshalls entry.
+ *
+ * @param ctx Cache context.
+ * @param clsLdr Class loader.
+ * @throws IgniteCheckedException If unmarshalling failed.
+ */
+ public void unmarshal(CacheObjectContext ctx, ClassLoader clsLdr) throws IgniteCheckedException {
+ key.finishUnmarshal(ctx, clsLdr);
if (val != null)
- val.finishUnmarshal(ctx.cacheObjectContext(), clsLdr);
+ val.finishUnmarshal(ctx, clsLdr);
long remaining = expireTime;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEventManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEventManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEventManager.java
index 93c5950..a967305 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEventManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEventManager.java
@@ -368,42 +368,6 @@ public class GridCacheEventManager extends GridCacheManagerAdapter {
}
/**
- * Adds preloading event.
- *
- * @param part Partition.
- * @param type Event type.
- * @param discoNode Discovery node.
- * @param discoType Discovery event type.
- * @param discoTs Discovery event timestamp.
- */
- public void addPreloadEvent(int part, int type, ClusterNode discoNode, int discoType, long discoTs) {
- assert discoNode != null;
- assert type > 0;
- assert discoType > 0;
- assert discoTs > 0;
-
- if (!cctx.events().isRecordable(type))
- LT.warn(log, "Added event without checking if event is recordable: " + U.gridEventName(type));
-
- cctx.gridEvents().record(new CacheRebalancingEvent(cctx.name(), cctx.localNode(),
- "Cache rebalancing event.", type, part, discoNode, discoType, discoTs));
- }
-
- /**
- * Adds partition unload event.
- *
- * @param part Partition.
- */
- public void addUnloadEvent(int part) {
- if (!cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_UNLOADED))
- LT.warn(log, "Added event without checking if event is recordable: " +
- U.gridEventName(EVT_CACHE_REBALANCE_PART_UNLOADED));
-
- cctx.gridEvents().record(new CacheRebalancingEvent(cctx.name(), cctx.localNode(),
- "Cache unloading event.", EVT_CACHE_REBALANCE_PART_UNLOADED, part, null, 0, 0));
- }
-
- /**
* @param type Event type.
* @return {@code True} if event is recordable.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGroupIdMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGroupIdMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGroupIdMessage.java
new file mode 100644
index 0000000..09c143b
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheGroupIdMessage.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.nio.ByteBuffer;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.MessageReader;
+import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+
+/**
+ * Message related to particular cache group.
+ */
+public abstract class GridCacheGroupIdMessage extends GridCacheMessage {
+ /** Cache group ID. */
+ @GridToStringInclude
+ protected int grpId;
+
+ /**
+ * @return Cache group ID.
+ */
+ public int groupId() {
+ return grpId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public final int handlerId() {
+ return grpId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public byte fieldsCount() {
+ return 3;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+ writer.setBuffer(buf);
+
+ if (!super.writeTo(buf, writer))
+ return false;
+
+ if (!writer.isHeaderWritten()) {
+ if (!writer.writeHeader(directType(), fieldsCount()))
+ return false;
+
+ writer.onHeaderWritten();
+ }
+
+ switch (writer.state()) {
+ case 2:
+ if (!writer.writeInt("grpId", grpId))
+ return false;
+
+ writer.incrementState();
+
+ }
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+ reader.setBuffer(buf);
+
+ if (!reader.beforeMessageRead())
+ return false;
+
+ if (!super.readFrom(buf, reader))
+ return false;
+
+ switch (reader.state()) {
+ case 2:
+ grpId = reader.readInt("grpId");
+
+ if (!reader.isLastRead())
+ return false;
+
+ reader.incrementState();
+
+ }
+
+ return reader.afterMessageRead(GridCacheGroupIdMessage.class);
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(GridCacheGroupIdMessage.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIdMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIdMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIdMessage.java
new file mode 100644
index 0000000..6c20bdd
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIdMessage.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.nio.ByteBuffer;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.plugin.extensions.communication.MessageReader;
+import org.apache.ignite.plugin.extensions.communication.MessageWriter;
+
+/**
+ * Message related to particular cache.
+ */
+public abstract class GridCacheIdMessage extends GridCacheMessage {
+ /** Cache ID. */
+ @GridToStringInclude
+ protected int cacheId;
+
+ /**
+ * @return Cache ID.
+ */
+ public int cacheId() {
+ return cacheId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /**
+ * @param cacheId Cache ID.
+ */
+ public void cacheId(int cacheId) {
+ this.cacheId = cacheId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public byte fieldsCount() {
+ return 3;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
+ writer.setBuffer(buf);
+
+ if (!super.writeTo(buf, writer))
+ return false;
+
+ if (!writer.isHeaderWritten()) {
+ if (!writer.writeHeader(directType(), fieldsCount()))
+ return false;
+
+ writer.onHeaderWritten();
+ }
+
+ switch (writer.state()) {
+ case 2:
+ if (!writer.writeInt("cacheId", cacheId))
+ return false;
+
+ writer.incrementState();
+
+ }
+
+ return true;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) {
+ reader.setBuffer(buf);
+
+ if (!reader.beforeMessageRead())
+ return false;
+
+ if (!super.readFrom(buf, reader))
+ return false;
+
+ switch (reader.state()) {
+ case 2:
+ cacheId = reader.readInt("cacheId");
+
+ if (!reader.isLastRead())
+ return false;
+
+ reader.incrementState();
+
+ }
+
+ return reader.afterMessageRead(GridCacheIdMessage.class);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return cacheId;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(GridCacheIdMessage.class, this);
+ }
+}
[08/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java
index 6fb557a..cba9477 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLocalPartition.java
@@ -19,7 +19,10 @@ package org.apache.ignite.internal.processors.cache.distributed.dht;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -30,30 +33,33 @@ import java.util.concurrent.locks.ReentrantLock;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.NodeStoppingException;
import org.apache.ignite.internal.pagemem.wal.record.delta.PartitionMetaStateRecord;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheConcurrentMapImpl;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntry;
import org.apache.ignite.internal.processors.cache.GridCacheMapEntryFactory;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader;
import org.apache.ignite.internal.processors.cache.extras.GridCacheObsoleteEntryExtras;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
-import org.apache.ignite.internal.processors.query.QueryUtils;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.lang.GridIterator;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
-import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteUuid;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jsr166.ConcurrentHashMap8;
import org.jsr166.ConcurrentLinkedDeque8;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_ATOMIC_CACHE_DELETE_HISTORY_SIZE;
@@ -70,6 +76,17 @@ import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDh
* Key partition.
*/
public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements Comparable<GridDhtLocalPartition>, GridReservable {
+ /** */
+ private static final GridCacheMapEntryFactory ENTRY_FACTORY = new GridCacheMapEntryFactory() {
+ @Override public GridCacheMapEntry create(
+ GridCacheContext ctx,
+ AffinityTopologyVersion topVer,
+ KeyCacheObject key
+ ) {
+ return new GridDhtCacheEntry(ctx, topVer, key);
+ }
+ };
+
/** Maximum size for delete queue. */
public static final int MAX_DELETE_QUEUE_SIZE = Integer.getInteger(IGNITE_ATOMIC_CACHE_DELETE_HISTORY_SIZE, 200_000);
@@ -100,29 +117,48 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
@GridToStringExclude
private final GridFutureAdapter<?> rent;
- /** Context. */
- private final GridCacheContext cctx;
+ /** */
+ @GridToStringExclude
+ private final GridCacheSharedContext ctx;
+
+ /** */
+ @GridToStringExclude
+ private final CacheGroupContext grp;
/** Create time. */
@GridToStringExclude
private final long createTime = U.currentTimeMillis();
/** Eviction history. */
+ @GridToStringExclude
private volatile Map<KeyCacheObject, GridCacheVersion> evictHist = new HashMap<>();
/** Lock. */
+ @GridToStringExclude
private final ReentrantLock lock = new ReentrantLock();
+ /** */
+ @GridToStringExclude
+ private final ConcurrentMap<Integer, CacheMapHolder> cacheMaps;
+
+ /** */
+ @GridToStringExclude
+ private final CacheMapHolder singleCacheEntryMap;
+
/** Remove queue. */
+ @GridToStringExclude
private final ConcurrentLinkedDeque8<RemovedEntryHolder> rmvQueue = new ConcurrentLinkedDeque8<>();
/** Group reservations. */
+ @GridToStringExclude
private final CopyOnWriteArrayList<GridDhtPartitionsReservation> reservations = new CopyOnWriteArrayList<>();
/** */
+ @GridToStringExclude
private final CacheDataStore store;
/** Partition updates. */
+ @GridToStringExclude
private final ConcurrentNavigableMap<Long, Boolean> updates = new ConcurrentSkipListMap<>();
/** Last applied update. */
@@ -133,18 +169,30 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
private volatile boolean shouldBeRenting;
/**
- * @param cctx Context.
+ * @param ctx Context.
+ * @param grp Cache group.
* @param id Partition ID.
- * @param entryFactory Entry factory.
*/
@SuppressWarnings("ExternalizableWithoutPublicNoArgConstructor")
- GridDhtLocalPartition(GridCacheContext cctx, int id, GridCacheMapEntryFactory entryFactory) {
- super(cctx, entryFactory, Math.max(10, GridCacheAdapter.DFLT_START_CACHE_SIZE / cctx.affinity().partitions()));
+ GridDhtLocalPartition(GridCacheSharedContext ctx,
+ CacheGroupContext grp,
+ int id) {
+ super(ENTRY_FACTORY);
this.id = id;
- this.cctx = cctx;
+ this.ctx = ctx;
+ this.grp = grp;
+
+ log = U.logger(ctx.kernalContext(), logRef, this);
- log = U.logger(cctx.kernalContext(), logRef, this);
+ if (grp.sharedGroup()) {
+ singleCacheEntryMap = null;
+ cacheMaps = new ConcurrentHashMap<>();
+ }
+ else {
+ singleCacheEntryMap = new CacheMapHolder(grp.singleCacheContext(), createEntriesMap());
+ cacheMaps = null;
+ }
rent = new GridFutureAdapter<Object>() {
@Override public String toString() {
@@ -152,15 +200,15 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
};
- int delQueueSize = CU.isSystemCache(cctx.name()) ? 100 :
- Math.max(MAX_DELETE_QUEUE_SIZE / cctx.affinity().partitions(), 20);
+ int delQueueSize = grp.systemCache() ? 100 :
+ Math.max(MAX_DELETE_QUEUE_SIZE / grp.affinity().partitions(), 20);
rmvQueueMaxSize = U.ceilPow2(delQueueSize);
rmvdEntryTtl = Long.getLong(IGNITE_CACHE_REMOVED_ENTRIES_TTL, 10_000);
try {
- store = cctx.offheap().createCacheDataStore(id);
+ store = grp.offheap().createCacheDataStore(id);
}
catch (IgniteCheckedException e) {
// TODO ignite-db
@@ -169,6 +217,62 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @return Entries map.
+ */
+ private ConcurrentMap<KeyCacheObject, GridCacheMapEntry> createEntriesMap() {
+ return new ConcurrentHashMap8<>(Math.max(10, GridCacheAdapter.DFLT_START_CACHE_SIZE / grp.affinity().partitions()),
+ 0.75f,
+ Runtime.getRuntime().availableProcessors() * 2);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int internalSize() {
+ if (grp.sharedGroup()) {
+ int size = 0;
+
+ for (CacheMapHolder hld : cacheMaps.values())
+ size += hld.map.size();
+
+ return size;
+ }
+
+ return singleCacheEntryMap.map.size();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected CacheMapHolder entriesMap(GridCacheContext cctx) {
+ if (grp.sharedGroup())
+ return cacheMapHolder(cctx);
+
+ return singleCacheEntryMap;
+ }
+
+ /** {@inheritDoc} */
+ @Nullable @Override protected CacheMapHolder entriesMapIfExists(Integer cacheId) {
+ return grp.sharedGroup() ? cacheMaps.get(cacheId) : singleCacheEntryMap;
+ }
+
+ /**
+ * @param cctx Cache context.
+ * @return Map holder.
+ */
+ private CacheMapHolder cacheMapHolder(GridCacheContext cctx) {
+ assert grp.sharedGroup();
+
+ CacheMapHolder hld = cacheMaps.get(cctx.cacheIdBoxed());
+
+ if (hld != null)
+ return hld;
+
+ CacheMapHolder old = cacheMaps.putIfAbsent(cctx.cacheIdBoxed(), hld = new CacheMapHolder(cctx, createEntriesMap()));
+
+ if (old != null)
+ hld = old;
+
+ return hld;
+ }
+
+ /**
* @return Data store.
*/
public CacheDataStore dataStore() {
@@ -235,10 +339,10 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @return {@code True} if partition is empty.
*/
public boolean isEmpty() {
- if (cctx.allowFastEviction())
+ if (grp.allowFastEviction())
return internalSize() == 0;
- return store.size() == 0 && internalSize() == 0;
+ return store.fullSize() == 0 && internalSize() == 0;
}
/**
@@ -307,6 +411,20 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @param cacheId Cache ID.
+ * @param key Key.
+ * @param ver Version.
+ */
+ private void removeVersionedEntry(int cacheId, KeyCacheObject key, GridCacheVersion ver) {
+ CacheMapHolder hld = grp.sharedGroup() ? cacheMaps.get(cacheId) : singleCacheEntryMap;
+
+ GridCacheMapEntry entry = hld != null ? hld.map.get(key) : null;
+
+ if (entry != null && entry.markObsoleteVersion(ver))
+ removeEntry(entry);
+ }
+
+ /**
*
*/
public void cleanupRemoveQueue() {
@@ -314,10 +432,10 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
RemovedEntryHolder item = rmvQueue.pollFirst();
if (item != null)
- cctx.dht().removeVersionedEntry(item.key(), item.version());
+ removeVersionedEntry(item.cacheId(), item.key(), item.version());
}
- if (!cctx.isDrEnabled()) {
+ if (!grp.isDrEnabled()) {
RemovedEntryHolder item = rmvQueue.peekFirst();
while (item != null && item.expireTime() < U.currentTimeMillis()) {
@@ -326,7 +444,7 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
if (item == null)
break;
- cctx.dht().removeVersionedEntry(item.key(), item.version());
+ removeVersionedEntry(item.cacheId(), item.key(), item.version());
item = rmvQueue.peekFirst();
}
@@ -334,13 +452,14 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @param cacheId cacheId Cache ID.
* @param key Removed key.
* @param ver Removed version.
*/
- public void onDeferredDelete(KeyCacheObject key, GridCacheVersion ver) {
+ public void onDeferredDelete(int cacheId, KeyCacheObject key, GridCacheVersion ver) {
cleanupRemoveQueue();
- rmvQueue.add(new RemovedEntryHolder(key, ver, rmvdEntryTtl));
+ rmvQueue.add(new RemovedEntryHolder(cacheId, key, ver, rmvdEntryTtl));
}
/**
@@ -438,7 +557,10 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/** {@inheritDoc} */
- @Override protected void release(int sizeChange, GridCacheEntryEx e) {
+ @Override protected void release(int sizeChange, CacheMapHolder hld, GridCacheEntryEx e) {
+ if (grp.sharedGroup() && sizeChange != 0)
+ hld.size.addAndGet(sizeChange);
+
release0(sizeChange);
}
@@ -486,16 +608,16 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @return {@code true} if cas succeeds.
*/
private boolean casState(long state, GridDhtPartitionState toState) {
- if (cctx.shared().database().persistenceEnabled()) {
+ if (ctx.database().persistenceEnabled()) {
synchronized (this) {
boolean update = this.state.compareAndSet(state, setPartState(state, toState));
if (update)
try {
- cctx.shared().wal().log(new PartitionMetaStateRecord(cctx.cacheId(), id, toState, updateCounter()));
+ ctx.wal().log(new PartitionMetaStateRecord(grp.groupId(), id, toState, updateCounter()));
}
catch (IgniteCheckedException e) {
- log.error("Error while writing to log", e);
+ U.error(log, "Error while writing to log", e);
}
return update;
@@ -610,13 +732,13 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @param updateSeq Update sequence.
*/
void tryEvictAsync(boolean updateSeq) {
- assert cctx.kernalContext().state().active();
+ assert ctx.kernalContext().state().active();
long state = this.state.get();
GridDhtPartitionState partState = getPartState(state);
- if (isEmpty() && !QueryUtils.isEnabled(cctx.config()) && getSize(state) == 0 &&
+ if (isEmpty() && !grp.queriesEnabled() && getSize(state) == 0 &&
partState == RENTING && getReservations(state) == 0 && !groupReserved() &&
casState(state, EVICTED)) {
if (log.isDebugEnabled())
@@ -626,7 +748,7 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
finishDestroy(updateSeq);
}
else if (partState == RENTING || shouldBeRenting())
- cctx.preloader().evictPartitionAsync(this);
+ grp.preloader().evictPartitionAsync(this);
}
/**
@@ -702,18 +824,13 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
assert state() == EVICTED : this;
assert evictGuard.get() == -1;
- if (cctx.isDrEnabled())
- cctx.dr().partitionEvicted(id);
-
- cctx.continuousQueries().onPartitionEvicted(id);
-
- cctx.dataStructures().onPartitionEvicted(id);
+ grp.onPartitionEvicted(id);
destroyCacheDataStore();
rent.onDone();
- ((GridDhtPreloader)cctx.preloader()).onPartitionEvicted(this, updateSeq);
+ ((GridDhtPreloader)grp.preloader()).onPartitionEvicted(this, updateSeq);
clearDeferredDeletes();
}
@@ -753,7 +870,7 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
try {
CacheDataStore store = dataStore();
- cctx.offheap().destroyCacheDataStore(id, store);
+ grp.offheap().destroyCacheDataStore(id, store);
}
catch (IgniteCheckedException e) {
log.error("Unable to destroy cache data store on partition eviction [id=" + id + "]", e);
@@ -777,7 +894,9 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @return {@code True} if local node is primary for this partition.
*/
public boolean primary(AffinityTopologyVersion topVer) {
- return cctx.affinity().primaryByPartition(cctx.localNode(), id, topVer);
+ List<ClusterNode> nodes = grp.affinity().cachedAffinity(topVer).get(id);
+
+ return !nodes.isEmpty() && ctx.localNode().equals(nodes.get(0));
}
/**
@@ -785,14 +904,23 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @return {@code True} if local node is backup for this partition.
*/
public boolean backup(AffinityTopologyVersion topVer) {
- return cctx.affinity().backupByPartition(cctx.localNode(), id, topVer);
+ List<ClusterNode> nodes = grp.affinity().cachedAffinity(topVer).get(id);
+
+ return nodes.indexOf(ctx.localNode()) > 0;
}
/**
+ * @param cacheId ID of cache initiated counter update.
+ * @param topVer Topology version for current operation.
* @return Next update index.
*/
- public long nextUpdateCounter() {
- return store.nextUpdateCounter();
+ long nextUpdateCounter(int cacheId, AffinityTopologyVersion topVer, boolean primary, @Nullable Long primaryCntr) {
+ long nextCntr = store.nextUpdateCounter();
+
+ if (grp.sharedGroup())
+ grp.onPartitionCounterUpdate(cacheId, id, primaryCntr != null ? primaryCntr : nextCntr, topVer, primary);
+
+ return nextCntr;
}
/**
@@ -829,86 +957,53 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* @throws NodeStoppingException If node stopping.
*/
public void clearAll() throws NodeStoppingException {
- GridCacheVersion clearVer = cctx.versions().next();
-
- boolean rec = cctx.events().isRecordable(EVT_CACHE_REBALANCE_OBJECT_UNLOADED);
-
- Iterator<GridCacheMapEntry> it = allEntries().iterator();
+ GridCacheVersion clearVer = ctx.versions().next();
GridCacheObsoleteEntryExtras extras = new GridCacheObsoleteEntryExtras(clearVer);
- while (it.hasNext()) {
- GridCacheMapEntry cached = null;
-
- cctx.shared().database().checkpointReadLock();
-
- try {
- cached = it.next();
-
- if (cached instanceof GridDhtCacheEntry && ((GridDhtCacheEntry)cached).clearInternal(clearVer, extras)) {
- removeEntry(cached);
-
- if (!cached.isInternal()) {
- if (rec) {
- cctx.events().addEvent(cached.partition(),
- cached.key(),
- cctx.localNodeId(),
- (IgniteUuid)null,
- null,
- EVT_CACHE_REBALANCE_OBJECT_UNLOADED,
- null,
- false,
- cached.rawGet(),
- cached.hasValue(),
- null,
- null,
- null,
- false);
- }
- }
- }
- }
- catch (GridDhtInvalidPartitionException e) {
- assert isEmpty() && state() == EVICTED : "Invalid error [e=" + e + ", part=" + this + ']';
-
- break; // Partition is already concurrently cleared and evicted.
- }
- catch (NodeStoppingException e) {
- if (log.isDebugEnabled())
- log.debug("Failed to clear cache entry for evicted partition: " + cached.partition());
-
- rent.onDone(e);
+ boolean rec = grp.eventRecordable(EVT_CACHE_REBALANCE_OBJECT_UNLOADED);
- throw e;
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to clear cache entry for evicted partition: " + cached, e);
- }
- finally {
- cctx.shared().database().checkpointReadUnlock();
- }
+ if (grp.sharedGroup()) {
+ for (CacheMapHolder hld : cacheMaps.values())
+ clear(hld.map, extras, rec);
}
+ else
+ clear(singleCacheEntryMap.map, extras, rec);
+
+ if (!grp.allowFastEviction()) {
+ CacheMapHolder hld = grp.sharedGroup() ? null : singleCacheEntryMap;
- if (!cctx.allowFastEviction()) {
try {
- GridIterator<CacheDataRow> it0 = cctx.offheap().iterator(id);
+ GridIterator<CacheDataRow> it0 = grp.offheap().partitionIterator(id);
while (it0.hasNext()) {
- cctx.shared().database().checkpointReadLock();
+ ctx.database().checkpointReadLock();
try {
CacheDataRow row = it0.next();
- GridCacheMapEntry cached = putEntryIfObsoleteOrAbsent(cctx.affinity().affinityTopologyVersion(),
+ if (grp.sharedGroup() && (hld == null || hld.cctx.cacheId() != row.cacheId())) {
+ hld = cacheMaps.get(row.cacheId());
+
+ if (hld == null)
+ continue;
+ }
+
+ assert hld != null;
+
+ GridCacheMapEntry cached = putEntryIfObsoleteOrAbsent(
+ hld,
+ hld.cctx,
+ grp.affinity().lastVersion(),
row.key(),
true,
false);
if (cached instanceof GridDhtCacheEntry && ((GridDhtCacheEntry)cached).clearInternal(clearVer, extras)) {
if (rec) {
- cctx.events().addEvent(cached.partition(),
+ hld.cctx.events().addEvent(cached.partition(),
cached.key(),
- cctx.localNodeId(),
+ ctx.localNodeId(),
(IgniteUuid)null,
null,
EVT_CACHE_REBALANCE_OBJECT_UNLOADED,
@@ -929,7 +1024,7 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
break; // Partition is already concurrently cleared and evicted.
}
finally {
- cctx.shared().database().checkpointReadUnlock();
+ ctx.database().checkpointReadUnlock();
}
}
}
@@ -948,11 +1043,70 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @param map Map to clear.
+ * @param extras Obsolete extras.
+ * @param evt Unload event flag.
+ * @throws NodeStoppingException
+ */
+ private void clear(ConcurrentMap<KeyCacheObject, GridCacheMapEntry> map,
+ GridCacheObsoleteEntryExtras extras,
+ boolean evt) throws NodeStoppingException {
+ Iterator<GridCacheMapEntry> it = map.values().iterator();
+
+ while (it.hasNext()) {
+ GridCacheMapEntry cached = null;
+
+ ctx.database().checkpointReadLock();
+
+ try {
+ cached = it.next();
+
+ if (cached instanceof GridDhtCacheEntry && ((GridDhtCacheEntry)cached).clearInternal(extras.obsoleteVersion(), extras)) {
+ removeEntry(cached);
+
+ if (!cached.isInternal()) {
+ if (evt) {
+ grp.addCacheEvent(cached.partition(),
+ cached.key(),
+ ctx.localNodeId(),
+ EVT_CACHE_REBALANCE_OBJECT_UNLOADED,
+ null,
+ false,
+ cached.rawGet(),
+ cached.hasValue(),
+ false);
+ }
+ }
+ }
+ }
+ catch (GridDhtInvalidPartitionException e) {
+ assert isEmpty() && state() == EVICTED : "Invalid error [e=" + e + ", part=" + this + ']';
+
+ break; // Partition is already concurrently cleared and evicted.
+ }
+ catch (NodeStoppingException e) {
+ if (log.isDebugEnabled())
+ log.debug("Failed to clear cache entry for evicted partition: " + cached.partition());
+
+ rent.onDone(e);
+
+ throw e;
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to clear cache entry for evicted partition: " + cached, e);
+ }
+ finally {
+ ctx.database().checkpointReadUnlock();
+ }
+ }
+ }
+
+ /**
*
*/
private void clearDeferredDeletes() {
for (RemovedEntryHolder e : rmvQueue)
- cctx.dht().removeVersionedEntry(e.key(), e.version());
+ removeVersionedEntry(e.cacheId(), e.key(), e.version());
}
/** {@inheritDoc} */
@@ -977,6 +1131,7 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridDhtLocalPartition.class, this,
+ "grp", grp.cacheOrGroupName(),
"state", state(),
"reservations", reservations(),
"empty", isEmpty(),
@@ -984,12 +1139,25 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/** {@inheritDoc} */
- @Override public int publicSize() {
+ @Override public int publicSize(int cacheId) {
+ if (grp.sharedGroup()) {
+ CacheMapHolder hld = cacheMaps.get(cacheId);
+
+ return hld != null ? hld.size.get() : 0;
+ }
+
return getSize(state.get());
}
/** {@inheritDoc} */
- @Override public void incrementPublicSize(GridCacheEntryEx e) {
+ @Override public void incrementPublicSize(@Nullable CacheMapHolder hld, GridCacheEntryEx e) {
+ if (grp.sharedGroup()) {
+ if (hld == null)
+ hld = cacheMapHolder(e.context());
+
+ hld.size.incrementAndGet();
+ }
+
while (true) {
long state = this.state.get();
@@ -999,7 +1167,14 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/** {@inheritDoc} */
- @Override public void decrementPublicSize(GridCacheEntryEx e) {
+ @Override public void decrementPublicSize(@Nullable CacheMapHolder hld, GridCacheEntryEx e) {
+ if (grp.sharedGroup()) {
+ if (hld == null)
+ hld = cacheMapHolder(e.context());
+
+ hld.size.decrementAndGet();
+ }
+
while (true) {
long state = this.state.get();
@@ -1011,6 +1186,22 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @param cacheId Cache ID.
+ */
+ void onCacheStopped(int cacheId) {
+ assert grp.sharedGroup() : grp.cacheOrGroupName();
+
+ for (Iterator<RemovedEntryHolder> it = rmvQueue.iterator(); it.hasNext();) {
+ RemovedEntryHolder e = it.next();
+
+ if (e.cacheId() == cacheId)
+ it.remove();
+ }
+
+ cacheMaps.remove(cacheId);
+ }
+
+ /**
* @param state Composite state.
* @return Partition state.
*/
@@ -1065,6 +1256,9 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
* Removed entry holder.
*/
private static class RemovedEntryHolder {
+ /** */
+ private final int cacheId;
+
/** Cache key */
private final KeyCacheObject key;
@@ -1075,11 +1269,13 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
private final long expireTime;
/**
+ * @param cacheId Cache ID.
* @param key Key.
* @param ver Entry version.
* @param ttl TTL.
*/
- private RemovedEntryHolder(KeyCacheObject key, GridCacheVersion ver, long ttl) {
+ private RemovedEntryHolder(int cacheId, KeyCacheObject key, GridCacheVersion ver, long ttl) {
+ this.cacheId = cacheId;
this.key = key;
this.ver = ver;
@@ -1087,6 +1283,13 @@ public class GridDhtLocalPartition extends GridCacheConcurrentMapImpl implements
}
/**
+ * @return Cache ID.
+ */
+ int cacheId() {
+ return cacheId;
+ }
+
+ /**
* @return Key.
*/
KeyCacheObject key() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
index ea6ca06..87abd6c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
@@ -174,7 +174,7 @@ public class GridDhtLockResponse extends GridDistributedLockResponse {
}
if (preloadEntries != null)
- marshalInfos(preloadEntries, cctx);
+ marshalInfos(preloadEntries, cctx.shared(), cctx.cacheObjectContext());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
index ffc1d63..d365a8e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
@@ -88,9 +88,9 @@ public interface GridDhtPartitionTopology {
public boolean stopping();
/**
- * @return Cache ID.
+ * @return Cache group ID.
*/
- public int cacheId();
+ public int groupId();
/**
* Pre-initializes this topology.
@@ -134,13 +134,12 @@ public interface GridDhtPartitionTopology {
public void releasePartitions(int... parts);
/**
- * @param key Cache key.
- * @param create If {@code true}, then partition will be created if it's not there.
+ * @param part Partition number.
* @return Local partition.
* @throws GridDhtInvalidPartitionException If partition is evicted or absent and
* does not belong to this node.
*/
- @Nullable public GridDhtLocalPartition localPartition(Object key, boolean create)
+ @Nullable public GridDhtLocalPartition localPartition(int part)
throws GridDhtInvalidPartitionException;
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 7adce6e..248d44e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -42,9 +42,9 @@ import org.apache.ignite.internal.IgniteInterruptedCheckedException;
import org.apache.ignite.internal.managers.discovery.DiscoCache;
import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.ClusterState;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheMapEntryFactory;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionFullMap;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
@@ -72,7 +72,7 @@ import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDh
* Partition topology.
*/
@GridToStringExclude
-class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
+public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** If true, then check consistency. */
private static final boolean CONSISTENCY_CHECK = false;
@@ -82,8 +82,11 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** */
private static final Long ZERO = 0L;
- /** Context. */
- private final GridCacheContext<?, ?> cctx;
+ /** */
+ private final GridCacheSharedContext ctx;
+
+ /** */
+ private final CacheGroupContext grp;
/** Logger. */
private final IgniteLogger log;
@@ -118,9 +121,6 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** Lock. */
private final StripedCompositeReadWriteLock lock = new StripedCompositeReadWriteLock(16);
- /** */
- private final GridCacheMapEntryFactory entryFactory;
-
/** Partition update counter. */
private Map<Integer, T2<Long, Long>> cntrMap = new HashMap<>();
@@ -131,23 +131,25 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
private volatile boolean treatAllPartAsLoc;
/**
- * @param cctx Context.
- * @param entryFactory Entry factory.
+ * @param ctx Cache shared context.
+ * @param grp Cache group.
*/
- GridDhtPartitionTopologyImpl(GridCacheContext<?, ?> cctx, GridCacheMapEntryFactory entryFactory) {
- assert cctx != null;
+ public GridDhtPartitionTopologyImpl(GridCacheSharedContext ctx,
+ CacheGroupContext grp) {
+ assert ctx != null;
+ assert grp != null;
- this.cctx = cctx;
- this.entryFactory = entryFactory;
+ this.ctx = ctx;
+ this.grp = grp;
- log = cctx.logger(getClass());
+ log = ctx.logger(getClass());
- locParts = new AtomicReferenceArray<>(cctx.config().getAffinity().partitions());
+ locParts = new AtomicReferenceArray<>(grp.affinityFunction().partitions());
}
/** {@inheritDoc} */
- @Override public int cacheId() {
- return cctx.cacheId();
+ @Override public int groupId() {
+ return grp.groupId();
}
/**
@@ -171,7 +173,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
topVer = AffinityTopologyVersion.NONE;
- discoCache = cctx.discovery().discoCache();
+ discoCache = ctx.discovery().discoCache();
}
finally {
lock.writeLock().unlock();
@@ -235,13 +237,13 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (dumpCnt++ < GridDhtPartitionsExchangeFuture.DUMP_PENDING_OBJECTS_THRESHOLD) {
U.warn(log, "Failed to wait for partition eviction [" +
"topVer=" + topVer +
- ", cache=" + cctx.name() +
+ ", group=" + grp.cacheOrGroupName() +
", part=" + part.id() +
", partState=" + part.state() +
", size=" + part.internalSize() +
", reservations=" + part.reservations() +
", grpReservations=" + part.groupReserved() +
- ", node=" + cctx.localNodeId() + "]");
+ ", node=" + ctx.localNodeId() + "]");
if (IgniteSystemProperties.getBoolean(IGNITE_THREAD_DUMP_ON_EXCHANGE_TIMEOUT, false))
U.dumpThreads(log);
@@ -329,7 +331,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
AffinityTopologyVersion topVer = this.topVer;
assert topVer.topologyVersion() > 0 : "Invalid topology version [topVer=" + topVer +
- ", cacheName=" + cctx.name() + ']';
+ ", group=" + grp.cacheOrGroupName() + ']';
return topVer;
}
@@ -371,7 +373,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @param updateSeq Update sequence.
*/
private void initPartitions0(GridDhtPartitionsExchangeFuture exchFut, long updateSeq) {
- ClusterNode loc = cctx.localNode();
+ ClusterNode loc = ctx.localNode();
ClusterNode oldest = discoCache.oldestAliveServerNodeWithCache();
@@ -379,23 +381,23 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
assert topVer.equals(exchFut.topologyVersion()) :
"Invalid topology [topVer=" + topVer +
- ", cache=" + cctx.name() +
+ ", grp=" + grp.cacheOrGroupName() +
", futVer=" + exchFut.topologyVersion() +
", fut=" + exchFut + ']';
- assert cctx.affinity().affinityTopologyVersion().equals(exchFut.topologyVersion()) :
- "Invalid affinity [topVer=" + cctx.affinity().affinityTopologyVersion() +
- ", cache=" + cctx.name() +
+ assert grp.affinity().lastVersion().equals(exchFut.topologyVersion()) :
+ "Invalid affinity [topVer=" + grp.affinity().lastVersion() +
+ ", grp=" + grp.cacheOrGroupName() +
", futVer=" + exchFut.topologyVersion() +
", fut=" + exchFut + ']';
- List<List<ClusterNode>> aff = cctx.affinity().assignments(exchFut.topologyVersion());
+ List<List<ClusterNode>> aff = grp.affinity().assignments(exchFut.topologyVersion());
- int num = cctx.affinity().partitions();
+ int num = grp.affinity().partitions();
- if (cctx.rebalanceEnabled()) {
- boolean added = exchFut.cacheAddedOnExchange(cctx.cacheId(), cctx.receivedFrom());
+ if (grp.rebalanceEnabled()) {
+ boolean added = exchFut.cacheGroupAddedOnExchange(grp.groupId(), grp.receivedFrom());
- boolean first = (loc.equals(oldest) && loc.id().equals(exchId.nodeId()) && exchId.isJoined()) || added;
+ boolean first = added || (loc.equals(oldest) && loc.id().equals(exchId.nodeId()) && exchId.isJoined());
if (first) {
assert exchId.isJoined() || added;
@@ -406,7 +408,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
boolean owned = locPart.own();
- assert owned : "Failed to own partition for oldest node [cacheName" + cctx.name() +
+ assert owned : "Failed to own partition for oldest node [grp=" + grp.cacheOrGroupName() +
", part=" + locPart + ']';
if (log.isDebugEnabled())
@@ -465,7 +467,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @param updateSeq Update sequence.
*/
private void createPartitions(List<List<ClusterNode>> aff, long updateSeq) {
- int num = cctx.affinity().partitions();
+ int num = grp.affinity().partitions();
for (int p = 0; p < num; p++) {
if (node2part != null && node2part.valid()) {
@@ -487,26 +489,25 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** {@inheritDoc} */
@Override public void beforeExchange(GridDhtPartitionsExchangeFuture exchFut, boolean affReady)
throws IgniteCheckedException {
-
DiscoveryEvent discoEvt = exchFut.discoveryEvent();
ClusterState newState = exchFut.newClusterState();
treatAllPartAsLoc = (newState != null && newState == ClusterState.ACTIVE)
- || (cctx.kernalContext().state().active()
+ || (ctx.kernalContext().state().active()
&& discoEvt.type() == EventType.EVT_NODE_JOINED
&& discoEvt.eventNode().isLocal()
- && !cctx.kernalContext().clientNode()
+ && !ctx.kernalContext().clientNode()
);
// Wait for rent outside of checkpoint lock.
waitForRent();
- ClusterNode loc = cctx.localNode();
+ ClusterNode loc = ctx.localNode();
- cctx.shared().database().checkpointReadLock();
+ ctx.database().checkpointReadLock();
- synchronized (cctx.shared().exchange().interruptLock()) {
+ synchronized (ctx.exchange().interruptLock()) {
if (Thread.currentThread().isInterrupted())
throw new IgniteInterruptedCheckedException("Thread is interrupted: " + Thread.currentThread());
@@ -514,7 +515,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
U.writeLock(lock);
}
catch (IgniteInterruptedCheckedException e) {
- cctx.shared().database().checkpointReadUnlock();
+ ctx.database().checkpointReadUnlock();
throw e;
}
@@ -541,7 +542,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
cntrMap.clear();
// If this is the oldest node.
- if (oldest != null && (loc.equals(oldest) || exchFut.cacheAddedOnExchange(cctx.cacheId(), cctx.receivedFrom()))) {
+ if (oldest != null && (loc.equals(oldest) || exchFut.cacheGroupAddedOnExchange(grp.groupId(), grp.receivedFrom()))) {
if (node2part == null) {
node2part = new GridDhtPartitionFullMap(oldest.id(), oldest.order(), updateSeq);
@@ -568,7 +569,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (affReady)
initPartitions0(exchFut, updateSeq);
else {
- List<List<ClusterNode>> aff = cctx.affinity().idealAssignment();
+ List<List<ClusterNode>> aff = grp.affinity().idealAssignment();
createPartitions(aff, updateSeq);
}
@@ -582,7 +583,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
finally {
lock.writeLock().unlock();
- cctx.shared().database().checkpointReadUnlock();
+ ctx.database().checkpointReadUnlock();
}
}
@@ -590,19 +591,28 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
waitForRent();
}
+ /**
+ * @param p Partition number.
+ * @param topVer Topology version.
+ * @return {@code True} if given partition belongs to local node.
+ */
+ private boolean partitionLocalNode(int p, AffinityTopologyVersion topVer) {
+ return grp.affinity().nodes(p, topVer).contains(ctx.localNode());
+ }
+
/** {@inheritDoc} */
@Override public boolean afterExchange(GridDhtPartitionsExchangeFuture exchFut) throws IgniteCheckedException {
treatAllPartAsLoc = false;
boolean changed = waitForRent();
- int num = cctx.affinity().partitions();
+ int num = grp.affinity().partitions();
AffinityTopologyVersion topVer = exchFut.topologyVersion();
- assert cctx.affinity().affinityTopologyVersion().equals(topVer) : "Affinity is not initialized " +
+ assert grp.affinity().lastVersion().equals(topVer) : "Affinity is not initialized " +
"[topVer=" + topVer +
- ", affVer=" + cctx.affinity().affinityTopologyVersion() +
+ ", affVer=" + grp.affinity().lastVersion() +
", fut=" + exchFut + ']';
lock.writeLock().lock();
@@ -623,7 +633,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
for (int p = 0; p < num; p++) {
GridDhtLocalPartition locPart = localPartition(p, topVer, false, false);
- if (cctx.affinity().partitionLocalNode(p, topVer)) {
+ if (partitionLocalNode(p, topVer)) {
// This partition will be created during next topology event,
// which obviously has not happened at this point.
if (locPart == null) {
@@ -636,26 +646,28 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
GridDhtPartitionState state = locPart.state();
if (state == MOVING) {
- if (cctx.rebalanceEnabled()) {
+ if (grp.rebalanceEnabled()) {
Collection<ClusterNode> owners = owners(p);
// If there are no other owners, then become an owner.
if (F.isEmpty(owners)) {
boolean owned = locPart.own();
- assert owned : "Failed to own partition [cacheName" + cctx.name() + ", locPart=" +
+ assert owned : "Failed to own partition [grp=" + grp.cacheOrGroupName() + ", locPart=" +
locPart + ']';
updateSeq = updateLocal(p, locPart.state(), updateSeq);
changed = true;
- if (cctx.events().isRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
+ if (grp.eventRecordable(EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
DiscoveryEvent discoEvt = exchFut.discoveryEvent();
- cctx.events().addPreloadEvent(p,
- EVT_CACHE_REBALANCE_PART_DATA_LOST, discoEvt.eventNode(),
- discoEvt.type(), discoEvt.timestamp());
+ grp.addRebalanceEvent(p,
+ EVT_CACHE_REBALANCE_PART_DATA_LOST,
+ discoEvt.eventNode(),
+ discoEvt.type(),
+ discoEvt.timestamp());
}
if (log.isDebugEnabled())
@@ -673,7 +685,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (locPart != null) {
GridDhtPartitionState state = locPart.state();
- if (state == MOVING && cctx.kernalContext().state().active()) {
+ if (state == MOVING && ctx.kernalContext().state().active()) {
locPart.rent(false);
updateSeq = updateLocal(p, locPart.state(), updateSeq);
@@ -687,7 +699,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
}
- updateRebalanceVersion(cctx.affinity().assignments(topVer));
+ updateRebalanceVersion(grp.affinity().assignments(topVer));
consistencyCheck();
}
@@ -715,11 +727,11 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
GridDhtLocalPartition loc = locParts.get(p);
if (loc == null || loc.state() == EVICTED) {
- locParts.set(p, loc = new GridDhtLocalPartition(cctx, p, entryFactory));
+ locParts.set(p, loc = new GridDhtLocalPartition(ctx, grp, p));
- if (cctx.shared().pageStore() != null) {
+ if (ctx.pageStore() != null) {
try {
- cctx.shared().pageStore().onPartitionCreated(cctx.cacheId(), p);
+ ctx.pageStore().onPartitionCreated(grp.groupId(), p);
}
catch (IgniteCheckedException e) {
// TODO ignite-db
@@ -749,7 +761,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
GridDhtPartitionState state = loc != null ? loc.state() : null;
- if (loc != null && state != EVICTED && (state != RENTING || !cctx.allowFastEviction()))
+ if (loc != null && state != EVICTED && (state != RENTING || !grp.allowFastEviction()))
return loc;
if (!create)
@@ -764,7 +776,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
state = loc != null ? loc.state() : null;
- boolean belongs = cctx.affinity().partitionLocalNode(p, topVer);
+ boolean belongs = partitionLocalNode(p, topVer);
if (loc != null && state == EVICTED) {
locParts.set(p, loc = null);
@@ -774,7 +786,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
"(often may be caused by inconsistent 'key.hashCode()' implementation) " +
"[part=" + p + ", topVer=" + topVer + ", this.topVer=" + this.topVer + ']');
}
- else if (loc != null && state == RENTING && cctx.allowFastEviction())
+ else if (loc != null && state == RENTING && grp.allowFastEviction())
throw new GridDhtInvalidPartitionException(p, "Adding entry to partition that is concurrently evicted.");
if (loc == null) {
@@ -783,7 +795,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
"local node (often may be caused by inconsistent 'key.hashCode()' implementation) " +
"[part=" + p + ", topVer=" + topVer + ", this.topVer=" + this.topVer + ']');
- locParts.set(p, loc = new GridDhtLocalPartition(cctx, p, entryFactory));
+ locParts.set(p, loc = new GridDhtLocalPartition(ctx, grp, p));
if (updateSeq)
this.updateSeq.incrementAndGet();
@@ -798,9 +810,9 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
lock.writeLock().unlock();
}
- if (created && cctx.shared().pageStore() != null) {
+ if (created && ctx.pageStore() != null) {
try {
- cctx.shared().pageStore().onPartitionCreated(cctx.cacheId(), p);
+ ctx.pageStore().onPartitionCreated(grp.groupId(), p);
}
catch (IgniteCheckedException e) {
// TODO ignite-db
@@ -825,8 +837,8 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
/** {@inheritDoc} */
- @Override public GridDhtLocalPartition localPartition(Object key, boolean create) {
- return localPartition(cctx.affinity().partition(key), AffinityTopologyVersion.NONE, create);
+ @Override public GridDhtLocalPartition localPartition(int part) {
+ return locParts.get(part);
}
/** {@inheritDoc} */
@@ -882,7 +894,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
map.put(i, part.state());
}
- return new GridDhtPartitionMap(cctx.nodeId(),
+ return new GridDhtPartitionMap(ctx.localNodeId(),
updateSeq.get(),
topVer,
Collections.unmodifiableMap(map),
@@ -922,7 +934,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** {@inheritDoc} */
@Override public List<ClusterNode> nodes(int p, AffinityTopologyVersion topVer) {
- AffinityAssignment affAssignment = cctx.affinity().assignment(topVer);
+ AffinityAssignment affAssignment = grp.affinity().cachedAffinity(topVer);
List<ClusterNode> affNodes = affAssignment.get(p);
@@ -945,8 +957,8 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
try {
assert node2part != null && node2part.valid() : "Invalid node-to-partitions map [topVer1=" + topVer +
", topVer2=" + this.topVer +
- ", node=" + cctx.igniteInstanceName() +
- ", cache=" + cctx.name() +
+ ", node=" + ctx.igniteInstanceName() +
+ ", grp=" + grp.cacheOrGroupName() +
", node2part=" + node2part + ']';
List<ClusterNode> nodes = null;
@@ -958,7 +970,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
HashSet<UUID> affIds = affAssignment.getIds(p);
if (!affIds.contains(nodeId) && hasState(p, nodeId, OWNING, MOVING, RENTING)) {
- ClusterNode n = cctx.discovery().node(nodeId);
+ ClusterNode n = ctx.discovery().node(nodeId);
if (n != null && (topVer.topologyVersion() < 0 || n.order() <= topVer.topologyVersion())) {
if (nodes == null) {
@@ -991,7 +1003,9 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
AffinityTopologyVersion topVer,
GridDhtPartitionState state,
GridDhtPartitionState... states) {
- Collection<UUID> allIds = topVer.topologyVersion() > 0 ? F.nodeIds(discoCache.cacheAffinityNodes(cctx.cacheId())) : null;
+ Collection<UUID> allIds = topVer.topologyVersion() > 0 ?
+ F.nodeIds(discoCache.cacheGroupAffinityNodes(grp.groupId())) :
+ null;
lock.readLock().lock();
@@ -999,7 +1013,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
assert node2part != null && node2part.valid() : "Invalid node-to-partitions map [topVer=" + topVer +
", allIds=" + allIds +
", node2part=" + node2part +
- ", cache=" + cctx.name() + ']';
+ ", grp=" + grp.cacheOrGroupName() + ']';
Collection<UUID> nodeIds = part2node.get(p);
@@ -1016,7 +1030,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
continue;
if (hasState(p, id, state, states)) {
- ClusterNode n = cctx.discovery().node(id);
+ ClusterNode n = ctx.discovery().node(id);
if (n != null && (topVer.topologyVersion() < 0 || n.order() <= topVer.topologyVersion()))
nodes.add(n);
@@ -1032,7 +1046,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** {@inheritDoc} */
@Override public List<ClusterNode> owners(int p, AffinityTopologyVersion topVer) {
- if (!cctx.rebalanceEnabled())
+ if (!grp.rebalanceEnabled())
return ownersAndMoving(p, topVer);
return nodes(p, topVer, OWNING);
@@ -1045,7 +1059,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
/** {@inheritDoc} */
@Override public List<ClusterNode> moving(int p) {
- if (!cctx.rebalanceEnabled())
+ if (!grp.rebalanceEnabled())
return ownersAndMoving(p, AffinityTopologyVersion.NONE);
return nodes(p, AffinityTopologyVersion.NONE, MOVING);
@@ -1070,12 +1084,14 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
lock.readLock().lock();
try {
- assert node2part != null && node2part.valid() : "Invalid node2part [node2part: " + node2part +
- ", cache=" + cctx.name() +
- ", started=" + cctx.started() +
+ if (node2part == null || stopping)
+ return null;
+
+ assert node2part.valid() : "Invalid node2part [node2part=" + node2part +
+ ", grp=" + grp.cacheOrGroupName() +
", stopping=" + stopping +
- ", locNodeId=" + cctx.localNode().id() +
- ", locName=" + cctx.igniteInstanceName() + ']';
+ ", locNodeId=" + ctx.localNode().id() +
+ ", locName=" + ctx.igniteInstanceName() + ']';
GridDhtPartitionFullMap m = node2part;
@@ -1157,7 +1173,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
// then we keep the newer value.
if (newPart != null &&
(newPart.updateSequence() < part.updateSequence() ||
- (cctx.startTopologyVersion().compareTo(newPart.topologyVersion()) > 0))
+ (grp.localStartVersion().compareTo(newPart.topologyVersion()) > 0))
) {
if (log.isDebugEnabled())
log.debug("Overriding partition map in full update map [exchId=" + exchId + ", curPart=" +
@@ -1171,7 +1187,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
for (Iterator<UUID> it = partMap.keySet().iterator(); it.hasNext(); ) {
UUID nodeId = it.next();
- if (!cctx.discovery().alive(nodeId)) {
+ if (!ctx.discovery().alive(nodeId)) {
if (log.isDebugEnabled())
log.debug("Removing left node from full map update [nodeId=" + nodeId + ", partMap=" +
partMap + ']');
@@ -1183,7 +1199,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
node2part = partMap;
- Map<Integer, Set<UUID>> p2n = new HashMap<>(cctx.affinity().partitions(), 1.0f);
+ Map<Integer, Set<UUID>> p2n = new HashMap<>(grp.affinity().partitions(), 1.0f);
for (Map.Entry<UUID, GridDhtPartitionMap> e : partMap.entrySet()) {
for (Integer p : e.getValue().keySet()) {
@@ -1202,11 +1218,11 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
boolean changed = false;
- AffinityTopologyVersion affVer = cctx.affinity().affinityTopologyVersion();
+ AffinityTopologyVersion affVer = grp.affinity().lastVersion();
- GridDhtPartitionMap nodeMap = partMap.get(cctx.localNodeId());
+ GridDhtPartitionMap nodeMap = partMap.get(ctx.localNodeId());
- if (nodeMap != null && cctx.shared().database().persistenceEnabled()) {
+ if (nodeMap != null && ctx.database().persistenceEnabled()) {
for (Map.Entry<Integer, GridDhtPartitionState> e : nodeMap.entrySet()) {
int p = e.getKey();
GridDhtPartitionState state = e.getValue();
@@ -1233,7 +1249,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
if (!affVer.equals(AffinityTopologyVersion.NONE) && affVer.compareTo(topVer) >= 0) {
- List<List<ClusterNode>> aff = cctx.affinity().assignments(topVer);
+ List<List<ClusterNode>> aff = grp.affinity().assignments(topVer);
changed |= checkEvictions(updateSeq, aff);
@@ -1246,7 +1262,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
log.debug("Partition map after full update: " + fullMapString());
if (changed)
- cctx.shared().exchange().scheduleResendPartitions();
+ ctx.exchange().scheduleResendPartitions();
return changed ? localPartitionMap() : null;
}
@@ -1299,7 +1315,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (log.isDebugEnabled())
log.debug("Updating single partition map [exchId=" + exchId + ", parts=" + mapString(parts) + ']');
- if (!cctx.discovery().alive(parts.nodeId())) {
+ if (!ctx.discovery().alive(parts.nodeId())) {
if (log.isDebugEnabled())
log.debug("Received partition update for non-existing node (will ignore) [exchId=" + exchId +
", parts=" + parts + ']');
@@ -1373,10 +1389,10 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
}
- AffinityTopologyVersion affVer = cctx.affinity().affinityTopologyVersion();
+ AffinityTopologyVersion affVer = grp.affinity().lastVersion();
if (!affVer.equals(AffinityTopologyVersion.NONE) && affVer.compareTo(topVer) >= 0) {
- List<List<ClusterNode>> aff = cctx.affinity().assignments(topVer);
+ List<List<ClusterNode>> aff = grp.affinity().assignments(topVer);
changed |= checkEvictions(updateSeq, aff);
@@ -1389,7 +1405,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
log.debug("Partition map after single update: " + fullMapString());
if (changed)
- cctx.shared().exchange().scheduleResendPartitions();
+ ctx.exchange().scheduleResendPartitions();
return changed ? localPartitionMap() : null;
}
@@ -1403,7 +1419,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
lock.writeLock().lock();
try {
- int parts = cctx.affinity().partitions();
+ int parts = grp.affinity().partitions();
Collection<Integer> lost = null;
@@ -1437,7 +1453,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
boolean changed = false;
if (lost != null) {
- PartitionLossPolicy plc = cctx.config().getPartitionLossPolicy();
+ PartitionLossPolicy plc = grp.config().getPartitionLossPolicy();
assert plc != null;
@@ -1469,13 +1485,17 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
}
- if (cctx.events().isRecordable(EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST))
- cctx.events().addPreloadEvent(part, EVT_CACHE_REBALANCE_PART_DATA_LOST,
- discoEvt.eventNode(), discoEvt.type(), discoEvt.timestamp());
+ if (grp.eventRecordable(EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST)) {
+ grp.addRebalanceEvent(part,
+ EVT_CACHE_REBALANCE_PART_DATA_LOST,
+ discoEvt.eventNode(),
+ discoEvt.type(),
+ discoEvt.timestamp());
+ }
}
if (plc != PartitionLossPolicy.IGNORE)
- cctx.needsRecovery(true);
+ grp.needsRecovery(true);
}
return changed;
@@ -1490,7 +1510,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
lock.writeLock().lock();
try {
- int parts = cctx.affinity().partitions();
+ int parts = grp.affinity().partitions();
long updSeq = updateSeq.incrementAndGet();
for (int part = 0; part < parts; part++) {
@@ -1529,9 +1549,9 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
}
- checkEvictions(updSeq, cctx.affinity().assignments(topVer));
+ checkEvictions(updSeq, grp.affinity().assignments(topVer));
- cctx.needsRecovery(false);
+ grp.needsRecovery(false);
}
finally {
lock.writeLock().unlock();
@@ -1545,7 +1565,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
try {
Collection<Integer> res = null;
- int parts = cctx.affinity().partitions();
+ int parts = grp.affinity().partitions();
for (int part = 0; part < parts; part++) {
Set<UUID> nodeIds = part2node.get(part);
@@ -1582,7 +1602,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
GridDhtLocalPartition locPart = locParts.get(p);
if (locPart != null) {
- if (locPart.state() == OWNING && !owners.contains(cctx.localNodeId()))
+ if (locPart.state() == OWNING && !owners.contains(ctx.localNodeId()))
locPart.moving();
}
@@ -1607,12 +1627,12 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @return {@code True} if state changed.
*/
private boolean checkEvictions(long updateSeq) {
- AffinityTopologyVersion affVer = cctx.affinity().affinityTopologyVersion();
+ AffinityTopologyVersion affVer = grp.affinity().lastVersion();
boolean changed = false;
if (!affVer.equals(AffinityTopologyVersion.NONE) && affVer.compareTo(topVer) >= 0) {
- List<List<ClusterNode>> aff = cctx.affinity().assignments(topVer);
+ List<List<ClusterNode>> aff = grp.affinity().assignments(topVer);
changed = checkEvictions(updateSeq, aff);
@@ -1644,12 +1664,12 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @return Checks if any of the local partitions need to be evicted.
*/
private boolean checkEvictions(long updateSeq, List<List<ClusterNode>> aff) {
- if (!cctx.kernalContext().state().active())
+ if (!ctx.kernalContext().state().active())
return false;
boolean changed = false;
- UUID locId = cctx.nodeId();
+ UUID locId = ctx.localNodeId();
for (int p = 0; p < locParts.length(); p++) {
GridDhtLocalPartition part = locParts.get(p);
@@ -1662,7 +1682,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (state.active()) {
List<ClusterNode> affNodes = aff.get(p);
- if (!affNodes.contains(cctx.localNode())) {
+ if (!affNodes.contains(ctx.localNode())) {
List<ClusterNode> nodes = nodes(p, topVer, OWNING);
Collection<UUID> nodeIds = F.nodeIds(nodes);
@@ -1725,10 +1745,10 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
private long updateLocal(int p, GridDhtPartitionState state, long updateSeq) {
ClusterNode oldest = discoCache.oldestAliveServerNodeWithCache();
- assert oldest != null || cctx.kernalContext().clientNode();
+ assert oldest != null || ctx.kernalContext().clientNode();
// If this node became the oldest node.
- if (cctx.localNode().equals(oldest)) {
+ if (ctx.localNode().equals(oldest)) {
long seq = node2part.updateSequence();
if (seq != updateSeq) {
@@ -1755,7 +1775,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
if (node2part != null) {
- UUID locNodeId = cctx.localNodeId();
+ UUID locNodeId = ctx.localNodeId();
GridDhtPartitionMap map = node2part.get(locNodeId);
@@ -1792,9 +1812,9 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
ClusterNode oldest = discoCache.oldestAliveServerNode();
- assert oldest != null || cctx.kernalContext().clientNode();
+ assert oldest != null || ctx.kernalContext().clientNode();
- ClusterNode loc = cctx.localNode();
+ ClusterNode loc = ctx.localNode();
if (node2part != null) {
if (loc.equals(oldest) && !node2part.nodeId().equals(loc.id())) {
@@ -1939,11 +1959,10 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
try {
assert node2part != null && node2part.valid() : "Invalid node2part [node2part: " + node2part +
- ", cache=" + cctx.name() +
- ", started=" + cctx.started() +
+ ", grp=" + grp.cacheOrGroupName() +
", stopping=" + stopping +
- ", locNodeId=" + cctx.localNode().id() +
- ", locName=" + cctx.igniteInstanceName() + ']';
+ ", locNodeId=" + ctx.localNodeId() +
+ ", locName=" + ctx.igniteInstanceName() + ']';
for (GridDhtPartitionMap map : node2part.values()) {
if (map.hasMovingPartitions())
@@ -1957,10 +1976,25 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
}
}
+ /**
+ * @param cacheId Cache ID.
+ */
+ public void onCacheStopped(int cacheId) {
+ if (!grp.sharedGroup())
+ return;
+
+ for (int i = 0; i < locParts.length(); i++) {
+ GridDhtLocalPartition part = locParts.get(i);
+
+ if (part != null)
+ part.onCacheStopped(cacheId);
+ }
+ }
+
/** {@inheritDoc} */
@Override public void printMemoryStats(int threshold) {
- X.println(">>> Cache partition topology stats [igniteInstanceName=" + cctx.igniteInstanceName() +
- ", cache=" + cctx.name() + ']');
+ X.println(">>> Cache partition topology stats [igniteInstanceName=" + ctx.igniteInstanceName() +
+ ", grp=" + grp.cacheOrGroupName() + ']');
lock.readLock().lock();
@@ -1971,7 +2005,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (part == null)
continue;
- int size = part.dataStore().size();
+ int size = part.dataStore().fullSize();
if (size >= threshold)
X.println(">>> Local partition [part=" + part.id() + ", size=" + size + ']');
@@ -1988,7 +2022,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @return {@code True} if given partition belongs to local node.
*/
private boolean localNode(int part, List<List<ClusterNode>> aff) {
- return aff.get(part).contains(cctx.localNode());
+ return aff.get(part).contains(ctx.localNode());
}
/**
@@ -1999,7 +2033,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
if (node2part == null || !node2part.valid())
return;
- for (int i = 0; i < cctx.affinity().partitions(); i++) {
+ for (int i = 0; i < grp.affinity().partitions(); i++) {
List<ClusterNode> affNodes = aff.get(i);
// Topology doesn't contain server nodes (just clients).
@@ -2015,7 +2049,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
rebalancedTopVer = topVer;
if (log.isDebugEnabled())
- log.debug("Updated rebalanced version [cache=" + cctx.name() + ", ver=" + rebalancedTopVer + ']');
+ log.debug("Updated rebalanced version [cache=" + grp.cacheOrGroupName() + ", ver=" + rebalancedTopVer + ']');
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java
index c91eb7a..d607ff1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java
@@ -47,7 +47,8 @@ import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedLockCancelledException;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedUnlockRequest;
-import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysRequest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockRequest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLockResponse;
@@ -118,51 +119,61 @@ public abstract class GridDhtTransactionalCacheAdapter<K, V> extends GridDhtCach
@Override public void start() throws IgniteCheckedException {
super.start();
- preldr = new GridDhtPreloader(ctx);
-
- preldr.start();
-
- ctx.io().addHandler(ctx.cacheId(), GridNearGetRequest.class, new CI2<UUID, GridNearGetRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearGetRequest.class, new CI2<UUID, GridNearGetRequest>() {
@Override public void apply(UUID nodeId, GridNearGetRequest req) {
processNearGetRequest(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearSingleGetRequest.class, new CI2<UUID, GridNearSingleGetRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearSingleGetRequest.class, new CI2<UUID, GridNearSingleGetRequest>() {
@Override public void apply(UUID nodeId, GridNearSingleGetRequest req) {
processNearSingleGetRequest(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearLockRequest.class, new CI2<UUID, GridNearLockRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearLockRequest.class, new CI2<UUID, GridNearLockRequest>() {
@Override public void apply(UUID nodeId, GridNearLockRequest req) {
processNearLockRequest(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridDhtLockRequest.class, new CI2<UUID, GridDhtLockRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridDhtLockRequest.class, new CI2<UUID, GridDhtLockRequest>() {
@Override public void apply(UUID nodeId, GridDhtLockRequest req) {
processDhtLockRequest(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridDhtLockResponse.class, new CI2<UUID, GridDhtLockResponse>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridDhtLockResponse.class, new CI2<UUID, GridDhtLockResponse>() {
@Override public void apply(UUID nodeId, GridDhtLockResponse req) {
processDhtLockResponse(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridNearUnlockRequest.class, new CI2<UUID, GridNearUnlockRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridNearUnlockRequest.class, new CI2<UUID, GridNearUnlockRequest>() {
@Override public void apply(UUID nodeId, GridNearUnlockRequest req) {
processNearUnlockRequest(nodeId, req);
}
});
- ctx.io().addHandler(ctx.cacheId(), GridDhtUnlockRequest.class, new CI2<UUID, GridDhtUnlockRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridDhtUnlockRequest.class, new CI2<UUID, GridDhtUnlockRequest>() {
@Override public void apply(UUID nodeId, GridDhtUnlockRequest req) {
processDhtUnlockRequest(nodeId, req);
}
});
+
+ ctx.io().addCacheHandler(ctx.cacheId(), GridDhtForceKeysRequest.class,
+ new MessageHandler<GridDhtForceKeysRequest>() {
+ @Override public void onMessage(ClusterNode node, GridDhtForceKeysRequest msg) {
+ processForceKeysRequest(node, msg);
+ }
+ });
+
+ ctx.io().addCacheHandler(ctx.cacheId(), GridDhtForceKeysResponse.class,
+ new MessageHandler<GridDhtForceKeysResponse>() {
+ @Override public void onMessage(ClusterNode node, GridDhtForceKeysResponse msg) {
+ processForceKeyResponse(node, msg);
+ }
+ });
}
/** {@inheritDoc} */
@@ -382,7 +393,7 @@ public abstract class GridDhtTransactionalCacheAdapter<K, V> extends GridDhtCach
}
IgniteInternalFuture<Object> keyFut = F.isEmpty(req.keys()) ? null :
- ctx.dht().dhtPreloader().request(req.keys(), req.topologyVersion());
+ ctx.group().preloader().request(ctx, req.keys(), req.topologyVersion());
if (keyFut == null || keyFut.isDone()) {
if (keyFut != null) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
index d777a22..6d717eb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
@@ -173,19 +173,19 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse {
}
switch (writer.state()) {
- case 7:
+ case 6:
if (!writer.writeByteArray("checkCommittedErrBytes", checkCommittedErrBytes))
return false;
writer.incrementState();
- case 8:
+ case 7:
if (!writer.writeInt("miniId", miniId))
return false;
writer.incrementState();
- case 9:
+ case 8:
if (!writer.writeMessage("retVal", retVal))
return false;
@@ -207,7 +207,7 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse {
return false;
switch (reader.state()) {
- case 7:
+ case 6:
checkCommittedErrBytes = reader.readByteArray("checkCommittedErrBytes");
if (!reader.isLastRead())
@@ -215,7 +215,7 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse {
reader.incrementState();
- case 8:
+ case 7:
miniId = reader.readInt("miniId");
if (!reader.isLastRead())
@@ -223,7 +223,7 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse {
reader.incrementState();
- case 9:
+ case 8:
retVal = reader.readMessage("retVal");
if (!reader.isLastRead())
@@ -243,7 +243,7 @@ public class GridDhtTxFinishResponse extends GridDistributedTxFinishResponse {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 10;
+ return 9;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxOnePhaseCommitAckRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxOnePhaseCommitAckRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxOnePhaseCommitAckRequest.java
index c483408..67eacd3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxOnePhaseCommitAckRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxOnePhaseCommitAckRequest.java
@@ -47,6 +47,16 @@ public class GridDhtTxOnePhaseCommitAckRequest extends GridCacheMessage {
// No-op.
}
+ /** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
/**
*
* @param vers Near Tx xid Versions.
@@ -87,7 +97,7 @@ public class GridDhtTxOnePhaseCommitAckRequest extends GridCacheMessage {
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeCollection("vers", vers, MessageCollectionItemType.MSG))
return false;
@@ -109,7 +119,7 @@ public class GridDhtTxOnePhaseCommitAckRequest extends GridCacheMessage {
return false;
switch (reader.state()) {
- case 3:
+ case 2:
vers = reader.readCollection("vers", MessageCollectionItemType.MSG);
if (!reader.isLastRead())
@@ -129,6 +139,6 @@ public class GridDhtTxOnePhaseCommitAckRequest extends GridCacheMessage {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 4;
+ return 3;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index 8a674fb..75f8366 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -1086,7 +1086,9 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
Collection<KeyCacheObject> keys = entry.getValue();
- lastForceFut = cctx.cacheContext(cacheId).preloader().request(keys, tx.topologyVersion());
+ GridCacheContext ctx = cctx.cacheContext(cacheId);
+
+ lastForceFut = ctx.group().preloader().request(ctx, keys, tx.topologyVersion());
if (compFut != null && lastForceFut != null)
compFut.add(lastForceFut);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
index 362432c..5543cec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
@@ -458,7 +458,7 @@ public class GridPartitionedGetFuture<K, V> extends CacheDistributedGetFutureAda
GridCacheVersion ver = null;
if (readNoEntry) {
- CacheDataRow row = cctx.offheap().read(key);
+ CacheDataRow row = cctx.offheap().read(cctx, key);
if (row != null) {
long expireTime = row.expireTime();
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedSingleGetFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedSingleGetFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedSingleGetFuture.java
index 63ed9a8..3f612f7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedSingleGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedSingleGetFuture.java
@@ -359,7 +359,7 @@ public class GridPartitionedSingleGetFuture extends GridCacheFutureAdapter<Objec
boolean skipEntry = readNoEntry;
if (readNoEntry) {
- CacheDataRow row = cctx.offheap().read(key);
+ CacheDataRow row = cctx.offheap().read(cctx, key);
if (row != null) {
long expireTime = row.expireTime();
@@ -494,13 +494,13 @@ public class GridPartitionedSingleGetFuture extends GridCacheFutureAdapter<Objec
if (skipVals)
setSkipValueResult(true, verVal.version());
else
- setResult(verVal.value() , verVal.version());
+ setResult(verVal.value(), verVal.version());
}
else {
if (skipVals)
setSkipValueResult(false, null);
else
- setResult(null , null);
+ setResult(null, null);
}
}
else {
[09/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
index 955ca69..a25d794 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
@@ -19,13 +19,12 @@ package org.apache.ignite.internal.processors.cache.database;
import java.nio.ByteBuffer;
import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.configuration.DataPageEvictionMode;
import org.apache.ignite.internal.pagemem.PageIdUtils;
import org.apache.ignite.internal.pagemem.PageMemory;
import org.apache.ignite.internal.pagemem.PageUtils;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.IncompleteCacheObject;
import org.apache.ignite.internal.processors.cache.IncompleteObject;
@@ -94,25 +93,26 @@ public class CacheDataRowAdapter implements CacheDataRow {
/**
* Read row from data pages.
*
- * @param cctx Cache context.
+ * @param grp Cache group.
* @param rowData Required row data.
* @throws IgniteCheckedException If failed.
*/
- public final void initFromLink(GridCacheContext<?, ?> cctx, RowData rowData) throws IgniteCheckedException {
- initFromLink(cctx, cctx.shared(), cctx.memoryPolicy().pageMemory(), rowData);
+ public final void initFromLink(CacheGroupContext grp, RowData rowData) throws IgniteCheckedException {
+ initFromLink(grp, grp.shared(), grp.memoryPolicy().pageMemory(), rowData);
}
/**
* Read row from data pages.
* Can be called with cctx == null, if cache instance is unknown, but its ID is stored in the data row.
*
- * @param cctx Cctx.
+ * @param grp Cache group.
* @param sharedCtx Shared context.
* @param pageMem Page memory.
* @param rowData Row data.
+ * @throws IgniteCheckedException If failed.
*/
public final void initFromLink(
- @Nullable GridCacheContext<?, ?> cctx,
+ @Nullable CacheGroupContext grp,
GridCacheSharedContext<?, ?> sharedCtx,
PageMemory pageMem,
RowData rowData)
@@ -120,14 +120,9 @@ public class CacheDataRowAdapter implements CacheDataRow {
assert link != 0 : "link";
assert key == null : "key";
- CacheObjectContext coctx = null;
-
- if (cctx != null) {
- cacheId = cctx.memoryPolicy().config().getPageEvictionMode() == DataPageEvictionMode.DISABLED ?
- cctx.cacheId() : 0; // Force cacheId reading for evictable memory policies.
+ CacheObjectContext coctx = grp != null ? grp.cacheObjectContext() : null;
- coctx = cctx.cacheObjectContext();
- }
+ boolean readCacheId = grp == null || grp.storeCacheIdInDataPage();
long nextLink = link;
IncompleteObject<?> incomplete = null;
@@ -135,10 +130,16 @@ public class CacheDataRowAdapter implements CacheDataRow {
do {
final long pageId = pageId(nextLink);
- final long page = pageMem.acquirePage(cacheId, pageId);
+
+ // Group is null if try evict page, with persistence evictions should be disabled.
+ assert grp != null || !sharedCtx.database().persistenceEnabled();
+
+ int grpId = grp != null ? grp.groupId() : 0;
+
+ final long page = pageMem.acquirePage(grpId, pageId);
try {
- long pageAddr = pageMem.readLock(cacheId, pageId, page); // Non-empty data page must not be recycled.
+ long pageAddr = pageMem.readLock(grpId, pageId, page); // Non-empty data page must not be recycled.
assert pageAddr != 0L : nextLink;
@@ -154,7 +155,7 @@ public class CacheDataRowAdapter implements CacheDataRow {
if (first) {
if (nextLink == 0) {
// Fast path for a single page row.
- readFullRow(sharedCtx, coctx, pageAddr + data.offset(), rowData);
+ readFullRow(sharedCtx, coctx, pageAddr + data.offset(), rowData, readCacheId);
return;
}
@@ -169,17 +170,17 @@ public class CacheDataRowAdapter implements CacheDataRow {
boolean keyOnly = rowData == RowData.KEY_ONLY;
- incomplete = readFragment(sharedCtx, coctx, buf, keyOnly, incomplete);
+ incomplete = readFragment(sharedCtx, coctx, buf, keyOnly, readCacheId, incomplete);
if (keyOnly && key != null)
return;
}
finally {
- pageMem.readUnlock(cacheId, pageId, page);
+ pageMem.readUnlock(grpId, pageId, page);
}
}
finally {
- pageMem.releasePage(cacheId, pageId, page);
+ pageMem.releasePage(grpId, pageId, page);
}
}
while(nextLink != 0);
@@ -188,9 +189,11 @@ public class CacheDataRowAdapter implements CacheDataRow {
}
/**
+ * @param sharedCtx Cache shared context.
* @param coctx Cache object context.
* @param buf Buffer.
* @param keyOnly {@code true} If need to read only key object.
+ * @param readCacheId {@code true} If need to read cache ID.
* @param incomplete Incomplete object.
* @throws IgniteCheckedException If failed.
* @return Read object.
@@ -200,9 +203,10 @@ public class CacheDataRowAdapter implements CacheDataRow {
CacheObjectContext coctx,
ByteBuffer buf,
boolean keyOnly,
+ boolean readCacheId,
IncompleteObject<?> incomplete
) throws IgniteCheckedException {
- if (cacheId == 0) {
+ if (readCacheId && cacheId == 0) {
incomplete = readIncompleteCacheId(buf, incomplete);
if (cacheId == 0)
@@ -211,8 +215,13 @@ public class CacheDataRowAdapter implements CacheDataRow {
incomplete = null;
}
- if (coctx == null)
+ if (coctx == null) {
+ // coctx can be null only when grp is null too, this means that
+ // we are in process of eviction and cacheId is mandatory part of data.
+ assert cacheId != 0;
+
coctx = sharedCtx.cacheContext(cacheId).cacheObjectContext();
+ }
// Read key.
if (key == null) {
@@ -251,20 +260,23 @@ public class CacheDataRowAdapter implements CacheDataRow {
}
/**
+ * @param sharedCtx Cache shared context.
* @param coctx Cache object context.
* @param addr Address.
* @param rowData Required row data.
+ * @param readCacheId {@code true} If need to read cache ID.
* @throws IgniteCheckedException If failed.
*/
private void readFullRow(
GridCacheSharedContext<?, ?> sharedCtx,
CacheObjectContext coctx,
long addr,
- RowData rowData)
+ RowData rowData,
+ boolean readCacheId)
throws IgniteCheckedException {
int off = 0;
- if (cacheId == 0) {
+ if (readCacheId) {
cacheId = PageUtils.getInt(addr, off);
off += 4;
@@ -328,6 +340,8 @@ public class CacheDataRowAdapter implements CacheDataRow {
if (remaining >= size) {
cacheId = buf.getInt();
+ assert cacheId != 0;
+
return null;
}
@@ -342,6 +356,8 @@ public class CacheDataRowAdapter implements CacheDataRow {
timeBuf.order(buf.order());
cacheId = timeBuf.getInt();
+
+ assert cacheId != 0;
}
return incomplete;
@@ -401,7 +417,6 @@ public class CacheDataRowAdapter implements CacheDataRow {
* @param buf Buffer.
* @param incomplete Incomplete object.
* @return Incomplete object.
- * @throws IgniteCheckedException If failed.
*/
private IncompleteObject<?> readIncompleteExpireTime(
ByteBuffer buf,
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheSearchRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheSearchRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheSearchRow.java
index d51cf0e..6e429c4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheSearchRow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheSearchRow.java
@@ -37,4 +37,9 @@ public interface CacheSearchRow {
* @return Key hash code.
*/
public int hash();
+
+ /**
+ * @return Cache ID or {@code 0} if cache ID is not defined.
+ */
+ public int cacheId();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java
index 1c4c89e..0e0faef 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/RowStore.java
@@ -19,8 +19,9 @@ package org.apache.ignite.internal.processors.cache.database;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.CacheObjectContext;
-import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.database.freelist.FreeList;
/**
@@ -31,27 +32,27 @@ public class RowStore {
private final FreeList freeList;
/** */
- protected final PageMemory pageMem;
+ private final GridCacheSharedContext ctx;
/** */
- protected final GridCacheContext<?,?> cctx;
+ protected final PageMemory pageMem;
/** */
protected final CacheObjectContext coctx;
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
* @param freeList Free list.
*/
- public RowStore(GridCacheContext<?,?> cctx, FreeList freeList) {
- assert cctx != null;
+ public RowStore(CacheGroupContext grp, FreeList freeList) {
+ assert grp != null;
assert freeList != null;
- this.cctx = cctx;
this.freeList = freeList;
- coctx = cctx.cacheObjectContext();
- pageMem = cctx.memoryPolicy().pageMemory();
+ ctx = grp.shared();
+ coctx = grp.cacheObjectContext();
+ pageMem = grp.memoryPolicy().pageMemory();
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index 4d2110c..d92f811 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -884,11 +884,12 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
/**
* @param upper Upper bound.
+ * @param x Implementation specific argument, {@code null} always means that we need to return full detached data row.
* @return Cursor.
* @throws IgniteCheckedException If failed.
*/
- private GridCursor<T> findLowerUnbounded(L upper) throws IgniteCheckedException {
- ForwardCursor cursor = new ForwardCursor(null, upper);
+ private GridCursor<T> findLowerUnbounded(L upper, Object x) throws IgniteCheckedException {
+ ForwardCursor cursor = new ForwardCursor(null, upper, x);
long firstPageId;
@@ -933,14 +934,25 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
* @return Cursor.
* @throws IgniteCheckedException If failed.
*/
- @Override public final GridCursor<T> find(L lower, L upper) throws IgniteCheckedException {
+ @Override public GridCursor<T> find(L lower, L upper) throws IgniteCheckedException {
+ return find(lower, upper, null);
+ }
+
+ /**
+ * @param lower Lower bound inclusive or {@code null} if unbounded.
+ * @param upper Upper bound inclusive or {@code null} if unbounded.
+ * @param x Implementation specific argument, {@code null} always means that we need to return full detached data row.
+ * @return Cursor.
+ * @throws IgniteCheckedException If failed.
+ */
+ public final GridCursor<T> find(L lower, L upper, Object x) throws IgniteCheckedException {
checkDestroyed();
try {
if (lower == null)
- return findLowerUnbounded(upper);
+ return findLowerUnbounded(upper, x);
- ForwardCursor cursor = new ForwardCursor(lower, upper);
+ ForwardCursor cursor = new ForwardCursor(lower, upper, x);
cursor.find();
@@ -2072,6 +2084,8 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
try {
long metaPageAddr = writeLock(metaPageId, metaPage); // No checks, we must be out of use.
+ assert metaPageAddr != 0L;
+
try {
for (long pageId : getFirstPageIds(metaPageAddr)) {
assert pageId != 0;
@@ -4390,6 +4404,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
/** */
private final L upperBound;
+ /** */
+ private final Object x;
+
/**
* @param lowerBound Lower bound.
* @param upperBound Upper bound.
@@ -4397,6 +4414,18 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
ForwardCursor(L lowerBound, L upperBound) {
this.lowerBound = lowerBound;
this.upperBound = upperBound;
+ this.x = null;
+ }
+
+ /**
+ * @param lowerBound Lower bound.
+ * @param upperBound Upper bound.
+ * @param x Implementation specific argument, {@code null} always means that we need to return full detached data row.
+ */
+ ForwardCursor(L lowerBound, L upperBound, Object x) {
+ this.lowerBound = lowerBound;
+ this.upperBound = upperBound;
+ this.x = x;
}
/**
@@ -4513,7 +4542,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
rows = (T[])new Object[cnt];
for (int i = 0; i < cnt; i++) {
- T r = getRow(io, pageAddr, startIdx + i);
+ T r = getRow(io, pageAddr, startIdx + i, x);
rows = GridArrays.set(rows, i, r);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
index 2586696..927446b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
@@ -157,6 +157,18 @@ public abstract class PageIO {
/** */
public static final short T_PAGE_UPDATE_TRACKING = 15;
+ /** */
+ public static final short T_CACHE_ID_AWARE_DATA_REF_INNER = 16;
+
+ /** */
+ public static final short T_CACHE_ID_AWARE_DATA_REF_LEAF = 17;
+
+ /** */
+ public static final short T_CACHE_ID_AWARE_PENDING_REF_INNER = 18;
+
+ /** */
+ public static final short T_CACHE_ID_AWARE_PENDING_REF_LEAF = 19;
+
/** Index for payload == 1. */
public static final short T_H2_EX_REF_LEAF_START = 10000;
@@ -484,6 +496,12 @@ public abstract class PageIO {
case T_DATA_REF_LEAF:
return (Q)IgniteCacheOffheapManagerImpl.DataLeafIO.VERSIONS.forVersion(ver);
+ case T_CACHE_ID_AWARE_DATA_REF_INNER:
+ return (Q)IgniteCacheOffheapManagerImpl.CacheIdAwareDataInnerIO.VERSIONS.forVersion(ver);
+
+ case T_CACHE_ID_AWARE_DATA_REF_LEAF:
+ return (Q)IgniteCacheOffheapManagerImpl.CacheIdAwareDataLeafIO.VERSIONS.forVersion(ver);
+
case T_METASTORE_INNER:
return (Q)MetadataStorage.MetaStoreInnerIO.VERSIONS.forVersion(ver);
@@ -496,6 +514,12 @@ public abstract class PageIO {
case T_PENDING_REF_LEAF:
return (Q)IgniteCacheOffheapManagerImpl.PendingEntryLeafIO.VERSIONS.forVersion(ver);
+ case T_CACHE_ID_AWARE_PENDING_REF_INNER:
+ return (Q) IgniteCacheOffheapManagerImpl.CacheIdAwarePendingEntryInnerIO.VERSIONS.forVersion(ver);
+
+ case T_CACHE_ID_AWARE_PENDING_REF_LEAF:
+ return (Q)IgniteCacheOffheapManagerImpl.CacheIdAwarePendingEntryLeafIO.VERSIONS.forVersion(ver);
+
default:
// For tests.
if (innerTestIO != null && innerTestIO.getType() == type && innerTestIO.getVersion() == ver)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java
index 5d1885e..c092132 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java
@@ -24,7 +24,7 @@ import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
@@ -38,7 +38,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
*
*/
-public class GridCacheTtlUpdateRequest extends GridCacheMessage {
+public class GridCacheTtlUpdateRequest extends GridCacheIdMessage {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
index 630c79f..fc209aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedBaseMessage.java
@@ -24,7 +24,7 @@ import java.util.Collections;
import org.apache.ignite.internal.GridDirectCollection;
import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.processors.cache.GridCacheDeployable;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheIdMessage;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersionable;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -37,7 +37,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* Base for all messages in replicated cache.
*/
-public abstract class GridDistributedBaseMessage extends GridCacheMessage implements GridCacheDeployable,
+public abstract class GridDistributedBaseMessage extends GridCacheIdMessage implements GridCacheDeployable,
GridCacheVersionable {
/** */
private static final long serialVersionUID = 0L;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java
index 096ca9f..dc9e4ec 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheAdapter.java
@@ -79,10 +79,9 @@ public abstract class GridDistributedCacheAdapter<K, V> extends GridCacheAdapter
/**
* @param ctx Cache registry.
- * @param startSize Start size.
*/
- protected GridDistributedCacheAdapter(GridCacheContext<K, V> ctx, int startSize) {
- super(ctx, startSize);
+ protected GridDistributedCacheAdapter(GridCacheContext<K, V> ctx) {
+ super(ctx);
}
/**
@@ -279,11 +278,11 @@ public abstract class GridDistributedCacheAdapter<K, V> extends GridCacheAdapter
IgniteCacheOffheapManager offheap = ctx.offheap();
if (modes.offheap)
- size += offheap.entriesCount(modes.primary, modes.backup, topVer);
+ size += offheap.cacheEntriesCount(ctx.cacheId(), modes.primary, modes.backup, topVer);
else if (modes.heap) {
for (GridDhtLocalPartition locPart : ctx.topology().currentLocalPartitions()) {
if ((modes.primary && locPart.primary(topVer)) || (modes.backup && locPart.backup(topVer)))
- size += locPart.publicSize();
+ size += locPart.publicSize(ctx.cacheId());
}
}
}
@@ -292,7 +291,7 @@ public abstract class GridDistributedCacheAdapter<K, V> extends GridCacheAdapter
}
/** {@inheritDoc} */
- @Override public long localSizeLong(int partition, CachePeekMode[] peekModes) throws IgniteCheckedException {
+ @Override public long localSizeLong(int part, CachePeekMode[] peekModes) throws IgniteCheckedException {
PeekModes modes = parsePeekModes(peekModes, true);
long size = 0;
@@ -306,9 +305,9 @@ public abstract class GridDistributedCacheAdapter<K, V> extends GridCacheAdapter
IgniteCacheOffheapManager offheap = ctx.offheap();
- if (ctx.affinity().primaryByPartition(ctx.localNode(), partition, topVer) && modes.primary ||
- ctx.affinity().backupByPartition(ctx.localNode(), partition, topVer) && modes.backup)
- size += offheap.entriesCount(partition);
+ if (ctx.affinity().primaryByPartition(ctx.localNode(), part, topVer) && modes.primary ||
+ ctx.affinity().backupByPartition(ctx.localNode(), part, topVer) && modes.backup)
+ size += offheap.cacheEntriesCount(ctx.cacheId(), part);
}
return size;
@@ -460,7 +459,7 @@ public abstract class GridDistributedCacheAdapter<K, V> extends GridCacheAdapter
return false;
try {
- GridCloseableIterator<KeyCacheObject> iter = dht.context().offheap().keysIterator(part);
+ GridCloseableIterator<KeyCacheObject> iter = dht.context().offheap().cacheKeysIterator(ctx.cacheId(), part);
if (iter != null) {
try {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxFinishResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxFinishResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxFinishResponse.java
index 561c292..c36e633 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxFinishResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxFinishResponse.java
@@ -71,6 +71,16 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
}
/** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public final int partition() {
return part;
}
@@ -135,25 +145,25 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
}
switch (writer.state()) {
- case 3:
+ case 2:
if (!writer.writeByte("flags", flags))
return false;
writer.incrementState();
- case 4:
+ case 3:
if (!writer.writeIgniteUuid("futId", futId))
return false;
writer.incrementState();
- case 5:
+ case 4:
if (!writer.writeInt("part", part))
return false;
writer.incrementState();
- case 6:
+ case 5:
if (!writer.writeMessage("txId", txId))
return false;
@@ -175,7 +185,7 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
return false;
switch (reader.state()) {
- case 3:
+ case 2:
flags = reader.readByte("flags");
if (!reader.isLastRead())
@@ -183,7 +193,7 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
reader.incrementState();
- case 4:
+ case 3:
futId = reader.readIgniteUuid("futId");
if (!reader.isLastRead())
@@ -191,7 +201,7 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
reader.incrementState();
- case 5:
+ case 4:
part = reader.readInt("part");
if (!reader.isLastRead())
@@ -199,7 +209,7 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
reader.incrementState();
- case 6:
+ case 5:
txId = reader.readMessage("txId");
if (!reader.isLastRead())
@@ -219,7 +229,7 @@ public class GridDistributedTxFinishResponse extends GridCacheMessage {
/** {@inheritDoc} */
@Override public byte fieldsCount() {
- return 7;
+ return 6;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
index 9cb04d4..299fcf3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxRemoteAdapter.java
@@ -594,6 +594,8 @@ public abstract class GridDistributedTxRemoteAdapter extends IgniteTxAdapter
dhtVer,
txEntry.updateCounter());
else {
+ assert val != null : txEntry;
+
cached.innerSet(this,
eventNodeId(),
nodeId,
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedConcurrentMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedConcurrentMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedConcurrentMap.java
index 76c7a15..3b41ffa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedConcurrentMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridCachePartitionedConcurrentMap.java
@@ -25,7 +25,7 @@ import java.util.NoSuchElementException;
import java.util.Set;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheEntryPredicate;
-import org.apache.ignite.internal.processors.cache.CacheObject;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.cache.GridCacheConcurrentMap;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheEntryEx;
@@ -38,24 +38,25 @@ import org.jetbrains.annotations.Nullable;
* An implementation of GridCacheConcurrentMap that will delegate all method calls to corresponding local partition.
*/
public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap {
- /** Context. */
- private final GridCacheContext ctx;
+ /** Cache group. */
+ private final CacheGroupContext grp;
/**
- * Constructor.
- * @param ctx Context.
+ * @param grp Cache group.
*/
- public GridCachePartitionedConcurrentMap(GridCacheContext ctx) {
- this.ctx = ctx;
+ GridCachePartitionedConcurrentMap(CacheGroupContext grp) {
+ this.grp = grp;
}
/**
+ * @param cctx Cache context.
* @param key Key.
* @param topVer Topology version.
* @param create Create flag.
* @return Local partition.
*/
@Nullable private GridDhtLocalPartition localPartition(
+ GridCacheContext cctx,
KeyCacheObject key,
AffinityTopologyVersion topVer,
boolean create
@@ -63,33 +64,33 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
int p = key.partition();
if (p == -1)
- p = ctx.affinity().partition(key);
+ p = cctx.affinity().partition(key);
- return ctx.topology().localPartition(p, topVer, create);
+ return grp.topology().localPartition(p, topVer, create);
}
/** {@inheritDoc} */
- @Nullable @Override public GridCacheMapEntry getEntry(KeyCacheObject key) {
- GridDhtLocalPartition part = localPartition(key, AffinityTopologyVersion.NONE, false);
+ @Nullable @Override public GridCacheMapEntry getEntry(GridCacheContext ctx, KeyCacheObject key) {
+ GridDhtLocalPartition part = localPartition(ctx, key, AffinityTopologyVersion.NONE, false);
if (part == null)
return null;
- return part.getEntry(key);
+ return part.getEntry(ctx, key);
}
/** {@inheritDoc} */
- @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(AffinityTopologyVersion topVer,
+ @Override public GridCacheMapEntry putEntryIfObsoleteOrAbsent(GridCacheContext ctx, AffinityTopologyVersion topVer,
KeyCacheObject key,
boolean create,
boolean touch) {
while (true) {
- GridDhtLocalPartition part = localPartition(key, topVer, create);
+ GridDhtLocalPartition part = localPartition(ctx, key, topVer, create);
if (part == null)
return null;
- GridCacheMapEntry res = part.putEntryIfObsoleteOrAbsent(topVer, key, create, touch);
+ GridCacheMapEntry res = part.putEntryIfObsoleteOrAbsent(ctx, topVer, key, create, touch);
if (res != null || !create)
return res;
@@ -102,35 +103,35 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
@Override public int internalSize() {
int size = 0;
- for (GridDhtLocalPartition part : ctx.topology().currentLocalPartitions())
+ for (GridDhtLocalPartition part : grp.topology().currentLocalPartitions())
size += part.internalSize();
return size;
}
/** {@inheritDoc} */
- @Override public int publicSize() {
+ @Override public int publicSize(int cacheId) {
int size = 0;
- for (GridDhtLocalPartition part : ctx.topology().currentLocalPartitions())
- size += part.publicSize();
+ for (GridDhtLocalPartition part : grp.topology().currentLocalPartitions())
+ size += part.publicSize(cacheId);
return size;
}
/** {@inheritDoc} */
- @Override public void incrementPublicSize(GridCacheEntryEx e) {
- localPartition(e.key(), AffinityTopologyVersion.NONE, true).incrementPublicSize(e);
+ @Override public void incrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
+ localPartition(e.context(), e.key(), AffinityTopologyVersion.NONE, true).incrementPublicSize(hld, e);
}
/** {@inheritDoc} */
- @Override public void decrementPublicSize(GridCacheEntryEx e) {
- localPartition(e.key(), AffinityTopologyVersion.NONE, true).decrementPublicSize(e);
+ @Override public void decrementPublicSize(CacheMapHolder hld, GridCacheEntryEx e) {
+ localPartition(e.context(), e.key(), AffinityTopologyVersion.NONE, true).decrementPublicSize(hld, e);
}
/** {@inheritDoc} */
@Override public boolean removeEntry(GridCacheEntryEx entry) {
- GridDhtLocalPartition part = localPartition(entry.key(), AffinityTopologyVersion.NONE, false);
+ GridDhtLocalPartition part = localPartition(entry.context(), entry.key(), AffinityTopologyVersion.NONE, false);
if (part == null)
return false;
@@ -139,12 +140,12 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
}
/** {@inheritDoc} */
- @Override public Iterable<GridCacheMapEntry> entries(final CacheEntryPredicate... filter) {
+ @Override public Iterable<GridCacheMapEntry> entries(final int cacheId, final CacheEntryPredicate... filter) {
return new Iterable<GridCacheMapEntry>() {
@Override public Iterator<GridCacheMapEntry> iterator() {
return new PartitionedIterator<GridCacheMapEntry>() {
@Override protected Iterator<GridCacheMapEntry> iterator(GridDhtLocalPartition part) {
- return part.entries(filter).iterator();
+ return part.entries(cacheId, filter).iterator();
}
};
}
@@ -152,23 +153,10 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
}
/** {@inheritDoc} */
- @Override public Iterable<GridCacheMapEntry> allEntries(final CacheEntryPredicate... filter) {
- return new Iterable<GridCacheMapEntry>() {
- @Override public Iterator<GridCacheMapEntry> iterator() {
- return new PartitionedIterator<GridCacheMapEntry>() {
- @Override protected Iterator<GridCacheMapEntry> iterator(GridDhtLocalPartition part) {
- return part.allEntries(filter).iterator();
- }
- };
- }
- };
- }
-
- /** {@inheritDoc} */
- @Override public Set<GridCacheMapEntry> entrySet(final CacheEntryPredicate... filter) {
+ @Override public Set<GridCacheMapEntry> entrySet(final int cacheId, final CacheEntryPredicate... filter) {
return new PartitionedSet<GridCacheMapEntry>() {
@Override protected Set<GridCacheMapEntry> set(GridDhtLocalPartition part) {
- return part.entrySet(filter);
+ return part.entrySet(cacheId, filter);
}
};
}
@@ -178,7 +166,7 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
*/
private abstract class PartitionedIterator<T> implements Iterator<T> {
/** Partitions iterator. */
- private Iterator<GridDhtLocalPartition> partsIter = ctx.topology().currentLocalPartitions().iterator();
+ private Iterator<GridDhtLocalPartition> partsIter = grp.topology().currentLocalPartitions().iterator();
/** Current partition iterator. */
private Iterator<T> currIter = partsIter.hasNext() ? iterator(partsIter.next()) :
@@ -242,7 +230,7 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
@Override public int size() {
int size = 0;
- for (GridDhtLocalPartition part : ctx.topology().currentLocalPartitions())
+ for (GridDhtLocalPartition part : grp.topology().currentLocalPartitions())
size += set(part).size();
return size;
@@ -250,7 +238,7 @@ public class GridCachePartitionedConcurrentMap implements GridCacheConcurrentMap
/** {@inheritDoc} */
@Override public boolean contains(Object o) {
- for (GridDhtLocalPartition part : ctx.topology().currentLocalPartitions()) {
+ for (GridDhtLocalPartition part : grp.topology().currentLocalPartitions()) {
if (set(part).contains(o))
return true;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
index 43bc609..619630f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
@@ -71,7 +71,7 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
private GridCacheSharedContext cctx;
/** Cache ID. */
- private int cacheId;
+ private int grpId;
/** Logger. */
private final IgniteLogger log;
@@ -111,18 +111,18 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
/**
* @param cctx Context.
- * @param cacheId Cache ID.
+ * @param grpId Group ID.
* @param exchFut Exchange ID.
* @param similarAffKey Key to find caches with similar affinity.
*/
public GridClientPartitionTopology(
GridCacheSharedContext cctx,
- int cacheId,
+ int grpId,
GridDhtPartitionsExchangeFuture exchFut,
Object similarAffKey
) {
this.cctx = cctx;
- this.cacheId = cacheId;
+ this.grpId = grpId;
this.similarAffKey = similarAffKey;
topVer = exchFut.topologyVersion();
@@ -166,8 +166,8 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
}
/** {@inheritDoc} */
- @Override public int cacheId() {
- return cacheId;
+ @Override public int groupId() {
+ return grpId;
}
/** {@inheritDoc} */
@@ -281,7 +281,7 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
long updateSeq = this.updateSeq.incrementAndGet();
// If this is the oldest node.
- if (oldest.id().equals(loc.id()) || exchFut.dynamicCacheStarted(cacheId)) {
+ if (oldest.id().equals(loc.id()) || exchFut.dynamicCacheGroupStarted(grpId)) {
if (node2part == null) {
node2part = new GridDhtPartitionFullMap(oldest.id(), oldest.order(), updateSeq);
@@ -353,8 +353,8 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
}
/** {@inheritDoc} */
- @Override public GridDhtLocalPartition localPartition(Object key, boolean create) {
- return localPartition(1, AffinityTopologyVersion.NONE, create);
+ @Override public GridDhtLocalPartition localPartition(int p) {
+ return localPartition(p, AffinityTopologyVersion.NONE, false);
}
/** {@inheritDoc} */
@@ -542,7 +542,10 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
lock.readLock().lock();
try {
- assert node2part != null && node2part.valid() : "Invalid node2part [node2part: " + node2part +
+ if (stopping || node2part == null)
+ return null;
+
+ assert node2part.valid() : "Invalid node2part [node2part: " + node2part +
", locNodeId=" + cctx.localNodeId() +
", igniteInstanceName=" + cctx.igniteInstanceName() + ']';
@@ -1006,7 +1009,7 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
/** {@inheritDoc} */
@Override public void printMemoryStats(int threshold) {
X.println(">>> Cache partition topology stats [igniteInstanceName=" + cctx.igniteInstanceName() +
- ", cacheId=" + cacheId + ']');
+ ", grpId=" + grpId + ']');
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java
index f80adc5..d9d642a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.processors.cache.distributed.dht;
import java.nio.ByteBuffer;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.plugin.extensions.communication.MessageReader;
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
@@ -27,7 +27,7 @@ import org.apache.ignite.plugin.extensions.communication.MessageWriter;
/**
* Affinity assignment request.
*/
-public class GridDhtAffinityAssignmentRequest extends GridCacheMessage {
+public class GridDhtAffinityAssignmentRequest extends GridCacheGroupIdMessage {
/** */
private static final long serialVersionUID = 0L;
@@ -46,17 +46,17 @@ public class GridDhtAffinityAssignmentRequest extends GridCacheMessage {
/**
* @param futId Future ID.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param topVer Topology version.
*/
public GridDhtAffinityAssignmentRequest(
long futId,
- int cacheId,
+ int grpId,
AffinityTopologyVersion topVer) {
assert topVer != null;
this.futId = futId;
- this.cacheId = cacheId;
+ this.grpId = grpId;
this.topVer = topVer;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java
index 5d82171..4df3fc1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java
@@ -27,20 +27,18 @@ import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridDirectTransient;
import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.GridCacheMessage;
+import org.apache.ignite.internal.processors.cache.GridCacheGroupIdMessage;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
-import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.plugin.extensions.communication.MessageReader;
import org.apache.ignite.plugin.extensions.communication.MessageWriter;
-import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
import org.jetbrains.annotations.NotNull;
/**
* Affinity assignment response.
*/
-public class GridDhtAffinityAssignmentResponse extends GridCacheMessage {
+public class GridDhtAffinityAssignmentResponse extends GridCacheGroupIdMessage {
/** */
private static final long serialVersionUID = 0L;
@@ -73,17 +71,17 @@ public class GridDhtAffinityAssignmentResponse extends GridCacheMessage {
/**
* @param futId Future ID.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param topVer Topology version.
* @param affAssignment Affinity assignment.
*/
public GridDhtAffinityAssignmentResponse(
long futId,
- int cacheId,
+ int grpId,
@NotNull AffinityTopologyVersion topVer,
List<List<ClusterNode>> affAssignment) {
this.futId = futId;
- this.cacheId = cacheId;
+ this.grpId = grpId;
this.topVer = topVer;
affAssignmentIds = ids(affAssignment);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
index 741ca5e..8746320 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
@@ -33,7 +33,7 @@ import org.apache.ignite.internal.GridNodeOrderComparator;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
import org.apache.ignite.internal.managers.discovery.DiscoCache;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
-import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
+import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.tostring.GridToStringInclude;
@@ -74,27 +74,27 @@ public class GridDhtAssignmentFetchFuture extends GridFutureAdapter<GridDhtAffin
private final AffinityTopologyVersion topVer;
/** */
- private final int cacheId;
+ private final int grpId;
/**
* @param ctx Context.
- * @param cacheDesc Cache descriptor.
+ * @param grpDesc Group descriptor.
* @param topVer Topology version.
* @param discoCache Discovery cache.
*/
public GridDhtAssignmentFetchFuture(
GridCacheSharedContext ctx,
- DynamicCacheDescriptor cacheDesc,
+ CacheGroupDescriptor grpDesc,
AffinityTopologyVersion topVer,
DiscoCache discoCache
) {
this.topVer = topVer;
- this.cacheId = cacheDesc.cacheId();
+ this.grpId = grpDesc.groupId();
this.ctx = ctx;
id = idGen.getAndIncrement();
- Collection<ClusterNode> availableNodes = discoCache.cacheAffinityNodes(cacheDesc.cacheId());
+ Collection<ClusterNode> availableNodes = discoCache.cacheGroupAffinityNodes(grpDesc.groupId());
LinkedList<ClusterNode> tmp = new LinkedList<>();
@@ -112,10 +112,10 @@ public class GridDhtAssignmentFetchFuture extends GridFutureAdapter<GridDhtAffin
}
/**
- * @return Cache ID.
+ * @return Cache group ID.
*/
- public int cacheId() {
- return cacheId;
+ public int groupId() {
+ return grpId;
}
/**
@@ -195,7 +195,7 @@ public class GridDhtAssignmentFetchFuture extends GridFutureAdapter<GridDhtAffin
", node=" + node + ']');
ctx.io().send(node,
- new GridDhtAffinityAssignmentRequest(id, cacheId, topVer),
+ new GridDhtAffinityAssignmentRequest(id, grpId, topVer),
AFFINITY_POOL);
// Close window for listener notification.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
index c3d5f88..418d712 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
@@ -18,7 +18,6 @@
package org.apache.ignite.internal.processors.cache.distributed.dht;
import java.io.Externalizable;
-import java.util.AbstractSet;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -26,7 +25,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
-import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
import javax.cache.Cache;
@@ -34,13 +32,15 @@ import javax.cache.expiry.ExpiryPolicy;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.events.DiscoveryEvent;
+import org.apache.ignite.events.Event;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.NodeStoppingException;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
+import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.CacheOperationContext;
-import org.apache.ignite.internal.processors.cache.CachePeekModes;
import org.apache.ignite.internal.processors.cache.EntryGetResult;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheClearAllRunnable;
@@ -59,7 +59,9 @@ import org.apache.ignite.internal.processors.cache.distributed.GridCacheTtlUpdat
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheAdapter;
import org.apache.ignite.internal.processors.cache.distributed.GridDistributedCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.dht.colocated.GridDhtDetachedCacheEntry;
-import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPreloader;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysFuture;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysRequest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse;
import org.apache.ignite.internal.processors.cache.distributed.near.CacheVersionedValue;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearCacheAdapter;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearGetRequest;
@@ -70,7 +72,6 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
import org.apache.ignite.internal.processors.platform.cache.PlatformCacheEntryFilter;
import org.apache.ignite.internal.util.future.GridCompoundFuture;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
-import org.apache.ignite.internal.util.lang.GridIteratorAdapter;
import org.apache.ignite.internal.util.typedef.CI1;
import org.apache.ignite.internal.util.typedef.CI2;
import org.apache.ignite.internal.util.typedef.CI3;
@@ -78,6 +79,7 @@ import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiInClosure;
import org.apache.ignite.lang.IgniteBiPredicate;
import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.lang.IgniteUuid;
@@ -86,8 +88,11 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jsr166.ConcurrentHashMap8;
+import static org.apache.ignite.events.EventType.EVT_NODE_FAILED;
+import static org.apache.ignite.events.EventType.EVT_NODE_LEFT;
import static org.apache.ignite.internal.processors.dr.GridDrType.DR_LOAD;
import static org.apache.ignite.internal.processors.dr.GridDrType.DR_NONE;
+import static org.apache.ignite.internal.util.GridConcurrentFactory.newMap;
/**
* DHT cache adapter.
@@ -96,18 +101,36 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
/** */
private static final long serialVersionUID = 0L;
- /** Topology. */
- private GridDhtPartitionTopologyImpl top;
-
- /** Preloader. */
- protected GridCachePreloader preldr;
-
/** Multi tx future holder. */
private ThreadLocal<IgniteBiTuple<IgniteUuid, GridDhtTopologyFuture>> multiTxHolder = new ThreadLocal<>();
/** Multi tx futures. */
private ConcurrentMap<IgniteUuid, MultiUpdateFuture> multiTxFuts = new ConcurrentHashMap8<>();
+ /** Force key futures. */
+ private final ConcurrentMap<IgniteUuid, GridDhtForceKeysFuture<?, ?>> forceKeyFuts = newMap();
+
+ /** */
+ private volatile boolean stopping;
+
+ /** Discovery listener. */
+ private final GridLocalEventListener discoLsnr = new GridLocalEventListener() {
+ @Override public void onEvent(Event evt) {
+ DiscoveryEvent e = (DiscoveryEvent)evt;
+
+ ClusterNode loc = ctx.localNode();
+
+ assert e.type() == EVT_NODE_LEFT || e.type() == EVT_NODE_FAILED : e;
+
+ final ClusterNode n = e.eventNode();
+
+ assert !loc.id().equals(n.id());
+
+ for (GridDhtForceKeysFuture<?, ?> f : forceKeyFuts.values())
+ f.onDiscoveryEvent(e);
+ }
+ };
+
/**
* Empty constructor required for {@link Externalizable}.
*/
@@ -116,6 +139,176 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
}
/**
+ * Adds future to future map.
+ *
+ * @param fut Future to add.
+ * @return {@code False} if node cache is stopping and future was completed with error.
+ */
+ public boolean addFuture(GridDhtForceKeysFuture<?, ?> fut) {
+ forceKeyFuts.put(fut.futureId(), fut);
+
+ if (stopping) {
+ fut.onDone(stopError());
+
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Removes future from future map.
+ *
+ * @param fut Future to remove.
+ */
+ public void removeFuture(GridDhtForceKeysFuture<?, ?> fut) {
+ forceKeyFuts.remove(fut.futureId(), fut);
+ }
+
+ /**
+ * @param node Node.
+ * @param msg Message.
+ */
+ protected final void processForceKeyResponse(ClusterNode node, GridDhtForceKeysResponse msg) {
+ GridDhtForceKeysFuture<?, ?> f = forceKeyFuts.get(msg.futureId());
+
+ if (f != null)
+ f.onResult(msg);
+ else if (log.isDebugEnabled())
+ log.debug("Receive force key response for unknown future (is it duplicate?) [nodeId=" + node.id() +
+ ", res=" + msg + ']');
+ }
+ /**
+ * @param node Node originated request.
+ * @param msg Force keys message.
+ */
+ protected final void processForceKeysRequest(final ClusterNode node, final GridDhtForceKeysRequest msg) {
+ IgniteInternalFuture<?> fut = ctx.mvcc().finishKeys(msg.keys(), msg.cacheId(), msg.topologyVersion());
+
+ if (fut.isDone())
+ processForceKeysRequest0(node, msg);
+ else
+ fut.listen(new CI1<IgniteInternalFuture<?>>() {
+ @Override public void apply(IgniteInternalFuture<?> t) {
+ processForceKeysRequest0(node, msg);
+ }
+ });
+ }
+
+ /**
+ * @param node Node originated request.
+ * @param msg Force keys message.
+ */
+ private void processForceKeysRequest0(ClusterNode node, GridDhtForceKeysRequest msg) {
+ try {
+ ClusterNode loc = ctx.localNode();
+
+ GridDhtForceKeysResponse res = new GridDhtForceKeysResponse(
+ ctx.cacheId(),
+ msg.futureId(),
+ msg.miniId(),
+ ctx.deploymentEnabled());
+
+ GridDhtPartitionTopology top = ctx.topology();
+
+ for (KeyCacheObject k : msg.keys()) {
+ int p = ctx.affinity().partition(k);
+
+ GridDhtLocalPartition locPart = top.localPartition(p, AffinityTopologyVersion.NONE, false);
+
+ // If this node is no longer an owner.
+ if (locPart == null && !top.owners(p).contains(loc)) {
+ res.addMissed(k);
+
+ continue;
+ }
+
+ GridCacheEntryEx entry;
+
+ while (true) {
+ try {
+ entry = ctx.dht().entryEx(k);
+
+ entry.unswap();
+
+ GridCacheEntryInfo info = entry.info();
+
+ if (info == null) {
+ assert entry.obsolete() : entry;
+
+ continue;
+ }
+
+ if (!info.isNew())
+ res.addInfo(info);
+
+ ctx.evicts().touch(entry, msg.topologyVersion());
+
+ break;
+ }
+ catch (GridCacheEntryRemovedException ignore) {
+ if (log.isDebugEnabled())
+ log.debug("Got removed entry: " + k);
+ }
+ catch (GridDhtInvalidPartitionException ignore) {
+ if (log.isDebugEnabled())
+ log.debug("Local node is no longer an owner: " + p);
+
+ res.addMissed(k);
+
+ break;
+ }
+ }
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("Sending force key response [node=" + node.id() + ", res=" + res + ']');
+
+ ctx.io().send(node, res, ctx.ioPolicy());
+ }
+ catch (ClusterTopologyCheckedException ignore) {
+ if (log.isDebugEnabled())
+ log.debug("Received force key request form failed node (will ignore) [nodeId=" + node.id() +
+ ", req=" + msg + ']');
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to reply to force key request [nodeId=" + node.id() + ", req=" + msg + ']', e);
+ }
+ }
+
+ /**
+ *
+ */
+ public void dumpDebugInfo() {
+ if (!forceKeyFuts.isEmpty()) {
+ U.warn(log, "Pending force key futures [cache=" + ctx.name() + "]:");
+
+ for (GridDhtForceKeysFuture fut : forceKeyFuts.values())
+ U.warn(log, ">>> " + fut);
+ }
+ }
+
+ @Override public void onKernalStop() {
+ super.onKernalStop();
+
+ stopping = true;
+
+ IgniteCheckedException err = stopError();
+
+ for (GridDhtForceKeysFuture fut : forceKeyFuts.values())
+ fut.onDone(err);
+
+ ctx.gridEvents().removeLocalEventListener(discoLsnr);
+ }
+
+ /**
+ * @return Node stop exception.
+ */
+ private IgniteCheckedException stopError() {
+ return new NodeStoppingException("Operation has been cancelled (cache or node is stopping).");
+ }
+
+ /**
* @param nodeId Sender node ID.
* @param res Near get response.
*/
@@ -160,7 +353,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
* @param ctx Context.
*/
protected GridDhtCacheAdapter(GridCacheContext<K, V> ctx) {
- this(ctx, new GridCachePartitionedConcurrentMap(ctx));
+ this(ctx, new GridCachePartitionedConcurrentMap(ctx.group()));
}
/**
@@ -174,83 +367,21 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
}
/** {@inheritDoc} */
- @Override protected void init() {
- super.init();
-
- top = new GridDhtPartitionTopologyImpl(ctx, entryFactory());
- }
-
- /** {@inheritDoc} */
@Override public void start() throws IgniteCheckedException {
- super.start();
-
- ctx.io().addHandler(ctx.cacheId(), GridCacheTtlUpdateRequest.class, new CI2<UUID, GridCacheTtlUpdateRequest>() {
+ ctx.io().addCacheHandler(ctx.cacheId(), GridCacheTtlUpdateRequest.class, new CI2<UUID, GridCacheTtlUpdateRequest>() {
@Override public void apply(UUID nodeId, GridCacheTtlUpdateRequest req) {
processTtlUpdateRequest(req);
}
});
- }
-
- /** {@inheritDoc} */
- @Override public void stop() {
- super.stop();
-
- if (preldr != null)
- preldr.stop();
-
- // Clean up to help GC.
- preldr = null;
- top = null;
- }
- /** {@inheritDoc} */
- @Override public void onReconnected() {
- super.onReconnected();
-
- ctx.affinity().onReconnected();
-
- top.onReconnected();
-
- if (preldr != null)
- preldr.onReconnected();
- }
-
- /** {@inheritDoc} */
- @Override public void onKernalStart() throws IgniteCheckedException {
- super.onKernalStart();
-
- if (preldr != null)
- preldr.onKernalStart();
- }
-
- /** {@inheritDoc} */
- @Override public void onKernalStop() {
- super.onKernalStop();
-
- if (preldr != null)
- preldr.onKernalStop();
+ ctx.gridEvents().addLocalEventListener(discoLsnr, EVT_NODE_LEFT, EVT_NODE_FAILED);
}
/** {@inheritDoc} */
@Override public void printMemoryStats() {
super.printMemoryStats();
- top.printMemoryStats(1024);
- }
-
- /**
- * @return Cache map entry factory.
- */
- @Override protected GridCacheMapEntryFactory entryFactory() {
- return new GridCacheMapEntryFactory() {
- @Override public GridCacheMapEntry create(
- GridCacheContext ctx,
- AffinityTopologyVersion topVer,
- KeyCacheObject key
- ) {
- return new GridDhtCacheEntry(ctx, topVer, key);
- }
- };
+ ctx.group().topology().printMemoryStats(1024);
}
/**
@@ -262,21 +393,12 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
* @return Partition topology.
*/
public GridDhtPartitionTopology topology() {
- return top;
+ return ctx.group().topology();
}
/** {@inheritDoc} */
@Override public GridCachePreloader preloader() {
- return preldr;
- }
-
- /**
- * @return DHT preloader.
- */
- public GridDhtPreloader dhtPreloader() {
- assert preldr instanceof GridDhtPreloader;
-
- return (GridDhtPreloader)preldr;
+ return ctx.group().preloader();
}
/**
@@ -300,6 +422,8 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
if (tup != null)
throw new IgniteCheckedException("Nested multi-update locks are not supported");
+ GridDhtPartitionTopology top = ctx.group().topology();
+
top.readLock();
GridDhtTopologyFuture topFut;
@@ -342,7 +466,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
if (tup == null)
throw new IgniteCheckedException("Multi-update was not started or released twice.");
- top.readLock();
+ ctx.group().topology().readLock();
try {
IgniteUuid lockId = tup.get1();
@@ -355,7 +479,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
multiFut.onDone(lockId);
}
finally {
- top.readUnlock();
+ ctx.group().topology().readUnlock();
}
}
@@ -516,7 +640,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
return;
try {
- GridDhtLocalPartition part = top.localPartition(ctx.affinity().partition(key),
+ GridDhtLocalPartition part = ctx.group().topology().localPartition(ctx.affinity().partition(key),
AffinityTopologyVersion.NONE, true);
// Reserve to make sure that partition does not get unloaded.
@@ -578,7 +702,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
long sum = 0;
for (GridDhtLocalPartition p : topology().currentLocalPartitions())
- sum += p.dataStore().size();
+ sum += p.dataStore().cacheSize(ctx.cacheId());
return sum;
}
@@ -596,7 +720,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
for (GridDhtLocalPartition p : topology().currentLocalPartitions()) {
if (p.primary(topVer))
- sum += p.dataStore().size();
+ sum += p.dataStore().cacheSize(ctx.cacheId());
}
return sum;
@@ -811,7 +935,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
res = new GridNearSingleGetResponse(ctx.cacheId(),
req.futureId(),
- req.topologyVersion(),
+ null,
res0,
false,
req.addDeploymentInfo());
@@ -820,9 +944,9 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
res.setContainsValue();
}
else {
- AffinityTopologyVersion topVer = ctx.shared().exchange().readyAffinityVersion();
+ AffinityTopologyVersion topVer = ctx.shared().exchange().lastTopologyFuture().topologyVersion();
- assert topVer.compareTo(req.topologyVersion()) >= 0 : "Wrong ready topology version for " +
+ assert topVer.compareTo(req.topologyVersion()) > 0 : "Wrong ready topology version for " +
"invalid partitions response [topVer=" + topVer + ", req=" + req + ']';
res = new GridNearSingleGetResponse(ctx.cacheId(),
@@ -910,9 +1034,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
}
if (!F.isEmpty(fut.invalidPartitions()))
- res.invalidPartitions(fut.invalidPartitions(), ctx.shared().exchange().readyAffinityVersion());
- else
- res.invalidPartitions(fut.invalidPartitions(), req.topologyVersion());
+ res.invalidPartitions(fut.invalidPartitions(), ctx.shared().exchange().lastTopologyFuture().topologyVersion());
try {
ctx.io().send(nodeId, res, ctx.ioPolicy());
@@ -1098,7 +1220,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
false);
if (part != null)
- part.onDeferredDelete(entry.key(), ver);
+ part.onDeferredDelete(entry.context().cacheId(), entry.key(), ver);
}
/**
@@ -1110,8 +1232,8 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
if (expVer.equals(curVer))
return false;
- Collection<ClusterNode> cacheNodes0 = ctx.discovery().cacheAffinityNodes(ctx.cacheId(), expVer);
- Collection<ClusterNode> cacheNodes1 = ctx.discovery().cacheAffinityNodes(ctx.cacheId(), curVer);
+ Collection<ClusterNode> cacheNodes0 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), expVer);
+ Collection<ClusterNode> cacheNodes1 = ctx.discovery().cacheGroupAffinityNodes(ctx.groupId(), curVer);
if (!cacheNodes0.equals(cacheNodes1) || ctx.affinity().affinityTopologyVersion().compareTo(curVer) < 0)
return true;
@@ -1149,7 +1271,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
* @param topVer Specified affinity topology version.
* @return Local entries iterator.
*/
- public Iterator<Cache.Entry<K, V>> localEntriesIterator(final boolean primary,
+ private Iterator<Cache.Entry<K, V>> localEntriesIterator(final boolean primary,
final boolean backup,
final boolean keepBinary,
final AffinityTopologyVersion topVer) {
@@ -1163,7 +1285,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
* @param topVer Specified affinity topology version.
* @return Local entries iterator.
*/
- public Iterator<? extends GridCacheEntryEx> localEntriesIteratorEx(final boolean primary,
+ private Iterator<? extends GridCacheEntryEx> localEntriesIteratorEx(final boolean primary,
final boolean backup,
final AffinityTopologyVersion topVer) {
assert primary || backup;
@@ -1210,7 +1332,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
GridDhtLocalPartition part = partIt.next();
if (primary == part.primary(topVer)) {
- curIt = part.entries().iterator();
+ curIt = part.entries(ctx.cacheId()).iterator();
break;
}
@@ -1255,4 +1377,35 @@ public abstract class GridDhtCacheAdapter<K, V> extends GridDistributedCacheAdap
return topVer;
}
}
+
+ /**
+ *
+ */
+ protected abstract class MessageHandler<M> implements IgniteBiInClosure<UUID, M> {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** {@inheritDoc} */
+ @Override public void apply(UUID nodeId, M msg) {
+ ClusterNode node = ctx.node(nodeId);
+
+ if (node == null) {
+ if (log.isDebugEnabled())
+ log.debug("Received message from failed node [node=" + nodeId + ", msg=" + msg + ']');
+
+ return;
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("Received message from node [node=" + nodeId + ", msg=" + msg + ']');
+
+ onMessage(node, msg);
+ }
+
+ /**
+ * @param node Node.
+ * @param msg Message.
+ */
+ protected abstract void onMessage(ClusterNode node, M msg);
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java
index be7805f..2e86fb0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java
@@ -93,8 +93,10 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry {
}
/** {@inheritDoc} */
- @Override protected long nextPartCounter() {
- return locPart.nextUpdateCounter();
+ @Override protected long nextPartitionCounter(AffinityTopologyVersion topVer,
+ boolean primary,
+ @Nullable Long primaryCntr) {
+ return locPart.nextUpdateCounter(cctx.cacheId(), topVer, primary, primaryCntr);
}
/** {@inheritDoc} */
@@ -139,7 +141,7 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry {
assert !Thread.holdsLock(this);
// Remove this entry from partition mapping.
- cctx.dht().topology().onRemoved(this);
+ cctx.topology().onRemoved(this);
}
/**
@@ -715,8 +717,8 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry {
/**
* @return Cache name.
*/
- protected String cacheName() {
- return cctx.dht().near().name();
+ protected final String cacheName() {
+ return cctx.name();
}
/** {@inheritDoc} */
@@ -726,12 +728,12 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry {
/** {@inheritDoc} */
@Override protected void incrementMapPublicSize() {
- locPart.incrementPublicSize(this);
+ locPart.incrementPublicSize(null, this);
}
/** {@inheritDoc} */
@Override protected void decrementMapPublicSize() {
- locPart.decrementPublicSize(this);
+ locPart.decrementPublicSize(null, this);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
index 7bc17a1..8031c8f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
@@ -166,7 +166,7 @@ public final class GridDhtGetFuture<K, V> extends GridCompoundIdentityFuture<Col
* Initializes future.
*/
void init() {
- GridDhtFuture<Object> fut = cctx.dht().dhtPreloader().request(keys.keySet(), topVer);
+ GridDhtFuture<Object> fut = cctx.group().preloader().request(cctx, keys.keySet(), topVer);
if (fut != null) {
if (!F.isEmpty(fut.invalidPartitions())) {
@@ -292,9 +292,11 @@ public final class GridDhtGetFuture<K, V> extends GridCompoundIdentityFuture<Col
*/
private boolean map(KeyCacheObject key) {
try {
+ int keyPart = cctx.affinity().partition(key);
+
GridDhtLocalPartition part = topVer.topologyVersion() > 0 ?
- cache().topology().localPartition(cctx.affinity().partition(key), topVer, true) :
- cache().topology().localPartition(key, false);
+ cache().topology().localPartition(keyPart, topVer, true) :
+ cache().topology().localPartition(keyPart);
if (part == null)
return false;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
index 2da26ac..b9007ba 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetSingleFuture.java
@@ -87,8 +87,8 @@ public final class GridDhtGetSingleFuture<K, V> extends GridFutureAdapter<GridCa
/** Topology version .*/
private AffinityTopologyVersion topVer;
- /** Retries because ownership changed. */
- private Collection<Integer> retries;
+ /** Retry because ownership changed. */
+ private Integer retry;
/** Subject ID. */
private UUID subjId;
@@ -194,17 +194,21 @@ public final class GridDhtGetSingleFuture<K, V> extends GridFutureAdapter<GridCa
*
*/
private void map() {
- if (cctx.dht().dhtPreloader().needForceKeys()) {
- GridDhtFuture<Object> fut = cctx.dht().dhtPreloader().request(
+ if (cctx.group().preloader().needForceKeys()) {
+ GridDhtFuture<Object> fut = cctx.group().preloader().request(
+ cctx,
Collections.singleton(key),
topVer);
if (fut != null) {
- if (F.isEmpty(fut.invalidPartitions())) {
- if (retries == null)
- retries = new HashSet<>();
+ if (!F.isEmpty(fut.invalidPartitions())) {
+ assert fut.invalidPartitions().size() == 1 : fut.invalidPartitions();
- retries.addAll(fut.invalidPartitions());
+ retry = F.first(fut.invalidPartitions());
+
+ onDone((GridCacheEntryInfo)null);
+
+ return;
}
fut.listen(
@@ -239,17 +243,14 @@ public final class GridDhtGetSingleFuture<K, V> extends GridFutureAdapter<GridCa
*
*/
private void map0() {
- // Assign keys to primary nodes.
- int part = cctx.affinity().partition(key);
+ assert retry == null : retry;
- if (retries == null || !retries.contains(part)) {
- if (!map(key)) {
- retries = Collections.singleton(part);
+ if (!map(key)) {
+ retry = cctx.affinity().partition(key);
- onDone((GridCacheEntryInfo)null);
+ onDone((GridCacheEntryInfo)null);
- return;
- }
+ return;
}
getAsync();
@@ -257,7 +258,7 @@ public final class GridDhtGetSingleFuture<K, V> extends GridFutureAdapter<GridCa
/** {@inheritDoc} */
@Override public Collection<Integer> invalidPartitions() {
- return retries == null ? Collections.<Integer>emptyList() : retries;
+ return retry == null ? Collections.<Integer>emptyList() : Collections.singletonList(retry);
}
/**
@@ -265,9 +266,11 @@ public final class GridDhtGetSingleFuture<K, V> extends GridFutureAdapter<GridCa
* @return {@code True} if mapped.
*/
private boolean map(KeyCacheObject key) {
+ int keyPart = cctx.affinity().partition(key);
+
GridDhtLocalPartition part = topVer.topologyVersion() > 0 ?
- cache().topology().localPartition(cctx.affinity().partition(key), topVer, true) :
- cache().topology().localPartition(key, false);
+ cache().topology().localPartition(keyPart, topVer, true) :
+ cache().topology().localPartition(keyPart);
if (part == null)
return false;
[15/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 9063a12..dc4a91f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -72,7 +72,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
private boolean lateAffAssign;
/** Affinity information for all started caches (initialized on coordinator). */
- private ConcurrentMap<Integer, CacheHolder> caches = new ConcurrentHashMap<>();
+ private ConcurrentMap<Integer, CacheGroupHolder> grpHolders = new ConcurrentHashMap<>();
/** Last topology version when affinity was calculated (updated from exchange thread). */
private AffinityTopologyVersion affCalcVer;
@@ -81,7 +81,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
private AffinityTopologyVersion lastAffVer;
/** Registered caches (updated from exchange thread). */
- private final Map<Integer, DynamicCacheDescriptor> registeredCaches = new HashMap<>();
+ private final Map<Integer, CacheGroupDescriptor> registeredGrps = new HashMap<>();
/** */
private WaitRebalanceInfo waitInfo;
@@ -126,14 +126,14 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
void onDiscoveryEvent(int type, ClusterNode node, AffinityTopologyVersion topVer) {
if (type == EVT_NODE_JOINED && node.isLocal()) {
// Clean-up in case of client reconnect.
- registeredCaches.clear();
+ registeredGrps.clear();
affCalcVer = null;
lastAffVer = null;
- for (DynamicCacheDescriptor desc : cctx.cache().cacheDescriptors())
- registeredCaches.put(desc.cacheId(), desc);
+ for (CacheGroupDescriptor desc : cctx.cache().cacheGroupDescriptors().values())
+ registeredGrps.put(desc.groupId(), desc);
}
if (!CU.clientNode(node) && (type == EVT_NODE_FAILED || type == EVT_NODE_JOINED || type == EVT_NODE_LEFT)) {
@@ -154,7 +154,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
if (msg.exchangeId() != null) {
if (log.isDebugEnabled()) {
- log.debug("Need process affinity change message [lastAffVer=" + lastAffVer +
+ log.debug("Ignore affinity change message [lastAffVer=" + lastAffVer +
", msgExchId=" + msg.exchangeId() +
", msgVer=" + msg.topologyVersion() + ']');
}
@@ -188,14 +188,14 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/**
* @param topVer Expected topology version.
*/
- private void onCacheStopped(AffinityTopologyVersion topVer) {
+ private void onCacheGroupStopped(AffinityTopologyVersion topVer) {
CacheAffinityChangeMessage msg = null;
synchronized (mux) {
if (waitInfo == null || !waitInfo.topVer.equals(topVer))
return;
- if (waitInfo.waitCaches.isEmpty()) {
+ if (waitInfo.waitGrps.isEmpty()) {
msg = affinityChangeMessage(waitInfo);
waitInfo = null;
@@ -213,9 +213,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/**
* @param top Topology.
- * @param checkCacheId Cache ID.
+ * @param checkGrpId Group ID.
*/
- void checkRebalanceState(GridDhtPartitionTopology top, Integer checkCacheId) {
+ void checkRebalanceState(GridDhtPartitionTopology top, Integer checkGrpId) {
if (!lateAffAssign)
return;
@@ -229,14 +229,14 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
assert affCalcVer.equals(waitInfo.topVer) : "Invalid affinity version [calcVer=" + affCalcVer +
", waitVer=" + waitInfo.topVer + ']';
- Map<Integer, UUID> partWait = waitInfo.waitCaches.get(checkCacheId);
+ Map<Integer, UUID> partWait = waitInfo.waitGrps.get(checkGrpId);
boolean rebalanced = true;
if (partWait != null) {
- CacheHolder cache = caches.get(checkCacheId);
+ CacheGroupHolder grpHolder = grpHolders.get(checkGrpId);
- if (cache != null) {
+ if (grpHolder != null) {
for (Iterator<Map.Entry<Integer, UUID>> it = partWait.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<Integer, UUID> e = it.next();
@@ -256,9 +256,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
if (rebalanced) {
- waitInfo.waitCaches.remove(checkCacheId);
+ waitInfo.waitGrps.remove(checkGrpId);
- if (waitInfo.waitCaches.isEmpty()) {
+ if (waitInfo.waitGrps.isEmpty()) {
msg = affinityChangeMessage(waitInfo);
waitInfo = null;
@@ -287,7 +287,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
Map<Integer, Map<Integer, List<UUID>>> assignmentsChange = U.newHashMap(waitInfo.assignments.size());
for (Map.Entry<Integer, Map<Integer, List<ClusterNode>>> e : waitInfo.assignments.entrySet()) {
- Integer cacheId = e.getKey();
+ Integer grpId = e.getKey();
Map<Integer, List<ClusterNode>> assignment = e.getValue();
@@ -296,23 +296,23 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
for (Map.Entry<Integer, List<ClusterNode>> e0 : assignment.entrySet())
assignment0.put(e0.getKey(), toIds0(e0.getValue()));
- assignmentsChange.put(cacheId, assignment0);
+ assignmentsChange.put(grpId, assignment0);
}
return new CacheAffinityChangeMessage(waitInfo.topVer, assignmentsChange, waitInfo.deploymentIds);
}
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
*/
- public void onCacheCreated(GridCacheContext cctx) {
- final Integer cacheId = cctx.cacheId();
+ void onCacheGroupCreated(CacheGroupContext grp) {
+ final Integer grpId = grp.groupId();
- if (!caches.containsKey(cctx.cacheId())) {
- cctx.io().addHandler(cacheId, GridDhtAffinityAssignmentResponse.class,
+ if (!grpHolders.containsKey(grp.groupId())) {
+ cctx.io().addCacheGroupHandler(grpId, GridDhtAffinityAssignmentResponse.class,
new IgniteBiInClosure<UUID, GridDhtAffinityAssignmentResponse>() {
@Override public void apply(UUID nodeId, GridDhtAffinityAssignmentResponse res) {
- processAffinityAssignmentResponse(nodeId, res);
+ processAffinityAssignmentResponse(grpId, nodeId, res);
}
});
}
@@ -322,28 +322,14 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @param exchActions Cache change requests to execute on exchange.
*/
private void updateCachesInfo(ExchangeActions exchActions) {
- for (ExchangeActions.ActionData action : exchActions.cacheStopRequests()) {
- DynamicCacheDescriptor desc = registeredCaches.remove(action.descriptor().cacheId());
+ for (CacheGroupDescriptor stopDesc : exchActions.cacheGroupsToStop()) {
+ CacheGroupDescriptor rmvd = registeredGrps.remove(stopDesc.groupId());
- assert desc != null : action.request().cacheName();
+ assert rmvd != null : stopDesc.cacheOrGroupName();
}
- for (ExchangeActions.ActionData action : exchActions.cacheStartRequests()) {
- DynamicCacheChangeRequest req = action.request();
-
- Integer cacheId = action.descriptor().cacheId();
-
- DynamicCacheDescriptor desc = new DynamicCacheDescriptor(cctx.kernalContext(),
- req.startCacheConfiguration(),
- req.cacheType(),
- false,
- action.descriptor().receivedFrom(),
- action.descriptor().staticallyConfigured(),
- action.descriptor().sql(),
- req.deploymentId(),
- req.schema());
-
- DynamicCacheDescriptor old = registeredCaches.put(cacheId, desc);
+ for (CacheGroupDescriptor startDesc : exchActions.cacheGroupsToStart()) {
+ CacheGroupDescriptor old = registeredGrps.put(startDesc.groupId(), startDesc);
assert old == null : old;
}
@@ -360,7 +346,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
*/
public boolean onCacheChangeRequest(final GridDhtPartitionsExchangeFuture fut,
boolean crd,
- ExchangeActions exchActions)
+ final ExchangeActions exchActions)
throws IgniteCheckedException
{
assert exchActions != null && !exchActions.empty() : exchActions;
@@ -368,9 +354,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
updateCachesInfo(exchActions);
// Affinity did not change for existing caches.
- forAllCaches(crd && lateAffAssign, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(crd && lateAffAssign, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
- if (fut.stopping(aff.cacheId()))
+ if (exchActions.cacheGroupStopping(aff.groupId()))
return;
aff.clientEventTopologyChange(fut.discoveryEvent(), fut.topologyVersion());
@@ -392,8 +378,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
nearCfg = req.nearCacheConfiguration();
}
else {
- startCache = cctx.cacheContext(action.descriptor().cacheId()) == null &&
- CU.affinityNode(cctx.localNode(), req.startCacheConfiguration().getNodeFilter());
+ startCache = cctx.cacheContext(cacheDesc.cacheId()) == null &&
+ CU.affinityNode(cctx.localNode(), cacheDesc.groupDescriptor().config().getNodeFilter());
}
try {
@@ -401,102 +387,122 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
cctx.cache().prepareCacheStart(cacheDesc, nearCfg, fut.topologyVersion());
if (fut.cacheAddedOnExchange(cacheDesc.cacheId(), cacheDesc.receivedFrom())) {
- if (fut.discoCache().cacheAffinityNodes(req.cacheName()).isEmpty())
+ if (fut.discoCache().cacheGroupAffinityNodes(cacheDesc.groupId()).isEmpty())
U.quietAndWarn(log, "No server nodes found for cache client: " + req.cacheName());
}
}
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to initialize cache. Will try to rollback cache start routine. " +
+ "[cacheName=" + req.cacheName() + ']', e);
- if (!crd || !lateAffAssign) {
- GridCacheContext cacheCtx = cctx.cacheContext(cacheDesc.cacheId());
-
- if (cacheCtx != null && !cacheCtx.isLocal()) {
- boolean clientCacheStarted =
- req.clientStartOnly() && req.initiatingNodeId().equals(cctx.localNodeId());
+ cctx.cache().forceCloseCache(fut.topologyVersion(), action, e);
+ }
+ }
- if (clientCacheStarted)
- initAffinity(cacheDesc, cacheCtx.affinity().affinityCache(), fut, lateAffAssign);
- else if (!req.clientStartOnly()) {
- assert fut.topologyVersion().equals(cacheCtx.startTopologyVersion());
+ Set<Integer> gprs = new HashSet<>();
- GridAffinityAssignmentCache aff = cacheCtx.affinity().affinityCache();
+ for (ExchangeActions.ActionData action : exchActions.newAndClientCachesStartRequests()) {
+ Integer grpId = action.descriptor().groupId();
- assert aff.lastVersion().equals(AffinityTopologyVersion.NONE) : aff.lastVersion();
+ if (gprs.add(grpId)) {
+ if (crd && lateAffAssign)
+ initStartedGroupOnCoordinator(fut, action.descriptor().groupDescriptor());else {
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- List<List<ClusterNode>> assignment = aff.calculate(fut.topologyVersion(),
- fut.discoveryEvent(), fut.discoCache());
+ if (grp != null && !grp.isLocal() && grp.localStartVersion().equals(fut.topologyVersion())) {
+ assert grp.affinity().lastVersion().equals(AffinityTopologyVersion.NONE) : grp.affinity().lastVersion();
- aff.initialize(fut.topologyVersion(), assignment);
- }
+ initAffinity(registeredGrps.get(grp.groupId()), grp.affinity(), fut);
}
}
- else
- initStartedCacheOnCoordinator(fut, cacheDesc.cacheId());
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to initialize cache. Will try to rollback cache start routine. " +
- "[cacheName=" + req.cacheName() + ']', e);
-
- cctx.cache().forceCloseCache(fut.topologyVersion(), action, e);
}
}
- for (DynamicCacheChangeRequest req : exchActions.closeRequests(cctx.localNodeId())) {
- Integer cacheId = CU.cacheId(req.cacheName());
+ List<ExchangeActions.ActionData> closeReqs = exchActions.closeRequests(cctx.localNodeId());
- cctx.cache().blockGateway(req);
+ for (ExchangeActions.ActionData req : closeReqs) {
+ cctx.cache().blockGateway(req.request());
if (crd) {
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ CacheGroupContext grp = cctx.cache().cacheGroup(req.descriptor().groupId());
+
+ assert grp != null;
+
+ if (grp.affinityNode())
+ continue;
+
+ boolean grpClosed = false;
- // Client cache was stopped, need create 'client' CacheHolder.
- if (cacheCtx != null && !cacheCtx.affinityNode()) {
- CacheHolder cache = caches.remove(cacheId);
+ if (grp.sharedGroup()) {
+ boolean cacheRemaining = false;
- assert !cache.client() : cache;
+ for (GridCacheContext ctx : cctx.cacheContexts()) {
+ if (ctx.group() == grp && !cacheClosed(ctx.cacheId(), closeReqs)) {
+ cacheRemaining = true;
- cache = CacheHolder2.create(cctx,
- cctx.cache().cacheDescriptor(cacheId),
- fut,
- cache.affinity());
+ break;
+ }
+ }
- caches.put(cacheId, cache);
+ if (!cacheRemaining)
+ grpClosed = true;
}
- }
- }
+ else
+ grpClosed = true;
+
+ // All client cache groups were stopped, need create 'client' CacheGroupHolder.
+ if (grpClosed) {
+ CacheGroupHolder grpHolder = grpHolders.remove(grp.groupId());
+
+ if (grpHolder != null) {
+ assert !grpHolder.client() : grpHolder;
- Set<Integer> stoppedCaches = null;
+ grpHolder = CacheGroupHolder2.create(cctx,
+ registeredGrps.get(grp.groupId()),
+ fut,
+ grp.affinity());
- for (ExchangeActions.ActionData action : exchActions.cacheStopRequests()) {
- DynamicCacheDescriptor desc = action.descriptor();
+ grpHolders.put(grp.groupId(), grpHolder);
+ }
+ }
+ }
+ }
+ for (ExchangeActions.ActionData action : exchActions.cacheStopRequests())
cctx.cache().blockGateway(action.request());
- if (crd && lateAffAssign && desc.cacheConfiguration().getCacheMode() != LOCAL) {
- CacheHolder cache = caches.remove(desc.cacheId());
+ Set<Integer> stoppedGrps = null;
- assert cache != null : action.request();
+ if (crd && lateAffAssign) {
+ for (CacheGroupDescriptor grpDesc : exchActions.cacheGroupsToStop()) {
+ if (grpDesc.config().getCacheMode() != LOCAL) {
+ CacheGroupHolder cacheGrp = grpHolders.remove(grpDesc.groupId());
- if (stoppedCaches == null)
- stoppedCaches = new HashSet<>();
+ assert cacheGrp != null : grpDesc;
- stoppedCaches.add(cache.cacheId());
+ if (stoppedGrps == null)
+ stoppedGrps = new HashSet<>();
- cctx.io().removeHandler(desc.cacheId(), GridDhtAffinityAssignmentResponse.class);
+ stoppedGrps.add(cacheGrp.groupId());
+
+ cctx.io().removeHandler(true, cacheGrp.groupId(), GridDhtAffinityAssignmentResponse.class);
+ }
}
}
- if (stoppedCaches != null) {
+ if (stoppedGrps != null) {
boolean notify = false;
synchronized (mux) {
if (waitInfo != null) {
- for (Integer cacheId : stoppedCaches) {
- boolean rmv = waitInfo.waitCaches.remove(cacheId) != null;
+ for (Integer grpId : stoppedGrps) {
+ boolean rmv = waitInfo.waitGrps.remove(grpId) != null;
if (rmv) {
notify = true;
- waitInfo.assignments.remove(cacheId);
+ waitInfo.assignments.remove(grpId);
}
}
}
@@ -507,7 +513,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
cctx.kernalContext().closure().runLocalSafe(new Runnable() {
@Override public void run() {
- onCacheStopped(topVer);
+ onCacheGroupStopped(topVer);
}
});
}
@@ -517,12 +523,26 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/**
+ * @param cacheId Cache ID.
+ * @param closeReqs Close requests.
+ * @return {@code True} if requests contain request for given cache ID.
+ */
+ private boolean cacheClosed(int cacheId, List<ExchangeActions.ActionData> closeReqs) {
+ for (ExchangeActions.ActionData req : closeReqs) {
+ if (req.descriptor().cacheId() == cacheId)
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
*
*/
public void removeAllCacheInfo(){
- caches.clear();
+ grpHolders.clear();
- registeredCaches.clear();
+ registeredGrps.clear();
}
/**
@@ -550,13 +570,13 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
final Map<Object, List<List<ClusterNode>>> affCache = new HashMap<>();
- forAllCaches(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
List<List<ClusterNode>> idealAssignment = aff.idealAssignment();
assert idealAssignment != null;
- Map<Integer, List<UUID>> cacheAssignment = assignment.get(aff.cacheId());
+ Map<Integer, List<UUID>> cacheAssignment = assignment.get(aff.groupId());
List<List<ClusterNode>> newAssignment;
@@ -606,25 +626,25 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
final Map<Object, List<List<ClusterNode>>> affCache = new HashMap<>();
- forAllCaches(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
AffinityTopologyVersion affTopVer = aff.lastVersion();
assert affTopVer.topologyVersion() > 0 : affTopVer;
- DynamicCacheDescriptor desc = registeredCaches.get(aff.cacheId());
+ CacheGroupDescriptor desc = registeredGrps.get(aff.groupId());
- assert desc != null : aff.cacheName();
+ assert desc != null : aff.cacheOrGroupName();
IgniteUuid deploymentId = desc.deploymentId();
- if (!deploymentId.equals(deploymentIds.get(aff.cacheId()))) {
+ if (!deploymentId.equals(deploymentIds.get(aff.groupId()))) {
aff.clientEventTopologyChange(exchFut.discoveryEvent(), topVer);
return;
}
- Map<Integer, List<UUID>> change = affChange.get(aff.cacheId());
+ Map<Integer, List<UUID>> change = affChange.get(aff.groupId());
if (change != null) {
assert !change.isEmpty() : msg;
@@ -639,7 +659,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
List<ClusterNode> nodes = toNodes(topVer, e.getValue());
assert !nodes.equals(assignment.get(part)) : "Assignment did not change " +
- "[cache=" + aff.cacheName() +
+ "[cacheGrp=" + aff.cacheOrGroupName() +
", part=" + part +
", cur=" + F.nodeIds(assignment.get(part)) +
", new=" + F.nodeIds(nodes) +
@@ -675,7 +695,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
if (lateAffAssign) {
if (!locJoin) {
- forAllCaches(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(crd, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
AffinityTopologyVersion topVer = fut.topologyVersion();
@@ -688,7 +708,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
else {
if (!locJoin) {
- forAllCaches(false, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(false, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
AffinityTopologyVersion topVer = fut.topologyVersion();
@@ -721,10 +741,11 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/**
+ * @param grpId Cache group ID.
* @param nodeId Node ID.
* @param res Response.
*/
- private void processAffinityAssignmentResponse(UUID nodeId, GridDhtAffinityAssignmentResponse res) {
+ private void processAffinityAssignmentResponse(Integer grpId, UUID nodeId, GridDhtAffinityAssignmentResponse res) {
if (log.isDebugEnabled())
log.debug("Processing affinity assignment response [node=" + nodeId + ", res=" + res + ']');
@@ -738,11 +759,11 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @param c Cache closure.
* @throws IgniteCheckedException If failed
*/
- private void forAllRegisteredCaches(IgniteInClosureX<DynamicCacheDescriptor> c) throws IgniteCheckedException {
+ private void forAllRegisteredCacheGroups(IgniteInClosureX<CacheGroupDescriptor> c) throws IgniteCheckedException {
assert lateAffAssign;
- for (DynamicCacheDescriptor cacheDesc : registeredCaches.values()) {
- if (cacheDesc.cacheConfiguration().getCacheMode() == LOCAL)
+ for (CacheGroupDescriptor cacheDesc : registeredGrps.values()) {
+ if (cacheDesc.config().getCacheMode() == LOCAL)
continue;
c.applyx(cacheDesc);
@@ -753,56 +774,60 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @param crd Coordinator flag.
* @param c Closure.
*/
- private void forAllCaches(boolean crd, IgniteInClosureX<GridAffinityAssignmentCache> c) {
+ private void forAllCacheGroups(boolean crd, IgniteInClosureX<GridAffinityAssignmentCache> c) {
if (crd) {
- for (CacheHolder cache : caches.values())
- c.apply(cache.affinity());
+ for (CacheGroupHolder grp : grpHolders.values())
+ c.apply(grp.affinity());
}
else {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.kernalContext().cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- c.apply(cacheCtx.affinity().affinityCache());
+ c.apply(grp.affinity());
}
}
}
/**
* @param fut Exchange future.
- * @param cacheId Cache ID.
+ * @param grpDesc Cache group descriptor.
* @throws IgniteCheckedException If failed.
*/
- private void initStartedCacheOnCoordinator(GridDhtPartitionsExchangeFuture fut, final Integer cacheId)
+ private void initStartedGroupOnCoordinator(GridDhtPartitionsExchangeFuture fut, final CacheGroupDescriptor grpDesc)
throws IgniteCheckedException {
- CacheHolder cache = caches.get(cacheId);
+ assert grpDesc != null && grpDesc.groupId() != 0 : grpDesc;
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ if (grpDesc.config().getCacheMode() == LOCAL)
+ return;
- if (cache == null) {
- DynamicCacheDescriptor desc = cctx.cache().cacheDescriptor(cacheId);
+ Integer grpId = grpDesc.groupId();
- assert desc != null : cacheId;
+ CacheGroupHolder grpHolder = grpHolders.get(grpId);
- if (desc.cacheConfiguration().getCacheMode() == LOCAL)
- return;
+ CacheGroupContext grp = cctx.kernalContext().cache().cacheGroup(grpId);
- cache = cacheCtx != null ? new CacheHolder1(cacheCtx, null) : CacheHolder2.create(cctx, desc, fut, null);
+ if (grpHolder == null) {
+ grpHolder = grp != null ?
+ new CacheGroupHolder1(grp, null) :
+ CacheGroupHolder2.create(cctx, grpDesc, fut, null);
- CacheHolder old = caches.put(cacheId, cache);
+ CacheGroupHolder old = grpHolders.put(grpId, grpHolder);
assert old == null : old;
- List<List<ClusterNode>> newAff = cache.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+ List<List<ClusterNode>> newAff = grpHolder.affinity().calculate(fut.topologyVersion(),
+ fut.discoveryEvent(),
+ fut.discoCache());
- cache.affinity().initialize(fut.topologyVersion(), newAff);
+ grpHolder.affinity().initialize(fut.topologyVersion(), newAff);
}
- else if (cache.client() && cacheCtx != null) {
- assert cache.affinity().idealAssignment() != null;
+ else if (grpHolder.client() && grp != null) {
+ assert grpHolder.affinity().idealAssignment() != null;
- cache = new CacheHolder1(cacheCtx, cache.affinity());
+ grpHolder = new CacheGroupHolder1(grp, grpHolder.affinity());
- caches.put(cacheId, cache);
+ grpHolders.put(grpId, grpHolder);
}
}
@@ -818,14 +843,16 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
final GridDhtPartitionsExchangeFuture fut,
Collection<DynamicCacheDescriptor> descs) throws IgniteCheckedException {
for (DynamicCacheDescriptor desc : descs) {
- if (!registeredCaches.containsKey(desc.cacheId()))
- registeredCaches.put(desc.cacheId(), desc);
+ CacheGroupDescriptor grpDesc = desc.groupDescriptor();
+
+ if (!registeredGrps.containsKey(grpDesc.groupId()))
+ registeredGrps.put(grpDesc.groupId(), grpDesc);
}
if (crd && lateAffAssign) {
- forAllRegisteredCaches(new IgniteInClosureX<DynamicCacheDescriptor>() {
- @Override public void applyx(DynamicCacheDescriptor desc) throws IgniteCheckedException {
- CacheHolder cache = cache(fut, desc);
+ forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+ @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
+ CacheGroupHolder cache = groupHolder(fut, desc);
if (cache.affinity().lastVersion().equals(AffinityTopologyVersion.NONE)) {
List<List<ClusterNode>> assignment =
@@ -837,30 +864,28 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
});
}
else {
- forAllCaches(false, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+ forAllCacheGroups(false, new IgniteInClosureX<GridAffinityAssignmentCache>() {
@Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
if (aff.lastVersion().equals(AffinityTopologyVersion.NONE))
- initAffinity(registeredCaches.get(aff.cacheId()), aff, fut, false);
+ initAffinity(registeredGrps.get(aff.groupId()), aff, fut);
}
});
}
}
/**
- * @param desc Cache descriptor.
+ * @param desc Cache group descriptor.
* @param aff Affinity.
* @param fut Exchange future.
- * @param fetch Force fetch flag.
* @throws IgniteCheckedException If failed.
*/
- private void initAffinity(DynamicCacheDescriptor desc,
+ private void initAffinity(CacheGroupDescriptor desc,
GridAffinityAssignmentCache aff,
- GridDhtPartitionsExchangeFuture fut,
- boolean fetch)
+ GridDhtPartitionsExchangeFuture fut)
throws IgniteCheckedException {
- assert desc != null;
+ assert desc != null : aff.cacheOrGroupName();
- if (!fetch && canCalculateAffinity(desc, aff, fut)) {
+ if (canCalculateAffinity(desc, aff, fut)) {
List<List<ClusterNode>> assignment = aff.calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
aff.initialize(fut.topologyVersion(), assignment);
@@ -878,26 +903,26 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/**
- * @param desc Cache descriptor.
+ * @param desc Cache group descriptor.
* @param aff Affinity.
* @param fut Exchange future.
* @return {@code True} if local node can calculate affinity on it's own for this partition map exchange.
*/
- private boolean canCalculateAffinity(DynamicCacheDescriptor desc,
+ private boolean canCalculateAffinity(CacheGroupDescriptor desc,
GridAffinityAssignmentCache aff,
GridDhtPartitionsExchangeFuture fut) {
- assert desc != null : aff.cacheName();
+ assert desc != null : aff.cacheOrGroupName();
// Do not request affinity from remote nodes if affinity function is not centralized.
- if (!aff.centralizedAffinityFunction())
+ if (!lateAffAssign && !aff.centralizedAffinityFunction())
return true;
// If local node did not initiate exchange or local node is the only cache node in grid.
- Collection<ClusterNode> affNodes = cctx.discovery().cacheAffinityNodes(aff.cacheId(), fut.topologyVersion());
+ Collection<ClusterNode> affNodes = fut.discoCache().cacheGroupAffinityNodes(aff.groupId());
- return fut.cacheAddedOnExchange(aff.cacheId(), desc.receivedFrom()) ||
+ return fut.cacheGroupAddedOnExchange(aff.groupId(), desc.receivedFrom()) ||
!fut.exchangeId().nodeId().equals(cctx.localNodeId()) ||
- (affNodes.size() == 1 && affNodes.contains(cctx.localNode()));
+ (affNodes.isEmpty() || (affNodes.size() == 1 && affNodes.contains(cctx.localNode())));
}
/**
@@ -917,13 +942,15 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
if (lateAffAssign) {
if (locJoin) {
if (crd) {
- forAllRegisteredCaches(new IgniteInClosureX<DynamicCacheDescriptor>() {
- @Override public void applyx(DynamicCacheDescriptor cacheDesc) throws IgniteCheckedException {
+ forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+ @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
AffinityTopologyVersion topVer = fut.topologyVersion();
- CacheHolder cache = cache(fut, cacheDesc);
+ CacheGroupHolder cache = groupHolder(fut, desc);
- List<List<ClusterNode>> newAff = cache.affinity().calculate(topVer, fut.discoveryEvent(), fut.discoCache());
+ List<List<ClusterNode>> newAff = cache.affinity().calculate(topVer,
+ fut.discoveryEvent(),
+ fut.discoCache());
cache.affinity().initialize(topVer, newAff);
}
@@ -948,21 +975,21 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
if (crd && lateAffAssign) {
if (log.isDebugEnabled()) {
log.debug("Computed new affinity after node join [topVer=" + fut.topologyVersion() +
- ", waitCaches=" + (info != null ? cacheNames(info.waitCaches.keySet()) : null) + ']');
+ ", waitGrps=" + (info != null ? groupNames(info.waitGrps.keySet()) : null) + ']');
}
}
}
}
/**
- * @param cacheIds Cache IDs.
+ * @param grpIds Cache group IDs.
* @return Cache names.
*/
- private String cacheNames(Collection<Integer> cacheIds) {
+ private String groupNames(Collection<Integer> grpIds) {
StringBuilder names = new StringBuilder();
- for (Integer cacheId : cacheIds) {
- String name = registeredCaches.get(cacheId).cacheConfiguration().getName();
+ for (Integer grpId : grpIds) {
+ String name = registeredGrps.get(grpId).cacheOrGroupName();
if (names.length() != 0)
names.append(", ");
@@ -982,21 +1009,24 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
List<GridDhtAssignmentFetchFuture> fetchFuts = new ArrayList<>();
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- DynamicCacheDescriptor cacheDesc = registeredCaches.get(cacheCtx.cacheId());
-
- if (cctx.localNodeId().equals(cacheDesc.receivedFrom())) {
- List<List<ClusterNode>> assignment =
- cacheCtx.affinity().affinityCache().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+ if (fut.cacheGroupAddedOnExchange(grp.groupId(), grp.receivedFrom())) {
+ List<List<ClusterNode>> assignment = grp.affinity().calculate(fut.topologyVersion(),
+ fut.discoveryEvent(),
+ fut.discoCache());
- cacheCtx.affinity().affinityCache().initialize(fut.topologyVersion(), assignment);
+ grp.affinity().initialize(fut.topologyVersion(), assignment);
}
else {
+ CacheGroupDescriptor grpDesc = registeredGrps.get(grp.groupId());
+
+ assert grpDesc != null : grp.cacheOrGroupName();
+
GridDhtAssignmentFetchFuture fetchFut = new GridDhtAssignmentFetchFuture(cctx,
- cacheDesc,
+ grpDesc,
topVer,
fut.discoCache());
@@ -1009,9 +1039,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
for (int i = 0; i < fetchFuts.size(); i++) {
GridDhtAssignmentFetchFuture fetchFut = fetchFuts.get(i);
- Integer cacheId = fetchFut.cacheId();
+ Integer grpId = fetchFut.groupId();
- fetchAffinity(fut, cctx.cacheContext(cacheId).affinity().affinityCache(), fetchFut);
+ fetchAffinity(fut, cctx.cache().cacheGroup(grpId).affinity(), fetchFut);
}
}
@@ -1070,11 +1100,11 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
boolean centralizedAff;
if (lateAffAssign) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- cacheCtx.affinity().affinityCache().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+ grp.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
}
centralizedAff = true;
@@ -1101,11 +1131,11 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
private void initAffinityNoLateAssignment(GridDhtPartitionsExchangeFuture fut) throws IgniteCheckedException {
assert !lateAffAssign;
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- initAffinity(registeredCaches.get(cacheCtx.cacheId()), cacheCtx.affinity().affinityCache(), fut, false);
+ initAffinity(registeredGrps.get(grp.groupId()), grp.affinity(), fut);
}
}
@@ -1116,35 +1146,38 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
*/
private IgniteInternalFuture<?> initCoordinatorCaches(final GridDhtPartitionsExchangeFuture fut)
throws IgniteCheckedException {
+ assert lateAffAssign;
+
final List<IgniteInternalFuture<AffinityTopologyVersion>> futs = new ArrayList<>();
- forAllRegisteredCaches(new IgniteInClosureX<DynamicCacheDescriptor>() {
- @Override public void applyx(DynamicCacheDescriptor desc) throws IgniteCheckedException {
- CacheHolder cache = caches.get(desc.cacheId());
+ forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+ @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
+ CacheGroupHolder grpHolder = grpHolders.get(desc.groupId());
- if (cache != null) {
- if (cache.client())
- cache.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+ if (grpHolder != null) {
+ if (grpHolder.client()) // Affinity for non-client holders calculated in {@link #onServerLeft}.
+ grpHolder.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
return;
}
- final Integer cacheId = desc.cacheId();
+ // Need initialize holders and affinity if this node became coordinator during this exchange.
+ final Integer grpId = desc.groupId();
- GridCacheContext cacheCtx = cctx.cacheContext(cacheId);
+ CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
- if (cacheCtx == null) {
- cctx.io().addHandler(desc.cacheId(), GridDhtAffinityAssignmentResponse.class,
+ if (grp == null) {
+ cctx.io().addCacheGroupHandler(desc.groupId(), GridDhtAffinityAssignmentResponse.class,
new IgniteBiInClosure<UUID, GridDhtAffinityAssignmentResponse>() {
@Override public void apply(UUID nodeId, GridDhtAffinityAssignmentResponse res) {
- processAffinityAssignmentResponse(nodeId, res);
+ processAffinityAssignmentResponse(grpId, nodeId, res);
}
}
);
- cache = CacheHolder2.create(cctx, desc, fut, null);
+ grpHolder = CacheGroupHolder2.create(cctx, desc, fut, null);
- final GridAffinityAssignmentCache aff = cache.affinity();
+ final GridAffinityAssignmentCache aff = grpHolder.affinity();
List<GridDhtPartitionsExchangeFuture> exchFuts = cctx.exchange().exchangeFutures();
@@ -1154,9 +1187,10 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
", total=" + exchFuts.size() + ']';
final GridDhtPartitionsExchangeFuture prev = exchFuts.get(idx + 1);
+
if (log.isDebugEnabled()) {
log.debug("Need initialize affinity on coordinator [" +
- "cache=" + desc.cacheConfiguration().getName() +
+ "cacheGrp=" + desc.cacheOrGroupName() +
"prevAff=" + prev.topologyVersion() + ']');
}
@@ -1185,9 +1219,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
futs.add(affFut);
}
else
- cache = new CacheHolder1(cacheCtx, null);
+ grpHolder = new CacheGroupHolder1(grp, null);
- CacheHolder old = caches.put(cache.cacheId(), cache);
+ CacheGroupHolder old = grpHolders.put(grpHolder.groupId(), grpHolder);
assert old == null : old;
}
@@ -1213,38 +1247,36 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @return Cache holder.
* @throws IgniteCheckedException If failed.
*/
- private CacheHolder cache(GridDhtPartitionsExchangeFuture fut, DynamicCacheDescriptor desc)
+ private CacheGroupHolder groupHolder(GridDhtPartitionsExchangeFuture fut, final CacheGroupDescriptor desc)
throws IgniteCheckedException {
assert lateAffAssign;
- final Integer cacheId = desc.cacheId();
-
- CacheHolder cache = caches.get(cacheId);
+ CacheGroupHolder cacheGrp = grpHolders.get(desc.groupId());
- if (cache != null)
- return cache;
+ if (cacheGrp != null)
+ return cacheGrp;
- GridCacheContext cacheCtx = cctx.cacheContext(desc.cacheId());
+ final CacheGroupContext grp = cctx.cache().cacheGroup(desc.groupId());
- if (cacheCtx == null) {
- cctx.io().addHandler(cacheId, GridDhtAffinityAssignmentResponse.class,
+ if (grp == null) {
+ cctx.io().addCacheGroupHandler(desc.groupId(), GridDhtAffinityAssignmentResponse.class,
new IgniteBiInClosure<UUID, GridDhtAffinityAssignmentResponse>() {
@Override public void apply(UUID nodeId, GridDhtAffinityAssignmentResponse res) {
- processAffinityAssignmentResponse(nodeId, res);
+ processAffinityAssignmentResponse(desc.groupId(), nodeId, res);
}
}
);
- cache = CacheHolder2.create(cctx, desc, fut, null);
+ cacheGrp = CacheGroupHolder2.create(cctx, desc, fut, null);
}
else
- cache = new CacheHolder1(cacheCtx, null);
+ cacheGrp = new CacheGroupHolder1(grp, null);
- CacheHolder old = caches.put(cache.cacheId(), cache);
+ CacheGroupHolder old = grpHolders.put(desc.groupId(), cacheGrp);
assert old == null : old;
- return cache;
+ return cacheGrp;
}
/**
@@ -1255,18 +1287,20 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
*/
@Nullable private WaitRebalanceInfo initAffinityOnNodeJoin(final GridDhtPartitionsExchangeFuture fut, boolean crd)
throws IgniteCheckedException {
+ assert lateAffAssign;
+
AffinityTopologyVersion topVer = fut.topologyVersion();
final Map<Object, List<List<ClusterNode>>> affCache = new HashMap<>();
if (!crd) {
- for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
- if (cacheCtx.isLocal())
+ for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
+ if (grp.isLocal())
continue;
- boolean latePrimary = cacheCtx.rebalanceEnabled();
+ boolean latePrimary = grp.rebalanceEnabled();
- initAffinityOnNodeJoin(fut, cacheCtx.affinity().affinityCache(), null, latePrimary, affCache);
+ initAffinityOnNodeJoin(fut, grp.affinity(), null, latePrimary, affCache);
}
return null;
@@ -1274,9 +1308,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
else {
final WaitRebalanceInfo waitRebalanceInfo = new WaitRebalanceInfo(topVer);
- forAllRegisteredCaches(new IgniteInClosureX<DynamicCacheDescriptor>() {
- @Override public void applyx(DynamicCacheDescriptor cacheDesc) throws IgniteCheckedException {
- CacheHolder cache = cache(fut, cacheDesc);
+ forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+ @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
+ CacheGroupHolder cache = groupHolder(fut, desc);
boolean latePrimary = cache.rebalanceEnabled;
@@ -1309,7 +1343,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
AffinityTopologyVersion affTopVer = aff.lastVersion();
- assert affTopVer.topologyVersion() > 0 : "Affinity is not initialized [cache=" + aff.cacheName() +
+ assert affTopVer.topologyVersion() > 0 : "Affinity is not initialized [grp=" + aff.cacheOrGroupName() +
", topVer=" + affTopVer + ", node=" + cctx.localNodeId() + ']';
List<List<ClusterNode>> curAff = aff.assignments(affTopVer);
@@ -1400,7 +1434,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
if (rebalance != null)
- rebalance.add(aff.cacheId(), part, newNodes.get(0).id(), newNodes);
+ rebalance.add(aff.groupId(), part, newNodes.get(0).id(), newNodes);
return nodes0;
}
@@ -1443,6 +1477,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
*/
private Map<Integer, Map<Integer, List<UUID>>> initAffinityOnNodeLeft0(final GridDhtPartitionsExchangeFuture fut)
throws IgniteCheckedException {
+ assert lateAffAssign;
+
final AffinityTopologyVersion topVer = fut.topologyVersion();
final WaitRebalanceInfo waitRebalanceInfo = new WaitRebalanceInfo(topVer);
@@ -1451,24 +1487,24 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
final Map<Integer, Map<Integer, List<UUID>>> assignment = new HashMap<>();
- forAllRegisteredCaches(new IgniteInClosureX<DynamicCacheDescriptor>() {
- @Override public void applyx(DynamicCacheDescriptor cacheDesc) throws IgniteCheckedException {
- CacheHolder cache = cache(fut, cacheDesc);
+ forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+ @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
+ CacheGroupHolder grpHolder = groupHolder(fut, desc);
- if (!cache.rebalanceEnabled)
+ if (!grpHolder.rebalanceEnabled)
return;
- AffinityTopologyVersion affTopVer = cache.affinity().lastVersion();
+ AffinityTopologyVersion affTopVer = grpHolder.affinity().lastVersion();
assert affTopVer.topologyVersion() > 0 && !affTopVer.equals(topVer) : "Invalid affinity version " +
- "[last=" + affTopVer + ", futVer=" + topVer + ", cache=" + cache.name() + ']';
+ "[last=" + affTopVer + ", futVer=" + topVer + ", grp=" + desc.cacheOrGroupName() + ']';
- List<List<ClusterNode>> curAssignment = cache.affinity().assignments(affTopVer);
- List<List<ClusterNode>> newAssignment = cache.affinity().idealAssignment();
+ List<List<ClusterNode>> curAssignment = grpHolder.affinity().assignments(affTopVer);
+ List<List<ClusterNode>> newAssignment = grpHolder.affinity().idealAssignment();
assert newAssignment != null;
- GridDhtPartitionTopology top = cache.topology(fut);
+ GridDhtPartitionTopology top = grpHolder.topology(fut);
Map<Integer, List<UUID>> cacheAssignment = null;
@@ -1482,7 +1518,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
List<ClusterNode> newNodes0 = null;
assert newPrimary == null || aliveNodes.contains(newPrimary) : "Invalid new primary [" +
- "cache=" + cache.name() +
+ "grp=" + desc.cacheOrGroupName() +
", node=" + newPrimary +
", topVer=" + topVer + ']';
@@ -1491,7 +1527,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
GridDhtPartitionState state = top.partitionState(newPrimary.id(), p);
if (state != GridDhtPartitionState.OWNING) {
- newNodes0 = latePrimaryAssignment(cache.affinity(),
+ newNodes0 = latePrimaryAssignment(grpHolder.affinity(),
p,
curPrimary,
newNodes,
@@ -1506,7 +1542,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
ClusterNode curNode = curNodes.get(i);
if (top.partitionState(curNode.id(), p) == GridDhtPartitionState.OWNING) {
- newNodes0 = latePrimaryAssignment(cache.affinity(),
+ newNodes0 = latePrimaryAssignment(grpHolder.affinity(),
p,
curNode,
newNodes,
@@ -1521,7 +1557,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
for (ClusterNode owner : owners) {
if (aliveNodes.contains(owner)) {
- newNodes0 = latePrimaryAssignment(cache.affinity(),
+ newNodes0 = latePrimaryAssignment(grpHolder.affinity(),
p,
owner,
newNodes,
@@ -1544,7 +1580,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
if (cacheAssignment != null)
- assignment.put(cache.cacheId(), cacheAssignment);
+ assignment.put(grpHolder.groupId(), cacheAssignment);
}
});
@@ -1557,7 +1593,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
if (log.isDebugEnabled()) {
log.debug("Computed new affinity after node left [topVer=" + topVer +
- ", waitCaches=" + (info != null ? cacheNames(info.waitCaches.keySet()) : null) + ']');
+ ", waitGrps=" + (info != null ? groupNames(info.waitGrps.keySet()) : null) + ']');
}
}
@@ -1616,7 +1652,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/**
*
*/
- abstract static class CacheHolder {
+ abstract static class CacheGroupHolder {
/** */
private final GridAffinityAssignmentCache aff;
@@ -1628,7 +1664,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @param aff Affinity cache.
* @param initAff Existing affinity cache.
*/
- CacheHolder(boolean rebalanceEnabled,
+ CacheGroupHolder(boolean rebalanceEnabled,
GridAffinityAssignmentCache aff,
@Nullable GridAffinityAssignmentCache initAff) {
this.aff = aff;
@@ -1645,10 +1681,10 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
abstract boolean client();
/**
- * @return Cache ID.
+ * @return Group ID.
*/
- int cacheId() {
- return aff.cacheId();
+ int groupId() {
+ return aff.groupId();
}
/**
@@ -1659,13 +1695,6 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/**
- * @return Cache name.
- */
- String name() {
- return aff.cacheName();
- }
-
- /**
* @param fut Exchange future.
* @return Cache topology.
*/
@@ -1682,20 +1711,20 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/**
* Created cache is started on coordinator.
*/
- private class CacheHolder1 extends CacheHolder {
+ private class CacheGroupHolder1 extends CacheGroupHolder {
/** */
- private final GridCacheContext cctx;
+ private final CacheGroupContext grp;
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
* @param initAff Current affinity.
*/
- CacheHolder1(GridCacheContext cctx, @Nullable GridAffinityAssignmentCache initAff) {
- super(cctx.rebalanceEnabled(), cctx.affinity().affinityCache(), initAff);
+ CacheGroupHolder1(CacheGroupContext grp, @Nullable GridAffinityAssignmentCache initAff) {
+ super(grp.rebalanceEnabled(), grp.affinity(), initAff);
- assert !cctx.isLocal() : cctx.name();
+ assert !grp.isLocal() : grp;
- this.cctx = cctx;
+ this.grp = grp;
}
/** {@inheritDoc} */
@@ -1704,56 +1733,41 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/** {@inheritDoc} */
- @Override public int partitions() {
- return cctx.affinity().partitions();
- }
-
- /** {@inheritDoc} */
- @Override public String name() {
- return cctx.name();
- }
-
- /** {@inheritDoc} */
- @Override public int cacheId() {
- return cctx.cacheId();
- }
-
- /** {@inheritDoc} */
@Override public GridDhtPartitionTopology topology(GridDhtPartitionsExchangeFuture fut) {
- return cctx.topology();
+ return grp.topology();
}
}
/**
* Created if cache is not started on coordinator.
*/
- private static class CacheHolder2 extends CacheHolder {
+ private static class CacheGroupHolder2 extends CacheGroupHolder {
/** */
private final GridCacheSharedContext cctx;
/**
* @param cctx Context.
- * @param cacheDesc Cache descriptor.
+ * @param grpDesc Cache group descriptor.
* @param fut Exchange future.
* @param initAff Current affinity.
* @return Cache holder.
* @throws IgniteCheckedException If failed.
*/
- static CacheHolder2 create(
+ static CacheGroupHolder2 create(
GridCacheSharedContext cctx,
- DynamicCacheDescriptor cacheDesc,
+ CacheGroupDescriptor grpDesc,
GridDhtPartitionsExchangeFuture fut,
@Nullable GridAffinityAssignmentCache initAff) throws IgniteCheckedException {
- assert cacheDesc != null;
+ assert grpDesc != null;
assert !cctx.kernalContext().clientNode();
- CacheConfiguration<?, ?> ccfg = cacheDesc.cacheConfiguration();
+ CacheConfiguration<?, ?> ccfg = grpDesc.config();
- assert ccfg != null : cacheDesc;
+ assert ccfg != null : grpDesc;
assert ccfg.getCacheMode() != LOCAL : ccfg.getName();
- assert !cctx.discovery().cacheAffinityNodes(ccfg.getName(),
- fut.topologyVersion()).contains(cctx.localNode()) : cacheDesc.cacheName();
+ assert !cctx.discovery().cacheGroupAffinityNodes(grpDesc.groupId(),
+ fut.topologyVersion()).contains(cctx.localNode()) : grpDesc.cacheOrGroupName();
AffinityFunction affFunc = cctx.cache().clone(ccfg.getAffinity());
@@ -1763,13 +1777,14 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
U.startLifecycleAware(F.asList(affFunc));
GridAffinityAssignmentCache aff = new GridAffinityAssignmentCache(cctx.kernalContext(),
- ccfg.getName(),
+ grpDesc.cacheOrGroupName(),
+ grpDesc.groupId(),
affFunc,
ccfg.getNodeFilter(),
ccfg.getBackups(),
ccfg.getCacheMode() == LOCAL);
- return new CacheHolder2(ccfg.getRebalanceMode() != NONE, cctx, aff, initAff);
+ return new CacheGroupHolder2(ccfg.getRebalanceMode() != NONE, cctx, aff, initAff);
}
/**
@@ -1778,7 +1793,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @param aff Affinity.
* @param initAff Current affinity.
*/
- CacheHolder2(
+ CacheGroupHolder2(
boolean rebalanceEnabled,
GridCacheSharedContext cctx,
GridAffinityAssignmentCache aff,
@@ -1795,7 +1810,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/** {@inheritDoc} */
@Override public GridDhtPartitionTopology topology(GridDhtPartitionsExchangeFuture fut) {
- return cctx.exchange().clientTopology(cacheId(), fut);
+ return cctx.exchange().clientTopology(groupId(), fut);
}
}
@@ -1807,7 +1822,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
private final AffinityTopologyVersion topVer;
/** */
- private Map<Integer, Map<Integer, UUID>> waitCaches;
+ private Map<Integer, Map<Integer, UUID>> waitGrps;
/** */
private Map<Integer, Map<Integer, List<ClusterNode>>> assignments;
@@ -1826,9 +1841,9 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
* @return {@code True} if there are partitions waiting for rebalancing.
*/
boolean empty() {
- if (waitCaches != null) {
- assert !waitCaches.isEmpty();
- assert waitCaches.size() == assignments.size();
+ if (waitGrps != null) {
+ assert !waitGrps.isEmpty();
+ assert waitGrps.size() == assignments.size();
return false;
}
@@ -1837,34 +1852,34 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
}
/**
- * @param cacheId Cache ID.
+ * @param grpId Group ID.
* @param part Partition.
* @param waitNode Node rebalancing data.
* @param assignment New assignment.
*/
- void add(Integer cacheId, Integer part, UUID waitNode, List<ClusterNode> assignment) {
+ void add(Integer grpId, Integer part, UUID waitNode, List<ClusterNode> assignment) {
assert !F.isEmpty(assignment) : assignment;
- if (waitCaches == null) {
- waitCaches = new HashMap<>();
+ if (waitGrps == null) {
+ waitGrps = new HashMap<>();
assignments = new HashMap<>();
deploymentIds = new HashMap<>();
}
- Map<Integer, UUID> cacheWaitParts = waitCaches.get(cacheId);
+ Map<Integer, UUID> cacheWaitParts = waitGrps.get(grpId);
if (cacheWaitParts == null) {
- waitCaches.put(cacheId, cacheWaitParts = new HashMap<>());
+ waitGrps.put(grpId, cacheWaitParts = new HashMap<>());
- deploymentIds.put(cacheId, registeredCaches.get(cacheId).deploymentId());
+ deploymentIds.put(grpId, registeredGrps.get(grpId).deploymentId());
}
cacheWaitParts.put(part, waitNode);
- Map<Integer, List<ClusterNode>> cacheAssignment = assignments.get(cacheId);
+ Map<Integer, List<ClusterNode>> cacheAssignment = assignments.get(grpId);
if (cacheAssignment == null)
- assignments.put(cacheId, cacheAssignment = new HashMap<>());
+ assignments.put(grpId, cacheAssignment = new HashMap<>());
cacheAssignment.put(part, assignment);
}
@@ -1872,7 +1887,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
/** {@inheritDoc} */
@Override public String toString() {
return "WaitRebalanceInfo [topVer=" + topVer +
- ", caches=" + (waitCaches != null ? waitCaches.keySet() : null) + ']';
+ ", grps=" + (waitGrps != null ? waitGrps.keySet() : null) + ']';
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
index a30331f..6a6f40d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
@@ -31,18 +31,31 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
private static final long serialVersionUID = 0L;
/** */
+ private final Map<Integer, CacheGroupInfo> clientCacheGrps;
+
+ /** */
private final Map<String, CacheInfo> clientCaches;
/**
* @param clientCaches Information about caches started on re-joining client node.
+ * @param clientCacheGrps Information about cach groups started on re-joining client node.
*/
- CacheClientReconnectDiscoveryData(Map<String, CacheInfo> clientCaches) {
+ CacheClientReconnectDiscoveryData(Map<Integer, CacheGroupInfo> clientCacheGrps,
+ Map<String, CacheInfo> clientCaches) {
+ this.clientCacheGrps = clientCacheGrps;
this.clientCaches = clientCaches;
}
/**
* @return Information about caches started on re-joining client node.
*/
+ Map<Integer, CacheGroupInfo> clientCacheGroups() {
+ return clientCacheGrps;
+ }
+
+ /**
+ * @return Information about caches started on re-joining client node.
+ */
Map<String, CacheInfo> clientCaches() {
return clientCaches;
}
@@ -50,6 +63,53 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
/**
*
*/
+ static class CacheGroupInfo implements Serializable {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** */
+ private final CacheConfiguration ccfg;
+
+ /** */
+ private final IgniteUuid deploymentId;
+
+ /** Flags added for future usage. */
+ private final long flags;
+
+ /**
+ * @param ccfg Cache group configuration.
+ * @param deploymentId Cache group deployment ID.
+ * @param flags Flags (for future usage).
+ */
+ CacheGroupInfo(CacheConfiguration ccfg,
+ IgniteUuid deploymentId,
+ long flags) {
+ assert ccfg != null;
+ assert deploymentId != null;
+
+ this.ccfg = ccfg;
+ this.deploymentId = deploymentId;
+ this.flags = flags;
+ }
+
+ /**
+ * @return Cache group configuration.
+ */
+ CacheConfiguration config() {
+ return ccfg;
+ }
+
+ /**
+ * @return Cache group deployment ID.
+ */
+ IgniteUuid deploymentId() {
+ return deploymentId;
+ }
+ }
+
+ /**
+ *
+ */
static class CacheInfo implements Serializable {
/** */
private static final long serialVersionUID = 0L;
@@ -67,7 +127,7 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
private final boolean nearCache;
/** Flags added for future usage. */
- private final byte flags;
+ private final long flags;
/**
* @param ccfg Cache configuration.
@@ -80,7 +140,7 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
CacheType cacheType,
IgniteUuid deploymentId,
boolean nearCache,
- byte flags) {
+ long flags) {
assert ccfg != null;
assert cacheType != null;
assert deploymentId != null;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
index 3e2c259..b728d96 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
@@ -35,7 +35,10 @@ public class CacheData implements Serializable {
private final CacheConfiguration cacheCfg;
/** */
- private final Integer cacheId;
+ private final int cacheId;
+
+ /** */
+ private final int grpId;
/** */
private final CacheType cacheType;
@@ -59,11 +62,12 @@ public class CacheData implements Serializable {
private final boolean template;
/** Flags added for future usage. */
- private final byte flags;
+ private final long flags;
/**
* @param cacheCfg Cache configuration.
* @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param cacheType Cache ID.
* @param deploymentId Cache deployment ID.
* @param schema Query schema.
@@ -75,6 +79,7 @@ public class CacheData implements Serializable {
*/
CacheData(CacheConfiguration cacheCfg,
int cacheId,
+ int grpId,
CacheType cacheType,
IgniteUuid deploymentId,
QuerySchema schema,
@@ -82,14 +87,16 @@ public class CacheData implements Serializable {
boolean staticCfg,
boolean sql,
boolean template,
- byte flags) {
+ long flags) {
assert cacheCfg != null;
assert rcvdFrom != null : cacheCfg.getName();
assert deploymentId != null : cacheCfg.getName();
assert template || cacheId != 0 : cacheCfg.getName();
+ assert template || grpId != 0 : cacheCfg.getName();
this.cacheCfg = cacheCfg;
this.cacheId = cacheId;
+ this.grpId = grpId;
this.cacheType = cacheType;
this.deploymentId = deploymentId;
this.schema = schema;
@@ -101,9 +108,16 @@ public class CacheData implements Serializable {
}
/**
+ * @return Cache group ID.
+ */
+ public int groupId() {
+ return grpId;
+ }
+
+ /**
* @return Cache ID.
*/
- public Integer cacheId() {
+ public int cacheId() {
return cacheId;
}
[02/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalWithGroupFullApiSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalWithGroupFullApiSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalWithGroupFullApiSelfTest.java
new file mode 100644
index 0000000..867a2de
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/local/GridCacheLocalWithGroupFullApiSelfTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.local;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class GridCacheLocalWithGroupFullApiSelfTest extends GridCacheLocalFullApiSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfiguration(String igniteInstanceName) throws Exception {
+ CacheConfiguration ccfg = super.cacheConfiguration(igniteInstanceName);
+
+ ccfg.setGroupName("group1");
+
+ return ccfg;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryConcurrentPartitionUpdateTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryConcurrentPartitionUpdateTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryConcurrentPartitionUpdateTest.java
index 9c7c836..6c74f79 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryConcurrentPartitionUpdateTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryConcurrentPartitionUpdateTest.java
@@ -35,6 +35,7 @@ import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
@@ -78,52 +79,74 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
* @throws Exception If failed.
*/
public void testConcurrentUpdatePartitionAtomic() throws Exception {
- concurrentUpdatePartition(ATOMIC);
+ concurrentUpdatePartition(ATOMIC, false);
}
/**
* @throws Exception If failed.
*/
public void testConcurrentUpdatePartitionTx() throws Exception {
- concurrentUpdatePartition(TRANSACTIONAL);
+ concurrentUpdatePartition(TRANSACTIONAL, false);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testConcurrentUpdatePartitionAtomicCacheGroup() throws Exception {
+ concurrentUpdatePartition(ATOMIC, true);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testConcurrentUpdatePartitionTxCacheGroup() throws Exception {
+ concurrentUpdatePartition(TRANSACTIONAL, true);
}
/**
* @param atomicityMode Cache atomicity mode.
+ * @param cacheGrp {@code True} if test cache multiple caches in the same group.
* @throws Exception If failed.
*/
- private void concurrentUpdatePartition(CacheAtomicityMode atomicityMode) throws Exception {
+ private void concurrentUpdatePartition(CacheAtomicityMode atomicityMode, boolean cacheGrp) throws Exception {
Ignite srv = startGrid(0);
client = true;
Ignite client = startGrid(1);
- CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
+ List<AtomicInteger> cntrs = new ArrayList<>();
+ List<String> caches = new ArrayList<>();
- ccfg.setWriteSynchronizationMode(FULL_SYNC);
- ccfg.setAtomicityMode(atomicityMode);
+ if (cacheGrp) {
+ for (int i = 0; i < 3; i++) {
+ CacheConfiguration<Object, Object> ccfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME + i);
- IgniteCache clientCache = client.createCache(ccfg);
+ ccfg.setGroupName("testGroup");
+ ccfg.setWriteSynchronizationMode(FULL_SYNC);
+ ccfg.setAtomicityMode(atomicityMode);
- final AtomicInteger evtCnt = new AtomicInteger();
+ IgniteCache<Object, Object> cache = client.createCache(ccfg);
- ContinuousQuery<Object, Object> qry = new ContinuousQuery<>();
-
- qry.setLocalListener(new CacheEntryUpdatedListener<Object, Object>() {
- @Override public void onUpdated(Iterable<CacheEntryEvent<?, ?>> evts) {
- for (CacheEntryEvent evt : evts) {
- assertNotNull(evt.getKey());
- assertNotNull(evt.getValue());
+ caches.add(cache.getName());
- evtCnt.incrementAndGet();
- }
+ cntrs.add(startListener(cache).get1());
}
- });
+ }
+ else {
+ CacheConfiguration<Object, Object> ccfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME);
- clientCache.query(qry);
+ ccfg.setWriteSynchronizationMode(FULL_SYNC);
+ ccfg.setAtomicityMode(atomicityMode);
- Affinity<Integer> aff = srv.affinity(DEFAULT_CACHE_NAME);
+ IgniteCache<Object, Object> cache = client.createCache(ccfg);
+
+ caches.add(cache.getName());
+
+ cntrs.add(startListener(cache).get1());
+ }
+
+ Affinity<Integer> aff = srv.affinity(caches.get(0));
final List<Integer> keys = new ArrayList<>();
@@ -143,7 +166,10 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
final int THREADS = 10;
final int UPDATES = 1000;
- final IgniteCache<Object, Object> srvCache = srv.cache(DEFAULT_CACHE_NAME);
+ final List<IgniteCache<Object, Object>> srvCaches = new ArrayList<>();
+
+ for (String cacheName : caches)
+ srvCaches.add(srv.cache(cacheName));
for (int i = 0; i < 15; i++) {
log.info("Iteration: " + i);
@@ -152,60 +178,124 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
@Override public Void call() throws Exception {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
- for (int i = 0; i < UPDATES; i++)
- srvCache.put(keys.get(rnd.nextInt(KEYS)), i);
+ for (int i = 0; i < UPDATES; i++) {
+ for (int c = 0; c < srvCaches.size(); c++)
+ srvCaches.get(c).put(keys.get(rnd.nextInt(KEYS)), i);
+ }
return null;
}
}, THREADS, "update");
- GridTestUtils.waitForCondition(new GridAbsPredicate() {
- @Override public boolean apply() {
- log.info("Events: " + evtCnt.get());
+ for (final AtomicInteger evtCnt : cntrs) {
+ GridTestUtils.waitForCondition(new GridAbsPredicate() {
+ @Override public boolean apply() {
+ log.info("Events: " + evtCnt.get());
- return evtCnt.get() >= THREADS * UPDATES;
- }
- }, 5000);
+ return evtCnt.get() >= THREADS * UPDATES;
+ }
+ }, 5000);
- assertEquals(THREADS * UPDATES, evtCnt.get());
+ assertEquals(THREADS * UPDATES, evtCnt.get());
- evtCnt.set(0);
+ evtCnt.set(0);
+ }
}
}
/**
+ * @param cache Cache.
+ * @return Event counter.
+ */
+ private T2<AtomicInteger, QueryCursor> startListener(IgniteCache<Object, Object> cache) {
+ final AtomicInteger evtCnt = new AtomicInteger();
+
+ ContinuousQuery<Object, Object> qry = new ContinuousQuery<>();
+
+ qry.setLocalListener(new CacheEntryUpdatedListener<Object, Object>() {
+ @Override public void onUpdated(Iterable<CacheEntryEvent<?, ?>> evts) {
+ for (CacheEntryEvent evt : evts) {
+ assertNotNull(evt.getKey());
+ assertNotNull(evt.getValue());
+
+ if ((Integer)evt.getValue() >= 0)
+ evtCnt.incrementAndGet();
+ }
+ }
+ });
+
+ QueryCursor cur = cache.query(qry);
+
+ return new T2<>(evtCnt, cur);
+ }
+
+ /**
* @throws Exception If failed.
*/
public void testConcurrentUpdatesAndQueryStartAtomic() throws Exception {
- concurrentUpdatesAndQueryStart(ATOMIC);
+ concurrentUpdatesAndQueryStart(ATOMIC, false);
}
/**
* @throws Exception If failed.
*/
public void testConcurrentUpdatesAndQueryStartTx() throws Exception {
- concurrentUpdatesAndQueryStart(TRANSACTIONAL);
+ concurrentUpdatesAndQueryStart(TRANSACTIONAL, false);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void _testConcurrentUpdatesAndQueryStartAtomicCacheGroup() throws Exception {
+ concurrentUpdatesAndQueryStart(ATOMIC, true);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void _testConcurrentUpdatesAndQueryStartTxCacheGroup() throws Exception {
+ concurrentUpdatesAndQueryStart(TRANSACTIONAL, true);
}
/**
* @param atomicityMode Cache atomicity mode.
+ * @param cacheGrp {@code True} if test cache multiple caches in the same group.
* @throws Exception If failed.
*/
- private void concurrentUpdatesAndQueryStart(CacheAtomicityMode atomicityMode) throws Exception {
+ private void concurrentUpdatesAndQueryStart(CacheAtomicityMode atomicityMode, boolean cacheGrp) throws Exception {
Ignite srv = startGrid(0);
client = true;
Ignite client = startGrid(1);
- CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
+ List<String> caches = new ArrayList<>();
+
+ if (cacheGrp) {
+ for (int i = 0; i < 3; i++) {
+ CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME + i);
- ccfg.setWriteSynchronizationMode(FULL_SYNC);
- ccfg.setAtomicityMode(atomicityMode);
+ ccfg.setGroupName("testGroup");
+ ccfg.setWriteSynchronizationMode(FULL_SYNC);
+ ccfg.setAtomicityMode(atomicityMode);
- IgniteCache clientCache = client.createCache(ccfg);
+ IgniteCache cache = client.createCache(ccfg);
- Affinity<Integer> aff = srv.affinity(DEFAULT_CACHE_NAME);
+ caches.add(cache.getName());
+ }
+ }
+ else {
+ CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
+
+ ccfg.setWriteSynchronizationMode(FULL_SYNC);
+ ccfg.setAtomicityMode(atomicityMode);
+
+ IgniteCache cache = client.createCache(ccfg);
+
+ caches.add(cache.getName());
+ }
+
+ Affinity<Integer> aff = srv.affinity(caches.get(0));
final List<Integer> keys = new ArrayList<>();
@@ -225,38 +315,27 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
final int THREADS = 10;
final int UPDATES = 1000;
- for (int i = 0; i < 5; i++) {
- log.info("Iteration: " + i);
-
- ContinuousQuery<Object, Object> qry = new ContinuousQuery<>();
-
- final AtomicInteger evtCnt = new AtomicInteger();
-
- qry.setLocalListener(new CacheEntryUpdatedListener<Object, Object>() {
- @Override public void onUpdated(Iterable<CacheEntryEvent<?, ?>> evts) {
- for (CacheEntryEvent evt : evts) {
- assertNotNull(evt.getKey());
- assertNotNull(evt.getValue());
+ final List<IgniteCache<Object, Object>> srvCaches = new ArrayList<>();
- if ((Integer)evt.getValue() >= 0)
- evtCnt.incrementAndGet();
- }
- }
- });
-
- QueryCursor cur;
+ for (String cacheName : caches)
+ srvCaches.add(srv.cache(cacheName));
- final IgniteCache<Object, Object> srvCache = srv.cache(DEFAULT_CACHE_NAME);
+ for (int i = 0; i < 5; i++) {
+ log.info("Iteration: " + i);
final AtomicBoolean stop = new AtomicBoolean();
+ List<T2<AtomicInteger, QueryCursor> > qrys = new ArrayList<>();
+
try {
IgniteInternalFuture fut = GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
@Override public Void call() throws Exception {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
- while (!stop.get())
- srvCache.put(keys.get(rnd.nextInt(KEYS)), rnd.nextInt(100) - 200);
+ while (!stop.get()) {
+ for (IgniteCache<Object, Object> srvCache : srvCaches)
+ srvCache.put(keys.get(rnd.nextInt(KEYS)), rnd.nextInt(100) - 200);
+ }
return null;
}
@@ -264,7 +343,8 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
U.sleep(1000);
- cur = clientCache.query(qry);
+ for (String cache : caches)
+ qrys.add(startListener(client.cache(cache)));
U.sleep(1000);
@@ -280,25 +360,30 @@ public class CacheContinuousQueryConcurrentPartitionUpdateTest extends GridCommo
@Override public Void call() throws Exception {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
- for (int i = 0; i < UPDATES; i++)
- srvCache.put(keys.get(rnd.nextInt(KEYS)), i);
+ for (int i = 0; i < UPDATES; i++) {
+ for (IgniteCache<Object, Object> srvCache : srvCaches)
+ srvCache.put(keys.get(rnd.nextInt(KEYS)), i);
+ }
return null;
}
}, THREADS, "update");
+ for (T2<AtomicInteger, QueryCursor> qry : qrys) {
+ final AtomicInteger evtCnt = qry.get1();
- GridTestUtils.waitForCondition(new GridAbsPredicate() {
- @Override public boolean apply() {
- log.info("Events: " + evtCnt.get());
+ GridTestUtils.waitForCondition(new GridAbsPredicate() {
+ @Override public boolean apply() {
+ log.info("Events: " + evtCnt.get());
- return evtCnt.get() >= THREADS * UPDATES;
- }
- }, 5000);
+ return evtCnt.get() >= THREADS * UPDATES;
+ }
+ }, 5000);
- assertEquals(THREADS * UPDATES, evtCnt.get());
+ assertEquals(THREADS * UPDATES, qry.get1().get());
- cur.close();
+ qry.get2().close();
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryFailoverAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryFailoverAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryFailoverAbstractSelfTest.java
index 2fb7fcb..54791d7 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryFailoverAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryFailoverAbstractSelfTest.java
@@ -2243,13 +2243,11 @@ public abstract class CacheContinuousQueryFailoverAbstractSelfTest extends GridC
* @throws Exception If failed.
*/
public void testNoEventLossOnTopologyChange() throws Exception {
- final int stableNodeCnt = 1;
-
final int batchLoadSize = 2000;
final int restartCycles = 5;
- Ignite qryClient = startGridsMultiThreaded(stableNodeCnt);
+ Ignite qryClient = startGrid(0);
final CacheEventListener4 lsnr = new CacheEventListener4(atomicityMode() == CacheAtomicityMode.ATOMIC);
@@ -2282,7 +2280,7 @@ public abstract class CacheContinuousQueryFailoverAbstractSelfTest extends GridC
log.info("Batch loaded. Iteration: " + iteration);
- final long expCnt = putCnt * stableNodeCnt + ignoredDupEvts;
+ final long expCnt = putCnt + ignoredDupEvts;
GridTestUtils.waitForCondition(new GridAbsPredicate() {
@Override public boolean apply() {
@@ -2316,7 +2314,6 @@ public abstract class CacheContinuousQueryFailoverAbstractSelfTest extends GridC
String msg = sb.toString();
// In atomic mode CQ can receive duplicate update events if update retried after fails.
- // E.g. topology change
if (atomicityMode() == CacheAtomicityMode.ATOMIC && msg.isEmpty() && cnt > expCnt)
ignoredDupEvts += cnt - expCnt;
else
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxOptimisticDeadlockDetectionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxOptimisticDeadlockDetectionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxOptimisticDeadlockDetectionTest.java
index b48c4ba..1573576 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxOptimisticDeadlockDetectionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxOptimisticDeadlockDetectionTest.java
@@ -399,7 +399,7 @@ public class TxOptimisticDeadlockDetectionTest extends GridCommonAbstractTest {
KeyCacheObject keyCacheObj = intCache.context().toCacheKeyObject(key0);
- GridCacheMapEntry entry = map.getEntry(keyCacheObj);
+ GridCacheMapEntry entry = map.getEntry(intCache.context(), keyCacheObj);
if (entry != null)
assertNull("Entry still has locks " + entry, entry.mvccAllLocal());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPessimisticDeadlockDetectionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPessimisticDeadlockDetectionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPessimisticDeadlockDetectionTest.java
index bc297a2..61f7125 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPessimisticDeadlockDetectionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxPessimisticDeadlockDetectionTest.java
@@ -408,7 +408,7 @@ public class TxPessimisticDeadlockDetectionTest extends GridCommonAbstractTest {
KeyCacheObject keyCacheObj = intCache.context().toCacheKeyObject(key0);
- GridCacheMapEntry entry = map.getEntry(keyCacheObj);
+ GridCacheMapEntry entry = map.getEntry(intCache.context(), keyCacheObj);
if (entry != null)
assertNull("Entry still has locks " + entry, entry.mvccAllLocal());
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
index 2096179..44a075e 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
@@ -79,14 +79,11 @@ public class GridCacheTestContext<K, V> extends GridCacheContext<K, V> {
null
),
defaultCacheConfiguration(),
+ null,
CacheType.USER,
AffinityTopologyVersion.ZERO,
- UUID.randomUUID(),
true,
true,
- null,
- null,
- null,
new GridCacheEventManager(),
new CacheOsStoreManager(null, new CacheConfiguration()),
new GridCacheEvictionManager(),
@@ -95,7 +92,6 @@ public class GridCacheTestContext<K, V> extends GridCacheContext<K, V> {
new CacheDataStructuresManager(),
new GridCacheTtlManager(),
new GridOsCacheDrManager(),
- null,
new CacheOsConflictResolutionManager<K, V>(),
new CachePluginManager(ctx, new CacheConfiguration()),
new GridCacheAffinityManager()
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
index 25ff2fd..4a6b765 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/communication/GridCacheMessageSelfTest.java
@@ -216,6 +216,16 @@ public class GridCacheMessageSelfTest extends GridCommonAbstractTest {
}
/** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public boolean addDeploymentInfo() {
return false;
}
@@ -311,6 +321,16 @@ public class GridCacheMessageSelfTest extends GridCommonAbstractTest {
}
/** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public boolean addDeploymentInfo() {
return false;
}
@@ -434,6 +454,16 @@ public class GridCacheMessageSelfTest extends GridCommonAbstractTest {
}
/** {@inheritDoc} */
+ @Override public int handlerId() {
+ return 0;
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean cacheGroupMessage() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
@Override public boolean addDeploymentInfo() {
return false;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index 1f096e4..a5a2401 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -68,6 +68,7 @@ import org.apache.ignite.internal.binary.BinaryContext;
import org.apache.ignite.internal.binary.BinaryEnumCache;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.CacheGroupContext;
import org.apache.ignite.internal.processors.resource.GridSpringResourceContext;
import org.apache.ignite.internal.util.GridClassLoaderCache;
import org.apache.ignite.internal.util.GridTestClockTimer;
@@ -2117,6 +2118,22 @@ public abstract class GridAbstractTest extends TestCase {
}
/**
+ * @param node Node.
+ * @param cacheName Cache name.
+ * @return Cache group ID for given cache name.
+ */
+ protected final int groupIdForCache(Ignite node, String cacheName) {
+ for (CacheGroupContext grp : ((IgniteKernal)node).context().cache().cacheGroups()) {
+ if (grp.hasCache(cacheName))
+ return grp.groupId();
+ }
+
+ fail("Failed to find group for cache: " + cacheName);
+
+ return 0;
+ }
+
+ /**
*
*/
private static interface WriteReplaceOwner {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index cf68c3c..306e298 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -65,6 +65,8 @@ import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.affinity.GridAffinityFunctionContextImpl;
+import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
+import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheExplicitLockSpan;
@@ -1731,4 +1733,66 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
return U.field(tm, "completedVersHashMap");
}
+
+ /**
+ *
+ */
+ protected final void checkCacheDiscoveryDataConsistent() {
+ Map<Integer, CacheGroupDescriptor> cacheGrps = null;
+ Map<String, DynamicCacheDescriptor> caches = null;
+
+ for (Ignite node : G.allGrids()) {
+ Map<Integer, CacheGroupDescriptor> cacheGrps0 =
+ ((IgniteKernal)node).context().cache().cacheGroupDescriptors();
+ Map<String, DynamicCacheDescriptor> caches0 =
+ ((IgniteKernal)node).context().cache().cacheDescriptors();
+
+ assertNotNull(cacheGrps0);
+ assertNotNull(caches0);
+
+ if (cacheGrps == null) {
+ cacheGrps = cacheGrps0;
+ caches = caches0;
+ }
+ else {
+ assertEquals(cacheGrps.size(), cacheGrps0.size());
+
+ for (Map.Entry<Integer, CacheGroupDescriptor> e : cacheGrps.entrySet()) {
+ CacheGroupDescriptor desc = e.getValue();
+ CacheGroupDescriptor desc0 = cacheGrps0.get(e.getKey());
+
+ assertNotNull(desc0);
+ checkGroupDescriptorsData(desc, desc0);
+ }
+
+ for (Map.Entry<String, DynamicCacheDescriptor> e : caches.entrySet()) {
+ DynamicCacheDescriptor desc = e.getValue();
+ DynamicCacheDescriptor desc0 = caches.get(e.getKey());
+
+ assertNotNull(desc0);
+ assertEquals(desc.deploymentId(), desc0.deploymentId());
+ assertEquals(desc.receivedFrom(), desc0.receivedFrom());
+ assertEquals(desc.startTopologyVersion(), desc0.startTopologyVersion());
+ assertEquals(desc.cacheConfiguration().getName(), desc0.cacheConfiguration().getName());
+ assertEquals(desc.cacheConfiguration().getGroupName(), desc0.cacheConfiguration().getGroupName());
+ checkGroupDescriptorsData(desc.groupDescriptor(), desc0.groupDescriptor());
+ }
+ }
+ }
+ }
+
+ /**
+ * @param desc First descriptor.
+ * @param desc0 Second descriptor.
+ */
+ private void checkGroupDescriptorsData(CacheGroupDescriptor desc, CacheGroupDescriptor desc0) {
+ assertEquals(desc.groupName(), desc0.groupName());
+ assertEquals(desc.sharedGroup(), desc0.sharedGroup());
+ assertEquals(desc.deploymentId(), desc0.deploymentId());
+ assertEquals(desc.receivedFrom(), desc0.receivedFrom());
+ assertEquals(desc.startTopologyVersion(), desc0.startTopologyVersion());
+ assertEquals(desc.config().getName(), desc0.config().getName());
+ assertEquals(desc.config().getGroupName(), desc0.config().getGroupName());
+ assertEquals(desc.caches(), desc0.caches());
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
index 710b2a1..11a4a10 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePart
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledMultiNodeP2PDisabledFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledOnheapFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledOnheapMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.CachePartitionedMultiNodeLongTxTimeoutFullApiTest;
@@ -38,7 +39,9 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAto
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicLateAffDisabledMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicMultiNodeP2PDisabledFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicMultiNodeWithGroupFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearEnabledMultiNodeFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearOnlyMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicNearOnlyMultiNodeP2PDisabledFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCacheAtomicOnheapFullApiSelfTest;
@@ -58,6 +61,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePar
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeCounterSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeP2PDisabledFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedMultiNodeWithGroupFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNearOnlyNoPrimaryFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedOnheapFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedOnheapMultiNodeFullApiSelfTest;
@@ -71,8 +75,10 @@ import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCa
import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCacheReplicatedMultiNodeP2PDisabledFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.replicated.GridCacheReplicatedNearOnlyMultiNodeFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.local.GridCacheLocalAtomicFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.local.GridCacheLocalAtomicWithGroupFullApiSelfTest;
import org.apache.ignite.internal.processors.cache.local.GridCacheLocalFullApiMultithreadedSelfTest;
import org.apache.ignite.internal.processors.cache.local.GridCacheLocalFullApiSelfTest;
+import org.apache.ignite.internal.processors.cache.local.GridCacheLocalWithGroupFullApiSelfTest;
/**
* Test suite for cache API.
@@ -161,6 +167,13 @@ public class IgniteCacheFullApiSelfTestSuite extends TestSuite {
// Other.
suite.addTestSuite(GridCacheClearSelfTest.class);
+ suite.addTestSuite(GridCacheLocalWithGroupFullApiSelfTest.class);
+ suite.addTestSuite(GridCacheLocalAtomicWithGroupFullApiSelfTest.class);
+ suite.addTestSuite(GridCacheAtomicMultiNodeWithGroupFullApiSelfTest.class);
+ suite.addTestSuite(GridCacheAtomicNearEnabledMultiNodeWithGroupFullApiSelfTest.class);
+ suite.addTestSuite(GridCachePartitionedMultiNodeWithGroupFullApiSelfTest.class);
+ suite.addTestSuite(GridCachePartitionedNearDisabledMultiNodeWithGroupFullApiSelfTest.class);
+
return suite;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
index 222ac30..f0c0c5a 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite3.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheValueConsistencyTran
import org.apache.ignite.internal.processors.cache.GridCacheValueConsistencyTransactionalSelfTest;
import org.apache.ignite.internal.processors.cache.GridCacheVersionSelfTest;
import org.apache.ignite.internal.processors.cache.GridCacheVersionTopologyChangeTest;
+import org.apache.ignite.internal.processors.cache.IgniteCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteCacheInterceptorSelfTestSuite;
import org.apache.ignite.internal.processors.cache.IgniteCacheScanPredicateDeploymentSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheAsyncOperationsTest;
@@ -195,6 +196,8 @@ public class IgniteCacheTestSuite3 extends TestSuite {
suite.addTestSuite(CacheAsyncOperationsTest.class);
+ suite.addTestSuite(IgniteCacheGroupsTest.class);
+
return suite;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
index 7baea2e..18b9258 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
@@ -37,6 +37,7 @@ import org.apache.ignite.internal.processors.cache.PartitionsExchangeOnDiscovery
import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentNodeJoinValidationTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteActiveOnStartNodeJoinValidationSelfTest;
+import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheGroupsPartitionLossPolicySelfTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePartitionLossPolicySelfTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteCacheTxIteratorSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.IgniteCacheAtomicProtocolTest;
@@ -73,6 +74,7 @@ public class IgniteCacheTestSuite5 extends TestSuite {
suite.addTestSuite(ClusterStatePartitionedSelfTest.class);
suite.addTestSuite(ClusterStateReplicatedSelfTest.class);
suite.addTestSuite(IgniteCachePartitionLossPolicySelfTest.class);
+ suite.addTestSuite(IgniteCacheGroupsPartitionLossPolicySelfTest.class);
suite.addTestSuite(CacheRebalancingSelfTest.class);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteTopologyValidatorTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteTopologyValidatorTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteTopologyValidatorTestSuite.java
index 58c754e..1c9b852 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteTopologyValidatorTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteTopologyValidatorTestSuite.java
@@ -19,11 +19,17 @@ package org.apache.ignite.testsuites;
import junit.framework.TestSuite;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorGridSplitCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorNearPartitionedAtomicCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorNearPartitionedTxCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorPartitionedAtomicCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorPartitionedTxCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorPartitionedTxCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorReplicatedAtomicCacheTest;
+import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorReplicatedTxCacheGroupsTest;
import org.apache.ignite.internal.processors.cache.IgniteTopologyValidatorReplicatedTxCacheTest;
/**
@@ -43,6 +49,14 @@ public class IgniteTopologyValidatorTestSuite extends TestSuite {
suite.addTest(new TestSuite(IgniteTopologyValidatorPartitionedTxCacheTest.class));
suite.addTest(new TestSuite(IgniteTopologyValidatorReplicatedAtomicCacheTest.class));
suite.addTest(new TestSuite(IgniteTopologyValidatorReplicatedTxCacheTest.class));
+
+ suite.addTest(new TestSuite(IgniteTopologyValidatorNearPartitionedAtomicCacheGroupsTest.class));
+ suite.addTest(new TestSuite(IgniteTopologyValidatorNearPartitionedTxCacheGroupsTest.class));
+ suite.addTest(new TestSuite(IgniteTopologyValidatorPartitionedAtomicCacheGroupsTest.class));
+ suite.addTest(new TestSuite(IgniteTopologyValidatorPartitionedTxCacheGroupsTest.class));
+ suite.addTest(new TestSuite(IgniteTopologyValidatorReplicatedAtomicCacheGroupsTest.class));
+ suite.addTest(new TestSuite(IgniteTopologyValidatorReplicatedTxCacheGroupsTest.class));
+
suite.addTest(new TestSuite(IgniteTopologyValidatorGridSplitCacheTest.class));
return suite;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
index 7caf354..0440615 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2PkHashIndex.java
@@ -108,7 +108,7 @@ public class H2PkHashIndex extends GridH2IndexBase {
List<GridCursor<? extends CacheDataRow>> cursors = new ArrayList<>();
for (IgniteCacheOffheapManager.CacheDataStore store : cctx.offheap().cacheDataStores())
- cursors.add(store.cursor(lowerObj, upperObj));
+ cursors.add(store.cursor(cctx.cacheId(), lowerObj, upperObj));
return new H2Cursor(new CompositeGridCursor<>(cursors.iterator()), p);
}
@@ -126,7 +126,7 @@ public class H2PkHashIndex extends GridH2IndexBase {
@Override public GridH2Row findOne(GridH2Row row) {
try {
for (IgniteCacheOffheapManager.CacheDataStore store : cctx.offheap().cacheDataStores()) {
- CacheDataRow found = store.find(row.key);
+ CacheDataRow found = store.find(cctx, row.key);
if (found != null)
tbl.rowDescriptor().createRow(row.key(), row.partition(), row.value(), row.version(), 0);
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
index 2024c36..86b2749 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
@@ -59,7 +59,7 @@ public class H2RowFactory {
final CacheDataRowAdapter rowBuilder = new CacheDataRowAdapter(link);
- rowBuilder.initFromLink(cctx, CacheDataRowAdapter.RowData.FULL);
+ rowBuilder.initFromLink(cctx.group(), CacheDataRowAdapter.RowData.FULL);
GridH2Row row;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
index f673717..f2b8bad 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
@@ -63,7 +63,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
/**
* @param name Tree name.
* @param reuseList Reuse list.
- * @param cacheId Cache ID.
+ * @param grpId Cache group ID.
* @param pageMem Page memory.
* @param wal Write ahead log manager.
* @param rowStore Row data store.
@@ -74,7 +74,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
protected H2Tree(
String name,
ReuseList reuseList,
- int cacheId,
+ int grpId,
PageMemory pageMem,
IgniteWriteAheadLogManager wal,
AtomicLong globalRmvId,
@@ -85,7 +85,7 @@ public abstract class H2Tree extends BPlusTree<SearchRow, GridH2Row> {
List<InlineIndexHelper> inlineIdxs,
int inlineSize
) throws IgniteCheckedException {
- super(name, cacheId, pageMem, wal, globalRmvId, metaPageId, reuseList);
+ super(name, grpId, pageMem, wal, globalRmvId, metaPageId, reuseList);
if (!initNew) {
// Page is ready - read inline size from it.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
index c1c1d9c..0cfb6a0 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
@@ -100,8 +100,6 @@ public class H2TreeIndex extends GridH2IndexBase {
name = BPlusTree.treeName(name, "H2Tree");
if (cctx.affinityNode()) {
- IgniteCacheDatabaseSharedManager dbMgr = cctx.shared().database();
-
inlineIdxs = getAvailableInlineColumns(cols);
segments = new H2Tree[segmentsCnt];
@@ -110,8 +108,9 @@ public class H2TreeIndex extends GridH2IndexBase {
RootPage page = getMetaPage(name, i);
segments[i] = new H2Tree(
- name,cctx.offheap().reuseListForIndex(name),
- cctx.cacheId(),
+ name,
+ cctx.offheap().reuseListForIndex(name),
+ cctx.groupId(),
cctx.memoryPolicy().pageMemory(),
cctx.shared().wal(),
cctx.offheap().globalRemoveId(),
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
index fb2129b..060636b 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java
@@ -171,7 +171,7 @@ public class DdlStatementsProcessor {
ccfg.setSqlSchema(cmd.schemaName());
SchemaOperationException err =
- QueryUtils.checkQueryEntityConflicts(ccfg, ctx.cache().cacheDescriptors());
+ QueryUtils.checkQueryEntityConflicts(ccfg, ctx.cache().cacheDescriptors().values());
if (err != null)
throw err;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
index f05fa5b..b85fa61 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridReduceQueryExecutor.java
@@ -1026,12 +1026,12 @@ public class GridReduceQueryExecutor {
}
/**
- * @param cacheName Cache name.
+ * @param grpId Cache group ID.
* @param topVer Topology version.
* @return Collection of data nodes.
*/
- private Collection<ClusterNode> dataNodes(String cacheName, AffinityTopologyVersion topVer) {
- Collection<ClusterNode> res = ctx.discovery().cacheAffinityNodes(cacheName, topVer);
+ private Collection<ClusterNode> dataNodes(int grpId, AffinityTopologyVersion topVer) {
+ Collection<ClusterNode> res = ctx.discovery().cacheGroupAffinityNodes(grpId, topVer);
return res != null ? res : Collections.<ClusterNode>emptySet();
}
@@ -1047,7 +1047,7 @@ public class GridReduceQueryExecutor {
String cacheName = cctx.name();
- Set<ClusterNode> dataNodes = new HashSet<>(dataNodes(cacheName, NONE));
+ Set<ClusterNode> dataNodes = new HashSet<>(dataNodes(cctx.groupId(), NONE));
if (dataNodes.isEmpty())
throw new CacheException("Failed to find data nodes for cache: " + cacheName);
@@ -1110,7 +1110,7 @@ public class GridReduceQueryExecutor {
continue;
}
- else if (!F.isEmpty(dataNodes(cctx.name(), NONE)))
+ else if (!F.isEmpty(dataNodes(cctx.groupId(), NONE)))
return null; // Retry.
throw new CacheException("Failed to find data nodes [cache=" + cctx.name() + ", part=" + p + "]");
@@ -1139,7 +1139,7 @@ public class GridReduceQueryExecutor {
continue; // Skip unmapped partitions.
if (F.isEmpty(owners)) {
- if (!F.isEmpty(dataNodes(extraCctx.name(), NONE)))
+ if (!F.isEmpty(dataNodes(extraCctx.groupId(), NONE)))
return null; // Retry.
throw new CacheException("Failed to find data nodes [cache=" + extraCctx.name() +
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsSqlTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsSqlTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsSqlTest.java
new file mode 100644
index 0000000..a7c81fd
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsSqlTest.java
@@ -0,0 +1,312 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.binary.AffinityKey;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+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.CacheMode.PARTITIONED;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsSqlTest extends GridCommonAbstractTest {
+ /** */
+ private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+ /** */
+ private static final String GROUP1 = "grp1";
+
+ /** */
+ private static final String GROUP2 = "grp2";
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+ ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ super.beforeTest();
+
+ startGridsMultiThreaded(3);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ stopAllGrids();
+
+ super.afterTest();
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testSqlQuery() throws Exception {
+ Ignite node = ignite(0);
+
+ IgniteCache c1 = node.createCache(personCacheConfiguration(GROUP1, "c1"));
+ IgniteCache c2 = node.createCache(personCacheConfiguration(GROUP1, "c2"));
+
+ SqlFieldsQuery qry = new SqlFieldsQuery("select name from Person where name=?");
+ qry.setArgs("p1");
+
+ assertEquals(0, c1.query(qry).getAll().size());
+ assertEquals(0, c2.query(qry).getAll().size());
+
+ c1.put(1, new Person("p1"));
+
+ assertEquals(1, c1.query(qry).getAll().size());
+ assertEquals(0, c2.query(qry).getAll().size());
+
+ c2.put(2, new Person("p1"));
+
+ assertEquals(1, c1.query(qry).getAll().size());
+ assertEquals(1, c2.query(qry).getAll().size());
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery1() throws Exception {
+ joinQuery(GROUP1, GROUP2, REPLICATED, PARTITIONED, TRANSACTIONAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery2() throws Exception {
+ GridTestUtils.assertThrows(log, new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ joinQuery(GROUP1, GROUP1, REPLICATED, PARTITIONED, TRANSACTIONAL, TRANSACTIONAL);
+ return null;
+ }
+ }, IgniteCheckedException.class, "Cache mode mismatch for caches related to the same group");
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery3() throws Exception {
+ joinQuery(GROUP1, GROUP1, PARTITIONED, PARTITIONED, TRANSACTIONAL, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery4() throws Exception {
+ joinQuery(GROUP1, GROUP1, REPLICATED, REPLICATED, ATOMIC, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery5() throws Exception {
+ joinQuery(GROUP1, null, REPLICATED, PARTITIONED, TRANSACTIONAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testJoinQuery6() throws Exception {
+ joinQuery(GROUP1, null, PARTITIONED, PARTITIONED, TRANSACTIONAL, ATOMIC);
+ }
+
+ /**
+ * @param grp1 First cache group.
+ * @param grp2 Second cache group.
+ * @param cm1 First cache mode.
+ * @param cm2 Second cache mode.
+ * @param cam1 First cache atomicity mode.
+ * @param cam2 Second cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void joinQuery(String grp1, String grp2, CacheMode cm1,
+ CacheMode cm2, CacheAtomicityMode cam1, CacheAtomicityMode cam2) throws Exception {
+ int keys = 1000;
+ int accsPerPerson = 4;
+
+ Ignite srv0 = ignite(0);
+
+ IgniteCache pers = srv0.createCache(personCacheConfiguration(grp1, "pers")
+ .setAffinity(new RendezvousAffinityFunction().setPartitions(10))
+ .setCacheMode(cm1)
+ .setAtomicityMode(cam1));
+
+ IgniteCache acc = srv0.createCache(accountCacheConfiguration(grp2, "acc")
+ .setAffinity(new RendezvousAffinityFunction().setPartitions(10))
+ .setCacheMode(cm2)
+ .setAtomicityMode(cam2));
+
+ try(Transaction tx = cam1 == TRANSACTIONAL || cam2 == TRANSACTIONAL ? srv0.transactions().txStart() : null) {
+ for (int i = 0; i < keys; i++) {
+
+ int pKey = i - (i % accsPerPerson);
+
+ if (i % accsPerPerson == 0)
+ pers.put(pKey, new Person("pers-" + pKey));
+
+
+ acc.put(new AffinityKey(i, pKey), new Account(pKey, "acc-" + i));
+ }
+
+ if (tx != null)
+ tx.commit();
+ }
+
+ Ignite node = ignite(2);
+
+ SqlFieldsQuery qry = new SqlFieldsQuery(
+ "select p._key as p_key, p.name, a._key as a_key, a.personId, a.attr \n" +
+ "from \"pers\".Person p inner join \"acc\".Account a \n" +
+ "on (p._key = a.personId)");
+
+ IgniteCache<Object, Object> cache = node.cache("acc");
+
+ List<List<?>> res = cache.query(qry).getAll();
+
+ assertEquals(keys, res.size());
+
+ for (List<?> row : res)
+ assertEquals(row.get(0), row.get(3));
+ }
+
+ /**
+ * @param grpName Group name.
+ * @param cacheName Cache name.
+ * @return Person cache configuration.
+ */
+ private CacheConfiguration personCacheConfiguration(String grpName, String cacheName) {
+ QueryEntity entity = new QueryEntity();
+
+ entity.setKeyType(Integer.class.getName());
+ entity.setValueType(Person.class.getName());
+ entity.addQueryField("name", String.class.getName(), null);
+
+ return cacheConfiguration(grpName, cacheName, entity);
+ }
+
+ /**
+ * @param grpName Group name.
+ * @param cacheName Cache name.
+ * @return Account cache configuration.
+ */
+ private CacheConfiguration accountCacheConfiguration(String grpName, String cacheName) {
+ QueryEntity entity = new QueryEntity();
+
+ entity.setKeyType(AffinityKey.class.getName());
+ entity.setValueType(Account.class.getName());
+ entity.addQueryField("personId", Integer.class.getName(), null);
+ entity.addQueryField("attr", String.class.getName(), null);
+ entity.setIndexes(F.asList(new QueryIndex("personId")));
+
+ return cacheConfiguration(grpName, cacheName, entity);
+ }
+
+ /**
+ * @param grpName Group name.
+ * @param cacheName Cache name.
+ * @param queryEntity Query entity.
+ * @return Cache configuration.
+ */
+ private CacheConfiguration cacheConfiguration(String grpName, String cacheName, QueryEntity queryEntity) {
+ CacheConfiguration ccfg = new CacheConfiguration();
+
+ ccfg.setWriteSynchronizationMode(FULL_SYNC);
+ ccfg.setGroupName(grpName);
+ ccfg.setName(cacheName);
+
+ ccfg.setQueryEntities(F.asList(queryEntity));
+
+ return ccfg;
+ }
+
+ /**
+ *
+ */
+ private static class Person implements Serializable {
+ /** */
+ String name;
+
+ /**
+ * @param name Name.
+ */
+ public Person(String name) {
+ this.name = name;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(Person.class, this);
+ }
+ }
+
+ /**
+ *
+ */
+ private static class Account implements Serializable {
+ /** */
+ Integer personId;
+
+ /** */
+ String attr;
+
+ /**
+ * @param personId Person ID.
+ * @param attr Attribute (some data).
+ */
+ public Account(Integer personId, String attr) {
+ this.personId = personId;
+ this.attr = attr;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(Account.class, this);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheNoClassQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheNoClassQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheNoClassQuerySelfTest.java
index b03e948..50d6de4 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheNoClassQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheNoClassQuerySelfTest.java
@@ -20,13 +20,10 @@ package org.apache.ignite.internal.processors.cache;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.cache.CacheAtomicityMode;
import org.apache.ignite.cache.QueryEntity;
import org.apache.ignite.cache.QueryIndex;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.NearCacheConfiguration;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
@@ -44,23 +41,6 @@ public class IgniteCacheNoClassQuerySelfTest extends GridCommonAbstractTest {
/** */
private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
- /** */
- protected Ignite ignite;
-
- /**
- * @return Atomicity mode.
- */
- protected CacheAtomicityMode atomicityMode() {
- return TRANSACTIONAL;
- }
-
- /**
- * @return Distribution.
- */
- protected NearCacheConfiguration nearCacheConfiguration() {
- return new NearCacheConfiguration();
- }
-
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsCompareQueryTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsCompareQueryTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsCompareQueryTest.java
new file mode 100644
index 0000000..5875ee1
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsCompareQueryTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.processors.query.h2.sql.BaseH2CompareQueryTest;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsCompareQueryTest extends BaseH2CompareQueryTest {
+ /**
+ * Creates new cache configuration.
+ *
+ * @param name Cache name.
+ * @param mode Cache mode.
+ * @param clsK Key class.
+ * @param clsV Value class.
+ * @return Cache configuration.
+ */
+ @Override protected CacheConfiguration cacheConfiguration(String name, CacheMode mode, Class<?> clsK, Class<?> clsV) {
+ CacheConfiguration<?,?> cc = super.cacheConfiguration(name, mode, clsK, clsV);
+
+ if (ORG.equals(name) || PERS.equals(name) || PURCH.equals(name))
+ cc.setGroupName("group");
+
+ return cc;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlDistributedJoinSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlDistributedJoinSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlDistributedJoinSelfTest.java
new file mode 100644
index 0000000..452c6cf
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlDistributedJoinSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsSqlDistributedJoinSelfTest extends IgniteSqlDistributedJoinSelfTest {
+ /** {@inheritDoc} */
+ @Override protected CacheConfiguration cacheConfig(String name, boolean partitioned, Class<?>[] idxTypes) {
+ return super.cacheConfig(name, partitioned, idxTypes).setGroupName("group");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.java
new file mode 100644
index 0000000..6e535f1
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest extends IgniteCacheGroupsSqlSegmentedIndexSelfTest {
+ /** {@inheritDoc} */
+ @Override protected int nodesCount() {
+ return 4;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexSelfTest.java
new file mode 100644
index 0000000..c0a4fb2
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteCacheGroupsSqlSegmentedIndexSelfTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.query;
+
+import org.apache.ignite.configuration.CacheConfiguration;
+
+/**
+ *
+ */
+public class IgniteCacheGroupsSqlSegmentedIndexSelfTest extends IgniteSqlSegmentedIndexSelfTest {
+ /** {@inheritDoc} */
+ @Override protected <K, V> CacheConfiguration<K, V> cacheConfig(String name, boolean partitioned, Class<?>... idxTypes) {
+ return super.<K, V>cacheConfig(name, partitioned, idxTypes).setGroupName("group");
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ @Override public void testSegmentedPartitionedWithReplicated() throws Exception {
+ log.info("Test is ignored");
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java
index aad4cfb..93fcdb3 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlDistributedJoinSelfTest.java
@@ -77,7 +77,7 @@ public class IgniteSqlDistributedJoinSelfTest extends GridCommonAbstractTest {
* @param idxTypes Indexed types.
* @return Cache configuration.
*/
- private static CacheConfiguration cacheConfig(String name, boolean partitioned, Class<?>... idxTypes) {
+ protected CacheConfiguration cacheConfig(String name, boolean partitioned, Class<?>... idxTypes) {
return new CacheConfiguration(DEFAULT_CACHE_NAME)
.setName(name)
.setCacheMode(partitioned ? CacheMode.PARTITIONED : CacheMode.REPLICATED)
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/BaseH2CompareQueryTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/BaseH2CompareQueryTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/BaseH2CompareQueryTest.java
index 9a3f64d..f9d25d6 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/BaseH2CompareQueryTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/BaseH2CompareQueryTest.java
@@ -60,6 +60,21 @@ public class BaseH2CompareQueryTest extends AbstractH2CompareQueryTest {
/** Purchase count. */
public static final int PURCH_CNT = PROD_CNT * 5;
+ /** */
+ protected static final String ORG = "org";
+
+ /** */
+ protected static final String PERS = "pers";
+
+ /** */
+ protected static final String PURCH = "purch";
+
+ /** */
+ protected static final String PROD = "prod";
+
+ /** */
+ protected static final String ADDR = "addr";
+
/** Cache org. */
private static IgniteCache<Integer, Organization> cacheOrg;
@@ -80,11 +95,11 @@ public class BaseH2CompareQueryTest extends AbstractH2CompareQueryTest {
IgniteConfiguration cfg = super.getConfiguration(gridName);
cfg.setCacheConfiguration(
- cacheConfiguration("org", CacheMode.PARTITIONED, Integer.class, Organization.class),
- cacheConfiguration("pers", CacheMode.PARTITIONED, AffinityKey.class, Person.class),
- cacheConfiguration("purch", CacheMode.PARTITIONED, AffinityKey.class, Purchase.class),
- cacheConfiguration("prod", CacheMode.REPLICATED, Integer.class, Product.class),
- cacheConfiguration("addr", CacheMode.REPLICATED, Integer.class, Address.class));
+ cacheConfiguration(ORG, CacheMode.PARTITIONED, Integer.class, Organization.class),
+ cacheConfiguration(PERS, CacheMode.PARTITIONED, AffinityKey.class, Person.class),
+ cacheConfiguration(PURCH, CacheMode.PARTITIONED, AffinityKey.class, Purchase.class),
+ cacheConfiguration(PROD, CacheMode.REPLICATED, Integer.class, Product.class),
+ cacheConfiguration(ADDR, CacheMode.REPLICATED, Integer.class, Address.class));
return cfg;
}
@@ -103,11 +118,11 @@ public class BaseH2CompareQueryTest extends AbstractH2CompareQueryTest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override protected void createCaches() {
- cacheOrg = jcache(ignite, cacheConfiguration("org", CacheMode.PARTITIONED, Integer.class, Organization.class), "org", Integer.class, Organization.class);
- cachePers = ignite.cache("pers");
- cachePurch = ignite.cache("purch");
- cacheProd = ignite.cache("prod");
- cacheAddr = ignite.cache("addr");
+ cacheOrg = jcache(ignite, cacheConfiguration(ORG, CacheMode.PARTITIONED, Integer.class, Organization.class), ORG, Integer.class, Organization.class);
+ cachePers = ignite.cache(PERS);
+ cachePurch = ignite.cache(PURCH);
+ cacheProd = ignite.cache(PROD);
+ cacheAddr = ignite.cache(ADDR);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
index 5085cd5..4d82bf9 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite2.java
@@ -34,6 +34,10 @@ import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitioned
import org.apache.ignite.internal.processors.cache.index.DynamicIndexPartitionedTransactionalConcurrentSelfTest;
import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedAtomicConcurrentSelfTest;
import org.apache.ignite.internal.processors.cache.index.DynamicIndexReplicatedTransactionalConcurrentSelfTest;
+import org.apache.ignite.internal.processors.query.IgniteCacheGroupsCompareQueryTest;
+import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlDistributedJoinSelfTest;
+import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest;
+import org.apache.ignite.internal.processors.query.IgniteCacheGroupsSqlSegmentedIndexSelfTest;
import org.apache.ignite.testframework.IgniteTestSuite;
/**
@@ -69,6 +73,11 @@ public class IgniteCacheQuerySelfTestSuite2 extends TestSuite {
suite.addTestSuite(IgniteCacheDistributedQueryStopOnCancelOrTimeoutSelfTest.class);
suite.addTestSuite(IgniteCacheObjectKeyIndexingSelfTest.class);
+ suite.addTestSuite(IgniteCacheGroupsCompareQueryTest.class);
+ suite.addTestSuite(IgniteCacheGroupsSqlSegmentedIndexSelfTest.class);
+ suite.addTestSuite(IgniteCacheGroupsSqlSegmentedIndexMultiNodeSelfTest.class);
+ suite.addTestSuite(IgniteCacheGroupsSqlDistributedJoinSelfTest.class);
+
return suite;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
index 0f4a418..794ec4d 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheWithIndexingTestSuite.java
@@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheOffheapIndexEntryEvi
import org.apache.ignite.internal.processors.cache.GridCacheOffheapIndexGetSelfTest;
import org.apache.ignite.internal.processors.cache.GridIndexingWithNoopSwapSelfTest;
import org.apache.ignite.internal.processors.cache.IgniteCacheConfigurationPrimitiveTypesSelfTest;
+import org.apache.ignite.internal.processors.cache.IgniteCacheGroupsSqlTest;
import org.apache.ignite.internal.processors.cache.IgniteCacheStarvationOnRebalanceTest;
import org.apache.ignite.internal.processors.cache.IgniteClientReconnectQueriesTest;
import org.apache.ignite.internal.processors.cache.ttl.CacheTtlAtomicLocalSelfTest;
@@ -72,6 +73,8 @@ public class IgniteCacheWithIndexingTestSuite extends TestSuite {
suite.addTestSuite(ClientReconnectAfterClusterRestartTest.class);
+ suite.addTestSuite(IgniteCacheGroupsSqlTest.class);
+
return suite;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
index 11f9472..3ba39c1 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteBenchmarkArguments.java
@@ -21,11 +21,13 @@ import com.beust.jcommander.Parameter;
import org.apache.ignite.cache.CacheWriteSynchronizationMode;
import org.apache.ignite.configuration.MemoryConfiguration;
import org.apache.ignite.internal.util.tostring.GridToStringBuilder;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.transactions.TransactionConcurrency;
import org.apache.ignite.transactions.TransactionIsolation;
import java.util.ArrayList;
import java.util.List;
+import org.jetbrains.annotations.Nullable;
/**
* Input arguments for Ignite benchmarks.
@@ -82,7 +84,8 @@ public class IgniteBenchmarkArguments {
/** */
@Parameter(names = {"-r", "--range"}, description = "Key range")
- public int range = 1_000_000;
+ @GridToStringInclude
+ private int range = 1_000_000;
/** */
@Parameter(names = {"-sf", "--scaleFactor"}, description = "Scale factor")
@@ -194,6 +197,14 @@ public class IgniteBenchmarkArguments {
@Parameter(names = {"-ps", "--pageSize"}, description = "Page size")
private int pageSize = MemoryConfiguration.DFLT_PAGE_SIZE;
+ /** */
+ @Parameter(names = {"-cg", "--cacheGrp"}, description = "Cache group for caches")
+ private String cacheGrp;
+
+ /** */
+ @Parameter(names = {"-cc", "--cachesCnt"}, description = "Number of caches to create")
+ private int cachesCnt = 1;
+
/**
* @return List of enabled load test operations.
*/
@@ -475,6 +486,20 @@ public class IgniteBenchmarkArguments {
}
/**
+ * @return Name of cache group to be set for caches.
+ */
+ @Nullable public String cacheGroup() {
+ return cacheGrp;
+ }
+
+ /**
+ * @return Number of caches to create.
+ */
+ public int cachesCount() {
+ return cachesCnt;
+ }
+
+ /**
* @return Description.
*/
public String description() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteNode.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteNode.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteNode.java
index 6e25fc4..1f947de 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteNode.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/IgniteNode.java
@@ -112,6 +112,9 @@ public class IgniteNode implements BenchmarkServer {
cc.setNearConfiguration(nearCfg);
}
+ if (args.cacheGroup() != null)
+ cc.setGroupName(args.cacheGroup());
+
cc.setWriteSynchronizationMode(args.syncMode());
cc.setBackups(args.backups());
[22/22] ignite git commit: Merge remote-tracking branch
'remotes/origin/master' into ignite-5293
Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into ignite-5293
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b1c5f2d5
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b1c5f2d5
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b1c5f2d5
Branch: refs/heads/ignite-5293
Commit: b1c5f2d56d63435cb8486ff50f92908f1bccec3e
Parents: 5108689 808ad9f
Author: sboikov <sb...@gridgain.com>
Authored: Tue Jun 6 18:04:19 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Jun 6 18:04:19 2017 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 3 +
.../configuration/CacheConfiguration.java | 21 +
.../managers/communication/GridIoManager.java | 10 +-
.../internal/managers/discovery/DiscoCache.java | 30 +-
.../discovery/GridDiscoveryManager.java | 165 +-
.../ignite/internal/pagemem/PageSupport.java | 2 +-
.../affinity/GridAffinityAssignmentCache.java | 38 +-
.../cache/CacheAffinitySharedManager.java | 623 +--
.../CacheClientReconnectDiscoveryData.java | 66 +-
.../internal/processors/cache/CacheData.java | 22 +-
.../processors/cache/CacheGroupContext.java | 943 ++++
.../processors/cache/CacheGroupData.java | 147 +
.../processors/cache/CacheGroupDescriptor.java | 210 +
.../cache/CacheJoinNodeDiscoveryData.java | 4 +-
.../processors/cache/CacheMetricsImpl.java | 10 +-
.../cache/CacheNodeCommonDiscoveryData.java | 19 +
.../cache/CacheOffheapEvictionManager.java | 11 +-
.../processors/cache/ClusterCachesInfo.java | 533 ++-
.../cache/ClusterCachesReconnectResult.java | 61 +
.../cache/DynamicCacheDescriptor.java | 26 +
.../processors/cache/ExchangeActions.java | 86 +-
.../processors/cache/GridCacheAdapter.java | 60 +-
.../cache/GridCacheAffinityManager.java | 62 +-
.../processors/cache/GridCacheAttributes.java | 21 +-
.../cache/GridCacheClearAllRunnable.java | 2 +-
.../cache/GridCacheConcurrentMap.java | 55 +-
.../cache/GridCacheConcurrentMapImpl.java | 171 +-
.../processors/cache/GridCacheContext.java | 166 +-
.../processors/cache/GridCacheEntryInfo.java | 37 +-
.../processors/cache/GridCacheEventManager.java | 36 -
.../cache/GridCacheGroupIdMessage.java | 110 +
.../processors/cache/GridCacheIdMessage.java | 117 +
.../processors/cache/GridCacheIoManager.java | 282 +-
.../cache/GridCacheLocalConcurrentMap.java | 56 +-
.../processors/cache/GridCacheMapEntry.java | 73 +-
.../processors/cache/GridCacheMessage.java | 97 +-
.../GridCachePartitionExchangeManager.java | 420 +-
.../processors/cache/GridCachePreloader.java | 23 +-
.../cache/GridCachePreloaderAdapter.java | 46 +-
.../processors/cache/GridCacheProcessor.java | 391 +-
.../cache/GridCacheSharedContext.java | 4 +-
.../processors/cache/GridCacheTtlManager.java | 22 +-
.../processors/cache/GridCacheUtils.java | 42 +-
.../GridChangeGlobalStateMessageResponse.java | 20 +-
.../processors/cache/GridNoStorageCacheMap.java | 30 +-
.../cache/IgniteCacheOffheapManager.java | 143 +-
.../cache/IgniteCacheOffheapManagerImpl.java | 1194 +++--
.../cache/affinity/GridCacheAffinityImpl.java | 9 +-
.../processors/cache/database/CacheDataRow.java | 5 -
.../cache/database/CacheDataRowAdapter.java | 65 +-
.../cache/database/CacheSearchRow.java | 5 +
.../processors/cache/database/RowStore.java | 19 +-
.../cache/database/tree/BPlusTree.java | 41 +-
.../cache/database/tree/io/PageIO.java | 24 +
.../distributed/GridCacheTtlUpdateRequest.java | 4 +-
.../distributed/GridDistributedBaseMessage.java | 4 +-
.../GridDistributedCacheAdapter.java | 19 +-
.../GridDistributedTxFinishResponse.java | 28 +-
.../GridDistributedTxRemoteAdapter.java | 2 +
.../dht/GridCachePartitionedConcurrentMap.java | 76 +-
.../dht/GridClientPartitionTopology.java | 25 +-
.../dht/GridDhtAffinityAssignmentRequest.java | 10 +-
.../dht/GridDhtAffinityAssignmentResponse.java | 12 +-
.../dht/GridDhtAssignmentFetchFuture.java | 20 +-
.../distributed/dht/GridDhtCacheAdapter.java | 363 +-
.../distributed/dht/GridDhtCacheEntry.java | 16 +-
.../cache/distributed/dht/GridDhtGetFuture.java | 8 +-
.../distributed/dht/GridDhtGetSingleFuture.java | 41 +-
.../distributed/dht/GridDhtLocalPartition.java | 413 +-
.../distributed/dht/GridDhtLockResponse.java | 2 +-
.../dht/GridDhtPartitionTopology.java | 9 +-
.../dht/GridDhtPartitionTopologyImpl.java | 290 +-
.../dht/GridDhtTransactionalCacheAdapter.java | 37 +-
.../dht/GridDhtTxFinishResponse.java | 14 +-
.../dht/GridDhtTxOnePhaseCommitAckRequest.java | 16 +-
.../distributed/dht/GridDhtTxPrepareFuture.java | 4 +-
.../dht/GridPartitionedGetFuture.java | 2 +-
.../dht/GridPartitionedSingleGetFuture.java | 6 +-
.../GridDhtAtomicAbstractUpdateRequest.java | 4 +-
.../dht/atomic/GridDhtAtomicCache.java | 68 +-
.../dht/atomic/GridDhtAtomicCacheEntry.java | 53 -
.../GridDhtAtomicDeferredUpdateResponse.java | 4 +-
.../dht/atomic/GridDhtAtomicNearResponse.java | 4 +-
.../dht/atomic/GridDhtAtomicUpdateResponse.java | 5 +-
.../GridNearAtomicAbstractUpdateRequest.java | 4 +-
.../GridNearAtomicCheckUpdateRequest.java | 4 +-
.../atomic/GridNearAtomicUpdateResponse.java | 4 +-
.../dht/colocated/GridDhtColocatedCache.java | 24 +-
.../colocated/GridDhtColocatedCacheEntry.java | 52 -
.../dht/preloader/GridDhtForceKeysFuture.java | 15 +-
.../dht/preloader/GridDhtForceKeysRequest.java | 4 +-
.../dht/preloader/GridDhtForceKeysResponse.java | 8 +-
.../GridDhtPartitionDemandMessage.java | 12 +-
.../dht/preloader/GridDhtPartitionDemander.java | 207 +-
.../dht/preloader/GridDhtPartitionSupplier.java | 58 +-
.../GridDhtPartitionSupplyMessage.java | 29 +-
.../GridDhtPartitionsAbstractMessage.java | 26 +-
.../GridDhtPartitionsExchangeFuture.java | 286 +-
.../preloader/GridDhtPartitionsFullMessage.java | 60 +-
.../GridDhtPartitionsSingleMessage.java | 40 +-
.../GridDhtPartitionsSingleRequest.java | 7 +-
.../dht/preloader/GridDhtPreloader.java | 410 +-
.../distributed/near/GridNearAtomicCache.java | 2 +-
.../distributed/near/GridNearCacheAdapter.java | 16 +-
.../distributed/near/GridNearGetRequest.java | 4 +-
.../distributed/near/GridNearGetResponse.java | 4 +-
.../near/GridNearOptimisticTxPrepareFuture.java | 21 +-
.../near/GridNearSingleGetRequest.java | 4 +-
.../near/GridNearSingleGetResponse.java | 6 +-
.../near/GridNearTransactionalCache.java | 4 +-
.../near/GridNearTxFinishResponse.java | 14 +-
.../processors/cache/local/GridLocalCache.java | 21 +-
.../local/atomic/GridLocalAtomicCache.java | 4 +-
.../query/GridCacheDistributedQueryManager.java | 10 +-
.../cache/query/GridCacheQueryManager.java | 4 +-
.../cache/query/GridCacheQueryRequest.java | 3 +-
.../cache/query/GridCacheQueryResponse.java | 4 +-
.../CacheContinuousQueryBatchAck.java | 4 +-
.../CacheContinuousQueryEventBuffer.java | 5 +-
.../continuous/CacheContinuousQueryHandler.java | 66 +-
.../CacheContinuousQueryListener.java | 20 +
.../continuous/CacheContinuousQueryManager.java | 59 +-
.../query/continuous/CounterSkipContext.java | 78 +
.../cache/transactions/IgniteTxAdapter.java | 2 +-
.../cache/transactions/IgniteTxEntry.java | 4 +-
.../cache/transactions/IgniteTxHandler.java | 26 +-
.../transactions/IgniteTxLocalAdapter.java | 2 +
.../cache/transactions/TxLocksRequest.java | 20 +-
.../cache/transactions/TxLocksResponse.java | 28 +-
.../cluster/GridClusterStateProcessor.java | 6 +-
.../processors/odbc/SqlListenerNioListener.java | 2 +-
.../processors/query/GridQueryProcessor.java | 3 +-
.../internal/processors/query/QueryUtils.java | 29 +-
.../service/GridServiceProcessor.java | 32 +-
.../visor/cache/VisorCachePartitionsTask.java | 2 +-
.../CacheAtomicSingleMessageCountSelfTest.java | 2 +-
.../cache/CacheDeferredDeleteQueueTest.java | 2 +-
...cheDhtLocalPartitionAfterRemoveSelfTest.java | 2 +-
...CacheExchangeMessageDuplicatedStateTest.java | 54 +-
.../cache/CacheOffheapMapEntrySelfTest.java | 9 +-
.../GridCacheConditionalDeploymentSelfTest.java | 18 +
.../processors/cache/GridCacheLeakTest.java | 3 +-
.../GridCacheOrderedPreloadingSelfTest.java | 14 +-
.../cache/GridCacheTtlManagerSelfTest.java | 3 +-
.../processors/cache/IgniteCacheGroupsTest.java | 4301 ++++++++++++++++++
.../cache/IgniteCachePeekModesAbstractTest.java | 2 +-
.../processors/cache/IgniteCacheStartTest.java | 5 +-
.../cache/IgniteOnePhaseCommitInvokeTest.java | 4 +-
...ologyValidatorAbstractTxCacheGroupsTest.java | 126 +
...opologyValidatorCacheGroupsAbstractTest.java | 131 +
...niteTopologyValidatorGridSplitCacheTest.java | 8 +-
...torNearPartitionedAtomicCacheGroupsTest.java | 31 +
...lidatorNearPartitionedTxCacheGroupsTest.java | 31 +
...lidatorPartitionedAtomicCacheGroupsTest.java | 45 +
...gyValidatorPartitionedTxCacheGroupsTest.java | 31 +
...alidatorReplicatedAtomicCacheGroupsTest.java | 45 +
...ogyValidatorReplicatedTxCacheGroupsTest.java | 31 +
.../IgniteTxStoreExceptionAbstractSelfTest.java | 4 +-
.../GridCacheBinaryObjectsAbstractSelfTest.java | 2 +-
.../GridCacheQueueCleanupSelfTest.java | 13 +-
.../GridCacheSetAbstractSelfTest.java | 17 +-
.../GridCacheSetFailoverAbstractSelfTest.java | 6 +-
.../IgnitePartitionedQueueNoBackupsTest.java | 6 +-
.../IgnitePartitionedSetNoBackupsSelfTest.java | 6 +-
.../CacheDiscoveryDataConcurrentJoinTest.java | 17 +
.../CacheLateAffinityAssignmentTest.java | 6 +-
...eCacheGroupsPartitionLossPolicySelfTest.java | 355 ++
.../IgniteCachePartitionLossPolicySelfTest.java | 19 +-
.../IgniteCacheReadFromBackupTest.java | 5 +-
...sabledMultiNodeWithGroupFullApiSelfTest.java | 35 +
.../atomic/IgniteCacheAtomicProtocolTest.java | 7 +-
...AtomicMultiNodeWithGroupFullApiSelfTest.java | 34 +
...nabledMultiNodeWithGroupFullApiSelfTest.java | 35 +
.../near/GridCacheNearReadersSelfTest.java | 4 +-
...tionedMultiNodeWithGroupFullApiSelfTest.java | 34 +
.../GridCacheReplicatedPreloadSelfTest.java | 3 +-
.../IgniteCacheClientNearCacheExpiryTest.java | 20 +-
.../expiry/IgniteCacheTtlCleanupSelfTest.java | 2 +-
...IgniteCacheJdbcBlobStoreNodeRestartTest.java | 3 +
...acheLocalAtomicWithGroupFullApiSelfTest.java | 34 +
.../local/GridCacheLocalFullApiSelfTest.java | 1 -
.../GridCacheLocalWithGroupFullApiSelfTest.java | 34 +
...nuousQueryConcurrentPartitionUpdateTest.java | 229 +-
...ContinuousQueryFailoverAbstractSelfTest.java | 7 +-
.../TxOptimisticDeadlockDetectionTest.java | 2 +-
.../TxPessimisticDeadlockDetectionTest.java | 2 +-
.../loadtests/hashmap/GridCacheTestContext.java | 6 +-
.../communication/GridCacheMessageSelfTest.java | 30 +
.../testframework/junits/GridAbstractTest.java | 17 +
.../junits/common/GridCommonAbstractTest.java | 64 +
.../IgniteCacheFullApiSelfTestSuite.java | 13 +
.../testsuites/IgniteCacheTestSuite3.java | 3 +
.../testsuites/IgniteCacheTestSuite5.java | 2 +
.../IgniteTopologyValidatorTestSuite.java | 14 +
.../shuffle/streams/HadoopOffheapBuffer.java | 2 +-
.../query/h2/database/H2PkHashIndex.java | 4 +-
.../query/h2/database/H2RowFactory.java | 2 +-
.../processors/query/h2/database/H2Tree.java | 6 +-
.../query/h2/database/H2TreeIndex.java | 7 +-
.../query/h2/ddl/DdlStatementsProcessor.java | 22 +-
.../h2/twostep/GridReduceQueryExecutor.java | 12 +-
.../cache/IgniteCacheGroupsSqlTest.java | 312 ++
.../cache/IgniteCacheNoClassQuerySelfTest.java | 20 -
.../cache/index/H2DynamicTableSelfTest.java | 23 +-
.../IgniteCacheGroupsCompareQueryTest.java | 45 +
...teCacheGroupsSqlDistributedJoinSelfTest.java | 30 +
...roupsSqlSegmentedIndexMultiNodeSelfTest.java | 28 +
...iteCacheGroupsSqlSegmentedIndexSelfTest.java | 37 +
.../query/IgniteSqlDistributedJoinSelfTest.java | 2 +-
.../query/h2/sql/BaseH2CompareQueryTest.java | 35 +-
.../IgniteCacheQuerySelfTestSuite2.java | 9 +
.../IgniteCacheWithIndexingTestSuite.java | 3 +
.../yardstick/IgniteBenchmarkArguments.java | 27 +-
.../org/apache/ignite/yardstick/IgniteNode.java | 3 +
.../cache/IgniteCacheAbstractBenchmark.java | 158 +
.../yardstick/cache/IgniteGetAllBenchmark.java | 3 +
.../cache/IgniteGetAllPutAllTxBenchmark.java | 2 +
.../cache/IgniteGetAndPutBenchmark.java | 2 +
.../cache/IgniteGetAndPutTxBenchmark.java | 2 +
.../yardstick/cache/IgniteGetBenchmark.java | 35 +-
.../IgniteGetEntriesPutAllTxBenchmark.java | 2 +
.../yardstick/cache/IgniteInvokeBenchmark.java | 2 +
.../cache/IgniteInvokeTxBenchmark.java | 2 +
.../IgniteInvokeWithInjectionBenchmark.java | 2 +
.../yardstick/cache/IgnitePutAllBenchmark.java | 2 +
.../IgnitePutAllSerializableTxBenchmark.java | 2 +
.../yardstick/cache/IgnitePutBenchmark.java | 2 +
.../cache/IgnitePutGetBatchBenchmark.java | 2 +
.../yardstick/cache/IgnitePutGetBenchmark.java | 2 +
.../cache/IgnitePutGetEntryBenchmark.java | 2 +
.../cache/IgnitePutGetEntryTxBenchmark.java | 2 +
.../cache/IgnitePutGetTxBatchBenchmark.java | 2 +
.../cache/IgnitePutGetTxBenchmark.java | 2 +
...IgnitePutIfAbsentIndexedValue1Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue1Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue2Benchmark.java | 2 +
.../cache/IgnitePutIndexedValue8Benchmark.java | 2 +
.../IgnitePutRandomValueSizeBenchmark.java | 2 +
.../cache/IgnitePutRemoveBenchmark.java | 2 +
.../yardstick/cache/IgnitePutTxBenchmark.java | 2 +
.../cache/IgnitePutTxImplicitBenchmark.java | 2 +
.../cache/IgnitePutTxPrimaryOnlyBenchmark.java | 2 +
.../IgnitePutTxSkipLocalBackupBenchmark.java | 2 +
.../cache/IgnitePutValue8Benchmark.java | 2 +
.../IgniteReplaceIndexedValue1Benchmark.java | 2 +
.../cache/IgniteScanQueryBenchmark.java | 88 +
.../cache/IgniteSqlQueryBenchmark.java | 16 +-
.../IgniteSqlQueryDistributedJoinBenchmark.java | 24 +-
.../cache/IgniteSqlQueryJoinBenchmark.java | 14 +-
.../cache/IgniteSqlQueryPutBenchmark.java | 8 +-
.../IgniteSqlQueryPutSeparatedBenchmark.java | 4 +
.../cache/jdbc/JdbcPutGetBenchmark.java | 4 +-
.../IgniteCacheRandomOperationBenchmark.java | 42 +-
.../yardstick/cache/load/model/ModelUtil.java | 3 +
254 files changed, 13713 insertions(+), 3556 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
index 19b3f97,87abd6c..abba28f
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
@@@ -162,8 -168,13 +162,8 @@@ public class GridDhtLockResponse extend
GridCacheContext cctx = ctx.cacheContext(cacheId);
- if (nearEvicted != null) {
- for (IgniteTxKey key : nearEvicted)
- key.prepareMarshal(cctx);
- }
-
if (preloadEntries != null)
- marshalInfos(preloadEntries, cctx);
+ marshalInfos(preloadEntries, cctx.shared(), cctx.cacheObjectContext());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTransactionalCacheAdapter.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/b1c5f2d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
----------------------------------------------------------------------
[10/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 099840a..a4e4c24 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache;
import java.util.Collections;
import java.util.Iterator;
+import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -27,11 +28,9 @@ import java.util.concurrent.atomic.AtomicReference;
import javax.cache.Cache;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.configuration.DataPageEvictionMode;
+import org.apache.ignite.IgniteLogger;
import org.apache.ignite.internal.NodeStoppingException;
import org.apache.ignite.internal.pagemem.FullPageId;
-import org.apache.ignite.internal.pagemem.PageIdUtils;
import org.apache.ignite.internal.pagemem.PageMemory;
import org.apache.ignite.internal.pagemem.PageUtils;
import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
@@ -51,10 +50,8 @@ import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
import org.apache.ignite.internal.processors.cache.database.tree.reuse.ReuseList;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
-import org.apache.ignite.internal.processors.cache.local.GridLocalCache;
import org.apache.ignite.internal.processors.cache.query.GridCacheQueryManager;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
-import org.apache.ignite.internal.processors.query.QueryUtils;
import org.apache.ignite.internal.util.GridAtomicLong;
import org.apache.ignite.internal.util.GridCloseableIteratorAdapter;
import org.apache.ignite.internal.util.GridEmptyCloseableIterator;
@@ -81,9 +78,20 @@ import static org.apache.ignite.internal.pagemem.PageIdUtils.pageId;
*
*/
@SuppressWarnings("PublicInnerClass")
-public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter implements IgniteCacheOffheapManager {
+public class IgniteCacheOffheapManagerImpl implements IgniteCacheOffheapManager {
+ /** */
+ private static final int UNDEFINED_CACHE_ID = 0;
+
+ /** */
+ protected GridCacheSharedContext ctx;
+
+ /** */
+ protected CacheGroupContext grp;
+
+ /** */
+ protected IgniteLogger log;
+
/** */
- // TODO GG-11208 need restore size after restart.
private CacheDataStore locCacheDataStore;
/** */
@@ -99,9 +107,6 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
private volatile boolean hasPendingEntries;
/** */
- private static final PendingRow START_PENDING_ROW = new PendingRow(Long.MIN_VALUE, 0);
-
- /** */
private final GridAtomicLong globalRmvId = new GridAtomicLong(U.currentTimeMillis() * 1000_000);
/** */
@@ -116,77 +121,102 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override protected void start0() throws IgniteCheckedException {
- super.start0();
+ @Override public void start(GridCacheSharedContext ctx, CacheGroupContext grp) throws IgniteCheckedException {
+ this.ctx = ctx;
+ this.grp = grp;
+ this.log = ctx.logger(getClass());
- updateValSizeThreshold = cctx.shared().database().pageSize() / 2;
+ updateValSizeThreshold = ctx.database().pageSize() / 2;
- if (cctx.affinityNode()) {
- cctx.shared().database().checkpointReadLock();
+ if (grp.affinityNode()) {
+ ctx.database().checkpointReadLock();
try {
initDataStructures();
- if (cctx.isLocal()) {
- assert cctx.cache() instanceof GridLocalCache : cctx.cache();
-
+ if (grp.isLocal())
locCacheDataStore = createCacheDataStore(0);
- }
}
finally {
- cctx.shared().database().checkpointReadUnlock();
+ ctx.database().checkpointReadUnlock();
}
}
}
- /**
- * @throws IgniteCheckedException If failed.
- */
- protected void initDataStructures() throws IgniteCheckedException {
- if (cctx.shared().ttl().eagerTtlEnabled()) {
+ /** {@inheritDoc} */
+ public void onCacheStarted(GridCacheContext cctx) throws IgniteCheckedException{
+ if (cctx.affinityNode() && cctx.ttl().eagerTtlEnabled() && pendingEntries == null) {
String name = "PendingEntries";
long rootPage = allocateForTree();
- pendingEntries = new PendingEntriesTree(cctx,
+ pendingEntries = new PendingEntriesTree(
+ grp,
name,
- cctx.memoryPolicy().pageMemory(),
+ grp.memoryPolicy().pageMemory(),
rootPage,
- cctx.reuseList(),
+ grp.reuseList(),
true);
}
}
- /** {@inheritDoc} */
- @Override protected void stop0(final boolean cancel, final boolean destroy) {
- super.stop0(cancel, destroy);
+ /**
+ * @throws IgniteCheckedException If failed.
+ */
+ protected void initDataStructures() throws IgniteCheckedException {
+ // No-op.
+ }
- if (destroy && cctx.affinityNode())
- destroyCacheDataStructures(destroy);
+ /** {@inheritDoc} */
+ @Override public void stopCache(int cacheId, final boolean destroy) {
+ if (destroy && grp.affinityNode())
+ destroyCacheDataStructures(cacheId, destroy);
}
/** {@inheritDoc} */
- @Override protected void onKernalStop0(boolean cancel) {
- super.onKernalStop0(cancel);
+ @Override public void stop() {
+ try {
+ for (CacheDataStore store : cacheDataStores())
+ store.destroy();
+
+ if (pendingEntries != null)
+ pendingEntries.destroy();
+ }
+ catch (IgniteCheckedException e) {
+ throw new IgniteException(e.getMessage(), e);
+ }
+ }
+ /** {@inheritDoc} */
+ @Override public void onKernalStop() {
busyLock.block();
}
/**
*
*/
- protected void destroyCacheDataStructures(boolean destroy) {
- assert cctx.affinityNode();
+ protected void destroyCacheDataStructures(int cacheId, boolean destroy) {
+ assert grp.affinityNode();
try {
- if (locCacheDataStore != null)
- locCacheDataStore.destroy();
+ if (grp.sharedGroup()) {
+ assert cacheId != UNDEFINED_CACHE_ID;
- if (pendingEntries != null)
- pendingEntries.destroy();
+ for (CacheDataStore store : cacheDataStores())
+ store.clear(cacheId);
- for (CacheDataStore store : partDataStores.values())
- store.destroy();
+ if (pendingEntries != null) {
+ PendingRow row = new PendingRow(cacheId);
+
+ GridCursor<PendingRow> cursor = pendingEntries.find(row, row, PendingEntriesTree.WITHOUT_KEY);
+
+ while (cursor.next()) {
+ boolean res = pendingEntries.removex(cursor.get());
+
+ assert res;
+ }
+ }
+ }
}
catch (IgniteCheckedException e) {
throw new IgniteException(e.getMessage(), e);
@@ -198,7 +228,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @return Data store for given entry.
*/
public CacheDataStore dataStore(GridDhtLocalPartition part) {
- if (cctx.isLocal())
+ if (grp.isLocal())
return locCacheDataStore;
else {
assert part != null;
@@ -208,14 +238,11 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public long entriesCount() {
- if (cctx.isLocal())
- return locCacheDataStore.size();
-
+ @Override public long cacheEntriesCount(int cacheId) {
long size = 0;
- for (CacheDataStore store : partDataStores.values())
- size += store.size();
+ for (CacheDataStore store : cacheDataStores())
+ size += store.cacheSize(cacheId);
return size;
}
@@ -225,59 +252,41 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @return Partition data.
*/
@Nullable private CacheDataStore partitionData(int p) {
- if (cctx.isLocal())
+ if (grp.isLocal())
return locCacheDataStore;
else {
- GridDhtLocalPartition part = cctx.topology().localPartition(p, AffinityTopologyVersion.NONE, false);
+ GridDhtLocalPartition part = grp.topology().localPartition(p, AffinityTopologyVersion.NONE, false);
return part != null ? part.dataStore() : null;
}
}
/** {@inheritDoc} */
- @Override public long entriesCount(
+ @Override public long cacheEntriesCount(
+ int cacheId,
boolean primary,
boolean backup,
AffinityTopologyVersion topVer
) throws IgniteCheckedException {
- if (cctx.isLocal())
- return entriesCount(0);
+ if (grp.isLocal())
+ return cacheEntriesCount(cacheId, 0);
else {
- ClusterNode locNode = cctx.localNode();
-
long cnt = 0;
- for (GridDhtLocalPartition locPart : cctx.topology().currentLocalPartitions()) {
- if (primary) {
- if (cctx.affinity().primaryByPartition(locNode, locPart.id(), topVer)) {
- cnt += locPart.dataStore().size();
-
- continue;
- }
- }
+ Iterator<CacheDataStore> it = cacheData(primary, backup, topVer);
- if (backup) {
- if (cctx.affinity().backupByPartition(locNode, locPart.id(), topVer))
- cnt += locPart.dataStore().size();
- }
- }
+ while (it.hasNext())
+ cnt += it.next().cacheSize(cacheId);
return cnt;
}
}
/** {@inheritDoc} */
- @Override public long entriesCount(int part) {
- if (cctx.isLocal()) {
- assert part == 0;
+ @Override public long cacheEntriesCount(int cacheId, int part) {
+ CacheDataStore store = partitionData(part);
- return locCacheDataStore.size();
- }
- else {
- GridDhtLocalPartition locPart = cctx.topology().localPartition(part, AffinityTopologyVersion.NONE, false);
-
- return locPart == null ? 0 : locPart.dataStore().size();
- }
+ return store == null ? 0 : store.cacheSize(cacheId);
}
/**
@@ -289,10 +298,10 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
private Iterator<CacheDataStore> cacheData(boolean primary, boolean backup, AffinityTopologyVersion topVer) {
assert primary || backup;
- if (cctx.isLocal())
- return Collections.singleton(locCacheDataStore).iterator();
+ if (grp.isLocal())
+ return singletonIterator(locCacheDataStore);
else {
- final Iterator<GridDhtLocalPartition> it = cctx.topology().currentLocalPartitions().iterator();
+ final Iterator<GridDhtLocalPartition> it = grp.topology().currentLocalPartitions().iterator();
if (primary && backup) {
return F.iterator(it, new IgniteClosure<GridDhtLocalPartition, CacheDataStore>() {
@@ -302,8 +311,8 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}, true);
}
- final Set<Integer> parts = primary ? cctx.affinity().primaryPartitions(cctx.localNodeId(), topVer) :
- cctx.affinity().backupPartitions(cctx.localNodeId(), topVer);
+ final Set<Integer> parts = primary ? grp.affinity().primaryPartitions(ctx.localNodeId(), topVer) :
+ grp.affinity().backupPartitions(ctx.localNodeId(), topVer);
return F.iterator(it, new IgniteClosure<GridDhtLocalPartition, CacheDataStore>() {
@Override public CacheDataStore apply(GridDhtLocalPartition part) {
@@ -319,15 +328,18 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public void invoke(KeyCacheObject key,
+ @Override public void invoke(
+ GridCacheContext cctx,
+ KeyCacheObject key,
GridDhtLocalPartition part,
OffheapInvokeClosure c)
throws IgniteCheckedException {
- dataStore(part).invoke(key, c);
+ dataStore(part).invoke(cctx, key, c);
}
/** {@inheritDoc} */
@Override public void update(
+ GridCacheContext cctx,
KeyCacheObject key,
CacheObject val,
GridCacheVersion ver,
@@ -338,16 +350,17 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
) throws IgniteCheckedException {
assert expireTime >= 0;
- dataStore(part).update(key, partId, val, ver, expireTime, oldRow);
+ dataStore(part).update(cctx, key, partId, val, ver, expireTime, oldRow);
}
/** {@inheritDoc} */
@Override public void remove(
+ GridCacheContext cctx,
KeyCacheObject key,
int partId,
GridDhtLocalPartition part
) throws IgniteCheckedException {
- dataStore(part).remove(key, partId);
+ dataStore(part).remove(cctx, key, partId);
}
/** {@inheritDoc} */
@@ -356,21 +369,21 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
throws IgniteCheckedException {
KeyCacheObject key = entry.key();
- assert cctx.isLocal() || entry.localPartition() != null : entry;
+ assert grp.isLocal() || entry.localPartition() != null : entry;
- return dataStore(entry.localPartition()).find(key);
+ return dataStore(entry.localPartition()).find(entry.context(), key);
}
/** {@inheritDoc} */
- @Nullable @Override public CacheDataRow read(KeyCacheObject key) throws IgniteCheckedException {
+ @Nullable @Override public CacheDataRow read(GridCacheContext cctx, KeyCacheObject key) throws IgniteCheckedException {
CacheDataRow row;
if (cctx.isLocal())
- row = locCacheDataStore.find(key);
+ row = locCacheDataStore.find(cctx, key);
else {
GridDhtLocalPartition part = cctx.topology().localPartition(cctx.affinity().partition(key), null, false);
- row = part != null ? dataStore(part).find(key) : null;
+ row = part != null ? dataStore(part).find(cctx, key) : null;
}
assert row == null || row.value() != null : row;
@@ -411,17 +424,17 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @param readers {@code True} to clear readers.
*/
@SuppressWarnings("unchecked")
- @Override public void clear(boolean readers) {
+ @Override public void clearCache(GridCacheContext cctx, boolean readers) {
GridCacheVersion obsoleteVer = null;
- GridIterator<CacheDataRow> it = rowsIterator(true, true, null);
+ GridIterator<CacheDataRow> it = iterator(cctx.cacheId(), cacheDataStores().iterator());
while (it.hasNext()) {
KeyCacheObject key = it.next().key();
try {
if (obsoleteVer == null)
- obsoleteVer = cctx.versions().next();
+ obsoleteVer = ctx.versions().next();
GridCacheEntryEx entry = cctx.cache().entryEx(key);
@@ -456,11 +469,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @throws IgniteCheckedException If failed.
*/
@SuppressWarnings("unchecked")
- @Override public <K, V> GridCloseableIterator<Cache.Entry<K, V>> entriesIterator(final boolean primary,
+ @Override public <K, V> GridCloseableIterator<Cache.Entry<K, V>> cacheEntriesIterator(
+ final GridCacheContext cctx,
+ final boolean primary,
final boolean backup,
final AffinityTopologyVersion topVer,
final boolean keepBinary) throws IgniteCheckedException {
- final Iterator<CacheDataRow> it = rowsIterator(primary, backup, topVer);
+ final Iterator<CacheDataRow> it = cacheIterator(cctx.cacheId(), primary, backup, topVer);
return new GridCloseableIteratorAdapter<Cache.Entry<K, V>>() {
/** */
@@ -501,13 +516,14 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public GridCloseableIterator<KeyCacheObject> keysIterator(final int part) throws IgniteCheckedException {
+ @Override public GridCloseableIterator<KeyCacheObject> cacheKeysIterator(int cacheId, final int part) throws IgniteCheckedException {
CacheDataStore data = partitionData(part);
if (data == null)
return new GridEmptyCloseableIterator<>();
- final GridCursor<? extends CacheDataRow> cur = data.cursor();
+ final GridCursor<? extends CacheDataRow> cur =
+ data.cursor(cacheId, null, null, CacheDataRowAdapter.RowData.KEY_ONLY);
return new GridCloseableIteratorAdapter<KeyCacheObject>() {
/** */
@@ -537,21 +553,41 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public GridIterator<CacheDataRow> iterator(boolean primary, boolean backups,
+ @Override public GridIterator<CacheDataRow> cacheIterator(
+ int cacheId,
+ boolean primary,
+ boolean backups,
final AffinityTopologyVersion topVer)
throws IgniteCheckedException {
- return rowsIterator(primary, backups, topVer);
+ return iterator(cacheId, cacheData(primary, backups, topVer));
+ }
+
+ /** {@inheritDoc} */
+ @Override public GridIterator<CacheDataRow> cachePartitionIterator(int cacheId, int part) throws IgniteCheckedException {
+ CacheDataStore data = partitionData(part);
+
+ if (data == null)
+ return new GridEmptyCloseableIterator<>();
+
+ return iterator(cacheId, singletonIterator(data));
+ }
+
+ /** {@inheritDoc} */
+ @Override public GridIterator<CacheDataRow> partitionIterator(int part) throws IgniteCheckedException {
+ CacheDataStore data = partitionData(part);
+
+ if (data == null)
+ return new GridEmptyCloseableIterator<>();
+
+ return iterator(UNDEFINED_CACHE_ID, singletonIterator(data));
}
/**
- * @param primary Primary entries flag.
- * @param backups Backup entries flag.
- * @param topVer Topology version.
- * @return Iterator.
+ * @param cacheId Cache ID.
+ * @param dataIt Data store iterator.
+ * @return Rows iterator
*/
- private GridIterator<CacheDataRow> rowsIterator(boolean primary, boolean backups, AffinityTopologyVersion topVer) {
- final Iterator<CacheDataStore> dataIt = cacheData(primary, backups, topVer);
-
+ private GridIterator<CacheDataRow> iterator(final int cacheId, final Iterator<CacheDataStore> dataIt) {
return new GridCloseableIteratorAdapter<CacheDataRow>() {
/** */
private GridCursor<? extends CacheDataRow> cur;
@@ -580,7 +616,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
CacheDataStore ds = dataIt.next();
curPart = ds.partId();
- cur = ds.cursor();
+ cur = cacheId == UNDEFINED_CACHE_ID ? ds.cursor() : ds.cursor(cacheId);
}
else
break;
@@ -601,35 +637,34 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
};
}
- /** {@inheritDoc} */
- @Override public GridIterator<CacheDataRow> iterator(int part) throws IgniteCheckedException {
- CacheDataStore data = partitionData(part);
-
- if (data == null)
- return new GridEmptyCloseableIterator<>();
-
- final GridCursor<? extends CacheDataRow> cur = data.cursor();
-
- return new GridCloseableIteratorAdapter<CacheDataRow>() {
+ /**
+ * @param item Item.
+ * @return Single item iterator.
+ */
+ private <T> Iterator<T> singletonIterator(final T item) {
+ return new Iterator<T>() {
/** */
- private CacheDataRow next;
+ private boolean hasNext = true;
- @Override protected CacheDataRow onNext() {
- CacheDataRow res = next;
-
- next = null;
-
- return res;
+ /** {@inheritDoc} */
+ @Override public boolean hasNext() {
+ return hasNext;
}
- @Override protected boolean onHasNext() throws IgniteCheckedException {
- if (next != null)
- return true;
+ /** {@inheritDoc} */
+ @Override public T next() {
+ if (hasNext) {
+ hasNext = false;
- if (cur.next())
- next = cur.get();
+ return item;
+ }
- return next != null;
+ throw new NoSuchElementException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void remove() {
+ throw new UnsupportedOperationException();
}
};
}
@@ -639,12 +674,12 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @throws IgniteCheckedException If failed.
*/
private long allocateForTree() throws IgniteCheckedException {
- ReuseList reuseList = cctx.reuseList();
+ ReuseList reuseList = grp.reuseList();
long pageId;
if (reuseList == null || (pageId = reuseList.takeRecycledPage()) == 0L)
- pageId = cctx.memoryPolicy().pageMemory().allocatePage(cctx.cacheId(), INDEX_PARTITION, FLAG_IDX);
+ pageId = grp.memoryPolicy().pageMemory().allocatePage(grp.groupId(), INDEX_PARTITION, FLAG_IDX);
return pageId;
}
@@ -653,7 +688,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
@Override public RootPage rootPageForIndex(String idxName) throws IgniteCheckedException {
long pageId = allocateForTree();
- return new RootPage(new FullPageId(pageId, cctx.cacheId()), true);
+ return new RootPage(new FullPageId(pageId, grp.groupId()), true);
}
/** {@inheritDoc} */
@@ -663,13 +698,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** {@inheritDoc} */
@Override public ReuseList reuseListForIndex(String idxName) {
- return cctx.reuseList();
+ return grp.reuseList();
}
/** {@inheritDoc} */
@Override public IgniteRebalanceIterator rebalanceIterator(int part, AffinityTopologyVersion topVer, Long partCntr)
throws IgniteCheckedException {
- final GridIterator<CacheDataRow> it = iterator(part);
+ final GridIterator<CacheDataRow> it = partitionIterator(part);
return new IgniteRebalanceIterator() {
@Override public boolean historical() {
@@ -738,14 +773,15 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
throws IgniteCheckedException {
final long rootPage = allocateForTree();
- CacheDataRowStore rowStore = new CacheDataRowStore(cctx, cctx.freeList(), p);
+ CacheDataRowStore rowStore = new CacheDataRowStore(grp, grp.freeList(), p);
String idxName = treeName(p);
- CacheDataTree dataTree = new CacheDataTree(idxName,
- cctx.reuseList(),
+ CacheDataTree dataTree = new CacheDataTree(
+ grp,
+ idxName,
+ grp.reuseList(),
rowStore,
- cctx,
rootPage,
true);
@@ -754,7 +790,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** {@inheritDoc} */
@Override public Iterable<CacheDataStore> cacheDataStores() {
- if (cctx.isLocal())
+ if (grp.isLocal())
return Collections.singleton(locCacheDataStore);
return new Iterable<CacheDataStore>() {
@@ -786,15 +822,23 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** {@inheritDoc} */
@Override public boolean expire(
+ GridCacheContext cctx,
IgniteInClosure2X<GridCacheEntryEx, GridCacheVersion> c,
int amount
) throws IgniteCheckedException {
+ assert !cctx.isNear() : cctx.name();
+
if (hasPendingEntries && pendingEntries != null) {
GridCacheVersion obsoleteVer = null;
long now = U.currentTimeMillis();
- GridCursor<PendingRow> cur = pendingEntries.find(START_PENDING_ROW, new PendingRow(now, 0));
+ GridCursor<PendingRow> cur;
+
+ if (grp.sharedGroup())
+ cur = pendingEntries.find(new PendingRow(cctx.cacheId()), new PendingRow(cctx.cacheId(), now, 0));
+ else
+ cur = pendingEntries.find(null, new PendingRow(UNDEFINED_CACHE_ID, now, 0));
int cleared = 0;
@@ -809,9 +853,9 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert row.key != null && row.link != 0 && row.expireTime != 0 : row;
- if (pendingEntries.remove(row) != null) {
+ if (pendingEntries.removex(row)) {
if (obsoleteVer == null)
- obsoleteVer = cctx.versions().next();
+ obsoleteVer = ctx.versions().next();
c.apply(cctx.cache().entryEx(row.key), obsoleteVer);
}
@@ -848,7 +892,10 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
protected final AtomicLong cntr = new AtomicLong();
/** Partition size. */
- protected final AtomicLong storageSize = new AtomicLong();
+ private final AtomicLong storageSize = new AtomicLong();
+
+ /** */
+ private final ConcurrentMap<Integer, AtomicLong> cacheSizes = new ConcurrentHashMap<>();
/** Initialized update counter. */
protected Long initCntr = 0L;
@@ -871,13 +918,60 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
this.dataTree = dataTree;
}
+ /**
+ * @param cacheId Cache ID.
+ */
+ void incrementSize(int cacheId) {
+ storageSize.incrementAndGet();
+
+ if (grp.sharedGroup()) {
+ AtomicLong size = cacheSizes.get(cacheId);
+
+ if (size == null) {
+ AtomicLong old = cacheSizes.putIfAbsent(cacheId, size = new AtomicLong());
+
+ if (old != null)
+ size = old;
+ }
+
+ size.incrementAndGet();
+ }
+ }
+
+ /**
+ * @param cacheId Cache ID.
+ */
+ void decrementSize(int cacheId) {
+ storageSize.decrementAndGet();
+
+ if (grp.sharedGroup()) {
+ AtomicLong size = cacheSizes.get(cacheId);
+
+ if (size == null)
+ return;
+
+ size.decrementAndGet();
+ }
+ }
+
/** {@inheritDoc} */
@Override public int partId() {
return partId;
}
/** {@inheritDoc} */
- @Override public int size() {
+ @Override public int cacheSize(int cacheId) {
+ if (grp.sharedGroup()) {
+ AtomicLong size = cacheSizes.get(cacheId);
+
+ return size != null ? (int)size.get() : 0;
+ }
+
+ return (int)storageSize.get();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int fullSize() {
return (int)storageSize.get();
}
@@ -907,12 +1001,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/**
+ * @param cctx Cache context.
* @param oldRow Old row.
* @param dataRow New row.
* @return {@code True} if it is possible to update old row data.
* @throws IgniteCheckedException If failed.
*/
- private boolean canUpdateOldRow(@Nullable CacheDataRow oldRow, DataRow dataRow)
+ private boolean canUpdateOldRow(GridCacheContext cctx, @Nullable CacheDataRow oldRow, DataRow dataRow)
throws IgniteCheckedException {
if (oldRow == null || cctx.queries().enabled())
return false;
@@ -933,13 +1028,15 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public void invoke(KeyCacheObject key, OffheapInvokeClosure c)
+ @Override public void invoke(GridCacheContext cctx, KeyCacheObject key, OffheapInvokeClosure c)
throws IgniteCheckedException {
if (!busyLock.enterBusy())
throw new NodeStoppingException("Operation has been cancelled (node is stopping).");
try {
- dataTree.invoke(new SearchRow(key), CacheDataRowAdapter.RowData.NO_KEY, c);
+ int cacheId = grp.sharedGroup() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
+
+ dataTree.invoke(new SearchRow(cacheId, key), CacheDataRowAdapter.RowData.NO_KEY, c);
switch (c.operationType()) {
case PUT: {
@@ -947,7 +1044,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
CacheDataRow oldRow = c.oldRow();
- finishUpdate(c.newRow(), oldRow);
+ finishUpdate(cctx, c.newRow(), oldRow);
break;
}
@@ -955,7 +1052,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
case REMOVE: {
CacheDataRow oldRow = c.oldRow();
- finishRemove(key, oldRow);
+ finishRemove(cctx, key, oldRow);
break;
}
@@ -973,18 +1070,19 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
- @Override public CacheDataRow createRow(KeyCacheObject key,
+ @Override public CacheDataRow createRow(
+ GridCacheContext cctx,
+ KeyCacheObject key,
CacheObject val,
GridCacheVersion ver,
long expireTime,
@Nullable CacheDataRow oldRow) throws IgniteCheckedException
{
- int cacheId = cctx.memoryPolicy().config().getPageEvictionMode() == DataPageEvictionMode.DISABLED ?
- 0 : cctx.cacheId();
+ int cacheId = grp.storeCacheIdInDataPage() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
DataRow dataRow = new DataRow(key, val, ver, partId, expireTime, cacheId);
- if (canUpdateOldRow(oldRow, dataRow) && rowStore.updateRow(oldRow.link(), dataRow))
+ if (canUpdateOldRow(cctx, oldRow, dataRow) && rowStore.updateRow(oldRow.link(), dataRow))
dataRow.link(oldRow.link());
else {
CacheObjectContext coCtx = cctx.cacheObjectContext();
@@ -997,11 +1095,16 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert dataRow.link() != 0 : dataRow;
+ if (grp.sharedGroup() && dataRow.cacheId() == UNDEFINED_CACHE_ID)
+ dataRow.cacheId(cctx.cacheId());
+
return dataRow;
}
/** {@inheritDoc} */
- @Override public void update(KeyCacheObject key,
+ @Override public void update(
+ GridCacheContext cctx,
+ KeyCacheObject key,
int p,
CacheObject val,
GridCacheVersion ver,
@@ -1013,8 +1116,9 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
throw new NodeStoppingException("Operation has been cancelled (node is stopping).");
try {
- int cacheId = cctx.memoryPolicy().config().getPageEvictionMode() != DataPageEvictionMode.DISABLED ?
- cctx.cacheId() : 0;
+ int cacheId = grp.storeCacheIdInDataPage() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
+
+ assert oldRow == null || oldRow.cacheId() == cacheId : oldRow;
DataRow dataRow = new DataRow(key, val, ver, p, expireTime, cacheId);
@@ -1026,7 +1130,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
CacheDataRow old;
- if (canUpdateOldRow(oldRow, dataRow) && rowStore.updateRow(oldRow.link(), dataRow)) {
+ if (canUpdateOldRow(cctx, oldRow, dataRow) && rowStore.updateRow(oldRow.link(), dataRow)) {
old = oldRow;
dataRow.link(oldRow.link());
@@ -1036,6 +1140,9 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert dataRow.link() != 0 : dataRow;
+ if (grp.sharedGroup() && dataRow.cacheId() == UNDEFINED_CACHE_ID)
+ dataRow.cacheId(cctx.cacheId());
+
if (oldRow != null) {
old = oldRow;
@@ -1045,7 +1152,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
old = dataTree.put(dataRow);
}
- finishUpdate(dataRow, old);
+ finishUpdate(cctx, dataRow, old);
}
finally {
busyLock.leaveBusy();
@@ -1053,13 +1160,15 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/**
+ * @param cctx Cache context.
* @param newRow New row.
* @param oldRow Old row if available.
* @throws IgniteCheckedException If failed.
*/
- private void finishUpdate(CacheDataRow newRow, @Nullable CacheDataRow oldRow) throws IgniteCheckedException {
+ private void finishUpdate(GridCacheContext cctx, CacheDataRow newRow, @Nullable CacheDataRow oldRow)
+ throws IgniteCheckedException {
if (oldRow == null)
- storageSize.incrementAndGet();
+ incrementSize(cctx.cacheId());
KeyCacheObject key = newRow.key();
@@ -1067,12 +1176,16 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
GridCacheQueryManager qryMgr = cctx.queries();
+ int cacheId = grp.sharedGroup() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
+
if (qryMgr.enabled()) {
if (oldRow != null) {
qryMgr.store(key,
partId,
- oldRow.value(), oldRow.version(),
- newRow.value(), newRow.version(),
+ oldRow.value(),
+ oldRow.version(),
+ newRow.value(),
+ newRow.version(),
expireTime,
newRow.link());
}
@@ -1080,7 +1193,8 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
qryMgr.store(key,
partId,
null, null,
- newRow.value(), newRow.version(),
+ newRow.value(),
+ newRow.version(),
expireTime,
newRow.link());
}
@@ -1090,30 +1204,32 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
assert oldRow.link() != 0 : oldRow;
if (pendingEntries != null && oldRow.expireTime() != 0)
- pendingEntries.removex(new PendingRow(oldRow.expireTime(), oldRow.link()));
+ pendingEntries.removex(new PendingRow(cacheId, oldRow.expireTime(), oldRow.link()));
if (newRow.link() != oldRow.link())
rowStore.removeRow(oldRow.link());
}
if (pendingEntries != null && expireTime != 0) {
- pendingEntries.putx(new PendingRow(expireTime, newRow.link()));
+ pendingEntries.putx(new PendingRow(cacheId, expireTime, newRow.link()));
hasPendingEntries = true;
}
- updateIgfsMetrics(key, (oldRow != null ? oldRow.value() : null), newRow.value());
+ updateIgfsMetrics(cctx, key, (oldRow != null ? oldRow.value() : null), newRow.value());
}
/** {@inheritDoc} */
- @Override public void remove(KeyCacheObject key, int partId) throws IgniteCheckedException {
+ @Override public void remove(GridCacheContext cctx, KeyCacheObject key, int partId) throws IgniteCheckedException {
if (!busyLock.enterBusy())
throw new NodeStoppingException("Operation has been cancelled (node is stopping).");
try {
- CacheDataRow oldRow = dataTree.remove(new SearchRow(key));
+ int cacheId = grp.sharedGroup() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
- finishRemove(key, oldRow);
+ CacheDataRow oldRow = dataTree.remove(new SearchRow(cacheId, key));
+
+ finishRemove(cctx, key, oldRow);
}
finally {
busyLock.leaveBusy();
@@ -1121,21 +1237,26 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/**
+ * @param cctx Cache context.
* @param key Key.
* @param oldRow Removed row.
* @throws IgniteCheckedException If failed.
*/
- private void finishRemove(KeyCacheObject key, @Nullable CacheDataRow oldRow) throws IgniteCheckedException {
+ private void finishRemove(GridCacheContext cctx, KeyCacheObject key, @Nullable CacheDataRow oldRow) throws IgniteCheckedException {
CacheObject val = null;
GridCacheVersion ver = null;
if (oldRow != null) {
+ int cacheId = grp.sharedGroup() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
+
assert oldRow.link() != 0 : oldRow;
+ assert cacheId == UNDEFINED_CACHE_ID || oldRow.cacheId() == cacheId :
+ "Incorrect cache ID [expected=" + cacheId + ", actual=" + oldRow.cacheId() + "].";
if (pendingEntries != null && oldRow.expireTime() != 0)
- pendingEntries.removex(new PendingRow(oldRow.expireTime(), oldRow.link()));
+ pendingEntries.removex(new PendingRow(cacheId, oldRow.expireTime(), oldRow.link()));
- storageSize.decrementAndGet();
+ decrementSize(cctx.cacheId());
val = oldRow.value();
@@ -1150,19 +1271,21 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
if (oldRow != null)
rowStore.removeRow(oldRow.link());
- updateIgfsMetrics(key, (oldRow != null ? oldRow.value() : null), null);
+ updateIgfsMetrics(cctx, key, (oldRow != null ? oldRow.value() : null), null);
}
/** {@inheritDoc} */
- @Override public CacheDataRow find(KeyCacheObject key) throws IgniteCheckedException {
+ @Override public CacheDataRow find(GridCacheContext cctx, KeyCacheObject key) throws IgniteCheckedException {
key.valueBytes(cctx.cacheObjectContext());
- CacheDataRow row = dataTree.findOne(new SearchRow(key), CacheDataRowAdapter.RowData.NO_KEY);
+ int cacheId = grp.sharedGroup() ? cctx.cacheId() : UNDEFINED_CACHE_ID;
+
+ CacheDataRow row = dataTree.findOne(new SearchRow(cacheId, key), CacheDataRowAdapter.RowData.NO_KEY);
if (row != null) {
row.key(key);
- cctx.memoryPolicy().evictionTracker().touchPage(row.link());
+ grp.memoryPolicy().evictionTracker().touchPage(row.link());
}
return row;
@@ -1173,19 +1296,36 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
return dataTree.find(null, null);
}
+ /** {@inheritDoc}
+ * @param cacheId*/
+ @Override public GridCursor<? extends CacheDataRow> cursor(int cacheId) throws IgniteCheckedException {
+ return cursor(cacheId, null, null);
+ }
+
/** {@inheritDoc} */
- @Override public GridCursor<? extends CacheDataRow> cursor(KeyCacheObject lower,
+ @Override public GridCursor<? extends CacheDataRow> cursor(int cacheId, KeyCacheObject lower,
KeyCacheObject upper) throws IgniteCheckedException {
- SearchRow lowerRow = null;
- SearchRow upperRow = null;
+ return cursor(cacheId, lower, upper, null);
+ }
- if (lower != null)
- lowerRow = new SearchRow(lower);
+ /** {@inheritDoc} */
+ @Override public GridCursor<? extends CacheDataRow> cursor(int cacheId, KeyCacheObject lower,
+ KeyCacheObject upper, Object x) throws IgniteCheckedException {
+ SearchRow lowerRow;
+ SearchRow upperRow;
- if (upper != null)
- upperRow = new SearchRow(upper);
+ if (grp.sharedGroup()) {
+ assert cacheId != UNDEFINED_CACHE_ID;
- return dataTree.find(lowerRow, upperRow);
+ lowerRow = lower != null ? new SearchRow(cacheId, lower) : new SearchRow(cacheId);
+ upperRow = upper != null ? new SearchRow(cacheId, upper) : new SearchRow(cacheId);
+ }
+ else {
+ lowerRow = lower != null ? new SearchRow(UNDEFINED_CACHE_ID, lower) : null;
+ upperRow = upper != null ? new SearchRow(UNDEFINED_CACHE_ID, upper) : null;
+ }
+
+ return dataTree.find(lowerRow, upperRow, x);
}
/** {@inheritDoc} */
@@ -1215,6 +1355,46 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/** {@inheritDoc} */
+ @Override public void clear(int cacheId) throws IgniteCheckedException {
+ assert cacheId != UNDEFINED_CACHE_ID;
+
+ if (cacheSize(cacheId) == 0)
+ return;
+
+ Exception ex = null;
+
+ GridCursor<? extends CacheDataRow> cur =
+ cursor(cacheId, null, null, CacheDataRowAdapter.RowData.KEY_ONLY);
+
+ while (cur.next()) {
+ CacheDataRow row = cur.get();
+
+ assert row.link() != 0 : row;
+
+ try {
+ boolean res = dataTree.removex(row);
+
+ assert res : row;
+
+ rowStore.removeRow(row.link());
+
+ decrementSize(cacheId);
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Fail remove row [link=" + row.link() + "]");
+
+ if (ex == null)
+ ex = e;
+ else
+ ex.addSuppressed(e);
+ }
+ }
+
+ if (ex != null)
+ throw new IgniteCheckedException("Fail destroy store", ex);
+ }
+
+ /** {@inheritDoc} */
@Override public RowStore rowStore() {
return rowStore;
}
@@ -1247,11 +1427,14 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
}
/**
+ * @param cctx Cache context.
* @param key Key.
* @param oldVal Old value.
* @param newVal New value.
+ * @throws IgniteCheckedException If failed.
*/
private void updateIgfsMetrics(
+ GridCacheContext cctx,
KeyCacheObject key,
CacheObject oldVal,
CacheObject newVal
@@ -1259,11 +1442,11 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
// In case we deal with IGFS cache, count updated data
if (cctx.cache().isIgfsDataCache() &&
!cctx.isNear() &&
- cctx.kernalContext()
+ ctx.kernalContext()
.igfsHelper()
.isIgfsBlockKey(key.value(cctx.cacheObjectContext(), false))) {
- int oldSize = valueLength(oldVal);
- int newSize = valueLength(newVal);
+ int oldSize = valueLength(cctx, oldVal);
+ int newSize = valueLength(cctx, newVal);
int delta = newSize - oldSize;
@@ -1275,10 +1458,11 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/**
* Isolated method to get length of IGFS block.
*
+ * @param cctx Cache context.
* @param val Value.
* @return Length of value.
*/
- private int valueLength(@Nullable CacheObject val) {
+ private int valueLength(GridCacheContext cctx, @Nullable CacheObject val) {
if (val == null)
return 0;
@@ -1301,13 +1485,28 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** */
private final int hash;
+ /** */
+ private final int cacheId;
+
/**
+ * @param cacheId Cache ID.
* @param key Key.
*/
- SearchRow(KeyCacheObject key) {
+ SearchRow(int cacheId, KeyCacheObject key) {
this.key = key;
+ this.hash = key.hashCode();
+ this.cacheId = cacheId;
+ }
- hash = key.hashCode();
+ /**
+ * Instantiates a new fake search row as a logic cache based bound.
+ *
+ * @param cacheId Cache ID.
+ */
+ SearchRow(int cacheId) {
+ this.key = null;
+ this.hash = 0;
+ this.cacheId = cacheId;
}
/** {@inheritDoc} */
@@ -1324,6 +1523,11 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
@Override public int hash() {
return hash;
}
+
+ /** {@inheritDoc} */
+ @Override public int cacheId() {
+ return cacheId;
+ }
}
/**
@@ -1339,6 +1543,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/**
* @param hash Hash code.
* @param link Link.
+ * @param part Partition.
* @param rowData Required row data.
*/
DataRow(int hash, long link, int part, CacheDataRowAdapter.RowData rowData) {
@@ -1350,7 +1555,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
try {
// We can not init data row lazily because underlying buffer can be concurrently cleared.
- initFromLink(cctx, rowData);
+ initFromLink(grp, rowData);
}
catch (IgniteCheckedException e) {
throw new IgniteException(e);
@@ -1366,6 +1571,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @param ver Version.
* @param part Partition.
* @param expireTime Expire time.
+ * @param cacheId Cache ID.
*/
DataRow(KeyCacheObject key, CacheObject val, GridCacheVersion ver, int part, long expireTime, int cacheId) {
super(0);
@@ -1393,6 +1599,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
@Override public void link(long link) {
this.link = link;
}
+
+ /**
+ * @param cacheId Cache ID.
+ */
+ void cacheId(int cacheId) {
+ this.cacheId = cacheId;
+ }
}
/**
@@ -1403,54 +1616,80 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
private final CacheDataRowStore rowStore;
/** */
- private final GridCacheContext cctx;
+ private final CacheGroupContext grp;
/**
+ * @param grp Ccahe group.
* @param name Tree name.
* @param reuseList Reuse list.
* @param rowStore Row store.
- * @param cctx Context.
* @param metaPageId Meta page ID.
* @param initNew Initialize new index.
* @throws IgniteCheckedException If failed.
*/
public CacheDataTree(
+ CacheGroupContext grp,
String name,
ReuseList reuseList,
CacheDataRowStore rowStore,
- GridCacheContext cctx,
long metaPageId,
boolean initNew
) throws IgniteCheckedException {
super(name,
- cctx.cacheId(),
- cctx.memoryPolicy().pageMemory(),
- cctx.shared().wal(),
- cctx.offheap().globalRemoveId(),
+ grp.groupId(),
+ grp.memoryPolicy().pageMemory(),
+ grp.shared().wal(),
+ grp.offheap().globalRemoveId(),
metaPageId,
reuseList,
- DataInnerIO.VERSIONS,
- DataLeafIO.VERSIONS);
+ grp.sharedGroup() ? CacheIdAwareDataInnerIO.VERSIONS : DataInnerIO.VERSIONS,
+ grp.sharedGroup() ? CacheIdAwareDataLeafIO.VERSIONS : DataLeafIO.VERSIONS);
assert rowStore != null;
this.rowStore = rowStore;
- this.cctx = cctx;
+ this.grp = grp;
initTree(initNew);
}
/** {@inheritDoc} */
- @Override protected int compare(BPlusIO<CacheSearchRow> io, long pageAddr, int idx, CacheSearchRow row)
+ @Override protected int compare(BPlusIO<CacheSearchRow> iox, long pageAddr, int idx, CacheSearchRow row)
throws IgniteCheckedException {
- int hash = ((RowLinkIO)io).getHash(pageAddr, idx);
+ RowLinkIO io = (RowLinkIO)iox;
+
+ int cmp;
+
+ if (grp.sharedGroup()) {
+ assert row.cacheId() != UNDEFINED_CACHE_ID : "Cache ID is not provided: " + row;
+
+ int cacheId = io.getCacheId(pageAddr, idx);
+
+ assert cacheId != UNDEFINED_CACHE_ID : "Cache ID is not stored";
+
+ cmp = Integer.compare(cacheId, row.cacheId());
+
+ if (cmp != 0)
+ return cmp;
+
+ if (row.key() == null) {
+ assert row.getClass() == SearchRow.class : row;
+
+ // A search row with a cache ID only is used as a cache bound.
+ // The found position will be shifted until the exact cache bound is found;
+ // See for details:
+ // o.a.i.i.p.c.database.tree.BPlusTree.ForwardCursor.findLowerBound()
+ // o.a.i.i.p.c.database.tree.BPlusTree.ForwardCursor.findUpperBound()
+ return cmp;
+ }
+ }
- int cmp = Integer.compare(hash, row.hash());
+ cmp = Integer.compare(io.getHash(pageAddr, idx), row.hash());
if (cmp != 0)
return cmp;
- long link = ((RowLinkIO)io).getLink(pageAddr, idx);
+ long link = io.getLink(pageAddr, idx);
assert row.key() != null : row;
@@ -1460,14 +1699,15 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** {@inheritDoc} */
@Override protected CacheDataRow getRow(BPlusIO<CacheSearchRow> io, long pageAddr, int idx, Object flags)
throws IgniteCheckedException {
- int hash = ((RowLinkIO)io).getHash(pageAddr, idx);
long link = ((RowLinkIO)io).getLink(pageAddr, idx);
+ int hash = ((RowLinkIO)io).getHash(pageAddr, idx);
+ int cacheId = ((RowLinkIO)io).getCacheId(pageAddr, idx);
CacheDataRowAdapter.RowData x = flags != null ?
(CacheDataRowAdapter.RowData)flags :
CacheDataRowAdapter.RowData.FULL;
- return rowStore.dataRow(hash, link, x);
+ return rowStore.dataRow(cacheId, hash, link, x);
}
/**
@@ -1477,7 +1717,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @throws IgniteCheckedException If failed.
*/
private int compareKeys(KeyCacheObject key, final long link) throws IgniteCheckedException {
- byte[] bytes = key.valueBytes(cctx.cacheObjectContext());
+ byte[] bytes = key.valueBytes(grp.cacheObjectContext());
final long pageId = pageId(link);
final long page = acquirePage(pageId);
@@ -1496,7 +1736,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
if (data.nextLink() == 0) {
long addr = pageAddr + data.offset();
- if (cctx.memoryPolicy().config().getPageEvictionMode() != DataPageEvictionMode.DISABLED)
+ if (grp.storeCacheIdInDataPage())
addr += 4; // Skip cache id.
final int len = PageUtils.getInt(addr, 0);
@@ -1543,10 +1783,10 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
// TODO GG-11768.
CacheDataRowAdapter other = new CacheDataRowAdapter(link);
- other.initFromLink(cctx, CacheDataRowAdapter.RowData.KEY_ONLY);
+ other.initFromLink(grp, CacheDataRowAdapter.RowData.KEY_ONLY);
- byte[] bytes1 = other.key().valueBytes(cctx.cacheObjectContext());
- byte[] bytes2 = key.valueBytes(cctx.cacheObjectContext());
+ byte[] bytes1 = other.key().valueBytes(grp.cacheObjectContext());
+ byte[] bytes2 = key.valueBytes(grp.cacheObjectContext());
int lenCmp = Integer.compare(bytes1.length, bytes2.length);
@@ -1588,44 +1828,46 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
private final int partId;
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
* @param freeList Free list.
+ * @param partId Partition number.
*/
- public CacheDataRowStore(GridCacheContext<?, ?> cctx, FreeList freeList, int partId) {
- super(cctx, freeList);
+ public CacheDataRowStore(CacheGroupContext grp, FreeList freeList, int partId) {
+ super(grp, freeList);
this.partId = partId;
}
/**
+ * @param cacheId Cache ID.
* @param hash Hash code.
* @param link Link.
* @return Search row.
*/
- private CacheSearchRow keySearchRow(int hash, long link) {
- return new DataRow(hash, link, partId, CacheDataRowAdapter.RowData.KEY_ONLY);
+ private CacheSearchRow keySearchRow(int cacheId, int hash, long link) {
+ DataRow dataRow = new DataRow(hash, link, partId, CacheDataRowAdapter.RowData.KEY_ONLY);
+
+ if (dataRow.cacheId() == UNDEFINED_CACHE_ID && grp.sharedGroup())
+ dataRow.cacheId(cacheId);
+
+ return dataRow;
}
/**
+ * @param cacheId Cache ID.
* @param hash Hash code.
* @param link Link.
* @param rowData Required row data.
* @return Data row.
*/
- private CacheDataRow dataRow(int hash, long link, CacheDataRowAdapter.RowData rowData) {
- return new DataRow(hash, link, partId, rowData);
- }
- }
+ private CacheDataRow dataRow(int cacheId, int hash, long link, CacheDataRowAdapter.RowData rowData) {
+ DataRow dataRow = new DataRow(hash, link, partId, rowData);
- /**
- * @param pageAddr Page address.
- * @param off Offset.
- * @param link Link.
- * @param hash Hash.
- */
- private static void store0(long pageAddr, int off, long link, int hash) {
- PageUtils.putLong(pageAddr, off, link);
- PageUtils.putInt(pageAddr, off + 8, hash);
+ if (dataRow.cacheId() == UNDEFINED_CACHE_ID && grp.sharedGroup())
+ dataRow.cacheId(cacheId);
+
+ return dataRow;
+ }
}
/**
@@ -1645,37 +1887,50 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @return Key hash code.
*/
public int getHash(long pageAddr, int idx);
+
+ /**
+ * @param pageAddr Page address.
+ * @param idx Index.
+ * @return Cache ID or {@code 0} if cache ID is not defined.
+ */
+ public int getCacheId(long pageAddr, int idx);
}
/**
*
*/
- public static final class DataInnerIO extends BPlusInnerIO<CacheSearchRow> implements RowLinkIO {
- /** */
- public static final IOVersions<DataInnerIO> VERSIONS = new IOVersions<>(
- new DataInnerIO(1)
- );
-
+ private static abstract class AbstractDataInnerIO extends BPlusInnerIO<CacheSearchRow> implements RowLinkIO {
/**
+ * @param type Page type.
* @param ver Page format version.
+ * @param canGetRow If we can get full row from this page.
+ * @param itemSize Single item size on page.
*/
- DataInnerIO(int ver) {
- super(T_DATA_REF_INNER, ver, true, 12);
+ protected AbstractDataInnerIO(int type, int ver, boolean canGetRow, int itemSize) {
+ super(type, ver, canGetRow, itemSize);
}
/** {@inheritDoc} */
@Override public void storeByOffset(long pageAddr, int off, CacheSearchRow row) {
assert row.link() != 0;
- store0(pageAddr, off, row.link(), row.hash());
+ PageUtils.putLong(pageAddr, off, row.link());
+ PageUtils.putInt(pageAddr, off + 8, row.hash());
+
+ if (storeCacheId()) {
+ assert row.cacheId() != UNDEFINED_CACHE_ID : row;
+
+ PageUtils.putInt(pageAddr, off + 12, row.cacheId());
+ }
}
/** {@inheritDoc} */
@Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long pageAddr, int idx) {
+ int cacheId = getCacheId(pageAddr, idx);
int hash = getHash(pageAddr, idx);
long link = getLink(pageAddr, idx);
- return ((CacheDataTree)tree).rowStore.keySearchRow(hash, link);
+ return ((CacheDataTree)tree).rowStore.keySearchRow(cacheId, hash, link);
}
/** {@inheritDoc} */
@@ -1683,8 +1938,18 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
int srcIdx) {
int hash = ((RowLinkIO)srcIo).getHash(srcPageAddr, srcIdx);
long link = ((RowLinkIO)srcIo).getLink(srcPageAddr, srcIdx);
+ int off = offset(dstIdx);
+
+ PageUtils.putLong(dstPageAddr, off, link);
+ PageUtils.putInt(dstPageAddr, off + 8, hash);
+
+ if (storeCacheId()) {
+ int cacheId = ((RowLinkIO)srcIo).getCacheId(srcPageAddr, srcIdx);
+
+ assert cacheId != UNDEFINED_CACHE_ID;
- store0(dstPageAddr, offset(dstIdx), link, hash);
+ PageUtils.putInt(dstPageAddr, off + 12, cacheId);
+ }
}
/** {@inheritDoc} */
@@ -1706,43 +1971,66 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
for (int i = 0; i < cnt; i++)
c.apply(new CacheDataRowAdapter(getLink(pageAddr, i)));
}
+
+ /**
+ * @return {@code True} if cache ID has to be stored.
+ */
+ protected abstract boolean storeCacheId();
}
/**
*
*/
- public static final class DataLeafIO extends BPlusLeafIO<CacheSearchRow> implements RowLinkIO {
- /** */
- public static final IOVersions<DataLeafIO> VERSIONS = new IOVersions<>(
- new DataLeafIO(1)
- );
-
+ private static abstract class AbstractDataLeafIO extends BPlusLeafIO<CacheSearchRow> implements RowLinkIO {
/**
+ * @param type Page type.
* @param ver Page format version.
+ * @param itemSize Single item size on page.
*/
- DataLeafIO(int ver) {
- super(T_DATA_REF_LEAF, ver, 12);
+ protected AbstractDataLeafIO(int type, int ver, int itemSize) {
+ super(type, ver, itemSize);
}
/** {@inheritDoc} */
@Override public void storeByOffset(long pageAddr, int off, CacheSearchRow row) {
assert row.link() != 0;
- store0(pageAddr, off, row.link(), row.hash());
+ PageUtils.putLong(pageAddr, off, row.link());
+ PageUtils.putInt(pageAddr, off + 8, row.hash());
+
+ if (storeCacheId()) {
+ assert row.cacheId() != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(pageAddr, off + 12, row.cacheId());
+ }
}
/** {@inheritDoc} */
@Override public void store(long dstPageAddr, int dstIdx, BPlusIO<CacheSearchRow> srcIo, long srcPageAddr,
int srcIdx) {
- store0(dstPageAddr, offset(dstIdx), getLink(srcPageAddr, srcIdx), getHash(srcPageAddr, srcIdx));
+ int hash = ((RowLinkIO)srcIo).getHash(srcPageAddr, srcIdx);
+ long link = ((RowLinkIO)srcIo).getLink(srcPageAddr, srcIdx);
+ int off = offset(dstIdx);
+
+ PageUtils.putLong(dstPageAddr, off, link);
+ PageUtils.putInt(dstPageAddr, off + 8, hash);
+
+ if (storeCacheId()) {
+ int cacheId = ((RowLinkIO)srcIo).getCacheId(srcPageAddr, srcIdx);
+
+ assert cacheId != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(dstPageAddr, off + 12, cacheId);
+ }
}
/** {@inheritDoc} */
@Override public CacheSearchRow getLookupRow(BPlusTree<CacheSearchRow, ?> tree, long buf, int idx) {
+ int cacheId = getCacheId(buf, idx);
int hash = getHash(buf, idx);
long link = getLink(buf, idx);
- return ((CacheDataTree)tree).rowStore.keySearchRow(hash, link);
+ return ((CacheDataTree)tree).rowStore.keySearchRow(cacheId, hash, link);
}
/** {@inheritDoc} */
@@ -1764,6 +2052,119 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
for (int i = 0; i < cnt; i++)
c.apply(new CacheDataRowAdapter(getLink(pageAddr, i)));
}
+
+ /**
+ * @return {@code True} if cache ID has to be stored.
+ */
+ protected abstract boolean storeCacheId();
+ }
+
+ /**
+ *
+ */
+ public static final class DataInnerIO extends AbstractDataInnerIO {
+ /** */
+ public static final IOVersions<DataInnerIO> VERSIONS = new IOVersions<>(
+ new DataInnerIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ DataInnerIO(int ver) {
+ super(T_DATA_REF_INNER, ver, true, 12);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return UNDEFINED_CACHE_ID;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return false;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class DataLeafIO extends AbstractDataLeafIO {
+ /** */
+ public static final IOVersions<DataLeafIO> VERSIONS = new IOVersions<>(
+ new DataLeafIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ DataLeafIO(int ver) {
+ super(T_DATA_REF_LEAF, ver, 12);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return UNDEFINED_CACHE_ID;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return false;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class CacheIdAwareDataInnerIO extends AbstractDataInnerIO {
+ /** */
+ public static final IOVersions<CacheIdAwareDataInnerIO> VERSIONS = new IOVersions<>(
+ new CacheIdAwareDataInnerIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ CacheIdAwareDataInnerIO(int ver) {
+ super(T_CACHE_ID_AWARE_DATA_REF_INNER, ver, true, 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return PageUtils.getInt(pageAddr, offset(idx) + 12);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return true;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class CacheIdAwareDataLeafIO extends AbstractDataLeafIO {
+ /** */
+ public static final IOVersions<CacheIdAwareDataLeafIO> VERSIONS = new IOVersions<>(
+ new CacheIdAwareDataLeafIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ CacheIdAwareDataLeafIO(int ver) {
+ super(T_CACHE_ID_AWARE_DATA_REF_LEAF, ver, 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return PageUtils.getInt(pageAddr, offset(idx) + 12);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return true;
+ }
}
/**
@@ -1776,38 +2177,47 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
/** Link. */
private long link;
+ /** Cache ID. */
+ private int cacheId;
+
/** */
private KeyCacheObject key;
/**
+ * Creates a new instance which represents an upper or lower bound
+ * inside a logical cache.
+ *
+ * @param cacheId Cache ID.
+ */
+ public PendingRow(int cacheId) {
+ this.cacheId = cacheId;
+ }
+
+ /**
+ * @param cacheId Cache ID.
* @param expireTime Expire time.
* @param link Link
*/
- PendingRow(long expireTime, long link) {
+ PendingRow(int cacheId, long expireTime, long link) {
assert expireTime != 0;
+ this.cacheId = cacheId;
this.expireTime = expireTime;
this.link = link;
}
/**
- * @param cctx Context.
- * @param expireTime Expire time.
- * @param link Link.
+ * @param grp Cache group.
* @return Row.
* @throws IgniteCheckedException If failed.
*/
- static PendingRow createRowWithKey(GridCacheContext cctx, long expireTime, long link)
- throws IgniteCheckedException {
- PendingRow row = new PendingRow(expireTime, link);
-
+ PendingRow initKey(CacheGroupContext grp) throws IgniteCheckedException {
CacheDataRowAdapter rowData = new CacheDataRowAdapter(link);
+ rowData.initFromLink(grp, CacheDataRowAdapter.RowData.KEY_ONLY);
- rowData.initFromLink(cctx, CacheDataRowAdapter.RowData.KEY_ONLY);
+ key = rowData.key();
- row.key = rowData.key();
-
- return row;
+ return this;
}
/** {@inheritDoc} */
@@ -1821,10 +2231,13 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
*/
protected static class PendingEntriesTree extends BPlusTree<PendingRow, PendingRow> {
/** */
- private final GridCacheContext cctx;
+ private final static Object WITHOUT_KEY = new Object();
+
+ /** */
+ private final CacheGroupContext grp;
/**
- * @param cctx Cache context.
+ * @param grp Cache group.
* @param name Tree name.
* @param pageMem Page memory.
* @param metaPageId Meta page ID.
@@ -1833,7 +2246,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @throws IgniteCheckedException If failed.
*/
public PendingEntriesTree(
- GridCacheContext cctx,
+ CacheGroupContext grp,
String name,
PageMemory pageMem,
long metaPageId,
@@ -1841,26 +2254,49 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
boolean initNew)
throws IgniteCheckedException {
super(name,
- cctx.cacheId(),
+ grp.groupId(),
pageMem,
- cctx.shared().wal(),
- cctx.offheap().globalRemoveId(),
+ grp.shared().wal(),
+ grp.offheap().globalRemoveId(),
metaPageId,
reuseList,
- PendingEntryInnerIO.VERSIONS,
- PendingEntryLeafIO.VERSIONS);
+ grp.sharedGroup() ? CacheIdAwarePendingEntryInnerIO.VERSIONS : PendingEntryInnerIO.VERSIONS,
+ grp.sharedGroup() ? CacheIdAwarePendingEntryLeafIO.VERSIONS : PendingEntryLeafIO.VERSIONS);
- this.cctx = cctx;
+ this.grp = grp;
initTree(initNew);
}
/** {@inheritDoc} */
- @Override protected int compare(BPlusIO<PendingRow> io, long pageAddr, int idx, PendingRow row)
+ @Override protected int compare(BPlusIO<PendingRow> iox, long pageAddr, int idx, PendingRow row)
throws IgniteCheckedException {
- long expireTime = ((PendingRowIO)io).getExpireTime(pageAddr, idx);
+ PendingRowIO io = (PendingRowIO)iox;
- int cmp = Long.compare(expireTime, row.expireTime);
+ int cmp;
+
+ if (grp.sharedGroup()) {
+ assert row.cacheId != UNDEFINED_CACHE_ID : "Cache ID is not provided!";
+ assert io.getCacheId(pageAddr, idx) != UNDEFINED_CACHE_ID : "Cache ID is not stored!";
+
+ cmp = Integer.compare(io.getCacheId(pageAddr, idx), row.cacheId);
+
+ if (cmp != 0)
+ return cmp;
+
+ if(cmp == 0 && row.expireTime == 0 && row.link == 0) {
+ // A search row with a cach ID only is used as a cache bound.
+ // The found position will be shifted until the exact cache bound is found;
+ // See for details:
+ // o.a.i.i.p.c.database.tree.BPlusTree.ForwardCursor.findLowerBound()
+ // o.a.i.i.p.c.database.tree.BPlusTree.ForwardCursor.findUpperBound()
+ return cmp;
+ }
+ }
+
+ long expireTime = io.getExpireTime(pageAddr, idx);
+
+ cmp = Long.compare(expireTime, row.expireTime);
if (cmp != 0)
return cmp;
@@ -1868,15 +2304,17 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
if (row.link == 0L)
return 0;
- long link = ((PendingRowIO)io).getLink(pageAddr, idx);
+ long link = io.getLink(pageAddr, idx);
return Long.compare(link, row.link);
}
/** {@inheritDoc} */
- @Override protected PendingRow getRow(BPlusIO<PendingRow> io, long pageAddr, int idx, Object ignore)
+ @Override protected PendingRow getRow(BPlusIO<PendingRow> io, long pageAddr, int idx, Object flag)
throws IgniteCheckedException {
- return io.getLookupRow(this, pageAddr, idx);
+ PendingRow row = io.getLookupRow(this, pageAddr, idx);
+
+ return flag == WITHOUT_KEY ? row : row.initKey(grp);
}
}
@@ -1897,22 +2335,27 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
* @return Link.
*/
long getLink(long pageAddr, int idx);
+
+ /**
+ * @param pageAddr Page address.
+ * @param idx Index.
+ * @return Cache ID or {@code 0} if Cache ID is not defined.
+ */
+ int getCacheId(long pageAddr, int idx);
}
/**
*
*/
- public static class PendingEntryInnerIO extends BPlusInnerIO<PendingRow> implements PendingRowIO {
- /** */
- public static final IOVersions<PendingEntryInnerIO> VERSIONS = new IOVersions<>(
- new PendingEntryInnerIO(1)
- );
-
+ private static abstract class AbstractPendingEntryInnerIO extends BPlusInnerIO<PendingRow> implements PendingRowIO {
/**
+ * @param type Page type.
* @param ver Page format version.
+ * @param canGetRow If we can get full row from this page.
+ * @param itemSize Single item size on page.
*/
- PendingEntryInnerIO(int ver) {
- super(T_PENDING_REF_INNER, ver, true, 8 + 8);
+ protected AbstractPendingEntryInnerIO(int type, int ver, boolean canGetRow, int itemSize) {
+ super(type, ver, canGetRow, itemSize);
}
/** {@inheritDoc} */
@@ -1922,6 +2365,12 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
PageUtils.putLong(pageAddr, off, row.expireTime);
PageUtils.putLong(pageAddr, off + 8, row.link);
+
+ if (storeCacheId()) {
+ assert row.cacheId != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(pageAddr, off + 16, row.cacheId);
+ }
}
/** {@inheritDoc} */
@@ -1937,14 +2386,20 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
PageUtils.putLong(dstPageAddr, dstOff, expireTime);
PageUtils.putLong(dstPageAddr, dstOff + 8, link);
+
+ if (storeCacheId()) {
+ int cacheId = ((PendingRowIO)srcIo).getCacheId(srcPageAddr, srcIdx);
+
+ assert cacheId != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(dstPageAddr, dstOff + 16, cacheId);
+ }
}
/** {@inheritDoc} */
@Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx)
throws IgniteCheckedException {
- return PendingRow.createRowWithKey(((PendingEntriesTree)tree).cctx,
- getExpireTime(pageAddr, idx),
- getLink(pageAddr, idx));
+ return new PendingRow(getCacheId(pageAddr, idx), getExpireTime(pageAddr, idx), getLink(pageAddr, idx));
}
/** {@inheritDoc} */
@@ -1956,22 +2411,24 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
@Override public long getLink(long pageAddr, int idx) {
return PageUtils.getLong(pageAddr, offset(idx) + 8);
}
+
+ /**
+ * @return {@code True} if cache ID has to be stored.
+ */
+ protected abstract boolean storeCacheId();
}
/**
*
*/
- public static class PendingEntryLeafIO extends BPlusLeafIO<PendingRow> implements PendingRowIO {
- /** */
- public static final IOVersions<PendingEntryLeafIO> VERSIONS = new IOVersions<>(
- new PendingEntryLeafIO(1)
- );
-
+ private static abstract class AbstractPendingEntryLeafIO extends BPlusLeafIO<PendingRow> implements PendingRowIO {
/**
+ * @param type Page type.
* @param ver Page format version.
+ * @param itemSize Single item size on page.
*/
- PendingEntryLeafIO(int ver) {
- super(T_PENDING_REF_LEAF, ver, 8 + 8);
+ protected AbstractPendingEntryLeafIO(int type, int ver, int itemSize) {
+ super(type, ver, itemSize);
}
/** {@inheritDoc} */
@@ -1981,6 +2438,12 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
PageUtils.putLong(pageAddr, off, row.expireTime);
PageUtils.putLong(pageAddr, off + 8, row.link);
+
+ if (storeCacheId()) {
+ assert row.cacheId != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(pageAddr, off + 16, row.cacheId);
+ }
}
/** {@inheritDoc} */
@@ -1996,14 +2459,20 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
PageUtils.putLong(dstPageAddr, dstOff, expireTime);
PageUtils.putLong(dstPageAddr, dstOff + 8, link);
+
+ if (storeCacheId()) {
+ int cacheId = ((PendingRowIO)srcIo).getCacheId(srcPageAddr, srcIdx);
+
+ assert cacheId != UNDEFINED_CACHE_ID;
+
+ PageUtils.putInt(dstPageAddr, dstOff + 16, cacheId);
+ }
}
/** {@inheritDoc} */
@Override public PendingRow getLookupRow(BPlusTree<PendingRow, ?> tree, long pageAddr, int idx)
throws IgniteCheckedException {
- return PendingRow.createRowWithKey(((PendingEntriesTree)tree).cctx,
- getExpireTime(pageAddr, idx),
- getLink(pageAddr, idx));
+ return new PendingRow(getCacheId(pageAddr, idx), getExpireTime(pageAddr, idx), getLink(pageAddr, idx));
}
/** {@inheritDoc} */
@@ -2015,5 +2484,118 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
@Override public long getLink(long pageAddr, int idx) {
return PageUtils.getLong(pageAddr, offset(idx) + 8);
}
+
+ /**
+ * @return {@code True} if cache ID has to be stored.
+ */
+ protected abstract boolean storeCacheId();
+ }
+
+ /**
+ *
+ */
+ public static final class PendingEntryInnerIO extends AbstractPendingEntryInnerIO {
+ /** */
+ public static final IOVersions<PendingEntryInnerIO> VERSIONS = new IOVersions<>(
+ new PendingEntryInnerIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ PendingEntryInnerIO(int ver) {
+ super(T_PENDING_REF_INNER, ver, true, 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return UNDEFINED_CACHE_ID;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return false;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class PendingEntryLeafIO extends AbstractPendingEntryLeafIO {
+ /** */
+ public static final IOVersions<PendingEntryLeafIO> VERSIONS = new IOVersions<>(
+ new PendingEntryLeafIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ PendingEntryLeafIO(int ver) {
+ super(T_PENDING_REF_LEAF, ver, 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return UNDEFINED_CACHE_ID;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return false;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class CacheIdAwarePendingEntryInnerIO extends AbstractPendingEntryInnerIO {
+ /** */
+ public static final IOVersions<CacheIdAwarePendingEntryInnerIO> VERSIONS = new IOVersions<>(
+ new CacheIdAwarePendingEntryInnerIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ CacheIdAwarePendingEntryInnerIO(int ver) {
+ super(T_CACHE_ID_AWARE_PENDING_REF_INNER, ver, true, 20);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return PageUtils.getInt(pageAddr, offset(idx) + 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return true;
+ }
+ }
+
+ /**
+ *
+ */
+ public static final class CacheIdAwarePendingEntryLeafIO extends AbstractPendingEntryLeafIO {
+ /** */
+ public static final IOVersions<CacheIdAwarePendingEntryLeafIO> VERSIONS = new IOVersions<>(
+ new CacheIdAwarePendingEntryLeafIO(1)
+ );
+
+ /**
+ * @param ver Page format version.
+ */
+ CacheIdAwarePendingEntryLeafIO(int ver) {
+ super(T_CACHE_ID_AWARE_PENDING_REF_LEAF, ver, 20);
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getCacheId(long pageAddr, int idx) {
+ return PageUtils.getInt(pageAddr, offset(idx) + 16);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected boolean storeCacheId() {
+ return true;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/affinity/GridCacheAffinityImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/affinity/GridCacheAffinityImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/affinity/GridCacheAffinityImpl.java
index 41b3281..1cdeb3f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/affinity/GridCacheAffinityImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/affinity/GridCacheAffinityImpl.java
@@ -63,12 +63,7 @@ public class GridCacheAffinityImpl<K, V> implements Affinity<K> {
/** {@inheritDoc} */
@Override public int partitions() {
- CacheConfiguration ccfg = cctx.config();
-
- if (ccfg == null)
- throw new IgniteException(FAILED_TO_FIND_CACHE_ERR_MSG + cctx.name());
-
- return ccfg.getAffinity().partitions();
+ return cctx.group().affinityFunction().partitions();
}
/** {@inheritDoc} */
@@ -196,7 +191,7 @@ public class GridCacheAffinityImpl<K, V> implements Affinity<K> {
int nodesCnt;
if (!cctx.isLocal())
- nodesCnt = cctx.discovery().cacheAffinityNodes(cctx.cacheId(), topVer).size();
+ nodesCnt = cctx.discovery().cacheGroupAffinityNodes(cctx.groupId(), topVer).size();
else
nodesCnt = 1;
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java
index e0076d5..cc26b21 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java
@@ -36,11 +36,6 @@ public interface CacheDataRow extends CacheSearchRow {
public GridCacheVersion version();
/**
- * @return Cache id. Stored only if memory policy with configured per-page eviction is used.
- */
- public int cacheId();
-
- /**
* @return Expire time.
*/
public long expireTime();
[04/22] ignite git commit: ignite-5075 Implement logical 'cache
groups' sharing the same physical caches
Posted by sb...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/db85d166/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
new file mode 100644
index 0000000..78d4e0a
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
@@ -0,0 +1,4301 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import com.google.common.collect.Sets;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.atomic.AtomicReferenceArray;
+import java.util.concurrent.locks.Lock;
+import javax.cache.Cache;
+import javax.cache.CacheException;
+import javax.cache.configuration.Factory;
+import javax.cache.configuration.FactoryBuilder;
+import javax.cache.event.CacheEntryEvent;
+import javax.cache.event.CacheEntryUpdatedListener;
+import javax.cache.integration.CacheLoaderException;
+import javax.cache.integration.CacheWriterException;
+import javax.cache.processor.EntryProcessorException;
+import javax.cache.processor.MutableEntry;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteDataStreamer;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.binary.BinaryObject;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheEntryProcessor;
+import org.apache.ignite.cache.CacheExistsException;
+import org.apache.ignite.cache.CacheInterceptor;
+import org.apache.ignite.cache.CacheInterceptorAdapter;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cache.affinity.AffinityKeyMapper;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cache.query.ContinuousQuery;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.ScanQuery;
+import org.apache.ignite.cache.store.CacheStore;
+import org.apache.ignite.cache.store.CacheStoreAdapter;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.NearCacheConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
+import org.apache.ignite.internal.processors.platform.cache.expiry.PlatformExpiryPolicyFactory;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.internal.util.lang.GridIterator;
+import org.apache.ignite.internal.util.lang.GridPlainCallable;
+import org.apache.ignite.internal.util.lang.gridfunc.ContainsPredicate;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.PA;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiInClosure;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgniteInClosure;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.transactions.Transaction;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
+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.CacheMode.REPLICATED;
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
+import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+import static org.apache.ignite.transactions.TransactionIsolation.SERIALIZABLE;
+
+/**
+ *
+ */
+@SuppressWarnings("unchecked")
+public class IgniteCacheGroupsTest extends GridCommonAbstractTest {
+ /** */
+ private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+ /** */
+ private static final String GROUP1 = "grp1";
+
+ /** */
+ private static final String GROUP2 = "grp2";
+
+ /** */
+ private static final String CACHE1 = "cache1";
+
+ /** */
+ private static final String CACHE2 = "cache2";
+
+ /** */
+ private static final int ASYNC_TIMEOUT = 5000;
+
+ /** */
+ private boolean client;
+
+ /** */
+ private CacheConfiguration[] ccfgs;
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+ ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+ cfg.setClientMode(client);
+
+ if (ccfgs != null) {
+ cfg.setCacheConfiguration(ccfgs);
+
+ ccfgs = null;
+ }
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected long getTestTimeout() {
+ return 10 * 60_000;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ stopAllGrids();
+
+ super.afterTest();
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCloseCache1() throws Exception {
+ startGrid(0);
+
+ client = true;
+
+ Ignite client = startGrid(1);
+
+ IgniteCache c1 = client.createCache(cacheConfiguration(GROUP1, "c1", PARTITIONED, ATOMIC, 0, false));
+
+ checkCacheGroup(0, GROUP1, true);
+ checkCacheGroup(0, GROUP1, true);
+
+ checkCache(0, "c1", 10);
+ checkCache(1, "c1", 10);
+
+ c1.close();
+
+ checkCacheGroup(0, GROUP1, true);
+ checkCacheGroup(1, GROUP1, false);
+
+ checkCache(0, "c1", 10);
+
+ assertNotNull(client.cache("c1"));
+
+ checkCacheGroup(0, GROUP1, true);
+ checkCacheGroup(1, GROUP1, true);
+
+ checkCache(0, "c1", 10);
+ checkCache(1, "c1", 10);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCaches1() throws Exception {
+ createDestroyCaches(1);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCaches2() throws Exception {
+ createDestroyCaches(5);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateCacheWithSameNameInAnotherGroup() throws Exception {
+ startGridsMultiThreaded(2);
+
+ final Ignite ignite = ignite(0);
+
+ ignite.createCache(cacheConfiguration(GROUP1, CACHE1, PARTITIONED, ATOMIC, 2, false));
+
+ GridTestUtils.assertThrows(null, new GridPlainCallable<Void>() {
+ @Override public Void call() throws Exception {
+ ignite(1).createCache(cacheConfiguration(GROUP2, CACHE1, PARTITIONED, ATOMIC, 2, false));
+ return null;
+ }
+ }, CacheExistsException.class, "a cache with the same name is already started");
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCachesAtomicPartitioned() throws Exception {
+ createDestroyCaches(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCachesTxPartitioned() throws Exception {
+ createDestroyCaches(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCachesAtomicReplicated() throws Exception {
+ createDestroyCaches(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCreateDestroyCachesTxReplicated() throws Exception {
+ createDestroyCaches(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryAtomicPartitioned() throws Exception {
+ scanQuery(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryTxPartitioned() throws Exception {
+ scanQuery(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryAtomicReplicated() throws Exception {
+ scanQuery(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryTxReplicated() throws Exception {
+ scanQuery(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryAtomicLocal() throws Exception {
+ scanQuery(LOCAL, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryTxLocal() throws Exception {
+ scanQuery(LOCAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlAtomicPartitioned() throws Exception {
+ entriesTtl(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlTxPartitioned() throws Exception {
+ entriesTtl(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlAtomicReplicated() throws Exception {
+ entriesTtl(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlTxReplicated() throws Exception {
+ entriesTtl(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlAtomicLocal() throws Exception {
+ entriesTtl(LOCAL, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testEntriesTtlTxLocal() throws Exception {
+ entriesTtl(LOCAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorAtomicPartitioned() throws Exception {
+ cacheIterator(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorTxPartitioned() throws Exception {
+ cacheIterator(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorAtomicReplicated() throws Exception {
+ cacheIterator(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorTxReplicated() throws Exception {
+ cacheIterator(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorAtomicLocal() throws Exception {
+ cacheIterator(LOCAL, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheIteratorTxLocal() throws Exception {
+ cacheIterator(LOCAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryMultiplePartitionsAtomicPartitioned() throws Exception {
+ scanQueryMultiplePartitions(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryMultiplePartitionsTxPartitioned() throws Exception {
+ scanQueryMultiplePartitions(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryMultiplePartitionsAtomicReplicated() throws Exception {
+ scanQueryMultiplePartitions(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testScanQueryMultiplePartitionsTxReplicated() throws Exception {
+ scanQueryMultiplePartitions(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryTxReplicated() throws Exception {
+ continuousQuery(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryTxPartitioned() throws Exception {
+ continuousQuery(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryTxLocal() throws Exception {
+ continuousQuery(LOCAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryAtomicReplicated() throws Exception {
+ continuousQuery(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryAtomicPartitioned() throws Exception {
+ continuousQuery(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testContinuousQueryAtomicLocal() throws Exception {
+ continuousQuery(LOCAL, ATOMIC);
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void scanQuery(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 10_000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ boolean loc = cacheMode == LOCAL;
+
+ if (loc)
+ startGrid(0);
+ else
+ startGridsMultiThreaded(4);
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false));
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false));
+
+ IgniteCache<Integer, Integer> cache1;
+ IgniteCache<Integer, Integer> cache2;
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(loc ? 0 : 1);
+
+ cache1 = ignite.cache(CACHE1);
+ cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ // Async put ops.
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(loc ? 0 : 1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(loc ? 0 : 2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+ ScanQuery<Integer, Integer> qry = new ScanQuery<>();
+
+ Set<Integer> keysSet = sequence(keys);
+
+ for (Cache.Entry<Integer, Integer> entry : ignite(loc ? 0 : 3).cache(CACHE1).query(qry)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data1[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+
+ srv0.destroyCache(CACHE1);
+
+ keysSet = sequence(keys);
+
+ for (Cache.Entry<Integer, Integer> entry : ignite(loc ? 0 : 3).cache(CACHE2).query(qry)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data2[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void continuousQuery(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ final int keys = 10_000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ boolean loc = cacheMode == LOCAL;
+
+ if (loc)
+ startGrid(0);
+ else
+ startGridsMultiThreaded(4);
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false));
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false));
+
+ final AtomicInteger cntr1 = new AtomicInteger();
+ final AtomicInteger cntr2 = new AtomicInteger();
+
+ CacheEntryUpdatedListener lsnr1 = new CacheEntryUpdatedListener<Integer, Integer>() {
+ @Override public void onUpdated(
+ Iterable<CacheEntryEvent<? extends Integer, ? extends Integer>> evts) {
+ for (CacheEntryEvent<? extends Integer, ? extends Integer> ignored : evts)
+ cntr1.incrementAndGet();
+ }
+ };
+
+ CacheEntryUpdatedListener lsnr2 = new CacheEntryUpdatedListener<Integer, Integer>() {
+ @Override public void onUpdated(
+ Iterable<CacheEntryEvent<? extends Integer, ? extends Integer>> evts) {
+ for (CacheEntryEvent<? extends Integer, ? extends Integer> ignored : evts)
+ cntr2.incrementAndGet();
+ }
+ };
+
+ QueryCursor qry1 = ignite(loc ? 0 : 2).cache(CACHE1).query(new ContinuousQuery<>().setLocalListener(lsnr1));
+ QueryCursor qry2 = ignite(loc ? 0 : 3).cache(CACHE2).query(new ContinuousQuery<>().setLocalListener(lsnr2));
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(loc ? 0 : 1);
+
+ IgniteCache<Integer, Integer> cache1 = ignite.cache(CACHE1);
+ IgniteCache<Integer, Integer> cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(loc ? 0 : 1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(loc ? 0 : 2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+ GridTestUtils.waitForCondition(new PA() {
+ @Override public boolean apply() {
+ return cntr1.get() == keys && cntr2.get() == keys;
+ }
+ }, 2000);
+
+ assertEquals(cntr1.get(), keys);
+ assertEquals(cntr2.get(), keys);
+
+ qry1.close();
+
+ Map<Integer, Integer> map = generateDataMap(10);
+
+ srv0.cache(CACHE1).putAll(map);
+ srv0.cache(CACHE2).putAll(map);
+
+ GridTestUtils.waitForCondition(new PA() {
+ @Override public boolean apply() {
+ return cntr2.get() == keys + 10;
+ }
+ }, 2000);
+
+ assertEquals(keys + 10, cntr2.get());
+
+ assertEquals(keys, cntr1.get());
+
+ qry2.close();
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void scanQueryMultiplePartitions(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 10000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ startGridsMultiThreaded(4);
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(
+ cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false)
+ .setAffinity(new RendezvousAffinityFunction().setPartitions(32)));
+ srv0.createCache(
+ cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false)
+ .setAffinity(new RendezvousAffinityFunction().setPartitions(32)));
+
+ awaitPartitionMapExchange();
+
+ IgniteCache<Integer, Integer> cache1;
+ IgniteCache<Integer, Integer> cache2;
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(1);
+
+ cache1 = ignite.cache(CACHE1);
+ cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ // Async put ops.
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+
+ int p = ThreadLocalRandom.current().nextInt(32);
+
+ ScanQuery<Integer, Integer> qry = new ScanQuery().setPartition(p);
+
+ Set<Integer> keysSet = new TreeSet<>();
+
+ cache1 = ignite(3).cache(CACHE1);
+
+ Affinity<Integer> aff = affinity(cache1);
+
+ for(int i = 0; i < keys; i++) {
+ if (aff.partition(i) == p) {
+ keysSet.add(i);
+ }
+ }
+
+ for (Cache.Entry<Integer, Integer> entry : cache1.query(qry)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data1[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+
+ srv0.destroyCache(CACHE1);
+
+ keysSet = new TreeSet<>();
+
+ cache2 = ignite(3).cache(CACHE2);
+
+ aff = affinity(cache2);
+
+ for(int i = 0; i < keys; i++) {
+ if (aff.partition(i) == p) {
+ keysSet.add(i);
+ }
+ }
+
+ for (Cache.Entry<Integer, Integer> entry : cache2.query(qry)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data2[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void cacheIterator(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 10000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ boolean local = cacheMode == LOCAL;
+
+ if (local)
+ startGrid(0);
+ else
+ startGridsMultiThreaded(4);
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false));
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false));
+
+ if(!local)
+ awaitPartitionMapExchange();
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(local ? 0 : 1);
+
+ IgniteCache cache1 = ignite.cache(CACHE1);
+ IgniteCache cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ // Async put ops.
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(local ? 0 : 1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(local ? 0 : 2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+
+ Set<Integer> keysSet = sequence(keys);
+
+ for (Cache.Entry<Integer, Integer> entry : ignite(local ? 0 : 3).<Integer, Integer>cache(CACHE1)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data1[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+
+ srv0.destroyCache(CACHE1);
+
+ keysSet = sequence(keys);
+
+ for (Cache.Entry<Integer, Integer> entry : ignite(local ? 0 : 3).<Integer, Integer>cache(CACHE2)) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data2[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ private void entriesTtl(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 10000;
+
+ final int ttl = 10000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ boolean local = cacheMode == LOCAL;
+
+ if (local)
+ startGrid(0);
+ else
+ startGridsMultiThreaded(4);
+
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(
+ cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false)
+ // -1 = ETERNAL just created entries are not expiring
+ // -2 = NOT_CHANGED not to change ttl on entry update
+ .setExpiryPolicyFactory(new PlatformExpiryPolicyFactory(-1, -2, ttl)).setEagerTtl(true)
+ );
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false));
+
+ if (!local)
+ awaitPartitionMapExchange();
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(local ? 0 : 1);
+
+ IgniteCache cache1 = ignite.cache(CACHE1);
+ IgniteCache cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ // async put ops
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(local ? 0 : 1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(local ? 0 : 2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+ checkData(local ? 0 : 3, CACHE1, data1);
+ checkData(local ? 0 : 3, CACHE2, data2);
+
+ srv0.destroyCache(CACHE2);
+
+ checkData(local ? 0 : 3, CACHE1, data1);
+
+ // Wait for expiration
+
+ Thread.sleep((long)(ttl * 1.2));
+
+ assertEquals(0, ignite(local ? 0 : 3).cache(CACHE1).size());
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Cache atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void createDestroyCaches(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 10000;
+
+ Integer[] data1 = generateData(keys);
+ Integer[] data2 = generateData(keys);
+
+ startGridsMultiThreaded(4);
+
+ Ignite srv0 = ignite(0);
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 2, false));
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 2, false));
+
+ awaitPartitionMapExchange();
+
+ if (atomicityMode == TRANSACTIONAL) {
+ Ignite ignite = ignite(1);
+
+ IgniteCache cache1 = ignite.cache(CACHE1);
+ IgniteCache cache2 = ignite.cache(CACHE2);
+
+ try (Transaction tx = ignite.transactions().txStart()) {
+ for (int i = 0; i < keys ; i++) {
+ cache1.put(i, data1[i]);
+ cache2.put(i, data2[i]);
+ }
+
+ tx.commit();
+ }
+ }
+ else {
+ int ldrs = 4;
+
+ List<Callable<?>> cls = new ArrayList<>(ldrs * 2);
+
+ for (int i = 0; i < ldrs ; i++) {
+ cls.add(putOperation(1, ldrs, i, CACHE1, data1));
+ cls.add(putOperation(2, ldrs, i, CACHE2, data2));
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+ }
+
+ checkLocalData(3, CACHE1, data1);
+ checkLocalData(0, CACHE2, data2);
+
+ checkData(0, CACHE1, data1);
+ checkData(3, CACHE2, data2);
+
+ ignite(1).destroyCache(CACHE2);
+
+ startGrid(5);
+
+ awaitPartitionMapExchange();
+
+ checkData(5, CACHE1, data1);
+ checkLocalData(5, CACHE1, data1);
+
+ ignite(1).destroyCache(CACHE1);
+
+ checkCacheGroup(5, GROUP1, false);
+ }
+
+ /**
+ * @param idx Node index.
+ * @param ldrs Loaders count.
+ * @param ldrIdx Loader index.
+ * @param cacheName Cache name.
+ * @param data Data.
+ * @return Callable for put operation.
+ */
+ private Callable<Void> putOperation(
+ final int idx,
+ final int ldrs,
+ final int ldrIdx,
+ final String cacheName,
+ final Integer[] data) {
+ return new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ IgniteCache cache = ignite(idx).cache(cacheName);
+
+ for (int j = 0, size = data.length; j < size ; j++) {
+ if (j % ldrs == ldrIdx)
+ cache.put(j, data[j]);
+ }
+
+ return null;
+ }
+ };
+ }
+
+ /**
+ * Creates an array of random integers.
+ *
+ * @param cnt Array length.
+ * @return Array of random integers.
+ */
+ private Integer[] generateData(int cnt) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer[] data = new Integer[cnt];
+
+ for (int i = 0; i < data.length; i++)
+ data[i] = rnd.nextInt();
+
+ return data;
+ }
+
+ /**
+ * Creates a map with random integers.
+ *
+ * @param cnt Map size length.
+ * @return Map with random integers.
+ */
+ private Map<Integer, Integer> generateDataMap(int cnt) {
+ return generateDataMap(0, cnt);
+ }
+
+ /**
+ * Creates a map with random integers.
+ *
+ * @param startKey Start key.
+ * @param cnt Map size length.
+ * @return Map with random integers.
+ */
+ private Map<Integer, Integer> generateDataMap(int startKey, int cnt) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Map<Integer, Integer> data = U.newHashMap(cnt);
+
+ for (int i = 0; i < cnt; i++)
+ data.put(startKey++, rnd.nextInt());
+
+ return data;
+ }
+
+ /**
+ * @param cnt Sequence length.
+ * @return Sequence of integers.
+ */
+ private Set<Integer> sequence(int cnt) {
+ Set<Integer> res = new TreeSet<>();
+
+ for (int i = 0; i < cnt; i++)
+ res.add(i);
+
+ return res;
+ }
+
+ /**
+ * @param idx Node index.
+ * @param cacheName Cache name.
+ * @param data Expected data.
+ * @throws Exception If failed.
+ */
+ private void checkData(int idx, String cacheName, Integer[] data) throws Exception {
+ Set<Integer> keys = sequence(data.length);
+
+ Set<Map.Entry<Integer, Integer>> entries =
+ ignite(idx).<Integer, Integer>cache(cacheName).getAll(keys).entrySet();
+
+ for (Map.Entry<Integer, Integer> entry : entries) {
+ assertTrue(keys.remove(entry.getKey()));
+ assertEquals(data[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keys.isEmpty());
+ }
+
+ /**
+ * @param idx Node index.
+ * @param cacheName Cache name.
+ * @param data Expected data.
+ * @throws Exception If failed.
+ */
+ private void checkLocalData(int idx, String cacheName, Integer[] data) throws Exception {
+ Ignite ignite = ignite(idx);
+ ClusterNode node = ignite.cluster().localNode();
+ IgniteCache cache = ignite.<Integer, Integer>cache(cacheName);
+
+ Affinity aff = affinity(cache);
+
+ Set<Integer> localKeys = new TreeSet<>();
+
+ for (int key = 0; key < data.length; key++) {
+ if(aff.isPrimaryOrBackup(node, key))
+ localKeys.add(key);
+ }
+
+ Iterable<Cache.Entry<Integer, Integer>> localEntries = cache.localEntries(CachePeekMode.OFFHEAP);
+
+ for (Cache.Entry<Integer, Integer> entry : localEntries) {
+ assertTrue(localKeys.remove(entry.getKey()));
+ assertEquals(data[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(localKeys.isEmpty());
+ }
+
+ /**
+ * @param srvs Number of server nodes.
+ * @throws Exception If failed.
+ */
+ private void createDestroyCaches(int srvs) throws Exception {
+ startGridsMultiThreaded(srvs);
+
+ checkCacheDiscoveryDataConsistent();
+
+ Ignite srv0 = ignite(0);
+
+ for (int i = 0; i < srvs; i++)
+ checkCacheGroup(i, GROUP1, false);
+
+ for (int iter = 0; iter < 3; iter++) {
+ log.info("Iteration: " + iter);
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE1, PARTITIONED, ATOMIC, 2, false));
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < srvs; i++) {
+ checkCacheGroup(i, GROUP1, true);
+
+ checkCache(i, CACHE1, 10);
+ }
+
+ srv0.createCache(cacheConfiguration(GROUP1, CACHE2, PARTITIONED, ATOMIC, 2, false));
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < srvs; i++) {
+ checkCacheGroup(i, GROUP1, true);
+
+ checkCache(i, CACHE2, 10);
+ }
+
+ srv0.destroyCache(CACHE1);
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < srvs; i++) {
+ checkCacheGroup(i, GROUP1, true);
+
+ checkCache(i, CACHE2, 10);
+ }
+
+ srv0.destroyCache(CACHE2);
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < srvs; i++)
+ checkCacheGroup(i, GROUP1, false);
+ }
+ }
+
+ /**
+ * @param idx Node index.
+ * @param cacheName Cache name.
+ * @param ops Number of operations to execute.
+ */
+ private void checkCache(int idx, String cacheName, int ops) {
+ IgniteCache cache = ignite(idx).cache(cacheName);
+
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+ for (int i = 0; i < ops; i++) {
+ Integer key = rnd.nextInt();
+
+ cache.put(key, i);
+
+ assertEquals(i, cache.get(key));
+ }
+ }
+
+ /**
+ * @param cache3 {@code True} if add last cache.
+ * @return Cache configurations.
+ */
+ private CacheConfiguration[] staticConfigurations1(boolean cache3) {
+ CacheConfiguration[] ccfgs = new CacheConfiguration[cache3 ? 3 : 2];
+
+ ccfgs[0] = cacheConfiguration(null, "cache1", PARTITIONED, ATOMIC, 2, false);
+ ccfgs[1] = cacheConfiguration(GROUP1, "cache2", PARTITIONED, ATOMIC, 2, false);
+
+ if (cache3)
+ ccfgs[2] = cacheConfiguration(GROUP1, "cache3", PARTITIONED, ATOMIC, 2, false);
+
+ return ccfgs;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testDiscoveryDataConsistency1() throws Exception {
+ ccfgs = staticConfigurations1(true);
+ Ignite srv0 = startGrid(0);
+
+ ccfgs = staticConfigurations1(true);
+ startGrid(1);
+
+ checkCacheDiscoveryDataConsistent();
+
+ ccfgs = null;
+ startGrid(2);
+
+ checkCacheDiscoveryDataConsistent();
+
+ srv0.createCache(cacheConfiguration(null, "cache4", PARTITIONED, ATOMIC, 2, false));
+
+ checkCacheDiscoveryDataConsistent();
+
+ ccfgs = staticConfigurations1(true);
+ startGrid(3);
+
+ checkCacheDiscoveryDataConsistent();
+
+ srv0.createCache(cacheConfiguration(GROUP1, "cache5", PARTITIONED, ATOMIC, 2, false));
+
+ ccfgs = staticConfigurations1(true);
+ startGrid(4);
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < 5; i++)
+ checkCacheGroup(i, GROUP1, true);
+
+ srv0.destroyCache("cache1");
+ srv0.destroyCache("cache2");
+ srv0.destroyCache("cache3");
+
+ checkCacheDiscoveryDataConsistent();
+
+ ccfgs = staticConfigurations1(true);
+ startGrid(5);
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < 6; i++)
+ checkCacheGroup(i, GROUP1, true);
+
+ srv0.destroyCache("cache1");
+ srv0.destroyCache("cache2");
+ srv0.destroyCache("cache3");
+ srv0.destroyCache("cache4");
+ srv0.destroyCache("cache5");
+
+ ccfgs = staticConfigurations1(true);
+ startGrid(6);
+
+ checkCacheDiscoveryDataConsistent();
+
+ srv0.createCache(cacheConfiguration(null, "cache4", PARTITIONED, ATOMIC, 2, false));
+ srv0.createCache(cacheConfiguration(GROUP1, "cache5", PARTITIONED, ATOMIC, 2, false));
+
+ checkCacheDiscoveryDataConsistent();
+
+ ccfgs = staticConfigurations1(false);
+ startGrid(7);
+
+ checkCacheDiscoveryDataConsistent();
+
+ awaitPartitionMapExchange();
+ }
+
+ /**
+ * @param cnt Caches number.
+ * @param grp Cache groups.
+ * @param baseName Caches name prefix.
+ * @return Cache configurations.
+ */
+ private CacheConfiguration[] cacheConfigurations(int cnt, String grp, String baseName) {
+ CacheConfiguration[] ccfgs = new CacheConfiguration[cnt];
+
+ for (int i = 0; i < cnt; i++) {
+ ccfgs[i] = cacheConfiguration(grp,
+ baseName + i, PARTITIONED,
+ i % 2 == 0 ? TRANSACTIONAL : ATOMIC,
+ 2,
+ false).setAffinity(new RendezvousAffinityFunction(false, 256));
+ }
+
+ return ccfgs;
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testStartManyCaches() throws Exception {
+ final int CACHES = 5_000;
+
+ final int NODES = 4;
+
+ for (int i = 0; i < NODES; i++) {
+ ccfgs = cacheConfigurations(CACHES, GROUP1, "testCache1-");
+
+ client = i == NODES - 1;
+
+ startGrid(i);
+ }
+
+ Ignite client = ignite(NODES - 1);
+
+ client.createCaches(Arrays.asList(cacheConfigurations(CACHES, GROUP2, "testCache2-")));
+
+ checkCacheDiscoveryDataConsistent();
+
+ for (int i = 0; i < NODES; i++) {
+ for (int c = 0; c < CACHES; c++) {
+ if (c % 100 == 0)
+ log.info("Check node: " + i);
+
+ checkCache(i, "testCache1-" + c, 1);
+ checkCache(i, "testCache2-" + c, 1);
+ }
+ }
+
+ log.info("Stop nodes.");
+
+ GridTestUtils.runMultiThreaded(new IgniteInClosure<Integer>() {
+ @Override public void apply(Integer idx) {
+ stopGrid(idx);
+ }
+ }, NODES, "stopThread");
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testRebalance1() throws Exception {
+ Ignite srv0 = startGrid(0);
+
+ IgniteCache<Object, Object> srv0Cache1 =
+ srv0.createCache(cacheConfiguration(GROUP1, "c1", PARTITIONED, ATOMIC, 2, false));
+ IgniteCache<Object, Object> srv0Cache2 =
+ srv0.createCache(cacheConfiguration(GROUP1, "c2", PARTITIONED, ATOMIC, 2, false));
+ IgniteCache<Object, Object> srv0Cache3 =
+ srv0.createCache(cacheConfiguration(GROUP2, "c3", PARTITIONED, TRANSACTIONAL, 2, false));
+ IgniteCache<Object, Object> srv0Cache4 =
+ srv0.createCache(cacheConfiguration(GROUP2, "c4", PARTITIONED, TRANSACTIONAL, 2, false));
+
+ final int ITEMS = 1_000;
+
+ for (int i = 0; i < ITEMS; i++) {
+ srv0Cache1.put(new Key1(i), i);
+
+ srv0Cache3.put(new Key1(i), i);
+ srv0Cache4.put(new Key1(i), -i);
+ }
+
+ assertEquals(ITEMS, srv0Cache1.size());
+ assertEquals(ITEMS, srv0Cache1.localSize());
+ assertEquals(0, srv0Cache2.size());
+ assertEquals(ITEMS, srv0Cache3.size());
+ assertEquals(ITEMS, srv0Cache4.localSize());
+
+ startGrid(1);
+
+ awaitPartitionMapExchange();
+
+ for (int i = 0; i < 2; i++) {
+ Ignite node = ignite(i);
+
+ IgniteCache<Object, Object> cache1 = node.cache("c1");
+ IgniteCache<Object, Object> cache2 = node.cache("c2");
+ IgniteCache<Object, Object> cache3 = node.cache("c3");
+ IgniteCache<Object, Object> cache4 = node.cache("c4");
+
+ assertEquals(ITEMS * 2, cache1.size(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache1.localSize(CachePeekMode.ALL));
+ assertEquals(0, cache2.size(CachePeekMode.ALL));
+ assertEquals(0, cache2.localSize(CachePeekMode.ALL));
+
+ assertEquals(ITEMS * 2, cache3.size(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache3.localSize(CachePeekMode.ALL));
+
+ assertEquals(ITEMS * 2, cache4.size(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache4.localSize(CachePeekMode.ALL));
+
+ for (int k = 0; k < ITEMS; k++) {
+ assertEquals(i, cache1.localPeek(new Key1(i)));
+ assertNull(cache2.localPeek(new Key1(i)));
+ assertEquals(i, cache3.localPeek(new Key1(i)));
+ assertEquals(-i, cache4.localPeek(new Key1(i)));
+ }
+ }
+
+ for (int i = 0; i < ITEMS * 2; i++)
+ srv0Cache2.put(new Key1(i), i + 1);
+
+ Ignite srv2 = startGrid(2);
+
+ awaitPartitionMapExchange();
+
+ for (int i = 0; i < 3; i++) {
+ Ignite node = ignite(i);
+
+ IgniteCache<Object, Object> cache1 = node.cache("c1");
+ IgniteCache<Object, Object> cache2 = node.cache("c2");
+ IgniteCache<Object, Object> cache3 = node.cache("c3");
+ IgniteCache<Object, Object> cache4 = node.cache("c4");
+
+ assertEquals(ITEMS * 3, cache1.size(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache1.localSize(CachePeekMode.ALL));
+ assertEquals(ITEMS * 6, cache2.size(CachePeekMode.ALL));
+ assertEquals(ITEMS * 2, cache2.localSize(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache3.localSize(CachePeekMode.ALL));
+ assertEquals(ITEMS, cache4.localSize(CachePeekMode.ALL));
+ }
+
+ IgniteCache<Object, Object> srv2Cache1 = srv2.cache("c1");
+ IgniteCache<Object, Object> srv2Cache2 = srv2.cache("c2");
+
+ for (int i = 0; i < ITEMS; i++)
+ assertEquals(i, srv2Cache1.localPeek(new Key1(i)));
+
+ for (int i = 0; i < ITEMS * 2; i++)
+ assertEquals(i + 1, srv2Cache2.localPeek(new Key1(i)));
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testRebalance2() throws Exception {
+ Ignite srv0 = startGrid(0);
+
+ IgniteCache<Object, Object> srv0Cache1 =
+ srv0.createCache(cacheConfiguration(GROUP1, "c1", PARTITIONED, ATOMIC, 0, false));
+ IgniteCache<Object, Object> srv0Cache2 =
+ srv0.createCache(cacheConfiguration(GROUP1, "c2", PARTITIONED, ATOMIC, 0, false));
+
+ Affinity aff = srv0.affinity("c1");
+
+ final int ITEMS = 2_000;
+
+ Map<Integer, Integer> c1Data = new HashMap<>();
+ Map<Integer, Integer> c2Data = new HashMap<>();
+
+ for (int i = 0; i < ITEMS; i++) {
+ srv0Cache1.put(i, i);
+ c1Data.put(i, i);
+
+ if (i % 2 == 0) {
+ srv0Cache2.put(i, i);
+ c2Data.put(i, i);
+ }
+ }
+
+ assertEquals(ITEMS, srv0Cache1.size());
+ assertEquals(ITEMS / 2, srv0Cache2.size());
+
+ Ignite srv1 = startGrid(1);
+
+ awaitPartitionMapExchange();
+
+ assertEquals(ITEMS, srv0Cache1.size());
+ assertEquals(ITEMS / 2, srv0Cache2.size());
+
+ checkCacheData(c1Data, "c1");
+ checkCacheData(c2Data, "c2");
+
+ Set<Integer> srv1Parts = new HashSet<>();
+
+ for (Integer p : aff.primaryPartitions(srv1.cluster().localNode()))
+ srv1Parts.add(p);
+
+ CacheGroupContext grpSrv0 = cacheGroup(srv0, GROUP1);
+ CacheGroupContext grpSrv1 = cacheGroup(srv1, GROUP1);
+
+ for (int p = 0; p < aff.partitions(); p++) {
+ if (srv1Parts.contains(p)) {
+ GridIterator<CacheDataRow> it = grpSrv0.offheap().partitionIterator(p);
+ assertFalse(it.hasNext());
+
+ it = grpSrv1.offheap().partitionIterator(p);
+ assertTrue(it.hasNext());
+ }
+ else {
+ GridIterator<CacheDataRow> it = grpSrv0.offheap().partitionIterator(p);
+ assertTrue(it.hasNext());
+
+ it = grpSrv1.offheap().partitionIterator(p);
+ assertFalse(it.hasNext());
+ }
+ }
+
+ c1Data = new HashMap<>();
+ c2Data = new HashMap<>();
+
+ for (int i = 0; i < ITEMS; i++) {
+ srv0Cache1.put(i, i + 1);
+ c1Data.put(i, i + 1);
+
+ if (i % 2 == 0) {
+ srv0Cache2.put(i, i + 1);
+ c2Data.put(i, i + 1);
+ }
+ }
+
+ checkCacheData(c1Data, "c1");
+ checkCacheData(c2Data, "c2");
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testNoKeyIntersectTx() throws Exception {
+ testNoKeyIntersect(TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testNoKeyIntersectAtomic() throws Exception {
+ testNoKeyIntersect(ATOMIC);
+ }
+
+ /**
+ * @param atomicityMode Atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void testNoKeyIntersect(CacheAtomicityMode atomicityMode) throws Exception {
+ startGrid(0);
+
+ testNoKeyIntersect(atomicityMode, false);
+
+ testNoKeyIntersect(atomicityMode, true);
+
+ startGridsMultiThreaded(1, 4);
+
+ testNoKeyIntersect(atomicityMode, false);
+
+ testNoKeyIntersect(atomicityMode, true);
+ }
+
+ /**
+ * @param keys Keys.
+ * @param rnd Random.
+ * @return Added key.
+ */
+ private Integer addKey(Set<Integer> keys, ThreadLocalRandom rnd) {
+ for (;;) {
+ Integer key = rnd.nextInt(100_000);
+
+ if (keys.add(key))
+ return key;
+ }
+ }
+
+ /**
+ * @param atomicityMode Cache atomicity mode.
+ * @param heapCache On heap cache flag.
+ * @throws Exception If failed.
+ */
+ private void testNoKeyIntersect(CacheAtomicityMode atomicityMode, boolean heapCache) throws Exception {
+ Ignite srv0 = ignite(0);
+
+ try {
+ IgniteCache cache1 = srv0.
+ createCache(cacheConfiguration(GROUP1, "c1", PARTITIONED, atomicityMode, 1, heapCache));
+
+ Set<Integer> keys = new LinkedHashSet<>(30);
+
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+ for (int i = 0; i < 10; i++) {
+ Integer key = addKey(keys, rnd);
+
+ cache1.put(key, key);
+ cache1.put(new Key1(key), new Value1(key));
+ cache1.put(new Key2(key), new Value2(key));
+ }
+
+ assertEquals(30, cache1.size());
+
+ IgniteCache cache2 = srv0.
+ createCache(cacheConfiguration(GROUP1, "c2", PARTITIONED, atomicityMode, 1, heapCache));
+
+ assertEquals(30, cache1.size());
+ assertEquals(0 , cache2.size());
+
+ for (Integer key : keys) {
+ assertNull(cache2.get(key));
+ assertNull(cache2.get(new Key1(key)));
+ assertNull(cache2.get(new Key2(key)));
+
+ cache2.put(key, key + 1);
+ cache2.put(new Key1(key), new Value1(key + 1));
+ cache2.put(new Key2(key), new Value2(key + 1));
+ }
+
+ assertEquals(30, cache1.size());
+ assertEquals(30, cache2.size());
+
+ for (int i = 0; i < 10; i++) {
+ Integer key = addKey(keys, rnd);
+
+ cache2.put(key, key + 1);
+ cache2.put(new Key1(key), new Value1(key + 1));
+ cache2.put(new Key2(key), new Value2(key + 1));
+ }
+
+ assertEquals(30, cache1.size());
+ assertEquals(60, cache2.size());
+
+ int i = 0;
+
+ for (Integer key : keys) {
+ if (i++ < 10) {
+ assertEquals(key, cache1.get(key));
+ assertEquals(new Value1(key), cache1.get(new Key1(key)));
+ assertEquals(new Value2(key), cache1.get(new Key2(key)));
+ }
+ else {
+ assertNull(cache1.get(key));
+ assertNull(cache1.get(new Key1(key)));
+ assertNull(cache1.get(new Key2(key)));
+ }
+
+ assertEquals(key + 1, cache2.get(key));
+ assertEquals(new Value1(key + 1), cache2.get(new Key1(key)));
+ assertEquals(new Value2(key + 1), cache2.get(new Key2(key)));
+ }
+
+ IgniteCache cache3 = srv0.
+ createCache(cacheConfiguration(GROUP1, "c3", PARTITIONED, atomicityMode, 1, heapCache));
+
+ assertEquals(30, cache1.size());
+ assertEquals(60, cache2.size());
+ assertEquals(0, cache3.size());
+
+ for (Integer key : keys) {
+ assertNull(cache3.get(key));
+ assertNull(cache3.get(new Key1(key)));
+ assertNull(cache3.get(new Key2(key)));
+ }
+
+ for (Integer key : keys) {
+ cache3.put(key, key);
+ cache3.put(new Key1(key), new Value1(key));
+ cache3.put(new Key2(key), new Value2(key));
+ }
+
+ i = 0;
+
+ for (Integer key : keys) {
+ if (i++ < 10) {
+ assertEquals(key, cache1.get(key));
+ assertEquals(new Value1(key), cache1.get(new Key1(key)));
+ assertEquals(new Value2(key), cache1.get(new Key2(key)));
+ }
+ else {
+ assertNull(cache1.get(key));
+ assertNull(cache1.get(new Key1(key)));
+ assertNull(cache1.get(new Key2(key)));
+ }
+
+ assertEquals(key + 1, cache2.get(key));
+ assertEquals(new Value1(key + 1), cache2.get(new Key1(key)));
+ assertEquals(new Value2(key + 1), cache2.get(new Key2(key)));
+
+ assertEquals(key, cache3.get(key));
+ assertEquals(new Value1(key), cache3.get(new Key1(key)));
+ assertEquals(new Value2(key), cache3.get(new Key2(key)));
+ }
+
+ i = 0;
+
+ for (Integer key : keys) {
+ if (i++ == 3)
+ break;
+
+ cache1.remove(key);
+ cache1.remove(new Key1(key));
+ cache1.remove(new Key2(key));
+
+ assertNull(cache1.get(key));
+ assertNull(cache1.get(new Key1(key)));
+ assertNull(cache1.get(new Key2(key)));
+
+ assertEquals(key + 1, cache2.get(key));
+ assertEquals(new Value1(key + 1), cache2.get(new Key1(key)));
+ assertEquals(new Value2(key + 1), cache2.get(new Key2(key)));
+
+ assertEquals(key, cache3.get(key));
+ assertEquals(new Value1(key), cache3.get(new Key1(key)));
+ assertEquals(new Value2(key), cache3.get(new Key2(key)));
+ }
+
+ cache1.removeAll();
+
+ for (Integer key : keys) {
+ assertNull(cache1.get(key));
+ assertNull(cache1.get(new Key1(key)));
+ assertNull(cache1.get(new Key2(key)));
+
+ assertEquals(key + 1, cache2.get(key));
+ assertEquals(new Value1(key + 1), cache2.get(new Key1(key)));
+ assertEquals(new Value2(key + 1), cache2.get(new Key2(key)));
+
+ assertEquals(key, cache3.get(key));
+ assertEquals(new Value1(key), cache3.get(new Key1(key)));
+ assertEquals(new Value2(key), cache3.get(new Key2(key)));
+ }
+
+ cache2.removeAll();
+
+ for (Integer key : keys) {
+ assertNull(cache1.get(key));
+ assertNull(cache1.get(new Key1(key)));
+ assertNull(cache1.get(new Key2(key)));
+
+ assertNull(cache2.get(key));
+ assertNull(cache2.get(new Key1(key)));
+ assertNull(cache2.get(new Key2(key)));
+
+ assertEquals(key, cache3.get(key));
+ assertEquals(new Value1(key), cache3.get(new Key1(key)));
+ assertEquals(new Value2(key), cache3.get(new Key2(key)));
+ }
+
+ if (atomicityMode == TRANSACTIONAL)
+ testNoKeyIntersectTxLocks(cache1, cache2);
+ }
+ finally {
+ srv0.destroyCaches(Arrays.asList("c1", "c2", "c3"));
+ }
+ }
+
+ /**
+ * @param cache1 Cache1.
+ * @param cache2 Cache2.
+ * @throws Exception If failed.
+ */
+ private void testNoKeyIntersectTxLocks(final IgniteCache cache1, final IgniteCache cache2) throws Exception {
+ final Ignite node = (Ignite)cache1.unwrap(Ignite.class);
+
+ for (int i = 0; i < 5; i++) {
+ final Integer key = ThreadLocalRandom.current().nextInt(1000);
+
+ Lock lock = cache1.lock(key);
+
+ lock.lock();
+
+ try {
+ IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() {
+ @Override public Object call() throws Exception {
+ Lock lock1 = cache1.lock(key);
+
+ assertFalse(lock1.tryLock());
+
+ Lock lock2 = cache2.lock(key);
+
+ assertTrue(lock2.tryLock());
+
+ lock2.unlock();
+
+ return null;
+ }
+ }, "lockThread");
+
+ fut.get(10_000);
+ }
+ finally {
+ lock.unlock();
+ }
+
+ try (Transaction tx = node.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ cache1.put(key, 1);
+
+ IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() {
+ @Override public Object call() throws Exception {
+ try (Transaction tx = node.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ cache2.put(key, 2);
+
+ tx.commit();
+ }
+
+ assertEquals(2, cache2.get(key));
+
+ return null;
+ }
+ }, "txThread");
+
+ fut.get(10_000);
+
+ tx.commit();
+ }
+
+ assertEquals(1, cache1.get(key));
+ assertEquals(2, cache2.get(key));
+
+ try (Transaction tx = node.transactions().txStart(OPTIMISTIC, SERIALIZABLE)) {
+ Integer val = (Integer)cache1.get(key);
+
+ cache1.put(key, val + 10);
+
+ IgniteInternalFuture fut = GridTestUtils.runAsync(new Callable() {
+ @Override public Object call() throws Exception {
+ try (Transaction tx = node.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+ cache2.put(key, 3);
+
+ tx.commit();
+ }
+
+ assertEquals(3, cache2.get(key));
+
+ return null;
+ }
+ }, "txThread");
+
+ fut.get(10_000);
+
+ tx.commit();
+ }
+
+ assertEquals(11, cache1.get(key));
+ assertEquals(3, cache2.get(key));
+ }
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheApiTxPartitioned() throws Exception {
+ cacheApiTest(PARTITIONED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheApiTxReplicated() throws Exception {
+ cacheApiTest(REPLICATED, TRANSACTIONAL);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheApiAtomicPartitioned() throws Exception {
+ cacheApiTest(PARTITIONED, ATOMIC);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testCacheApiAtomicReplicated() throws Exception {
+ cacheApiTest(REPLICATED, ATOMIC);
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void cacheApiTest(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ startGridsMultiThreaded(4);
+
+ client = true;
+
+ startGrid(4);
+
+ int[] backups = cacheMode == REPLICATED ? new int[]{Integer.MAX_VALUE} : new int[]{0, 1, 2, 3};
+
+ for (int backups0 : backups)
+ cacheApiTest(cacheMode, atomicityMode, backups0, false, false, false);
+
+ int backups0 = cacheMode == REPLICATED ? Integer.MAX_VALUE :
+ backups[ThreadLocalRandom.current().nextInt(backups.length)];
+
+ cacheApiTest(cacheMode, atomicityMode, backups0, true, false, false);
+
+ if (cacheMode == PARTITIONED) {
+ // Here the f variable is used as a bit set where 2 last bits
+ // determine whether a near cache is used on server/client side.
+ // The case without near cache is already tested at this point.
+ for (int f : new int[]{1, 2, 3}) {
+ cacheApiTest(cacheMode, atomicityMode, backups0, false, nearSrv(f), nearClient(f));
+ cacheApiTest(cacheMode, atomicityMode, backups0, true, nearSrv(f), nearClient(f));
+ }
+ }
+ }
+
+ /**
+ * @param flag Flag.
+ * @return {@code True} if near cache should be used on a client side.
+ */
+ private boolean nearClient(int flag) {
+ return (flag & 0b01) == 0b01;
+ }
+
+ /**
+ * @param flag Flag.
+ * @return {@code True} if near cache should be used on a server side.
+ */
+ private boolean nearSrv(int flag) {
+ return (flag & 0b10) == 0b10;
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Atomicity mode.
+ * @param backups Number of backups.
+ * @param heapCache On heap cache flag.
+ * @param nearSrv {@code True} if near cache should be used on a server side.
+ * @param nearClient {@code True} if near cache should be used on a client side.
+ * @throws Exception If failed.
+ */
+ private void cacheApiTest(CacheMode cacheMode,
+ CacheAtomicityMode atomicityMode,
+ int backups,
+ boolean heapCache,
+ boolean nearSrv,
+ boolean nearClient) throws Exception {
+ Ignite srv0 = ignite(0);
+
+ NearCacheConfiguration nearCfg = nearSrv ? new NearCacheConfiguration() : null;
+
+ srv0.createCache(cacheConfiguration(GROUP1, "cache-0", cacheMode, atomicityMode, backups, heapCache)
+ .setNearConfiguration(nearCfg));
+
+ srv0.createCache(cacheConfiguration(GROUP1, "cache-1", cacheMode, atomicityMode, backups, heapCache));
+
+ srv0.createCache(cacheConfiguration(GROUP2, "cache-2", cacheMode, atomicityMode, backups, heapCache)
+ .setNearConfiguration(nearCfg));
+
+ srv0.createCache(cacheConfiguration(null, "cache-3", cacheMode, atomicityMode, backups, heapCache));
+
+ if (nearClient) {
+ Ignite clientNode = ignite(4);
+
+ clientNode.createNearCache("cache-0", new NearCacheConfiguration());
+ clientNode.createNearCache("cache-2", new NearCacheConfiguration());
+ }
+
+ try {
+ for (final Ignite node : Ignition.allGrids()) {
+ List<Callable<?>> ops = new ArrayList<>();
+
+ for (int i = 0; i < 4; i++)
+ ops.add(testSet(node.cache("cache-" + i), cacheMode, atomicityMode, backups, heapCache, node));
+
+ // Async operations.
+ GridTestUtils.runMultiThreaded(ops, "cacheApiTest");
+ }
+ }
+ finally {
+ for (int i = 0; i < 4; i++)
+ srv0.destroyCache("cache-" + i);
+ }
+ }
+
+ /**
+ * @param cache Cache.
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Atomicity mode.
+ * @param backups Number of backups.
+ * @param heapCache On heap cache flag.
+ * @param node Ignite node.
+ * @return Callable for the test operations.
+ */
+ private Callable<?> testSet(
+ final IgniteCache<Object, Object> cache,
+ final CacheMode cacheMode,
+ final CacheAtomicityMode atomicityMode,
+ final int backups,
+ final boolean heapCache,
+ final Ignite node) {
+ return new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ log.info("Test cache [node=" + node.name() +
+ ", cache=" + cache.getName() +
+ ", mode=" + cacheMode +
+ ", atomicity=" + atomicityMode +
+ ", backups=" + backups +
+ ", heapCache=" + heapCache +
+ ']');
+
+ cacheApiTest(cache);
+
+ return null;
+ }
+ };
+ }
+
+ /**
+ * @param cache Cache.
+ * @throws Exception If failed.
+ */
+ private void cacheApiTest(IgniteCache cache) throws Exception {
+ cachePutAllGetAllContainsAll(cache);
+
+ cachePutAllGetAllContainsAllAsync(cache);
+
+ cachePutRemove(cache);
+
+ cachePutRemoveAsync(cache);
+
+ cachePutGetContains(cache);
+
+ cachePutGetContainsAsync(cache);
+
+ cachePutGetAndPut(cache);
+
+ cachePutGetAndPutAsync(cache);
+
+ cachePutGetAndRemove(cache);
+
+ cachePutGetAndRemoveAsync(cache);
+
+ cachePutGetAndReplace(cache);
+
+ cachePutGetAndReplaceAsync(cache);
+
+ cachePutIfAbsent(cache);
+
+ cachePutIfAbsentAsync(cache);
+
+ cachePutGetAndPutIfAbsent(cache);
+
+ cachePutGetAndPutIfAbsentAsync(cache);
+
+ cacheQuery(cache);
+
+ cacheInvokeAll(cache);
+
+ cacheInvoke(cache);
+
+ cacheInvokeAllAsync(cache);
+
+ cacheInvokeAsync(cache);
+
+ cacheDataStreamer(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void tearDown(IgniteCache cache) {
+ cache.clear();
+
+ cache.removeAll();
+ }
+
+ /**
+ * @param cache Cache.
+ * @throws Exception If failed.
+ */
+ private void cacheDataStreamer(final IgniteCache cache) throws Exception {
+ final int keys = 400;
+ final int loaders = 4;
+
+ final Integer[] data = generateData(keys * loaders);
+
+ // Stream through a client node.
+ Ignite clientNode = ignite(4);
+
+ List<Callable<?>> cls = new ArrayList<>(loaders);
+
+ for (final int i : sequence(loaders)) {
+ final IgniteDataStreamer ldr = clientNode.dataStreamer(cache.getName());
+
+ ldr.autoFlushFrequency(0);
+
+ cls.add(new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ List<IgniteFuture> futs = new ArrayList<>(keys);
+
+ for (int j = 0, size = keys * loaders; j < size; j++) {
+ if (j % loaders == i)
+ futs.add(ldr.addData(j, data[j]));
+
+ if(j % (100 * loaders) == 0)
+ ldr.flush();
+ }
+
+ ldr.flush();
+
+ for (IgniteFuture fut : futs)
+ fut.get();
+
+ return null;
+ }
+ });
+ }
+
+ GridTestUtils.runMultiThreaded(cls, "loaders");
+
+ Set<Integer> keysSet = sequence(data.length);
+
+ for (Cache.Entry<Integer, Integer> entry : (IgniteCache<Integer, Integer>)cache) {
+ assertTrue(keysSet.remove(entry.getKey()));
+ assertEquals(data[entry.getKey()], entry.getValue());
+ }
+
+ assertTrue(keysSet.isEmpty());
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutAllGetAllContainsAll(IgniteCache cache) {
+ int keys = 100;
+
+ Map<Integer, Integer> data = generateDataMap(keys);
+
+ cache.putAll(data);
+
+ Map data0 = cache.getAll(data.keySet());
+
+ assertEquals(data.size(), data0.size());
+
+ for (Map.Entry<Integer, Integer> entry : data.entrySet())
+ assertEquals(entry.getValue(), data0.get(entry.getKey()));
+
+ assertTrue(cache.containsKeys(data.keySet()));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutAllGetAllContainsAllAsync(IgniteCache cache) {
+ int keys = 100;
+
+ Map<Integer, Integer> data = generateDataMap(keys);
+
+ cache.putAllAsync(data).get(ASYNC_TIMEOUT);
+
+ Map data0 = (Map)cache.getAllAsync(data.keySet()).get(ASYNC_TIMEOUT);
+
+ assertEquals(data.size(), data0.size());
+
+ for (Map.Entry<Integer, Integer> entry : data.entrySet())
+ assertEquals(entry.getValue(), data0.get(entry.getKey()));
+
+ assertTrue((Boolean)cache.containsKeysAsync(data.keySet()).get(ASYNC_TIMEOUT));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutRemove(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.put(key, val);
+
+ assertTrue(cache.remove(key));
+
+ assertNull(cache.get(key));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutRemoveAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.putAsync(key, val).get(ASYNC_TIMEOUT);
+
+ assertTrue((Boolean)cache.removeAsync(key).get(ASYNC_TIMEOUT));
+
+ assertNull(cache.get(key));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetContains(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.put(key, val);
+
+ Object val0 = cache.get(key);
+
+ assertEquals(val, val0);
+
+ assertTrue(cache.containsKey(key));
+
+ Integer key2 = rnd.nextInt();
+
+ while (key2.equals(key))
+ key2 = rnd.nextInt();
+
+ assertFalse(cache.containsKey(key2));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetContainsAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.putAsync(key, val).get(ASYNC_TIMEOUT);
+
+ Object val0 = cache.getAsync(key).get(ASYNC_TIMEOUT);
+
+ assertEquals(val, val0);
+
+ assertTrue((Boolean)cache.containsKeyAsync(key).get(ASYNC_TIMEOUT));
+
+ Integer key2 = rnd.nextInt();
+
+ while (key2.equals(key))
+ key2 = rnd.nextInt();
+
+ assertFalse((Boolean)cache.containsKeyAsync(key2).get(ASYNC_TIMEOUT));
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndPut(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ cache.put(key, val1);
+
+ Object val0 = cache.getAndPut(key, val2);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val2, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndPutAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ cache.put(key, val1);
+
+ Object val0 = cache.getAndPutAsync(key, val2).get(ASYNC_TIMEOUT);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val2, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndReplace(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ Object val0 = cache.getAndReplace(key, val1);
+
+ assertEquals(null, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(null, val0);
+
+ cache.put(key, val1);
+
+ val0 = cache.getAndReplace(key, val2);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val2, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndReplaceAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ Object val0 = cache.getAndReplaceAsync(key, val1).get(ASYNC_TIMEOUT);
+
+ assertEquals(null, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(null, val0);
+
+ cache.put(key, val1);
+
+ val0 = cache.getAndReplaceAsync(key, val2).get(ASYNC_TIMEOUT);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val2, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndRemove(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+
+ cache.put(key, val);
+
+ Object val0 = cache.getAndRemove(key);
+
+ assertEquals(val, val0);
+
+ val0 = cache.get(key);
+
+ assertNull(val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndRemoveAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+
+ cache.put(key, val);
+
+ Object val0 = cache.getAndRemoveAsync(key).get(ASYNC_TIMEOUT);
+
+ assertEquals(val, val0);
+
+ val0 = cache.get(key);
+
+ assertNull(val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutIfAbsent(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+
+ assertTrue(cache.putIfAbsent(key, val1));
+
+ Object val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ assertFalse(cache.putIfAbsent(key, val2));
+
+ val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutIfAbsentAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+
+ assertTrue((Boolean)cache.putIfAbsentAsync(key, val1).get(ASYNC_TIMEOUT));
+
+ Object val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ assertFalse((Boolean)cache.putIfAbsentAsync(key, val2).get(ASYNC_TIMEOUT));
+
+ val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndPutIfAbsent(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ cache.put(key, val1);
+
+ Object val0 = cache.getAndPutIfAbsent(key, val2);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cachePutGetAndPutIfAbsentAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val1 = rnd.nextInt();
+ Integer val2 = rnd.nextInt();
+
+ cache.put(key, val1);
+
+ Object val0 = cache.getAndPutIfAbsentAsync(key, val2).get(ASYNC_TIMEOUT);
+
+ assertEquals(val1, val0);
+
+ val0 = cache.get(key);
+
+ assertEquals(val1, val0);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cacheQuery(IgniteCache cache) {
+ int keys = 100;
+
+ Map<Integer, Integer> data = generateDataMap(keys);
+
+ cache.putAll(data);
+
+ ScanQuery<Integer, Integer> qry = new ScanQuery<>(new IgniteBiPredicate<Integer, Integer>() {
+ @Override public boolean apply(Integer key, Integer val) {
+ return key % 2 == 0;
+ }
+ });
+
+ List<Cache.Entry<Integer, Integer>> all = cache.query(qry).getAll();
+
+ assertEquals(all.size(), data.size() / 2);
+
+ for (Cache.Entry<Integer, Integer> entry : all) {
+ assertEquals(0, entry.getKey() % 2);
+ assertEquals(entry.getValue(), data.get(entry.getKey()));
+ }
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cacheInvokeAll(IgniteCache cache) {
+ int keys = 100;
+ Map<Integer, Integer> data = generateDataMap(keys);
+
+ cache.putAll(data);
+
+ Random rnd = ThreadLocalRandom.current();
+
+ int one = rnd.nextInt();
+ int two = rnd.nextInt();
+
+ Map<Integer, CacheInvokeResult<Integer>> res = cache.invokeAll(data.keySet(), new CacheEntryProcessor<Integer, Integer, Integer>() {
+ @Override public Integer process(MutableEntry<Integer, Integer> entry, Object... arguments) throws EntryProcessorException {
+ Object expected = ((Map)arguments[0]).get(entry.getKey());
+
+ assertEquals(expected, entry.getValue());
+
+ // Some calculation.
+ return (Integer)arguments[1] + (Integer)arguments[2];
+ }
+ }, data, one, two);
+
+ assertEquals(keys, res.size());
+ assertEquals(one + two, (Object)res.get(0).get());
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cacheInvoke(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.put(key, val);
+
+ int one = rnd.nextInt();
+ int two = rnd.nextInt();
+
+ Object res = cache.invoke(key, new CacheEntryProcessor<Integer, Integer, Integer>() {
+ @Override public Integer process(MutableEntry<Integer, Integer> entry, Object... arguments) throws EntryProcessorException {
+ assertEquals(arguments[0], entry.getValue());
+
+ // Some calculation.
+ return (Integer)arguments[1] + (Integer)arguments[2];
+ }
+ }, val, one, two);
+
+ assertEquals(one + two, res);
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cacheInvokeAllAsync(IgniteCache cache) {
+ int keys = 100;
+ Map<Integer, Integer> data = generateDataMap(keys);
+
+ cache.putAll(data);
+
+ Random rnd = ThreadLocalRandom.current();
+
+ int one = rnd.nextInt();
+ int two = rnd.nextInt();
+
+ Object res0 = cache.invokeAllAsync(data.keySet(), new CacheEntryProcessor<Integer, Integer, Integer>() {
+ @Override public Integer process(MutableEntry<Integer, Integer> entry,
+ Object... arguments) throws EntryProcessorException {
+ Object expected = ((Map)arguments[0]).get(entry.getKey());
+
+ assertEquals(expected, entry.getValue());
+
+ // Some calculation.
+ return (Integer)arguments[1] + (Integer)arguments[2];
+ }
+ }, data, one, two).get(ASYNC_TIMEOUT);
+
+ Map<Integer, CacheInvokeResult<Integer>> res = (Map<Integer, CacheInvokeResult<Integer>>)res0;
+
+ assertEquals(keys, res.size());
+ assertEquals(one + two, (Object)res.get(0).get());
+
+ tearDown(cache);
+ }
+
+ /**
+ * @param cache Cache.
+ */
+ private void cacheInvokeAsync(IgniteCache cache) {
+ Random rnd = ThreadLocalRandom.current();
+
+ Integer key = rnd.nextInt();
+ Integer val = rnd.nextInt();
+
+ cache.put(key, val);
+
+ int one = rnd.nextInt();
+ int two = rnd.nextInt();
+
+ Object res = cache.invokeAsync(key, new CacheEntryProcessor<Integer, Integer, Integer>() {
+ @Override public Integer process(MutableEntry<Integer, Integer> entry, Object... arguments) throws EntryProcessorException {
+ assertEquals(arguments[0], entry.getValue());
+
+ // Some calculation.
+ return (Integer)arguments[1] + (Integer)arguments[2];
+ }
+ }, val, one, two).get(ASYNC_TIMEOUT);
+
+ assertEquals(one + two, res);
+
+ tearDown(cache);
+ }
+
+
+ public void testLoadCacheAtomicPartitioned() throws Exception {
+ loadCache(PARTITIONED, ATOMIC);
+ }
+
+ public void testLoadCacheAtomicReplicated() throws Exception {
+ loadCache(REPLICATED, ATOMIC);
+ }
+
+ public void testLoadCacheTxPartitioned() throws Exception {
+ loadCache(PARTITIONED, TRANSACTIONAL);
+ }
+
+ public void testLoadCacheTxReplicated() throws Exception {
+ loadCache(REPLICATED, TRANSACTIONAL);
+ }
+
+ public void testLoadCacheAtomicLocal() throws Exception {
+ loadCache(LOCAL, ATOMIC);
+ }
+
+ public void testLoadCacheTxLocal() throws Exception {
+ loadCache(LOCAL, TRANSACTIONAL);
+ }
+
+ /**
+ * @param cacheMode Cache mode.
+ * @param atomicityMode Atomicity mode.
+ * @throws Exception If failed.
+ */
+ private void loadCache(CacheMode cacheMode, CacheAtomicityMode atomicityMode) throws Exception {
+ int keys = 100;
+
+ boolean local = cacheMode == LOCAL;
+
+ Map<Integer, Integer> data1 = generateDataMap(keys);
+ Map<Integer, Integer> data2 = generateDataMap(keys);
+
+ Factory<? extends CacheStore<Integer, Integer>> fctr1 =
+ FactoryBuilder.factoryOf(new MapBasedStore<>(data1));
+
+ Factory<? extends CacheStore<Integer, Integer>> fctr2 =
+ FactoryBuilder.factoryOf(new MapBasedStore<>(data2));
+
+
+ CacheConfiguration ccfg1 = cacheConfiguration(GROUP1, CACHE1, cacheMode, atomicityMode, 1, false)
+ .setCacheStoreFactory(fctr1);
+
+ CacheConfiguration ccfg2 = cacheConfiguration(GROUP1, CACHE2, cacheMode, atomicityMode, 1, false)
+ .setCacheStoreFactory(fctr2);
+
+ Ignite node = startGrids(local ? 1 : 4);
+
+ node.createCaches(F.asList(ccfg1, ccfg2));
+
+ IgniteCache<Integer, Integer> cache1 = node.cache(CACHE1);
+ IgniteCache<Integer, Integer> cache2 = node.cache(CACHE2);
+
+ cache1.loadCache(null);
+
+ checkCacheData(data1, CACHE1);
+
+ assertEquals(0, cache2.size());
+
+ cache2.loadCache(null);
+
+ checkCacheData(data2, CACHE2);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testConcurrentOperationsSameKeys() throws Exception {
+ final int SRVS = 4;
+ final int CLIENTS = 4;
+ final int NODES = SRVS + CLIENTS;
+
+ startGrid(0);
+
+ Ignite srv0 = startGridsMultiThreaded(1, SRVS - 1);
+
+ client = true;
+
+ startGridsMultiThreaded(SRVS, CLIENTS);
+
+ srv0.createCache(cacheConfiguration(GROUP1, "a0", PARTITIONED, ATOMIC, 1, false));
+ srv0.createCache(cacheConfiguration(GROUP1, "a1", PARTITIONED, ATOMIC, 1, false));
+ srv0.createCache(cacheConfiguration(GROUP1, "t0", PARTITIONED, TRANSACTIONAL, 1, false));
+ srv0.createCache(cacheConfiguration(GROUP1, "t1", PARTITIONED, TRANSACTIONAL, 1, false));
+
+ final List<Integer> keys = new ArrayList<>();
+
+ for (int i = 0; i < 50; i++)
+ keys.add(i);
+
+ final AtomicBoolean err = new AtomicBoolean();
+
+ final AtomicBoolean stop = new AtomicBoolean();
+
+ IgniteInternalFuture fut1 = updateFuture(NODES, "a0", keys, false, stop, err);
+ IgniteInternalFuture fut2 = updateFuture(NODES, "a1", keys, true, stop, err);
+ IgniteInternalFuture fut3 = updateFuture(NODES, "t0", keys, false, stop, err);
+ IgniteInternalFuture fut4 = updateFuture(NODES, "t1", keys, true, stop, err);
+
+ try {
+ for (int i = 0; i < 15 && !stop.get(); i++)
+ U.sleep(1_000);
+ }
+ finally {
+ stop.set(true);
+ }
+
+ fut1.get();
+ fut2.get();
+ fut3.get();
+ fut4.get();
+
+ assertFalse("Unexpected error, see log for details", err.get());
+ }
+
+ /**
+ * @param nodes Total number of nodes.
+ * @param cacheName Cache name.
+ * @param keys Keys to update.
+ * @param reverse {@code True} if update in reverse order.
+ * @param stop Stop flag.
+ * @param err Error flag.
+ * @return Update future.
+ */
+ private IgniteInternalFuture updateFuture(final int nodes,
+ final String cacheName,
+ final List<Integer> keys,
+ final boolean reverse,
+ final AtomicBoolean stop,
+ final AtomicBoolean err) {
+ final AtomicInteger idx = new AtomicInteger();
+
+ return GridTestUtils.runMultiThreadedAsync(new Callable<Void>() {
+ @Override public Void call() throws Exception {
+ try {
+ Ignite node = ignite(idx.getAndIncrement() % nodes);
+
+ log.info("Start thread [node=" + node.name() + ']');
+
+ IgniteCache cache = node.cache(cacheName);
+
+ Map<Integer, Integer> map = new LinkedHashMap<>();
+
+ if (reverse) {
+ for (int i = keys.size() - 1; i >= 0; i--)
+ map.put(keys.get(i), 2);
+ }
+ else {
+ for (Integer key : keys)
+ map.put(key, 1);
+ }
+
+ while (!stop.get())
+ cache.putAll(map);
+ }
+ catch (Exception e) {
+ err.set(true);
+
+ log.error("Unexpected error: " + e, e);
+
+ stop.set(true);
+ }
+
+ return null;
+ }
+ }, nodes * 2, "update-" + cacheName + "-" + reverse);
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
+ public void testConcurrentOperationsAndCacheDestroy() throws Exception {
+ final int SRVS = 4;
+ final int CLIENTS = 4;
+ final int NODES = SRVS + CLIENTS;
+
+ startGrid(0);
+
+ Ignite srv0 = startGridsMultiThreaded(1, SRVS - 1);
+
+ client = true;
+
+ startGridsMultiThreaded(SRVS, CLIENTS);
+
+ final int CACHES = 8;
+
+ final int grp1Backups = ThreadLocalRandom.current().nextInt(3);
+ final int grp2Backups = ThreadLocalRandom.current().nextInt(3);
+
+ log.info("Start test [grp1Backups=" + grp1Backups + ", grp2Backups=" + grp2Backups + ']');
+
+ for (int i = 0; i < CACHES; i++) {
+ srv0.createCache(
+ cacheConfiguration(GROUP1, GROUP1 + "-" + i, PARTITIONED, ATOMIC, grp1Backups, i % 2 == 0));
+
+ srv0.createCache(
+ cacheConfiguration(GROUP2, GROUP2 + "-" + i, PARTITIONED, TRANSACTIONAL, grp2Backups, i % 2 == 0));
+ }
+
+ final AtomicInteger idx = new AtomicInteger();
+
+ final AtomicBoolean err = new AtomicBoolean();
+
+ final AtomicBoolean stop = new AtomicBoolean();
+
+ IgniteInternalFuture opFut = GridTestUtils.runMultiThreadedAsync(new Runnable() {
+ @Override public void run() {
+ try {
+ Ignite node = ignite(idx.getAndIncrement() % NODES);
+
+ log.info("Start thread [node=" + node.name() + ']');
+
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+
+ while (!stop.get()) {
+ String grp = rnd.nextBoolean() ? GROUP1 : GROUP2;
+ int cacheIdx = rnd.nextInt(CACHES);
+
+ IgniteCache cache = node.cache(grp + "-" + cacheIdx);
+
+ for (int i = 0; i < 10; i++)
+
<TRUNCATED>