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