You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dg...@apache.org on 2019/04/10 10:42:07 UTC

[ignite] branch master updated: IGNITE-11684 Fix CacheSerializableTransactionsTest#testGetRemoveTxNearCache2 (and 1) is flaky - Fixes #6410.

This is an automated email from the ASF dual-hosted git repository.

dgovorukhin 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 a167a06  IGNITE-11684 Fix CacheSerializableTransactionsTest#testGetRemoveTxNearCache2 (and 1) is flaky - Fixes #6410.
a167a06 is described below

commit a167a064081329285eab6bb90db26ebd6f0ed344
Author: ibessonov <be...@gmail.com>
AuthorDate: Wed Apr 10 13:37:36 2019 +0300

    IGNITE-11684 Fix CacheSerializableTransactionsTest#testGetRemoveTxNearCache2 (and 1) is flaky - Fixes #6410.
    
    Signed-off-by: Dmitriy Govorukhin <dm...@gmail.com>
---
 .../processors/cache/GridCacheMapEntry.java        | 28 ++++++++++++++++++++--
 .../internal/processors/cache/GridCacheMvcc.java   |  2 +-
 2 files changed, 27 insertions(+), 3 deletions(-)

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 2428290..352ca0c 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
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -1735,8 +1736,31 @@ public abstract class GridCacheMapEntry extends GridMetadataAwareAdapter impleme
 
                         if (mvcc == null || mvcc.isEmpty(tx.xidVersion()))
                             clearReaders();
-                        else
-                            clearReader(tx.originatingNodeId());
+                        else {
+                            // Optimize memory usage - do not allocate additional array.
+                            List<GridCacheMvccCandidate> locs = mvcc.localCandidatesNoCopy(false);
+
+                            GridCacheVersion txVer = tx.xidVersion();
+
+                            UUID originatingNodeId = tx.originatingNodeId();
+
+                            boolean hasOriginatingNodeId = false;
+
+                            for (GridCacheMvccCandidate c : locs) {
+                                if (c.reentry() || Objects.equals(c.version(), txVer))
+                                    continue;
+
+                                if (Objects.equals(c.otherNodeId(), originatingNodeId)) {
+                                    hasOriginatingNodeId = true;
+
+                                    break;
+                                }
+                            }
+
+                            // Remove reader only if there are no other active transactions from it.
+                            if (!hasOriginatingNodeId)
+                                clearReader(originatingNodeId);
+                        }
                     }
                 }
             }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvcc.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvcc.java
index 52523b1..9ba8c63 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvcc.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvcc.java
@@ -1401,7 +1401,7 @@ public final class GridCacheMvcc {
 
         for (GridCacheMvccCandidate c : col) {
             // Don't include reentries.
-            if ((!c.reentry() || (reentries && c.reentry())) && !U.containsObjectArray(excludeVers, c.version()))
+            if ((reentries || !c.reentry()) && !U.containsObjectArray(excludeVers, c.version()))
                 cands.add(c);
         }