IGNITE-10572: MVCC TX: Possible race on invokeAll operations. This closes #5608.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9dc6d086 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9dc6d086 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9dc6d086 Branch: refs/heads/ignite-627 Commit: 9dc6d0864fb007fcab97eccee964d1df75fbd75c Parents: ca8a80b Author: Andrey V. Mashenkov <andrey.mashen...@gmail.com> Authored: Wed Dec 19 14:44:16 2018 +0300 Committer: Igor Seliverstov <gvvinbl...@gmail.com> Committed: Wed Dec 19 14:44:16 2018 +0300 ---------------------------------------------------------------------- .../near/GridNearTxEnlistFuture.java | 20 +++++++++++--------- .../near/GridNearTxEnlistResponse.java | 2 +- .../cache/distributed/near/GridNearTxLocal.java | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc6d086/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistFuture.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistFuture.java index 35a8cfa..789cd3c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistFuture.java @@ -26,6 +26,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.IgniteInternalFuture; @@ -69,6 +70,10 @@ public class GridNearTxEnlistFuture extends GridNearTxAbstractEnlistFuture<GridC private static final AtomicIntegerFieldUpdater<GridNearTxEnlistFuture> SKIP_UPD = AtomicIntegerFieldUpdater.newUpdater(GridNearTxEnlistFuture.class, "skipCntr"); + /** Res field updater. */ + private static final AtomicReferenceFieldUpdater<GridNearTxEnlistFuture, GridCacheReturn> RES_UPD = + AtomicReferenceFieldUpdater.newUpdater(GridNearTxEnlistFuture.class, GridCacheReturn.class, "res"); + /** Marker object. */ private static final Object FINISHED = new Object(); @@ -598,20 +603,17 @@ public class GridNearTxEnlistFuture extends GridNearTxAbstractEnlistFuture<GridC assert res != null; - if (res.result().invokeResult()) { - if(this.res == null) - this.res = new GridCacheReturn(true, true); - - this.res.success(this.res.success() && err == null && res.result().success()); + if (this.res != null || !RES_UPD.compareAndSet(this, null, res.result())) { + GridCacheReturn res0 = this.res; - this.res.mergeEntryProcessResults(res.result()); + if (res.result().invokeResult()) + res0.mergeEntryProcessResults(res.result()); + else if (res0.success() && !res.result().success()) + res0.success(false); } - else - this.res = res.result(); assert this.res != null && (this.res.emptyResult() || needRes || this.res.invokeResult() || !this.res.success()); - tx.hasRemoteLocks(true); return true; http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc6d086/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistResponse.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistResponse.java index cf00186..93df0c2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistResponse.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxEnlistResponse.java @@ -158,7 +158,7 @@ public class GridNearTxEnlistResponse extends GridCacheIdMessage implements Exce } /** {@inheritDoc} */ - @Nullable @Override public Throwable error() { + @Override public @Nullable Throwable error() { return err; } http://git-wip-us.apache.org/repos/asf/ignite/blob/9dc6d086/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java index fb2f8e3..7d50947 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java @@ -2089,7 +2089,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements GridTimeou Object val = futRes.value(); - if (futRes.invokeResult()) { + if (futRes.invokeResult() && val != null) { assert val instanceof Map; val = cacheCtx.unwrapInvokeResult((Map)val, keepBinary);