Repository: ignite
Updated Branches:
  refs/heads/ignite-1607 f0a17bc90 -> 761875a04


ignite-1607 WIP


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/761875a0
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/761875a0
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/761875a0

Branch: refs/heads/ignite-1607
Commit: 761875a04348e0a33001c492e41d6c0a7091cd5e
Parents: f0a17bc
Author: sboikov <[email protected]>
Authored: Thu Oct 22 09:19:59 2015 +0300
Committer: sboikov <[email protected]>
Committed: Thu Oct 22 09:19:59 2015 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheEntryEx.java      |  3 ++-
 .../processors/cache/GridCacheMapEntry.java     |  7 ++---
 ...arOptimisticSerializableTxPrepareFuture.java | 27 +++++++++++++++-----
 3 files changed, 27 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/761875a0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
index 53edde7..4e9e941 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
@@ -603,8 +603,9 @@ public interface GridCacheEntryEx {
      *
      * @param serReadVer Version read in serializable transaction.
      * @return {@code True} if version check passed.
+     * @throws GridCacheEntryRemovedException If entry has been removed.
      */
-    public boolean checkSerializableReadVersion(GridCacheVersion serReadVer);
+    public boolean checkSerializableReadVersion(GridCacheVersion serReadVer) 
throws GridCacheEntryRemovedException;
 
     /**
      * Peeks into entry without loading value or updating statistics.

http://git-wip-us.apache.org/repos/asf/ignite/blob/761875a0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
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 6e7c1ed..a3322c5 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
@@ -2865,10 +2865,11 @@ public abstract class GridCacheMapEntry extends 
GridMetadataAwareAdapter impleme
     }
 
     /** {@inheritDoc} */
-    @Override public synchronized boolean 
checkSerializableReadVersion(GridCacheVersion serReadVer) {
-        assert !obsolete() : this;
-
+    @Override public synchronized boolean 
checkSerializableReadVersion(GridCacheVersion serReadVer)
+        throws GridCacheEntryRemovedException {
         if (!serReadVer.equals(ver)) {
+            checkObsolete();
+
             boolean empty = isStartVersion() || deletedUnlocked();
 
             if (serReadVer.equals(IgniteTxEntry.SER_READ_EMPTY_ENTRY_VER))

http://git-wip-us.apache.org/repos/asf/ignite/blob/761875a0/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
index 7239b31..0330861 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
@@ -115,15 +115,30 @@ public class 
GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
                 if (entry.context().isLocal()) {
                     GridCacheVersion serReadVer = 
txEntry.serializableReadVersion();
 
-                    if (serReadVer != null && 
!entry.checkSerializableReadVersion(serReadVer)) {
+                    if (serReadVer != null) {
                         GridCacheContext ctx = entry.context();
 
-                        IgniteTxOptimisticCheckedException err0 =
-                            new IgniteTxOptimisticCheckedException("Failed to 
prepare transaction, " +
-                            "read/write conflict [key=" + 
entry.key().value(ctx.cacheObjectContext(), false) +
-                            ", cache=" + ctx.name() + ']');
+                        while (true) {
+                            try {
+                                if 
(!entry.checkSerializableReadVersion(serReadVer)) {
+                                    Object key = 
entry.key().value(ctx.cacheObjectContext(), false);
+
+                                    IgniteTxOptimisticCheckedException err0 =
+                                        new 
IgniteTxOptimisticCheckedException("Failed to prepare transaction, " +
+                                            "read/write conflict [key=" + key 
+ ", cache=" + ctx.name() + ']');
+
+                                    err.compareAndSet(null, err0);
+                                }
+
+                                break;
+                            }
+                            catch (GridCacheEntryRemovedException e) {
+                                entry = ctx.cache().entryEx(entry.key());
+
+                                txEntry.cached(entry);
+                            }
+                        }
 
-                        err.compareAndSet(null, err0);
                     }
                 }
 

Reply via email to