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/a50ffa7e Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a50ffa7e Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a50ffa7e Branch: refs/heads/ignite-1607 Commit: a50ffa7edf778094868462f82a5bdab6b1550e25 Parents: 846002f Author: sboikov <sboi...@gridgain.com> Authored: Tue Oct 27 12:00:07 2015 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Tue Oct 27 12:12:41 2015 +0300 ---------------------------------------------------------------------- .../processors/cache/GridCacheEntryEx.java | 5 +-- .../processors/cache/GridCacheMvcc.java | 36 ++++++++++++-------- .../distributed/GridDistributedCacheEntry.java | 3 +- .../distributed/dht/GridDhtCacheEntry.java | 8 ++--- .../distributed/dht/GridDhtTxPrepareFuture.java | 12 +++---- .../cache/distributed/near/GridNearTxLocal.java | 2 +- .../cache/local/GridLocalCacheEntry.java | 3 +- .../cache/transactions/IgniteTxAdapter.java | 2 +- .../transactions/IgniteTxLocalAdapter.java | 6 ++-- .../cache/transactions/IgniteTxManager.java | 14 ++++---- .../processors/cache/GridCacheTestEntryEx.java | 5 ++- .../loadtests/hashmap/GridHashMapLoadTest.java | 6 +++- 12 files changed, 60 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/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 3b636b4..50b01c8 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 @@ -540,16 +540,17 @@ public interface GridCacheEntryEx { * * @param tx Cache transaction. * @param timeout Timeout for lock acquisition. + * @param serOrder Version for serializable transactions ordering. * @param serReadVer Optional read entry version for optimistic serializable transaction. * @return {@code True} if lock was acquired, {@code false} otherwise. * @throws GridCacheEntryRemovedException If this entry is obsolete. * @throws GridDistributedLockCancelledException If lock has been cancelled. - * @throws IgniteCheckedException If failed. */ public boolean tmLock(IgniteInternalTx tx, long timeout, + @Nullable GridCacheVersion serOrder, @Nullable GridCacheVersion serReadVer) - throws GridCacheEntryRemovedException, GridDistributedLockCancelledException, IgniteCheckedException; + throws GridCacheEntryRemovedException, GridDistributedLockCancelledException; /** * Unlocks acquired lock. http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMvcc.java ---------------------------------------------------------------------- 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 d7aca89..12583ad 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 @@ -595,13 +595,19 @@ public final class GridCacheMvcc { serOrder ); - if (!add0(cand)) { - assert serOrder != null : cand; + if (serOrder == null) { + cctx.mvcc().addLocal(cand); - return null; + boolean add = add0(cand); + + assert add : cand; } + else { + if (!add0(cand)) + return null; - cctx.mvcc().addLocal(cand); + cctx.mvcc().addLocal(cand); + } return cand; } @@ -940,20 +946,22 @@ public final class GridCacheMvcc { } } - if (locs != null && !locs.isEmpty()) { - GridCacheMvccCandidate first = locs.getFirst(); + if (locs != null) { + boolean first = true; - if (first.serializable()) { - if (first.owner() || !first.ready()) - return; + for (ListIterator<GridCacheMvccCandidate> it = locs.listIterator(); it.hasNext(); ) { + GridCacheMvccCandidate cand = it.next(); - first.setOwner(); + if (first && cand.serializable()) { + if (cand.owner() || !cand.ready()) + return; - return; - } + cand.setOwner(); - for (ListIterator<GridCacheMvccCandidate> it = locs.listIterator(); it.hasNext(); ) { - GridCacheMvccCandidate cand = it.next(); + return; + } + + first = false; if (cand.owner()) return; http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheEntry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheEntry.java index 89045ab..a138d30 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedCacheEntry.java @@ -745,8 +745,9 @@ public class GridDistributedCacheEntry extends GridCacheMapEntry { /** {@inheritDoc} */ @Override public boolean tmLock(IgniteInternalTx tx, long timeout, + @Nullable GridCacheVersion serOrder, GridCacheVersion serReadVer) - throws GridCacheEntryRemovedException, GridDistributedLockCancelledException, IgniteCheckedException { + throws GridCacheEntryRemovedException, GridDistributedLockCancelledException { if (tx.local()) // Null is returned if timeout is negative and there is other lock owner. return addLocal( http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java index 5f2a94d..1b2d834 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheEntry.java @@ -172,7 +172,6 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry { * @return New candidate. * @throws GridCacheEntryRemovedException If entry has been removed. * @throws GridDistributedLockCancelledException If lock was cancelled. - * @throws IgniteCheckedException If failed. */ @Nullable public GridCacheMvccCandidate addDhtLocal( UUID nearNodeId, @@ -186,7 +185,7 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry { boolean reenter, boolean tx, boolean implicitSingle) - throws GridCacheEntryRemovedException, GridDistributedLockCancelledException, IgniteCheckedException + throws GridCacheEntryRemovedException, GridDistributedLockCancelledException { assert serReadVer == null || serOrder != null; assert !reenter || serOrder == null; @@ -263,8 +262,9 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry { /** {@inheritDoc} */ @Override public boolean tmLock(IgniteInternalTx tx, long timeout, + @Nullable GridCacheVersion serOrder, GridCacheVersion serReadVer) - throws GridCacheEntryRemovedException, GridDistributedLockCancelledException, IgniteCheckedException { + throws GridCacheEntryRemovedException, GridDistributedLockCancelledException { if (tx.local()) { GridDhtTxLocalAdapter dhtTx = (GridDhtTxLocalAdapter)tx; @@ -275,7 +275,7 @@ public class GridDhtCacheEntry extends GridDistributedCacheEntry { tx.topologyVersion(), tx.threadId(), tx.xidVersion(), - (tx.optimistic() && tx.serializable()) ? tx.nearXidVersion() : null, + serOrder, serReadVer, timeout, /*reenter*/false, http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java index 9ae4d4c..4facfb9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java @@ -143,10 +143,10 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter private AtomicBoolean mapped = new AtomicBoolean(false); /** Prepare reads. */ - private Collection<IgniteTxEntry> reads; + private Iterable<IgniteTxEntry> reads; /** Prepare writes. */ - private Collection<IgniteTxEntry> writes; + private Iterable<IgniteTxEntry> writes; /** Tx nodes. */ private Map<UUID, Collection<UUID>> txNodes; @@ -471,7 +471,7 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter readyLocks(writes); - if (tx.optimistic() && tx.serializable()) + if (tx.serializable() && tx.optimistic()) readyLocks(reads); locksReady = true; @@ -817,7 +817,7 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter this.writes = writes; this.txNodes = txNodes; - boolean ser = tx.optimistic() && tx.serializable(); + boolean ser = tx.serializable() && tx.optimistic(); if (!F.isEmpty(writes) || (ser && !F.isEmpty(reads))) { Map<Integer, Collection<KeyCacheObject>> forceKeys = null; @@ -924,7 +924,7 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter * @return Not null exception if version check failed. * @throws IgniteCheckedException If failed. */ - @Nullable private IgniteCheckedException checkReadConflict(Collection<IgniteTxEntry> entries) + @Nullable private IgniteCheckedException checkReadConflict(Iterable<IgniteTxEntry> entries) throws IgniteCheckedException { try { for (IgniteTxEntry entry : entries) { @@ -962,7 +962,7 @@ public final class GridDhtTxPrepareFuture extends GridCompoundFuture<IgniteInter */ private void prepare0() { try { - if (tx.optimistic() && tx.serializable()) { + if (tx.serializable() && tx.optimistic()) { IgniteCheckedException err0; try { http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/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 67fd81e..883c285 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 @@ -908,7 +908,7 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter { try { // At this point all the entries passed in must be enlisted in transaction because this is an // optimistic transaction. - optimisticLockEntries = optimistic() && serializable() ? F.concat(false, writes, reads) : writes; + optimisticLockEntries = (serializable() && optimistic()) ? F.concat(false, writes, reads) : writes; userPrepare(); http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCacheEntry.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCacheEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCacheEntry.java index 24cd2c0..85ed881 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCacheEntry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalCacheEntry.java @@ -206,12 +206,13 @@ public class GridLocalCacheEntry extends GridCacheMapEntry { /** {@inheritDoc} */ @Override public boolean tmLock(IgniteInternalTx tx, long timeout, + @Nullable GridCacheVersion serOrder, GridCacheVersion serReadVer) throws GridCacheEntryRemovedException { GridCacheMvccCandidate cand = addLocal( tx.threadId(), tx.xidVersion(), - (tx.optimistic() && tx.serializable()) ? tx.nearXidVersion() : null, + serOrder, serReadVer, timeout, /*reenter*/false, http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java index c6b749a..0e2394a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java @@ -432,7 +432,7 @@ public abstract class IgniteTxAdapter extends GridMetadataAwareAdapter /** {@inheritDoc} */ @Override public Collection<IgniteTxEntry> optimisticLockEntries() { - if (optimistic() && serializable()) + if (serializable() && optimistic()) return F.concat(false, writeEntries(), readEntries()); return writeEntries(); http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java index 4d3ad72..556d715 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java @@ -1361,7 +1361,7 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter AffinityTopologyVersion topVer = topologyVersion(); - boolean needReadVer = optimistic() && serializable(); + boolean needReadVer = serializable() && optimistic(); // In this loop we cover only read-committed or optimistic transactions. // Transactions that are pessimistic and not read-committed are covered @@ -1619,7 +1619,7 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter if (log.isDebugEnabled()) log.debug("Loading missed values for missed map: " + missedMap); - final boolean needReadVer = optimistic() && serializable(); + final boolean needReadVer = serializable() && optimistic(); return new GridEmbeddedFuture<>( new C2<Void, Exception, Map<K, V>>() { @@ -2058,7 +2058,7 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter final boolean hasFilters = !F.isEmptyOrNulls(filter) && !F.isAlwaysTrue(filter); final boolean needVal = singleRmv || retval || hasFilters; - final boolean needReadVer = needVal && (optimistic() && serializable()); + final boolean needReadVer = needVal && (serializable() && optimistic()); try { // Set transform flag for transaction. http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java index 24ea634..c1e9202 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java @@ -996,7 +996,10 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { * @return {@code True} if transaction read entries should be unlocked. */ private boolean unlockReadEntries(IgniteInternalTx tx) { - return (tx.pessimistic() && !tx.readCommitted()) || (tx.optimistic() && tx.serializable()); + if (tx.pessimistic()) + return !tx.readCommitted(); + else + return tx.serializable(); } /** @@ -1381,6 +1384,8 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { // we wait for the lock. long timeout = tx.timeout() == 0 ? 0 : remainingTime; + GridCacheVersion serOrder = (tx.serializable() && tx.optimistic()) ? tx.nearXidVersion() : null; + for (IgniteTxEntry txEntry1 : entries) { // Check if this entry was prepared before. if (!txEntry1.markPrepared() || txEntry1.explicitVersion() != null) @@ -1399,7 +1404,7 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { assert serReadVer == null || (tx.optimistic() && tx.serializable()) : txEntry1; - if (!entry1.tmLock(tx, timeout, serReadVer)) { + if (!entry1.tmLock(tx, timeout, serOrder, serReadVer)) { // Unlock locks locked so far. for (IgniteTxEntry txEntry2 : entries) { if (txEntry2 == txEntry1) @@ -1433,11 +1438,6 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter { break; } } - catch (IgniteCheckedException e) { - tx.setRollbackOnly(); - - throw e; - } catch (GridDistributedLockCancelledException ignore) { tx.setRollbackOnly(); http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java index 84cc572..abb2767 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java @@ -575,7 +575,10 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr } /** @inheritDoc */ - @Override public boolean tmLock(IgniteInternalTx tx, long timeout, GridCacheVersion serReadVer) { + @Override public boolean tmLock(IgniteInternalTx tx, + long timeout, + @Nullable GridCacheVersion serOrder, + GridCacheVersion serReadVer) { assert false; return false; } http://git-wip-us.apache.org/repos/asf/ignite/blob/a50ffa7e/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridHashMapLoadTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridHashMapLoadTest.java b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridHashMapLoadTest.java index bbff5a8..a6dfc9c 100644 --- a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridHashMapLoadTest.java +++ b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridHashMapLoadTest.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.testframework.junits.GridTestKernalContext; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.testframework.junits.logger.GridTestLog4jLogger; +import org.jetbrains.annotations.Nullable; /** * Tests hashmap load. @@ -81,7 +82,10 @@ public class GridHashMapLoadTest extends GridCommonAbstractTest { map.put(key, new GridCacheMapEntry(ctx, ctx.toCacheKeyObject(key), key.hashCode(), ctx.toCacheObject(val), null, 1) { - @Override public boolean tmLock(IgniteInternalTx tx, long timeout, GridCacheVersion serReadVer) { + @Override public boolean tmLock(IgniteInternalTx tx, + long timeout, + @Nullable GridCacheVersion serOrder, + GridCacheVersion serReadVer) { return false; }