You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2017/02/17 09:59:52 UTC

[42/50] [abbrv] ignite git commit: IGNITE-4590 Fixed Lock/unlock operations are hanging when topology changed

IGNITE-4590 Fixed Lock/unlock operations are hanging when topology changed


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

Branch: refs/heads/ignite-1.9
Commit: 4bf7fdf40e50aa6aca8fb438fb314c35166802df
Parents: ad91eac
Author: nikolay tikhonov <nt...@gridgain.com>
Authored: Tue Feb 7 16:18:56 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Feb 7 16:26:18 2017 +0300

----------------------------------------------------------------------
 .../transactions/IgniteTxLocalAdapter.java      |   3 +
 .../processors/cache/GridCacheTestEntryEx.java  | 102 +++++++++----------
 .../CacheLockReleaseNodeLeaveTest.java          |  65 +++++++++++-
 3 files changed, 118 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/4bf7fdf4/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 777489e..1a9b082 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
@@ -3785,6 +3785,9 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter implements Ig
             // so it is safe to get acquired locks.
             GridCacheMvccCandidate explicitCand = entry.localOwner();
 
+            if (explicitCand == null)
+                explicitCand = cctx.mvcc().explicitLock(threadId(), entry.txKey());
+
             if (explicitCand != null) {
                 GridCacheVersion explicitVer = explicitCand.version();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/4bf7fdf4/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 d46dee0..8f0d9b1 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
@@ -280,7 +280,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return true;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public KeyCacheObject key() {
         return key;
     }
@@ -290,7 +290,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return new IgniteTxKey(key, 0);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject rawGet() {
         return val;
     }
@@ -305,7 +305,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return val != null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject rawPut(CacheObject val, long ttl) {
         CacheObject old = this.val;
 
@@ -315,14 +315,14 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return old;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public Cache.Entry wrap() {
         assert false;
 
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public Cache.Entry wrapLazyValue(boolean keepBinary) {
         assert false;
 
@@ -336,19 +336,19 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Nullable @Override public CacheObject peekVisibleValue() {
         assert false;
 
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheVersion obsoleteVersion() {
         return obsoleteVer;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean obsolete() {
         return obsoleteVer != null;
     }
@@ -358,7 +358,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return obsoleteVer != null && !obsoleteVer.equals(exclude);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean invalidate(@Nullable GridCacheVersion curVer, GridCacheVersion newVer)
         throws IgniteCheckedException {
         assert false;
@@ -366,7 +366,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean invalidate(@Nullable CacheEntryPredicate[] filter)
         throws GridCacheEntryRemovedException, IgniteCheckedException {
         assert false;
@@ -374,7 +374,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean evictInternal(boolean swap, GridCacheVersion obsoleteVer,
         @Nullable CacheEntryPredicate[] filter) {
         assert false;
@@ -390,7 +390,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean isNew() {
         assert false; return false;
     }
@@ -400,7 +400,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         assert false; return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject innerGet(
         @Nullable GridCacheVersion ver,
         @Nullable IgniteInternalTx tx,
@@ -417,12 +417,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return val;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public void clearReserveForLoad(GridCacheVersion ver) {
         assert false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public EntryGetResult innerGetAndReserveForLoad(
         boolean readSwap,
         boolean updateMetrics,
@@ -437,7 +437,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Nullable @Override public EntryGetResult innerGetVersioned(
         @Nullable GridCacheVersion ver,
         IgniteInternalTx tx,
@@ -456,12 +456,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject innerReload() {
         return val;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheUpdateTxResult innerSet(@Nullable IgniteInternalTx tx,
         UUID evtNodeId,
         UUID affNodeId,
@@ -544,7 +544,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheUpdateTxResult innerRemove(
         @Nullable IgniteInternalTx tx,
         UUID evtNodeId,
@@ -573,7 +573,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return new GridCacheUpdateTxResult(true, old);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean clear(GridCacheVersion ver, boolean readers) throws IgniteCheckedException {
         if (ver == null || ver.equals(this.ver)) {
             val = null;
@@ -584,7 +584,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean tmLock(IgniteInternalTx tx,
         long timeout,
         @Nullable GridCacheVersion serOrder,
@@ -594,12 +594,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public void txUnlock(IgniteInternalTx tx) {
         assert false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean removeLock(GridCacheVersion ver) {
         GridCacheMvccCandidate doomed = mvcc.candidate(ver);
 
@@ -608,7 +608,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return doomed != null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean markObsolete(GridCacheVersion ver) {
         if (ver == null || ver.equals(obsoleteVer)) {
             obsoleteVer = ver;
@@ -645,19 +645,19 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheVersion version() {
         return ver;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean checkSerializableReadVersion(GridCacheVersion ver) {
         assert false;
 
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean initialValue(
         CacheObject val,
         GridCacheVersion ver,
@@ -673,19 +673,19 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean initialValue(KeyCacheObject key, GridCacheSwapEntry unswapped) {
         assert false;
 
         return false;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheVersionedEntryEx versionedEntry(final boolean keepBinary) throws IgniteCheckedException {
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public EntryGetResult versionedValue(CacheObject val,
         GridCacheVersion curVer,
         GridCacheVersion newVer,
@@ -696,22 +696,22 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean hasLockCandidate(GridCacheVersion ver) {
         return mvcc.hasCandidate(ver);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByAny(GridCacheVersion... exclude) {
         return !mvcc.isEmpty(exclude);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByThread()  {
         return lockedByThread(Thread.currentThread().getId());
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedLocally(GridCacheVersion lockVer) {
         return mvcc.isLocallyOwned(lockVer);
     }
@@ -722,52 +722,52 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return lockedLocally(lockVer) || lockedByThread(threadId);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByThread(long threadId, GridCacheVersion exclude) {
         return mvcc.isLocallyOwnedByThread(threadId, false, exclude);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByThread(long threadId) {
         return mvcc.isLocallyOwnedByThread(threadId, true);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedBy(GridCacheVersion ver) {
         return mvcc.isOwnedBy(ver);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByThreadUnsafe(long threadId) {
         return mvcc.isLocallyOwnedByThread(threadId, true);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedByUnsafe(GridCacheVersion ver) {
         return mvcc.isOwnedBy(ver);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean lockedLocallyUnsafe(GridCacheVersion lockVer) {
         return mvcc.isLocallyOwned(lockVer);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public boolean hasLockCandidateUnsafe(GridCacheVersion ver) {
         return mvcc.hasCandidate(ver);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public Collection<GridCacheMvccCandidate> localCandidates(GridCacheVersion... exclude) {
         return mvcc.localCandidates(exclude);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     Collection<GridCacheMvccCandidate> localCandidates(boolean reentries, GridCacheVersion... exclude) {
         return mvcc.localCandidates(reentries, exclude);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public Collection<GridCacheMvccCandidate> remoteMvccSnapshot(GridCacheVersion... exclude) {
         return mvcc.remoteCandidates(exclude);
     }
@@ -777,7 +777,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return mvcc.localCandidate(threadId);
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheMvccCandidate candidate(GridCacheVersion ver) {
         return mvcc.candidate(ver);
     }
@@ -795,19 +795,19 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return mvcc.anyOwner();
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public GridCacheMvccCandidate localOwner() {
         return mvcc.localOwner();
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject valueBytes() {
         assert false;
 
         return null;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public CacheObject valueBytes(GridCacheVersion ver) {
         assert false;
 
@@ -819,7 +819,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return 0;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public long expireTime() {
         return 0;
     }
@@ -839,12 +839,12 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         return ttl;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public long ttl() {
         return ttl;
     }
 
-    /** @inheritDoc */
+    /** {@inheritDoc} */
     @Override public void updateTtl(GridCacheVersion ver, long ttl) {
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/4bf7fdf4/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLockReleaseNodeLeaveTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLockReleaseNodeLeaveTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLockReleaseNodeLeaveTest.java
index e84fd3f..687fe0b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLockReleaseNodeLeaveTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLockReleaseNodeLeaveTest.java
@@ -17,9 +17,13 @@
 
 package org.apache.ignite.internal.processors.cache.distributed;
 
+import java.util.ArrayDeque;
+import java.util.Queue;
 import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Lock;
 import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteInternalFuture;
@@ -33,6 +37,7 @@ import org.apache.ignite.transactions.Transaction;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
 
@@ -43,6 +48,9 @@ public class CacheLockReleaseNodeLeaveTest extends GridCommonAbstractTest {
     /** */
     private static final TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
 
+    /** */
+    private static final String REPLICATED_TEST_CACHE = "REPLICATED_TEST_CACHE";
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(gridName);
@@ -53,7 +61,12 @@ public class CacheLockReleaseNodeLeaveTest extends GridCommonAbstractTest {
 
         ccfg.setAtomicityMode(TRANSACTIONAL);
 
-        cfg.setCacheConfiguration(ccfg);
+        CacheConfiguration ccfg1 = new CacheConfiguration(REPLICATED_TEST_CACHE)
+            .setCacheMode(REPLICATED)
+            .setAtomicityMode(TRANSACTIONAL)
+            .setReadFromBackup(false);
+
+        cfg.setCacheConfiguration(ccfg, ccfg1);
 
         return cfg;
     }
@@ -114,6 +127,56 @@ public class CacheLockReleaseNodeLeaveTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    public void testLockTopologyChange() throws Exception {
+        final int nodeCnt = 5;
+        int threadCnt = 8;
+        final int keys = 100;
+
+        try {
+            final AtomicBoolean stop = new AtomicBoolean(false);
+
+            Queue<IgniteInternalFuture<Long>> q = new ArrayDeque<>(nodeCnt);
+
+            for (int i = 0; i < nodeCnt; i++) {
+                final Ignite ignite = startGrid(i);
+
+                IgniteInternalFuture<Long> f = GridTestUtils.runMultiThreadedAsync(new Runnable() {
+                    @Override public void run() {
+                        while (!Thread.currentThread().isInterrupted() && !stop.get()) {
+                            IgniteCache<Integer, Integer> cache = ignite.cache(REPLICATED_TEST_CACHE);
+
+                            for (int i = 0; i < keys; i++) {
+                                Lock lock = cache.lock(i);
+                                lock.lock();
+
+                                cache.put(i, i);
+
+                                lock.unlock();
+                            }
+                        }
+                    }
+                }, threadCnt, "test-lock-thread");
+
+                q.add(f);
+
+                U.sleep(1_000);
+            }
+
+            stop.set(true);
+
+            IgniteInternalFuture<Long> f;
+
+            while ((f = q.poll()) != null)
+                f.get(2_000);
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testTxLockRelease() throws Exception {
         startGrids(2);