You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by as...@apache.org on 2021/03/29 19:28:15 UTC
[ignite] branch master updated: IGNITE-14431 Get rid of useless
validation. - Fixes #8939.
This is an automated email from the ASF dual-hosted git repository.
ascherbakov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 5fdb246 IGNITE-14431 Get rid of useless validation. - Fixes #8939.
5fdb246 is described below
commit 5fdb246ba010bd4977da5849bc9e79c71092e109
Author: Alexey Scherbakov <al...@gmail.com>
AuthorDate: Mon Mar 29 22:26:55 2021 +0300
IGNITE-14431 Get rid of useless validation. - Fixes #8939.
Signed-off-by: Alexey Scherbakov <al...@gmail.com>
---
.../org/apache/ignite/internal/IgniteKernal.java | 3 -
.../ignite/internal/IgniteNodeAttributes.java | 3 -
.../cache/CacheAffinitySharedManager.java | 2 +
.../distributed/dht/GridDhtTxPrepareFuture.java | 29 ++------
.../distributed/dht/atomic/GridDhtAtomicCache.java | 80 ----------------------
.../dht/topology/GridDhtPartitionTopologyImpl.java | 6 +-
.../dht/topology/GridDhtPartitionsReservation.java | 5 +-
7 files changed, 12 insertions(+), 116 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 7ee9d56..0785023 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -293,7 +293,6 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SHUTDOWN_POLI
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SPI_CLASS;
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_CONFIG;
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_USER_NAME;
-import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_VALIDATE_CACHE_REQUESTS;
import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
import static org.apache.ignite.internal.IgniteVersionUtils.BUILD_TSTAMP_STR;
import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
@@ -1838,8 +1837,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
add(ATTR_CONSISTENCY_CHECK_SKIPPED, getBoolean(IGNITE_SKIP_CONFIGURATION_CONSISTENCY_CHECK));
- add(ATTR_VALIDATE_CACHE_REQUESTS, Boolean.TRUE);
-
if (cfg.getConsistentId() != null)
add(ATTR_NODE_CONSISTENT_ID, cfg.getConsistentId());
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
index d1c2d8d..02e5146 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java
@@ -196,9 +196,6 @@ public final class IgniteNodeAttributes {
/** Internal attribute name constant. */
public static final String ATTR_DYNAMIC_CACHE_START_ROLLBACK_SUPPORTED = ATTR_PREFIX + ".dynamic.cache.start.rollback.supported";
- /** Internal attribute indicates that incoming cache requests should be validated on primary node as well. */
- public static final String ATTR_VALIDATE_CACHE_REQUESTS = ATTR_CACHE + ".validate.cache.requests";
-
/** Supported features. */
public static final String ATTR_IGNITE_FEATURES = ATTR_PREFIX + ".features";
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 ba5fe3b..f0f4491 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
@@ -537,6 +537,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
null,
null,
clientTop.lostPartitions());
+
+ excFut.validate(grp);
}
assert grpHolder.affinity().lastVersion().equals(grp.affinity().lastVersion());
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 14cd562..c362c31 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
@@ -102,7 +102,6 @@ import org.apache.ignite.thread.IgniteThread;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_OBJECT_LOADED;
-import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_VALIDATE_CACHE_REQUESTS;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.CREATE;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.DELETE;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.NOOP;
@@ -1080,12 +1079,8 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
ClusterNode node = cctx.discovery().node(tx.topologyVersion(), tx.nearNodeId());
- boolean validateCache = needCacheValidation(node);
-
- boolean writesEmpty = isEmpty(req.writes());
-
- if (validateCache) {
- GridDhtTopologyFuture topFut = cctx.exchange().lastFinishedFuture();
+ if (node != null) {
+ GridDhtTopologyFuture topFut = cctx.exchange().lastFinishedFuture();
if (topFut != null) {
IgniteCheckedException err = tx.txState().validateTopology(cctx, isEmpty(req.writes()), topFut);
@@ -1097,8 +1092,8 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
boolean ser = tx.serializable() && tx.optimistic();
- if (!writesEmpty || (ser && !F.isEmpty(req.reads()))) {
- Map<Integer, Collection<KeyCacheObject>> forceKeys = null;
+ if (!F.isEmpty(req.writes()) || (ser && !F.isEmpty(req.reads()))) {
+ Map<Integer, Collection<KeyCacheObject>> forceKeys = null;
for (IgniteTxEntry entry : req.writes())
forceKeys = checkNeedRebalanceKeys(entry, forceKeys);
@@ -1128,22 +1123,6 @@ public final class GridDhtTxPrepareFuture extends GridCacheCompoundFuture<Ignite
}
/**
- * Returns {@code true} if cache validation needed.
- *
- * @param node Originating node.
- * @return {@code True} if cache should be validated, {@code false} - otherwise.
- */
- private boolean needCacheValidation(ClusterNode node) {
- if (node == null) {
- // The originating (aka near) node has left the topology
- // and therefore the cache validation doesn't make sense.
- return false;
- }
-
- return Boolean.TRUE.equals(node.attribute(ATTR_VALIDATE_CACHE_REQUESTS));
- }
-
- /**
* Checks if this transaction needs previous value for the given tx entry. Will use passed in map to store
* required key or will create new map if passed in map is {@code null}.
*
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 60c0006..9245f29 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
@@ -70,12 +70,10 @@ import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProce
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtFuture;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTopologyFuture;
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.GridDhtForceKeysRequest;
import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtForceKeysResponse;
-import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture;
import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtInvalidPartitionException;
import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearAtomicCache;
@@ -129,7 +127,6 @@ import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC
import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_PUT;
import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_READ;
import static org.apache.ignite.events.EventType.EVT_CACHE_OBJECT_REMOVED;
-import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_VALIDATE_CACHE_REQUESTS;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.DELETE;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.TRANSFORM;
import static org.apache.ignite.internal.processors.cache.GridCacheOperation.UPDATE;
@@ -1862,72 +1859,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
if (!remap) {
- boolean validateCache = needCacheValidation(node);
-
- if (validateCache) {
- GridDhtTopologyFuture topFut = top.topologyVersionFuture();
-
- // Cache validation should use topology version from the update request
- // in case of the topology version was locked on near node.
- if (req.topologyLocked()) {
- // affinityReadyFuture() can return GridFinishedFuture under some circumstances
- // and therefore it cannot be used for validation.
- IgniteInternalFuture<AffinityTopologyVersion> affFut =
- ctx.shared().exchange().affinityReadyFuture(req.topologyVersion());
-
- if (affFut.isDone()) {
- List<GridDhtPartitionsExchangeFuture> futs =
- ctx.shared().exchange().exchangeFutures();
-
- boolean found = false;
-
- for (int i = 0; i < futs.size(); ++i) {
- GridDhtPartitionsExchangeFuture fut = futs.get(i);
-
- // We have to check fut.exchangeDone() here -
- // otherwise attempt to get topVer will throw error.
- // We won't skip needed future as per affinity ready future is done.
- if (fut.exchangeDone() &&
- fut.topologyVersion().equals(req.topologyVersion())) {
- topFut = fut;
-
- found = true;
-
- break;
- }
- }
-
- assert found : "The requested topology future cannot be found [topVer="
- + req.topologyVersion() + ']';
- }
- else {
- affFut.listen(f -> updateAllAsyncInternal0(node, req, completionCb));
-
- return;
- }
-
- assert req.topologyVersion().equals(topFut.topologyVersion()) :
- "The requested topology version cannot be found [" +
- "reqTopFut=" + req.topologyVersion()
- + ", topFut=" + topFut + ']';
- }
-
- assert topFut.isDone() : topFut;
-
- Throwable err =
- topFut.validateCache(ctx, req.recovery(), false, null, req.keys());
-
- if (err != null) {
- IgniteCheckedException e = new IgniteCheckedException(err);
-
- res.error(e);
-
- completionCb.apply(req, res);
-
- return;
- }
- }
-
update(node, locked, req, res, updDhtRes, taskName);
dhtFut = updDhtRes.dhtFuture();
@@ -3773,17 +3704,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
}
}
- /**
- * Returns {@code true} if cache validation needed.
- *
- * @return {@code True} if cache should be validated, {@code false} - otherwise.
- */
- private boolean needCacheValidation(ClusterNode node) {
- assert node != null : "The near node must not be null. This is guaranteed by processNearAtomicUpdateRequest()";
-
- return Boolean.TRUE.equals(node.attribute(ATTR_VALIDATE_CACHE_REQUESTS));
- }
-
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridDhtAtomicCache.class, this, super.toString());
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
index c8009fb..0e7d8bb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionTopologyImpl.java
@@ -2539,7 +2539,6 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
* @param aff Affinity assignments.
* @return {@code True} if there are local partitions need to be evicted.
*/
- @SuppressWarnings("unchecked")
private boolean checkEvictions(long updateSeq, AffinityAssignment aff) {
assert lock.isWriteLockedByCurrentThread();
@@ -3219,9 +3218,12 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
GridDhtLocalPartition locPart = localPartition(p);
+ if (locPart == null)
+ return false;
+
GridDhtPartitionState state0 = locPart.state();
- if (locPart == null || state0 == RENTING || state0 == EVICTED || partitionLocalNode(p, readyTopVer))
+ if (state0 == RENTING || state0 == EVICTED || partitionLocalNode(p, readyTopVer))
return false;
locPart.rent();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsReservation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsReservation.java
index 0f6c4a8..d670692 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsReservation.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/GridDhtPartitionsReservation.java
@@ -70,7 +70,7 @@ public class GridDhtPartitionsReservation implements GridReservable {
assert cctx != null;
assert appKey != null;
- this.topVer = cctx.shared().exchange().lastAffinityChangedTopologyVersion(topVer);
+ this.topVer = topVer;
this.cctx = cctx;
this.appKey = appKey;
}
@@ -197,8 +197,7 @@ public class GridDhtPartitionsReservation implements GridReservable {
if (reservations.compareAndSet(r, r - 1)) {
// If it was the last reservation and topology version changed -> attempt to evict partitions.
if (r == 1 && !cctx.kernalContext().isStopping() &&
- !topVer.equals(cctx.shared().exchange().lastAffinityChangedTopologyVersion(
- cctx.topology().lastTopologyChangeVersion())))
+ !topVer.equals(cctx.topology().lastTopologyChangeVersion()))
tryContinueClearing(parts.get());
return;