You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2021/01/28 10:10:29 UTC
[ignite] 07/09: Improve IgniteTxStateImpl.validateTopology for
single cache scenario
This is an automated email from the ASF dual-hosted git repository.
ptupitsyn pushed a commit to branch ignite-14067
in repository https://gitbox.apache.org/repos/asf/ignite.git
commit 66ef7decf714a845d85b892e49ce42d3a6357702
Author: Pavel Tupitsyn <pt...@apache.org>
AuthorDate: Thu Jan 28 12:52:15 2021 +0300
Improve IgniteTxStateImpl.validateTopology for single cache scenario
---
.../cache/transactions/IgniteTxStateImpl.java | 46 +++++++++++++++-------
.../processors/cache/GridCacheTestEntryEx.java | 6 +++
2 files changed, 38 insertions(+), 14 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
index 00d4817..b331a71 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
@@ -30,6 +30,7 @@ import org.apache.ignite.IgniteException;
import org.apache.ignite.cache.CacheInterceptor;
import org.apache.ignite.cache.CacheWriteSynchronizationMode;
import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
import org.apache.ignite.internal.processors.cache.CacheInvalidStateException;
import org.apache.ignite.internal.processors.cache.CacheStoppedException;
import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -138,36 +139,53 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
boolean read,
GridDhtTopologyFuture topFut
) {
- Map<Integer, Set<KeyCacheObject>> keysByCacheId = new HashMap<>();
+ if (activeCacheIds.size() == 1) {
+ IgniteTxKey anyKey = txMap.keySet().iterator().next();
+
+ int cacheId = anyKey.cacheId();
+ GridCacheContext ctx = cctx.cacheContext(cacheId);
- for (IgniteTxKey key : txMap.keySet()) {
- Set<KeyCacheObject> set = keysByCacheId.get(key.cacheId());
+ assert ctx != null : cacheId;
- if (set == null)
- keysByCacheId.put(key.cacheId(), set = new HashSet<>());
+ CacheInvalidStateException err = topFut.validateCache(ctx, recovery(), read, null, txMap.keySet());
- set.add(key.key());
+ if (err != null)
+ return err;
}
+ else {
+ Map<Integer, Set<KeyCacheObject>> keysByCacheId = new HashMap<>();
- for (Map.Entry<Integer, Set<KeyCacheObject>> e : keysByCacheId.entrySet()) {
- int cacheId = e.getKey();
+ for (IgniteTxKey key : txMap.keySet()) {
+ Set<KeyCacheObject> set = keysByCacheId.get(key.cacheId());
- GridCacheContext ctx = cctx.cacheContext(cacheId);
+ if (set == null)
+ keysByCacheId.put(key.cacheId(), set = new HashSet<>());
- assert ctx != null : cacheId;
+ set.add(key.key());
+ }
- CacheInvalidStateException err = topFut.validateCache(ctx, recovery(), read, null, e.getValue());
+ for (Map.Entry<Integer, Set<KeyCacheObject>> e : keysByCacheId.entrySet()) {
+ int cacheId = e.getKey();
- if (err != null)
- return err;
+ GridCacheContext ctx = cctx.cacheContext(cacheId);
+
+ assert ctx != null : cacheId;
+
+ CacheInvalidStateException err = topFut.validateCache(ctx, recovery(), read, null, e.getValue());
+
+ if (err != null)
+ return err;
+ }
}
+ AffinityTopologyVersion topVer = topFut.topologyVersion();
+
for (int i = 0; i < activeCacheIds.size(); i++) {
int cacheId = activeCacheIds.get(i);
GridCacheContext<?, ?> cacheCtx = cctx.cacheContext(cacheId);
- if (CU.affinityNodes(cacheCtx, topFut.topologyVersion()).isEmpty()) {
+ if (CU.affinityNodes(cacheCtx, topVer).isEmpty()) {
return new ClusterTopologyServerNotFoundException("Failed to map keys for cache (all " +
"partition nodes left the grid): " + cacheCtx.name());
}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
index c406054..f024c16 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
@@ -800,6 +800,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
return mvcc.localCandidates(exclude);
}
+ @Override
+ public Collection<GridCacheMvccCandidate> localCandidatesMax(GridCacheVersion maxVer) throws GridCacheEntryRemovedException {
+ // TODO
+ return null;
+ }
+
/** @inheritDoc */
Collection<GridCacheMvccCandidate> localCandidates(boolean reentries, GridCacheVersion... exclude) {
return mvcc.localCandidates(reentries, exclude);