You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/08/25 10:57:36 UTC

[29/50] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-1.3.3-p3'

Merge remote-tracking branch 'remotes/origin/ignite-1.3.3-p3'


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

Branch: refs/heads/ignite-1093
Commit: d859587948862067c2389cb5f2461e351a35ddfa
Parents: dd204de 9603b25
Author: sboikov <sb...@gridgain.com>
Authored: Fri Aug 21 11:00:22 2015 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Aug 21 11:00:22 2015 +0300

----------------------------------------------------------------------
 .../apache/ignite/IgniteSystemProperties.java   |   3 +
 .../store/jdbc/CacheAbstractJdbcStore.java      |  45 +-
 .../cache/store/jdbc/CacheJdbcPojoStore.java    |  32 +-
 .../store/jdbc/dialect/BasicJdbcDialect.java    |   3 +
 .../cache/store/jdbc/dialect/DB2Dialect.java    |   3 +
 .../cache/store/jdbc/dialect/H2Dialect.java     |   3 +
 .../cache/store/jdbc/dialect/JdbcDialect.java   |   3 +-
 .../cache/store/jdbc/dialect/MySQLDialect.java  |   3 +
 .../cache/store/jdbc/dialect/OracleDialect.java |   3 +
 .../store/jdbc/dialect/SQLServerDialect.java    |   3 +
 .../cluster/ClusterTopologyException.java       |  18 +
 .../ignite/internal/MarshallerContextImpl.java  |  24 +-
 .../ClusterTopologyCheckedException.java        |  18 +
 .../CachePartialUpdateCheckedException.java     |  11 +-
 .../processors/cache/GridCacheAdapter.java      |  81 ++-
 .../processors/cache/GridCacheIoManager.java    |   1 -
 .../cache/GridCacheSharedContext.java           |  17 +
 .../processors/cache/GridCacheUtils.java        |  23 +
 .../distributed/GridDistributedCacheEntry.java  |   7 +
 .../dht/GridClientPartitionTopology.java        |  20 +
 .../distributed/dht/GridDhtCacheAdapter.java    |  12 +-
 .../cache/distributed/dht/GridDhtGetFuture.java |  12 +-
 .../dht/GridDhtPartitionTopology.java           |   7 +
 .../dht/GridDhtPartitionTopologyImpl.java       |  20 +
 .../cache/distributed/dht/GridDhtTxLocal.java   |   4 +-
 .../distributed/dht/GridDhtTxPrepareFuture.java | 182 ++++++-
 .../dht/GridDhtTxPrepareResponse.java           |  42 +-
 .../dht/GridPartitionedGetFuture.java           | 104 ++--
 .../dht/atomic/GridDhtAtomicCache.java          |  16 +-
 .../dht/atomic/GridNearAtomicUpdateFuture.java  |   3 +
 .../dht/colocated/GridDhtColocatedCache.java    |  19 +-
 .../colocated/GridDhtColocatedLockFuture.java   |   8 +-
 .../GridDhtPartitionsExchangeFuture.java        |  40 +-
 .../distributed/near/GridNearAtomicCache.java   |   6 +-
 .../distributed/near/GridNearCacheAdapter.java  |  15 +-
 .../distributed/near/GridNearCacheEntry.java    |  10 +-
 .../distributed/near/GridNearGetFuture.java     | 121 +++--
 .../distributed/near/GridNearLockFuture.java    |  12 +-
 .../near/GridNearOptimisticTxPrepareFuture.java |  13 +-
 .../GridNearPessimisticTxPrepareFuture.java     |   9 +-
 .../near/GridNearTransactionalCache.java        |   9 +-
 .../cache/distributed/near/GridNearTxLocal.java |   7 +-
 .../near/GridNearTxPrepareResponse.java         |   3 -
 .../local/atomic/GridLocalAtomicCache.java      |  17 +-
 .../cache/transactions/IgniteInternalTx.java    |   2 +-
 .../cache/transactions/IgniteTxAdapter.java     |  19 +-
 .../cache/transactions/IgniteTxEntry.java       |  18 +
 .../cache/transactions/IgniteTxHandler.java     |   5 +-
 .../ignite/internal/util/IgniteUtils.java       |  10 +-
 .../ignite/internal/util/lang/GridFunc.java     |  14 +
 .../config/store/jdbc/ignite-type-metadata.xml  |   8 +
 .../store/jdbc/CacheJdbcPojoStoreTest.java      |  33 +-
 ...eJdbcStoreAbstractMultithreadedSelfTest.java |  16 +-
 .../ignite/cache/store/jdbc/model/Person.java   |  26 +-
 .../cache/CrossCacheTxRandomOperationsTest.java | 490 +++++++++++++++++++
 ...teAtomicCacheEntryProcessorNodeJoinTest.java |  32 ++
 .../IgniteCacheEntryProcessorNodeJoinTest.java  | 225 +++++++++
 .../IgniteCacheTopologySafeGetSelfTest.java     | 215 ++++++++
 .../GridCacheTransformEventSelfTest.java        |   2 +
 .../IgniteCacheCrossCacheTxFailoverTest.java    | 433 ++++++++++++++++
 .../IgniteCachePutRetryAbstractSelfTest.java    |   1 +
 ...gniteCachePutRetryTransactionalSelfTest.java | 187 +++++++
 .../near/GridCacheNearOnlyTopologySelfTest.java |   4 +-
 .../near/GridCacheNearTxForceKeyTest.java       |  76 +++
 ...idCachePartitionedHitsAndMissesSelfTest.java |  20 +-
 .../OptimizedMarshallerNodeFailoverTest.java    |  97 +++-
 .../IgniteCacheFailoverTestSuite.java           |   2 +
 .../testsuites/IgniteCacheTestSuite2.java       |   4 +
 .../ignite/schema/model/PojoDescriptor.java     |   6 +-
 .../ignite/schema/model/SchemaDescriptor.java   |  61 +++
 .../schema/parser/DatabaseMetadataParser.java   |  54 +-
 .../parser/dialect/DB2MetadataDialect.java      |   3 +-
 .../parser/dialect/DatabaseMetadataDialect.java |  13 +-
 .../parser/dialect/JdbcMetadataDialect.java     | 129 +++--
 .../parser/dialect/MySQLMetadataDialect.java    |  57 +++
 .../parser/dialect/OracleMetadataDialect.java   | 111 +++--
 .../org/apache/ignite/schema/ui/Controls.java   |  25 +-
 .../ignite/schema/ui/SchemaImportApp.java       | 157 +++++-
 .../schema/test/AbstractSchemaImportTest.java   |  10 +-
 .../jdbc/CacheJdbcPojoStoreFactorySelfTest.java |  14 +-
 80 files changed, 3186 insertions(+), 405 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
index bb3673d,a85962f..6e39672
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
@@@ -625,30 -653,31 +653,38 @@@ public class GridPartitionedGetFuture<K
              if (log.isDebugEnabled())
                  log.debug("Remote node left grid while sending or waiting for reply (will retry): " + this);
  
-             final AffinityTopologyVersion updTopVer =
-                 new AffinityTopologyVersion(Math.max(topVer.topologyVersion() + 1, cctx.discovery().topologyVersion()));
+             // Try getting from existing nodes.
+             if (!canRemap) {
+                 map(keys.keySet(), F.t(node, keys), topVer);
  
-             final GridFutureRemapTimeoutObject timeout = new GridFutureRemapTimeoutObject(this,
-                 cctx.kernalContext().config().getNetworkTimeout(),
-                 updTopVer,
-                 e);
- 
-             cctx.affinity().affinityReadyFuture(updTopVer).listen(
-                 new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
-                     @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
-                         if (timeout.finish()) {
-                             cctx.kernalContext().timeout().removeTimeoutObject(timeout);
- 
-                             try {
-                                 fut.get();
- 
-                                 // Remap.
-                                 map(keys.keySet(), F.t(node, keys), updTopVer);
- 
-                                 onDone(Collections.<K, V>emptyMap());
-                             }
-                             catch (IgniteCheckedException e) {
-                                 GridPartitionedGetFuture.this.onDone(e);
+                 onDone(Collections.<K, V>emptyMap());
+             }
+             else {
+                 final AffinityTopologyVersion updTopVer =
+                     new AffinityTopologyVersion(Math.max(topVer.topologyVersion() + 1, cctx.discovery().topologyVersion()));
+ 
+                 final GridFutureRemapTimeoutObject timeout = new GridFutureRemapTimeoutObject(this,
+                     cctx.kernalContext().config().getNetworkTimeout(),
+                     updTopVer,
+                     e);
+ 
+                 cctx.affinity().affinityReadyFuture(updTopVer).listen(
+                     new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
+                         @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
+                             if (timeout.finish()) {
+                                 cctx.kernalContext().timeout().removeTimeoutObject(timeout);
+ 
 -                                // Remap.
 -                                map(keys.keySet(), F.t(node, keys), updTopVer);
++                                try {
++                                    fut.get();
+ 
 -                                onDone(Collections.<K, V>emptyMap());
++                                    // Remap.
++                                    map(keys.keySet(), F.t(node, keys), updTopVer);
++
++                                    onDone(Collections.<K, V>emptyMap());
++                                }
++                                catch (IgniteCheckedException e) {
++                                    GridPartitionedGetFuture.this.onDone(e);
++                                }
                              }
                          }
                      }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index cbf6b40,4971ca6..1a90de9
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@@ -738,22 -761,20 +750,26 @@@ public class GridDhtPartitionsExchangeF
                          break;
                      }
                      catch (IgniteFutureTimeoutCheckedException ignored) {
-                         U.warn(log, "Failed to wait for locks release future. " +
-                             "Dumping pending objects that might be the cause: " + cctx.localNodeId());
+                         if (dumpedObjects < DUMP_PENDING_OBJECTS_THRESHOLD) {
+                             U.warn(log, "Failed to wait for locks release future. " +
+                                 "Dumping pending objects that might be the cause: " + cctx.localNodeId());
  
-                         U.warn(log, "Locked keys:");
 -                            U.warn(log, "Locked entries:");
++                            U.warn(log, "Locked keys:");
 +
-                         for (IgniteTxKey key : cctx.mvcc().lockedKeys())
-                             U.warn(log, "Locked key: " + key);
++                            for (IgniteTxKey key : cctx.mvcc().lockedKeys())
++                                U.warn(log, "Locked key: " + key);
 +
-                         for (IgniteTxKey key : cctx.mvcc().nearLockedKeys())
-                             U.warn(log, "Locked near key: " + key);
++                            for (IgniteTxKey key : cctx.mvcc().nearLockedKeys())
++                                U.warn(log, "Locked near key: " + key);
  
-                         Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> locks =
-                             cctx.mvcc().unfinishedLocks(exchId.topologyVersion());
+                             Map<IgniteTxKey, Collection<GridCacheMvccCandidate>> locks =
+                                 cctx.mvcc().unfinishedLocks(exchId.topologyVersion());
  
-                         for (Map.Entry<IgniteTxKey, Collection<GridCacheMvccCandidate>> e : locks.entrySet())
-                             U.warn(log, "Awaited locked entry [key=" + e.getKey() + ", mvcc=" + e.getValue() + ']');
+                             for (Map.Entry<IgniteTxKey, Collection<GridCacheMvccCandidate>> e : locks.entrySet())
 -                                U.warn(log, "Locked entry [key=" + e.getKey() + ", mvcc=" + e.getValue() + ']');
 -
++                                U.warn(log, "Awaited locked entry [key=" + e.getKey() + ", mvcc=" + e.getValue() + ']');
++                            
+                             dumpedObjects++;
+                         }
                      }
                  }
  

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearCacheAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetFuture.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetFuture.java
index 2017654,ca460c5..c4a5d70
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetFuture.java
@@@ -752,30 -781,31 +781,38 @@@ public final class GridNearGetFuture<K
              if (log.isDebugEnabled())
                  log.debug("Remote node left grid while sending or waiting for reply (will retry): " + this);
  
-             final AffinityTopologyVersion updTopVer =
-                 new AffinityTopologyVersion(Math.max(topVer.topologyVersion() + 1, cctx.discovery().topologyVersion()));
- 
-             final GridFutureRemapTimeoutObject timeout = new GridFutureRemapTimeoutObject(this,
-                 cctx.kernalContext().config().getNetworkTimeout(),
-                 updTopVer,
-                 e);
- 
-             cctx.affinity().affinityReadyFuture(updTopVer).listen(
-                 new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
-                     @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
-                         if (timeout.finish()) {
-                             cctx.kernalContext().timeout().removeTimeoutObject(timeout);
- 
-                             try {
-                                 fut.get();
- 
-                                 // Remap.
-                                 map(keys.keySet(), F.t(node, keys), updTopVer);
- 
-                                 onDone(Collections.<K, V>emptyMap());
-                             }
-                             catch (IgniteCheckedException e) {
-                                 GridNearGetFuture.this.onDone(e);
+             // Try getting value from alive nodes.
+             if (!canRemap) {
+                 // Remap
+                 map(keys.keySet(), F.t(node, keys), topVer);
+ 
+                 onDone(Collections.<K, V>emptyMap());
+             } else {
+                 final AffinityTopologyVersion updTopVer =
+                     new AffinityTopologyVersion(Math.max(topVer.topologyVersion() + 1, cctx.discovery().topologyVersion()));
+ 
+                 final GridFutureRemapTimeoutObject timeout = new GridFutureRemapTimeoutObject(this,
+                     cctx.kernalContext().config().getNetworkTimeout(),
+                     updTopVer,
+                     e);
+ 
+                 cctx.affinity().affinityReadyFuture(updTopVer).listen(
+                     new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {
+                         @Override public void apply(IgniteInternalFuture<AffinityTopologyVersion> fut) {
+                             if (timeout.finish()) {
+                                 cctx.kernalContext().timeout().removeTimeoutObject(timeout);
+ 
 -                                // Remap.
 -                                map(keys.keySet(), F.t(node, keys), updTopVer);
++                                try {
++                                    fut.get();
+ 
 -                                onDone(Collections.<K, V>emptyMap());
++                                    // Remap.
++                                    map(keys.keySet(), F.t(node, keys), updTopVer);
++
++                                    onDone(Collections.<K, V>emptyMap());
++                                }
++                                catch (IgniteCheckedException e) {
++                                    GridNearGetFuture.this.onDone(e);
++                                }
                              }
                          }
                      }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteInternalTx.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/main/java/org/apache/ignite/internal/util/lang/GridFunc.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryAbstractSelfTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
----------------------------------------------------------------------
diff --cc modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
index 1d14dec,c2fc46c..0ab5729
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCachePutRetryTransactionalSelfTest.java
@@@ -64,16 -76,185 +76,191 @@@ public class IgniteCachePutRetryTransac
  
          int keysCnt = keysCount();
  
 -        for (int i = 0; i < keysCnt; i++)
 -            atomic.incrementAndGet();
 +        try {
 +            for (int i = 0; i < keysCnt; i++)
 +                atomic.incrementAndGet();
  
 -        finished.set(true);
 -        fut.get();
 +            finished.set(true);
 +
 +            fut.get();
 +        }
 +        finally {
 +            finished.set(true);
 +        }
      }
+ 
+     /** {@inheritDoc} */
+     public void testExplicitTransactionRetries() throws Exception {
+         final AtomicInteger idx = new AtomicInteger();
+         int threads = 8;
+ 
+         final AtomicReferenceArray<Exception> err = new AtomicReferenceArray<>(threads);
+ 
+         IgniteInternalFuture<Long> fut = GridTestUtils.runMultiThreadedAsync(new Callable<Object>() {
+             @Override
+             public Object call() throws Exception {
+                 int th = idx.getAndIncrement();
+                 int base = th * FACTOR;
+ 
+                 Ignite ignite = ignite(0);
+                 final IgniteCache<Object, Object> cache = ignite.cache(null);
+ 
+                 try {
+                     for (int i = 0; i < FACTOR; i++) {
+                         doInTransaction(ignite, new ProcessCallable(cache, base, i));
+ 
+                         if (i > 0 && i % 500 == 0)
+                             info("Done: " + i);
+                     }
+                 }
+                 catch (Exception e) {
+                     err.set(th, e);
+                 }
+ 
+                 return null;
+             }
+         }, threads, "tx-runner");
+ 
+         while (!fut.isDone()) {
+             int stopIdx = ThreadLocalRandom.current().nextInt(2, 4); // Random in [2, 3].
+ 
+             stopGrid(stopIdx);
+ 
+             U.sleep(500);
+ 
+             startGrid(stopIdx);
+         }
+ 
+         for (int i = 0; i < threads; i++) {
+             Exception error = err.get(i);
+ 
+             if (error != null)
+                 throw error;
+         }
+ 
+         // Verify contents of the cache.
+         for (int g = 0; g < gridCount(); g++) {
+             IgniteCache<Object, Object> cache = ignite(g).cache(null);
+ 
+             for (int th = 0; th < threads; th++) {
+                 int base = th * FACTOR;
+ 
+                 String key = "key-" + base;
+ 
+                 Set<String> set = (Set<String>)cache.get(key);
+ 
+                 assertNotNull("Missing set for key: " + key, set);
+                 assertEquals(FACTOR, set.size());
+ 
+                 for (int i = 0; i < FACTOR; i++) {
+                     assertEquals("value-" + i, cache.get("key-" + base + "-" + i));
+                     assertTrue(set.contains("value-" + i));
+                 }
+             }
+         }
+     }
+ 
+     /**
+      * @param ignite Ignite instance.
+      * @param clo Closure.
+      * @return Result of closure execution.
+      * @throws Exception If failed.
+      */
+     private <T> T doInTransaction(Ignite ignite, Callable<T> clo) throws Exception {
+         while (true) {
+             try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+                 T res = clo.call();
+ 
+                 tx.commit();
+ 
+                 return res;
+             }
+             catch (CacheException e) {
+                 if (e.getCause() instanceof ClusterTopologyException) {
+                     ClusterTopologyException topEx = (ClusterTopologyException)e.getCause();
+ 
+                     topEx.retryReadyFuture().get();
+                 }
+                 else
+                     throw e;
+             }
+             catch (ClusterTopologyException e) {
+                 IgniteFuture<?> fut = e.retryReadyFuture();
+ 
+                 fut.get();
+             }
+             catch (TransactionRollbackException ignore) {
+                 // Safe to retry right away.
+             }
+         }
+     }
+ 
+     /**
+      * Callable to process inside transaction.
+      */
+     private static class ProcessCallable implements Callable<Void> {
+         /** */
+         private IgniteCache cache;
+ 
+         /** */
+         private int base;
+ 
+         /** */
+         private int i;
+ 
+         /**
+          * @param cache Cache.
+          * @param base Base index.
+          * @param i Iteration index.
+          */
+         private ProcessCallable(IgniteCache<Object, Object> cache, int base, int i) {
+             this.cache = cache;
+             this.base = base;
+             this.i = i;
+         }
+ 
+         /** {@inheritDoc} */
+         @SuppressWarnings("unchecked")
+         @Override public Void call() throws Exception {
+             String key1 = "key-" + base + "-" + i;
+             String key2 = "key-" + base;
+ 
+             assert key1.compareTo(key2) > 0;
+ 
+             ((IgniteCache<String, String>)cache).put(key1, "value-" + i);
+ 
+             ((IgniteCache<String, Set<String>>)cache).invoke(key2, new AddEntryProcessor("value-" + i));
+ 
+             return null;
+         }
+     }
+ 
+     /**
+      *
+      */
+     private static class AddEntryProcessor implements CacheEntryProcessor<String, Set<String>, Void> {
+         /** */
+         private String addVal;
+ 
+         /**
+          * @param addVal Value to add.
+          */
+         private AddEntryProcessor(String addVal) {
+             this.addVal = addVal;
+         }
+ 
+         /** {@inheritDoc} */
+         @Override public Void process(MutableEntry<String, Set<String>> entry, Object... arguments) throws EntryProcessorException {
+             Set<String> set = entry.getValue();
+ 
+             if (set == null)
+                 set = new HashSet<>();
+ 
+             set.add(addVal);
+ 
+             entry.setValue(set);
+ 
+             return null;
+         }
+     }
  }

http://git-wip-us.apache.org/repos/asf/ignite/blob/d8595879/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
----------------------------------------------------------------------
diff --cc modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
index 2efdb82,495719f..cb17501
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite2.java
@@@ -138,8 -138,12 +138,12 @@@ public class IgniteCacheTestSuite2 exte
          suite.addTest(new TestSuite(IgniteCachePartitionMapUpdateTest.class));
          suite.addTest(new TestSuite(IgniteCacheClientNodePartitionsExchangeTest.class));
          suite.addTest(new TestSuite(IgniteCacheClientNodeChangingTopologyTest.class));
 -        suite.addTest(new TestSuite(IgniteCacheClientNodeConcurrentStart.class));
 +        suite.addTest(new TestSuite(IgniteCacheServerNodeConcurrentStart.class));
  
+         suite.addTest(new TestSuite(IgniteCacheEntryProcessorNodeJoinTest.class));
+         suite.addTest(new TestSuite(IgniteAtomicCacheEntryProcessorNodeJoinTest.class));
+         suite.addTest(new TestSuite(GridCacheNearTxForceKeyTest.class));
+ 
          return suite;
      }
  }