ignite-968 lock entries after topology version check, otherwise can add entry in evicted partition
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/3ebb1c03 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/3ebb1c03 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/3ebb1c03 Branch: refs/heads/ignite-883_1 Commit: 3ebb1c03ad8b13714f85d7a464a126f4ca931347 Parents: 3c1f0ca Author: sboikov <sboi...@gridgain.com> Authored: Tue Jun 2 12:46:08 2015 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Tue Jun 2 12:49:02 2015 +0300 ---------------------------------------------------------------------- .../distributed/dht/atomic/GridDhtAtomicCache.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/3ebb1c03/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java index 69f5501..9ca80f9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java @@ -1024,9 +1024,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { IgniteCacheExpiryPolicy expiry = null; try { - // If batch store update is enabled, we need to lock all entries. - // First, need to acquire locks on cache entries, then check filter. - List<GridDhtCacheEntry> locked = lockEntries(keys, req.topologyVersion()); + List<GridDhtCacheEntry> locked = null; Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted = null; try { @@ -1043,7 +1041,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { } // Do not check topology version for CLOCK versioning since - // partition exchange will wait for near update future. + // partition exchange will wait for near update future (if future is on server node). // Also do not check topology version if topology was locked on near node by // external transaction or explicit lock. if ((req.fastMap() && !req.clientRequest()) || req.topologyLocked() || @@ -1056,6 +1054,10 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { return; } + // If batch store update is enabled, we need to lock all entries. + // First, need to acquire locks on cache entries, then check filter. + locked = lockEntries(keys, req.topologyVersion()); + boolean hasNear = ctx.discovery().cacheNearNode(node, name()); GridCacheVersion ver = req.updateVersion(); @@ -1144,7 +1146,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> { e.printStackTrace(); } finally { - unlockEntries(locked, req.topologyVersion()); + if (locked != null) + unlockEntries(locked, req.topologyVersion()); // Enqueue if necessary after locks release. if (deleted != null) {