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);

Reply via email to