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 2017/10/27 08:10:13 UTC

[1/9] ignite git commit: IGNITE-6071 White list of exceptions to suppress in createTcpClient. This closes #2575.

Repository: ignite
Updated Branches:
  refs/heads/ignite-5935 1c2fded6e -> f4041a2ec


IGNITE-6071 White list of exceptions to suppress in createTcpClient. This closes #2575.

Signed-off-by: nikolay_tikhonov <nt...@gridgain.com>


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

Branch: refs/heads/ignite-5935
Commit: 4c31549c1916860203b9d83b2421fc163ad2dd78
Parents: 8266a98
Author: nikolay_tikhonov <nt...@gridgain.com>
Authored: Thu Oct 26 14:24:27 2017 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Thu Oct 26 14:24:27 2017 +0300

----------------------------------------------------------------------
 .../communication/tcp/TcpCommunicationSpi.java  |   3 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   2 +
 ...entConnectAfterCommunicationFailureTest.java | 156 +++++++++++++++++++
 .../IgniteClientReconnectTestSuite.java         |   4 +-
 4 files changed, 163 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/4c31549c/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index 065609f..1bff8ee 100755
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -3337,7 +3337,8 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
                 }
             }
 
-            if (X.hasCause(errs, ConnectException.class, HandshakeException.class))
+            if (!X.hasCause(errs, SocketTimeoutException.class, HandshakeTimeoutException.class,
+                IgniteSpiOperationTimeoutException.class))
                 throw errs;
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/4c31549c/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index 4c2a0ad..efe531a 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -730,6 +730,8 @@ class ServerImpl extends TcpDiscoveryImpl {
                     finally {
                         U.closeQuiet(sock);
                     }
+
+                    U.sleep(200);
                 }
             }
             catch (Throwable t) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/4c31549c/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
new file mode 100644
index 0000000..301d5f2
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal;
+
+import java.util.Arrays;
+import java.util.UUID;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.util.nio.GridCommunicationClient;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Tests client to be able restore connection to cluster on subsequent attempts after communication problems.
+ */
+public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommonAbstractTest {
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        cfg.setNetworkTimeout(500);
+        cfg.setCommunicationSpi(new TcpCommunicationSpi(gridName.contains("block")));
+
+        if (gridName.contains("client")) {
+            cfg.setClientMode(true);
+        }
+
+        return cfg;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testClientReconnects() throws Exception {
+        Ignite srv1 = startGrid("server1");
+        Ignite srv2 = startGrid("server2");
+        startGrid("client-block");
+
+        assertEquals(1, srv2.cluster().forClients().nodes().size());
+        assertEquals(1, srv1.cluster().forClients().nodes().size());
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testClientThreadsSuspended() throws Exception {
+        Ignite srv1 = startGrid("server1");
+        Ignite srv2 = startGrid("server2");
+        Ignite client = startGrid("client");
+
+        boolean blockedAnything = false;
+
+        for (Thread thread : Thread.getAllStackTraces().keySet()) {
+            if (thread.getName().contains("%client%")) {
+                thread.suspend();
+                blockedAnything = true;
+            }
+        }
+
+        Thread.sleep(10000);
+
+        for (Thread thread : Thread.getAllStackTraces().keySet()) {
+            if (thread.getName().contains("%client%"))
+                thread.resume();
+        }
+
+        for (int j = 0; j < 10; j++) {
+            boolean topOk = true;
+
+            for (Ignite node : Arrays.asList(srv1, srv2, client)) {
+                if (node.cluster().nodes().size() != 3) {
+                    U.warn(log, "Grid size is incorrect (will re-run check in 1000 ms) " +
+                        "[name=" + node.name() + ", size=" + node.cluster().nodes().size() + ']');
+
+                    topOk = false;
+
+                    break;
+                }
+            }
+
+            if (topOk)
+                return;
+            else
+                Thread.sleep(1000);
+        }
+
+        assertTrue(blockedAnything);
+        assertEquals(1, srv2.cluster().forClients().nodes().size());
+        assertEquals(1, srv1.cluster().forClients().nodes().size());
+    }
+
+    /**
+     * Will never connect with the first node id, normal operation after.
+     */
+    private class TcpCommunicationSpi extends org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi {
+        /**
+         * Whether this instance should actually block.
+         */
+        private final boolean isBlocking;
+
+        /**
+         * Local node ID that is prevented from creating connections.
+         */
+        private volatile UUID blockedNodeId = null;
+
+        /**
+         *
+         * @param isBlocking Whether this instance should actually block.
+         */
+        public TcpCommunicationSpi(boolean isBlocking) {
+            this.isBlocking = isBlocking;
+        }
+
+        /** {@inheritDoc} */
+        @Override protected GridCommunicationClient createTcpClient(ClusterNode node, int connIdx)
+            throws IgniteCheckedException {
+            if (blockHandshakeOnce(getLocalNode().id())) {
+                throw new IgniteCheckedException("Node is blocked");
+            }
+
+            return super.createTcpClient(node, connIdx);
+        }
+
+        /** Check if this connection is blocked. */
+        private boolean blockHandshakeOnce(UUID nodeId) {
+            if (isBlocking && (blockedNodeId == null || blockedNodeId.equals(nodeId))) {
+                blockedNodeId = nodeId;
+                return true;
+            }
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/4c31549c/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteClientReconnectTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteClientReconnectTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteClientReconnectTestSuite.java
index 03d3fe2..d0e907c 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteClientReconnectTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteClientReconnectTestSuite.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.testsuites;
 
 import junit.framework.TestSuite;
+import org.apache.ignite.internal.IgniteClientConnectAfterCommunicationFailureTest;
 import org.apache.ignite.internal.IgniteClientReconnectApiExceptionTest;
 import org.apache.ignite.internal.IgniteClientReconnectAtomicsTest;
 import org.apache.ignite.internal.IgniteClientReconnectBinaryContexTest;
@@ -43,6 +44,7 @@ public class IgniteClientReconnectTestSuite extends TestSuite {
     public static TestSuite suite() throws Exception {
         TestSuite suite = new TestSuite("Ignite Client Reconnect Test Suite");
 
+        suite.addTestSuite(IgniteClientConnectAfterCommunicationFailureTest.class);
         suite.addTestSuite(IgniteClientReconnectStopTest.class);
         suite.addTestSuite(IgniteClientReconnectApiExceptionTest.class);
         suite.addTestSuite(IgniteClientReconnectDiscoveryStateTest.class);
@@ -59,4 +61,4 @@ public class IgniteClientReconnectTestSuite extends TestSuite {
 
         return suite;
     }
-}
\ No newline at end of file
+}


[5/9] ignite git commit: Merge remote-tracking branch 'origin/master'

Posted by sb...@apache.org.
Merge remote-tracking branch 'origin/master'


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

Branch: refs/heads/ignite-5935
Commit: a93d0bf58af93f3ac82523e05f8a36306ac913d0
Parents: 14f04c4 b0c2598
Author: sboikov <sb...@gridgain.com>
Authored: Thu Oct 26 17:16:44 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Oct 26 17:16:44 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/QueryEntity.java    | 11 ++++--
 .../cache/query/annotations/QuerySqlField.java  |  7 ++++
 .../cache/query/QueryEntityTypeDescriptor.java  | 19 +++++++++++
 .../query/IgniteSqlNotNullConstraintTest.java   | 35 +++++++++++---------
 4 files changed, 54 insertions(+), 18 deletions(-)
----------------------------------------------------------------------



[3/9] ignite git commit: ignite-6667 Reuse DiscoCache when possible

Posted by sb...@apache.org.
ignite-6667 Reuse DiscoCache when possible


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

Branch: refs/heads/ignite-5935
Commit: 14f04c4ce80178dc55ee62b3cf09dd4ec129f3e2
Parents: 4c8bc53
Author: Aleksei Scherbakov <al...@gmail.com>
Authored: Thu Oct 26 17:13:18 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Oct 26 17:13:18 2017 +0300

----------------------------------------------------------------------
 .../internal/managers/discovery/DiscoCache.java |  45 +++--
 .../discovery/DiscoveryCustomMessage.java       |  13 +-
 .../discovery/GridDiscoveryManager.java         | 190 +++++++++++--------
 .../cache/CacheAffinityChangeMessage.java       |   8 +
 .../ClientCacheChangeDiscoveryMessage.java      |   9 +
 .../ClientCacheChangeDummyDiscoveryMessage.java |   9 +
 .../cache/DynamicCacheChangeBatch.java          |   9 +
 .../binary/MetadataUpdateAcceptedMessage.java   |   9 +
 .../binary/MetadataUpdateProposedMessage.java   |   9 +
 .../cluster/ChangeGlobalStateFinishMessage.java |   9 +
 .../cluster/ChangeGlobalStateMessage.java       |  11 +-
 .../continuous/AbstractContinuousMessage.java   |  10 +
 .../StartRoutineAckDiscoveryMessage.java        |   2 +-
 .../StartRoutineDiscoveryMessage.java           |   2 +-
 .../StopRoutineAckDiscoveryMessage.java         |   2 +-
 .../continuous/StopRoutineDiscoveryMessage.java |   2 +-
 .../marshaller/MappingAcceptedMessage.java      |   9 +
 .../marshaller/MappingProposedMessage.java      |   9 +
 .../message/SchemaAbstractDiscoveryMessage.java |  10 +
 .../message/SchemaProposeDiscoveryMessage.java  |   3 +-
 .../IgniteDiscoveryCacheReuseSelfTest.java      |  89 +++++++++
 .../IgniteSpiDiscoverySelfTestSuite.java        |   6 +-
 22 files changed, 359 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
index 4b57eb8..9ed70aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
@@ -19,7 +19,6 @@ package org.apache.ignite.internal.managers.discovery;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -71,10 +70,10 @@ public class DiscoCache {
     private final Map<Integer, List<ClusterNode>> cacheGrpAffNodes;
 
     /** Node map. */
-    private final Map<UUID, ClusterNode> nodeMap;
+    final Map<UUID, ClusterNode> nodeMap;
 
     /** Alive nodes. */
-    private final Set<UUID> alives = new GridConcurrentHashSet<>();
+    final Set<UUID> alives = new GridConcurrentHashSet<>();
 
     /** */
     private final IgniteProductVersion minNodeVer;
@@ -95,6 +94,7 @@ public class DiscoCache {
      * @param cacheGrpAffNodes Affinity nodes by cache group ID.
      * @param nodeMap Node map.
      * @param alives Alive nodes.
+     * @param minNodeVer Minimum node version.
      */
     DiscoCache(
         AffinityTopologyVersion topVer,
@@ -108,7 +108,8 @@ public class DiscoCache {
         Map<Integer, List<ClusterNode>> allCacheNodes,
         Map<Integer, List<ClusterNode>> cacheGrpAffNodes,
         Map<UUID, ClusterNode> nodeMap,
-        Set<UUID> alives) {
+        Set<UUID> alives,
+        IgniteProductVersion minNodeVer) {
         this.topVer = topVer;
         this.state = state;
         this.loc = loc;
@@ -121,19 +122,7 @@ public class DiscoCache {
         this.cacheGrpAffNodes = cacheGrpAffNodes;
         this.nodeMap = nodeMap;
         this.alives.addAll(alives);
-
-        IgniteProductVersion minVer = null;
-
-        for (int i = 0; i < allNodes.size(); i++) {
-            ClusterNode node = allNodes.get(i);
-
-            if (minVer == null)
-                minVer = node.version();
-            else if (node.version().compareTo(minVer) < 0)
-                minVer = node.version();
-        }
-
-        minNodeVer = minVer;
+        this.minNodeVer = minNodeVer;
     }
 
     /**
@@ -326,6 +315,28 @@ public class DiscoCache {
         return nodes == null ? Collections.<ClusterNode>emptyList() : nodes;
     }
 
+    /**
+     * @param ver Topology version.
+     * @param state Not {@code null} state if need override state, otherwise current state is used.
+     * @return Copy of discovery cache with new version.
+     */
+    public DiscoCache copy(AffinityTopologyVersion ver, @Nullable DiscoveryDataClusterState state) {
+        return new DiscoCache(
+            ver,
+            state == null ? this.state : state,
+            loc,
+            rmtNodes,
+            allNodes,
+            srvNodes,
+            daemonNodes,
+            rmtNodesWithCaches,
+            allCacheNodes,
+            cacheGrpAffNodes,
+            nodeMap,
+            alives,
+            minNodeVer);
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DiscoCache.class, this);

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
index f908b59..c708c62 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryCustomMessage.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.managers.discovery;
 
 import java.io.Serializable;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedMessage;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddedMessage;
@@ -89,4 +90,14 @@ public interface DiscoveryCustomMessage extends Serializable {
      * @return {@code true} if message can be modified during listener notification. Changes will be send to next nodes.
      */
     public boolean isMutable();
-}
\ No newline at end of file
+
+    /**
+     * Creates new discovery cache if message caused topology version change.
+     *
+     * @param mgr Discovery manager.
+     * @param topVer New topology version.
+     * @param discoCache Current discovery cache.
+     * @return Reused discovery cache.
+     */
+    public DiscoCache createDiscoCache(GridDiscoveryManager mgr, AffinityTopologyVersion topVer, DiscoCache discoCache);
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 77b0622..a6737dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -71,6 +71,7 @@ import org.apache.ignite.internal.managers.eventstorage.GridLocalEventListener;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheGroupDescriptor;
 import org.apache.ignite.internal.processors.cache.ClientCacheChangeDummyDiscoveryMessage;
+import org.apache.ignite.internal.processors.cache.DynamicCacheChangeBatch;
 import org.apache.ignite.internal.processors.cache.DynamicCacheChangeRequest;
 import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
@@ -102,6 +103,7 @@ import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.security.SecurityCredentials;
 import org.apache.ignite.plugin.segmentation.SegmentationPolicy;
@@ -623,23 +625,11 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     updateClientNodes(node.id());
                 }
 
-                DiscoCache discoCache = null;
-
                 boolean locJoinEvt = type == EVT_NODE_JOINED && node.id().equals(locNode.id());
 
-                IgniteInternalFuture<Boolean> transitionWaitFut = null;
-
                 ChangeGlobalStateFinishMessage stateFinishMsg = null;
 
-                if (locJoinEvt) {
-                    discoCache = createDiscoCache(new AffinityTopologyVersion(topVer, minorTopVer),
-                        ctx.state().clusterState(),
-                        locNode,
-                        topSnapshot);
-
-                    transitionWaitFut = ctx.state().onLocalJoin(discoCache);
-                }
-                else if (type == EVT_NODE_FAILED || type == EVT_NODE_LEFT)
+                if (type == EVT_NODE_FAILED || type == EVT_NODE_LEFT)
                     stateFinishMsg = ctx.state().onNodeLeft(node);
 
                 final AffinityTopologyVersion nextTopVer;
@@ -658,12 +648,12 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     else if (customMsg instanceof ChangeGlobalStateFinishMessage) {
                         ctx.state().onStateFinishMessage((ChangeGlobalStateFinishMessage)customMsg);
 
-                        discoCache = createDiscoCache(topSnap.get().topVer,
-                            ctx.state().clusterState(),
-                            locNode,
-                            topSnapshot);
+                        Snapshot snapshot = topSnap.get();
+
+                        // Topology version does not change, but need create DiscoCache with new state.
+                        DiscoCache discoCache = snapshot.discoCache.copy(snapshot.topVer, ctx.state().clusterState());
 
-                        topSnap.set(new Snapshot(topSnap.get().topVer, discoCache));
+                        topSnap.set(new Snapshot(snapshot.topVer, discoCache));
 
                         incMinorTopVer = false;
                     }
@@ -704,24 +694,30 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     }
                 }
 
+                DiscoCache discoCache;
+
                 // Put topology snapshot into discovery history.
                 // There is no race possible between history maintenance and concurrent discovery
                 // event notifications, since SPI notifies manager about all events from this listener.
                 if (verChanged) {
-                    if (discoCache == null) {
+                    Snapshot snapshot = topSnap.get();
+
+                    if (customMsg == null) {
                         discoCache = createDiscoCache(nextTopVer,
                             ctx.state().clusterState(),
                             locNode,
                             topSnapshot);
                     }
+                    else
+                        discoCache = customMsg.createDiscoCache(GridDiscoveryManager.this, nextTopVer, snapshot.discoCache);
 
                     discoCacheHist.put(nextTopVer, discoCache);
 
-                    boolean set = updateTopologyVersionIfGreater(nextTopVer, discoCache);
-
-                    assert set || topVer == 0 : "Topology version has not been updated [this.topVer=" +
-                        topSnap + ", topVer=" + topVer + ", node=" + node +
+                    assert snapshot.topVer.compareTo(nextTopVer) < 0: "Topology version out of order [this.topVer=" +
+                        topSnap + ", topVer=" + topVer + ", node=" + node + ", nextTopVer=" + nextTopVer +
                         ", evt=" + U.gridEventName(type) + ']';
+
+                    topSnap.set(new Snapshot(nextTopVer, discoCache));
                 }
                 else
                     // Current version.
@@ -734,8 +730,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     if (gridStartTime == 0)
                         gridStartTime = getSpi().getGridStartTime();
 
-                    updateTopologyVersionIfGreater(new AffinityTopologyVersion(locNode.order()),
-                        discoCache);
+                    topSnap.set(new Snapshot(nextTopVer, discoCache));
 
                     startLatch.countDown();
 
@@ -752,6 +747,8 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     if (!isLocDaemon && !ctx.clientDisconnected())
                         ctx.cache().context().exchange().onLocalJoin(discoEvt, discoCache);
 
+                    IgniteInternalFuture<Boolean> transitionWaitFut = ctx.state().onLocalJoin(discoCache);
+
                     locJoin.onDone(new DiscoveryLocalJoinData(discoEvt,
                         discoCache,
                         transitionWaitFut,
@@ -784,7 +781,9 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                     topHist.clear();
 
                     topSnap.set(new Snapshot(AffinityTopologyVersion.ZERO,
-                        createDiscoCache(AffinityTopologyVersion.ZERO, ctx.state().clusterState(), locNode, Collections.<ClusterNode>singleton(locNode))));
+                        createDiscoCache(AffinityTopologyVersion.ZERO, ctx.state().clusterState(), locNode,
+                            Collections.<ClusterNode>singleton(locNode))
+                    ));
                 }
                 else if (type == EVT_CLIENT_NODE_RECONNECTED) {
                     assert locNode.isClient() : locNode;
@@ -1586,8 +1585,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
         }
 
         if (!locJoin.isDone())
-            locJoin.onDone(
-                new IgniteCheckedException("Failed to wait for local node joined event (grid is stopping)."));
+            locJoin.onDone(new IgniteCheckedException("Failed to wait for local node joined event (grid is stopping)."));
     }
 
     /** {@inheritDoc} */
@@ -2219,6 +2217,8 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
         ArrayList<ClusterNode> rmtNodes = new ArrayList<>(topSnapshot.size());
         ArrayList<ClusterNode> allNodes = new ArrayList<>(topSnapshot.size());
 
+        IgniteProductVersion minVer = null;
+
         for (ClusterNode node : topSnapshot) {
             if (alive(node))
                 alives.add(node.id());
@@ -2236,6 +2236,11 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
             }
 
             nodeMap.put(node.id(), node);
+
+            if (minVer == null)
+                minVer = node.version();
+            else if (node.version().compareTo(minVer) < 0)
+                minVer = node.version();
         }
 
         assert !rmtNodes.contains(loc) : "Remote nodes collection shouldn't contain local node" +
@@ -2243,39 +2248,9 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
 
         Map<Integer, List<ClusterNode>> allCacheNodes = U.newHashMap(allNodes.size());
         Map<Integer, List<ClusterNode>> cacheGrpAffNodes = U.newHashMap(allNodes.size());
-
         Set<ClusterNode> rmtNodesWithCaches = new TreeSet<>(GridNodeOrderComparator.INSTANCE);
 
-        for (ClusterNode node : allNodes) {
-            assert node.order() != 0 : "Invalid node order [locNode=" + loc + ", node=" + node + ']';
-            assert !node.isDaemon();
-
-            for (Map.Entry<Integer, CacheGroupAffinity> e : registeredCacheGrps.entrySet()) {
-                CacheGroupAffinity grpAff = e.getValue();
-                Integer grpId = e.getKey();
-
-                if (CU.affinityNode(node, grpAff.cacheFilter)) {
-                    List<ClusterNode> nodes = cacheGrpAffNodes.get(grpId);
-
-                    if (nodes == null)
-                        cacheGrpAffNodes.put(grpId, nodes = new ArrayList<>());
-
-                    nodes.add(node);
-                }
-            }
-
-            for (Map.Entry<String, CachePredicate> entry : registeredCaches.entrySet()) {
-                String cacheName = entry.getKey();
-                CachePredicate filter = entry.getValue();
-
-                if (filter.cacheNode(node)) {
-                    if (!node.isLocal())
-                        rmtNodesWithCaches.add(node);
-
-                    addToMap(allCacheNodes, cacheName, node);
-                }
-            }
-        }
+        fillAffinityNodeCaches(allNodes, allCacheNodes, cacheGrpAffNodes, rmtNodesWithCaches);
 
         return new DiscoCache(
             topVer,
@@ -2289,7 +2264,8 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
             Collections.unmodifiableMap(allCacheNodes),
             Collections.unmodifiableMap(cacheGrpAffNodes),
             Collections.unmodifiableMap(nodeMap),
-            alives);
+            alives,
+            minVer);
     }
 
     /**
@@ -2311,26 +2287,6 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
         cacheNodes.add(rich);
     }
 
-    /**
-     * Updates topology version if current version is smaller than updated.
-     *
-     * @param updated Updated topology version.
-     * @param discoCache Discovery cache.
-     * @return {@code True} if topology was updated.
-     */
-    private boolean updateTopologyVersionIfGreater(AffinityTopologyVersion updated, DiscoCache discoCache) {
-        while (true) {
-            Snapshot cur = topSnap.get();
-
-            if (updated.compareTo(cur.topVer) >= 0) {
-                if (topSnap.compareAndSet(cur, new Snapshot(updated, discoCache)))
-                    return true;
-            }
-            else
-                return false;
-        }
-    }
-
     /** Stops local node. */
     private void stopNode() {
         new Thread(
@@ -3061,4 +3017,78 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
             return clientNodes.get(node.id());
         }
     }
+
+    /**
+     * Fills affinity node caches.
+     *
+     * @param allNodes All nodes.
+     * @param allCacheNodes All cache nodes.
+     * @param cacheGrpAffNodes Cache group aff nodes.
+     * @param rmtNodesWithCaches Rmt nodes with caches.
+     */
+    private void fillAffinityNodeCaches(List<ClusterNode> allNodes, Map<Integer, List<ClusterNode>> allCacheNodes,
+        Map<Integer, List<ClusterNode>> cacheGrpAffNodes, Set<ClusterNode> rmtNodesWithCaches) {
+        for (ClusterNode node : allNodes) {
+            assert node.order() != 0 : "Invalid node order [locNode=" + localNode() + ", node=" + node + ']';
+            assert !node.isDaemon();
+
+            for (Map.Entry<Integer, CacheGroupAffinity> e : registeredCacheGrps.entrySet()) {
+                CacheGroupAffinity grpAff = e.getValue();
+                Integer grpId = e.getKey();
+
+                if (CU.affinityNode(node, grpAff.cacheFilter)) {
+                    List<ClusterNode> nodes = cacheGrpAffNodes.get(grpId);
+
+                    if (nodes == null)
+                        cacheGrpAffNodes.put(grpId, nodes = new ArrayList<>());
+
+                    nodes.add(node);
+                }
+            }
+
+            for (Map.Entry<String, CachePredicate> entry : registeredCaches.entrySet()) {
+                String cacheName = entry.getKey();
+                CachePredicate filter = entry.getValue();
+
+                if (filter.cacheNode(node)) {
+                    if (!node.isLocal())
+                        rmtNodesWithCaches.add(node);
+
+                    addToMap(allCacheNodes, cacheName, node);
+                }
+            }
+        }
+    }
+
+    /**
+     * Creates discovery cache after {@link DynamicCacheChangeBatch} received.
+     *
+     * @param topVer Topology version.
+     * @param discoCache Current disco cache.
+     * @return New discovery cache.
+     */
+    public DiscoCache createDiscoCacheOnCacheChange(AffinityTopologyVersion topVer,
+        DiscoCache discoCache) {
+        List<ClusterNode> allNodes = discoCache.allNodes();
+        Map<Integer, List<ClusterNode>> allCacheNodes = U.newHashMap(allNodes.size());
+        Map<Integer, List<ClusterNode>> cacheGrpAffNodes = U.newHashMap(allNodes.size());
+        Set<ClusterNode> rmtNodesWithCaches = new TreeSet<>(GridNodeOrderComparator.INSTANCE);
+
+        fillAffinityNodeCaches(allNodes, allCacheNodes, cacheGrpAffNodes, rmtNodesWithCaches);
+
+        return new DiscoCache(
+            topVer,
+            discoCache.state(),
+            discoCache.localNode(),
+            discoCache.remoteNodes(),
+            allNodes,
+            discoCache.serverNodes(),
+            discoCache.daemonNodes(),
+            U.sealList(rmtNodesWithCaches),
+            allCacheNodes,
+            cacheGrpAffNodes,
+            discoCache.nodeMap,
+            discoCache.alives,
+            discoCache.minimumNodeVersion());
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
index 8cff65e..fe1014c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinityChangeMessage.java
@@ -20,7 +20,9 @@ package org.apache.ignite.internal.processors.cache;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionExchangeId;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage;
@@ -154,6 +156,12 @@ public class CacheAffinityChangeMessage implements DiscoveryCustomMessage {
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        return discoCache.copy(topVer, null);
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(CacheAffinityChangeMessage.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
index 3d120f7..e35d80e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDiscoveryMessage.java
@@ -22,7 +22,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -170,6 +173,12 @@ public class ClientCacheChangeDiscoveryMessage implements DiscoveryCustomMessage
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(ClientCacheChangeDiscoveryMessage.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
index 44f6002..6ed3ecc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClientCacheChangeDummyDiscoveryMessage.java
@@ -20,7 +20,10 @@ package org.apache.ignite.internal.processors.cache;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
@@ -102,6 +105,12 @@ public class ClientCacheChangeDummyDiscoveryMessage implements DiscoveryCustomMe
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(ClientCacheChangeDummyDiscoveryMessage.class, this,
             "startCaches", (startReqs != null ? startReqs.keySet() : ""));

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
index d5c820f..83459a5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
@@ -19,7 +19,10 @@ package org.apache.ignite.internal.processors.cache;
 
 import java.util.Collection;
 import java.util.Set;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -73,6 +76,12 @@ public class DynamicCacheChangeBatch implements DiscoveryCustomMessage {
         return false;
     }
 
+    /** {@inheritDoc} */
+    @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr, AffinityTopologyVersion topVer,
+        DiscoCache discoCache) {
+        return mgr.createDiscoCacheOnCacheChange(topVer, discoCache);
+    }
+
     /**
      * @return Collection of change requests.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
index ef5370e..0416746 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateAcceptedMessage.java
@@ -16,7 +16,10 @@
  */
 package org.apache.ignite.internal.processors.cache.binary;
 
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
@@ -67,6 +70,12 @@ public class MetadataUpdateAcceptedMessage implements DiscoveryCustomMessage {
         return true;
     }
 
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
     /** */
     int acceptedVersion() {
         return acceptedVer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
index 715e668..f9bd660 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
@@ -20,7 +20,10 @@ import java.util.UUID;
 import org.apache.ignite.binary.BinaryObjectException;
 import org.apache.ignite.internal.binary.BinaryMetadata;
 import org.apache.ignite.internal.binary.BinaryMetadataHandler;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
@@ -130,6 +133,12 @@ public final class MetadataUpdateProposedMessage implements DiscoveryCustomMessa
         return true;
     }
 
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * @param err Error caused this update to be rejected.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
index 0771198..a1fbacf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateFinishMessage.java
@@ -18,7 +18,10 @@
 package org.apache.ignite.internal.processors.cluster;
 
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
@@ -80,6 +83,12 @@ public class ChangeGlobalStateFinishMessage implements DiscoveryCustomMessage {
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(ChangeGlobalStateFinishMessage.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
index 6579399..6a642bc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
@@ -19,7 +19,10 @@ package org.apache.ignite.internal.processors.cluster;
 
 import java.util.List;
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.ExchangeActions;
 import org.apache.ignite.internal.processors.cache.StoredCacheData;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -112,7 +115,13 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage {
         return false;
     }
 
-   /**
+    /** {@inheritDoc} */
+    @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr, AffinityTopologyVersion topVer,
+        DiscoCache discoCache) {
+        return mgr.createDiscoCacheOnCacheChange(topVer, discoCache);
+    }
+
+    /**
     * @return Node initiated state change.
     */
     public UUID initiatorNodeId() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
index 01a95df..e9754d1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/AbstractContinuousMessage.java
@@ -18,8 +18,12 @@
 package org.apache.ignite.internal.processors.continuous;
 
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
 
 /**
  *
@@ -57,4 +61,10 @@ public abstract class AbstractContinuousMessage implements DiscoveryCustomMessag
     @Override public boolean isMutable() {
         return false;
     }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineAckDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineAckDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineAckDiscoveryMessage.java
index 1765f2c..4063e05 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineAckDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineAckDiscoveryMessage.java
@@ -92,4 +92,4 @@ public class StartRoutineAckDiscoveryMessage extends AbstractContinuousMessage {
     @Override public String toString() {
         return S.toString(StartRoutineAckDiscoveryMessage.class, this, "routineId", routineId());
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineDiscoveryMessage.java
index 320226b..82996d4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRoutineDiscoveryMessage.java
@@ -132,4 +132,4 @@ public class StartRoutineDiscoveryMessage extends AbstractContinuousMessage {
     @Override public String toString() {
         return S.toString(StartRoutineDiscoveryMessage.class, this, "routineId", routineId());
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineAckDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineAckDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineAckDiscoveryMessage.java
index e6305c7..79d8b29 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineAckDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineAckDiscoveryMessage.java
@@ -45,4 +45,4 @@ public class StopRoutineAckDiscoveryMessage extends AbstractContinuousMessage {
     @Override public String toString() {
         return S.toString(StopRoutineAckDiscoveryMessage.class, this, "routineId", routineId());
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineDiscoveryMessage.java
index 30d12d1..f6b18fd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StopRoutineDiscoveryMessage.java
@@ -45,4 +45,4 @@ public class StopRoutineDiscoveryMessage extends AbstractContinuousMessage {
     @Override public String toString() {
         return S.toString(StopRoutineDiscoveryMessage.class, this, "routineId", routineId());
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
index 23c2858..7af0559 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingAcceptedMessage.java
@@ -17,7 +17,10 @@
 
 package org.apache.ignite.internal.processors.marshaller;
 
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
@@ -59,6 +62,12 @@ public class MappingAcceptedMessage implements DiscoveryCustomMessage {
         return false;
     }
 
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
     /** */
     MarshallerMappingItem getMappingItem() {
         return item;

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
index 33a2168..b4e13fb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/marshaller/MappingProposedMessage.java
@@ -18,7 +18,10 @@
 package org.apache.ignite.internal.processors.marshaller;
 
 import java.util.UUID;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
@@ -94,6 +97,12 @@ public class MappingProposedMessage implements DiscoveryCustomMessage {
         return true;
     }
 
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
     /** */
     MarshallerMappingItem mappingItem() {
         return mappingItem;

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
index 9fdc6c3..f55eae0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaAbstractDiscoveryMessage.java
@@ -17,11 +17,15 @@
 
 package org.apache.ignite.internal.processors.query.schema.message;
 
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
+import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.query.schema.operation.SchemaAbstractOperation;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Abstract discovery message for schema operations.
@@ -51,6 +55,12 @@ public abstract class SchemaAbstractDiscoveryMessage implements DiscoveryCustomM
         return id;
     }
 
+    /** {@inheritDoc} */
+    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
+        AffinityTopologyVersion topVer, DiscoCache discoCache) {
+        throw new UnsupportedOperationException();
+    }
+
     /**
      * @return Operation.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
index 5fd2606..0e1270b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/SchemaProposeDiscoveryMessage.java
@@ -99,9 +99,8 @@ public class SchemaProposeDiscoveryMessage extends SchemaAbstractDiscoveryMessag
      * @param err Error.
      */
     public void onError(SchemaOperationException err) {
-        if (!hasError()) {
+        if (!hasError())
             this.err = err;
-        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/test/java/org/apache/ignite/spi/discovery/IgniteDiscoveryCacheReuseSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/IgniteDiscoveryCacheReuseSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/IgniteDiscoveryCacheReuseSelfTest.java
new file mode 100644
index 0000000..c238a9a
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/IgniteDiscoveryCacheReuseSelfTest.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.spi.discovery;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.managers.discovery.DiscoCache;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Tests discovery cache reuse between topology events.
+ */
+public class IgniteDiscoveryCacheReuseSelfTest extends GridCommonAbstractTest {
+    /** */
+    private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
+
+        return cfg;
+    }
+
+    /**
+     * Tests correct reuse of discovery cache.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDiscoCacheReuseOnNodeJoin() throws Exception {
+        startGridsMultiThreaded(2);
+
+        assertDiscoCacheReuse(new AffinityTopologyVersion(2, 0), new AffinityTopologyVersion(2, 1));
+    }
+
+    /**
+     * Assert disco cache reuse.
+     *
+     * @param v1 First version.
+     * @param v2 Next version.
+     */
+    private void assertDiscoCacheReuse(AffinityTopologyVersion v1, AffinityTopologyVersion v2) {
+        for (Ignite ignite : G.allGrids()) {
+            GridBoundedConcurrentLinkedHashMap<AffinityTopologyVersion, DiscoCache> discoCacheHist =
+                U.field(((IgniteEx) ignite).context().discovery(), "discoCacheHist");
+
+            DiscoCache discoCache1 = discoCacheHist.get(v1);
+            DiscoCache discoCache2 = discoCacheHist.get(v2);
+
+            assertEquals(v1, discoCache1.version());
+            assertEquals(v2, discoCache2.version());
+
+            String[] props = new String[] {
+                "state", "loc", "rmtNodes", "allNodes", "srvNodes", "daemonNodes", "rmtNodesWithCaches",
+                "allCacheNodes", "allCacheNodes", "cacheGrpAffNodes", "nodeMap", "minNodeVer"
+            };
+
+            for (String prop : props)
+                assertSame(U.field(discoCache1, prop), U.field(discoCache2, prop));
+
+            assertNotSame(U.field(discoCache1, "alives"), U.field(discoCache2, "alives"));
+            assertEquals(U.field(discoCache1, "alives"), U.field(discoCache2, "alives"));
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/14f04c4c/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
index 3335797..ff4c9c1 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteSpiDiscoverySelfTestSuite.java
@@ -20,6 +20,7 @@ package org.apache.ignite.testsuites;
 import junit.framework.TestSuite;
 import org.apache.ignite.spi.GridTcpSpiForwardingSelfTest;
 import org.apache.ignite.spi.discovery.AuthenticationRestartTest;
+import org.apache.ignite.spi.discovery.IgniteDiscoveryCacheReuseSelfTest;
 import org.apache.ignite.spi.discovery.tcp.IgniteClientConnectTest;
 import org.apache.ignite.spi.discovery.tcp.IgniteClientReconnectMassiveShutdownTest;
 import org.apache.ignite.spi.discovery.tcp.TcpClientDiscoveryMarshallerCheckSelfTest;
@@ -94,7 +95,7 @@ public class IgniteSpiDiscoverySelfTestSuite extends TestSuite {
         suite.addTest(new TestSuite(TcpDiscoveryNodeAttributesUpdateOnReconnectTest.class));
         suite.addTest(new TestSuite(AuthenticationRestartTest.class));
 
-        //Client connect
+        // Client connect.
         suite.addTest(new TestSuite(IgniteClientConnectTest.class));
         suite.addTest(new TestSuite(IgniteClientReconnectMassiveShutdownTest.class));
 
@@ -104,6 +105,9 @@ public class IgniteSpiDiscoverySelfTestSuite extends TestSuite {
         suite.addTest(new TestSuite(TcpDiscoverySslSecuredUnsecuredTest.class));
         suite.addTest(new TestSuite(TcpDiscoverySslTrustedUntrustedTest.class));
 
+        // Disco cache reuse.
+        suite.addTest(new TestSuite(IgniteDiscoveryCacheReuseSelfTest.class));
+
         return suite;
     }
 }


[7/9] ignite git commit: Merge remote-tracking branch 'remotes/origin/master' into ignite-3478

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into ignite-3478

# Conflicts:
#	modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java


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

Branch: refs/heads/ignite-5935
Commit: e37dfa3b9a96d13ba38dc4c564ebeb4d0bccefa1
Parents: 987a57e f0500e2
Author: sboikov <sb...@gridgain.com>
Authored: Fri Oct 27 10:53:33 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Oct 27 10:53:33 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/QueryEntity.java    |  11 +-
 .../cache/query/annotations/QuerySqlField.java  |   7 +
 .../internal/managers/discovery/DiscoCache.java |  44 +++--
 .../discovery/DiscoveryCustomMessage.java       |  13 +-
 .../discovery/GridDiscoveryManager.java         | 190 +++++++++++--------
 .../cache/CacheAffinityChangeMessage.java       |   8 +
 .../ClientCacheChangeDiscoveryMessage.java      |   9 +
 .../ClientCacheChangeDummyDiscoveryMessage.java |   9 +
 .../cache/DynamicCacheChangeBatch.java          |   9 +
 .../binary/MetadataUpdateAcceptedMessage.java   |   9 +
 .../binary/MetadataUpdateProposedMessage.java   |   9 +
 .../GridDhtPartitionsExchangeFuture.java        |   3 +-
 .../GridCacheDatabaseSharedManager.java         |  16 +-
 .../snapshot/IgniteCacheSnapshotManager.java    |   6 +-
 .../persistence/snapshot/SnapshotOperation.java |   6 +-
 .../cache/query/QueryEntityIndexDescriptor.java |   2 +
 .../cache/query/QueryEntityTypeDescriptor.java  |  19 ++
 .../cluster/ChangeGlobalStateFinishMessage.java |   9 +
 .../cluster/ChangeGlobalStateMessage.java       |  11 +-
 .../continuous/AbstractContinuousMessage.java   |  10 +
 .../StartRoutineAckDiscoveryMessage.java        |   2 +-
 .../StartRoutineDiscoveryMessage.java           |   2 +-
 .../StopRoutineAckDiscoveryMessage.java         |   2 +-
 .../continuous/StopRoutineDiscoveryMessage.java |   2 +-
 .../marshaller/MappingAcceptedMessage.java      |   9 +
 .../marshaller/MappingProposedMessage.java      |   9 +
 .../message/SchemaAbstractDiscoveryMessage.java |  10 +
 .../message/SchemaProposeDiscoveryMessage.java  |   3 +-
 .../communication/tcp/TcpCommunicationSpi.java  |   3 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   2 +
 ...entConnectAfterCommunicationFailureTest.java | 156 +++++++++++++++
 .../IgniteDiscoveryCacheReuseSelfTest.java      |  89 +++++++++
 .../IgniteClientReconnectTestSuite.java         |   4 +-
 .../IgniteSpiDiscoverySelfTestSuite.java        |   6 +-
 .../processors/query/h2/IgniteH2Indexing.java   |  27 ++-
 .../processors/query/h2/opt/GridH2Table.java    |  60 ++++++
 .../IgniteCacheInsertSqlQuerySelfTest.java      |  18 ++
 .../query/IgniteSqlNotNullConstraintTest.java   |  35 ++--
 38 files changed, 706 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e37dfa3b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/e37dfa3b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --cc modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 642864c,a6737dc..716c43b
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@@ -624,25 -625,11 +626,13 @@@ public class GridDiscoveryManager exten
                      updateClientNodes(node.id());
                  }
  
-                 DiscoCache discoCache = null;
- 
 +                ctx.coordinators().onDiscoveryEvent(type, topSnapshot, topVer);
 +
                  boolean locJoinEvt = type == EVT_NODE_JOINED && node.id().equals(locNode.id());
  
-                 IgniteInternalFuture<Boolean> transitionWaitFut = null;
- 
                  ChangeGlobalStateFinishMessage stateFinishMsg = null;
  
-                 if (locJoinEvt) {
-                     discoCache = createDiscoCache(new AffinityTopologyVersion(topVer, minorTopVer),
-                         ctx.state().clusterState(),
-                         locNode,
-                         topSnapshot);
- 
-                     transitionWaitFut = ctx.state().onLocalJoin(discoCache);
-                 }
-                 else if (type == EVT_NODE_FAILED || type == EVT_NODE_LEFT)
+                 if (type == EVT_NODE_FAILED || type == EVT_NODE_LEFT)
                      stateFinishMsg = ctx.state().onNodeLeft(node);
  
                  final AffinityTopologyVersion nextTopVer;

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

http://git-wip-us.apache.org/repos/asf/ignite/blob/e37dfa3b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/e37dfa3b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------


[8/9] ignite git commit: Merge remote-tracking branch 'remotes/origin/master' into ignite-3478

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/master' into ignite-3478

# Conflicts:
#	modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java


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

Branch: refs/heads/ignite-5935
Commit: 39f7ae974a222b63c6a91b1df6cf669266a3e911
Parents: e37dfa3
Author: sboikov <sb...@gridgain.com>
Authored: Fri Oct 27 10:58:14 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Oct 27 10:58:14 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/internal/managers/discovery/DiscoCache.java   | 1 +
 .../ignite/internal/managers/discovery/GridDiscoveryManager.java    | 1 +
 2 files changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/39f7ae97/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
index 3699a1e..573c075 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoCache.java
@@ -338,6 +338,7 @@ public class DiscoCache {
             ver,
             state == null ? this.state : state,
             loc,
+            mvccCrd,
             rmtNodes,
             allNodes,
             srvNodes,

http://git-wip-us.apache.org/repos/asf/ignite/blob/39f7ae97/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
index 716c43b..962d35c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
@@ -3084,6 +3084,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
             topVer,
             discoCache.state(),
             discoCache.localNode(),
+            discoCache.mvccCoordinator(),
             discoCache.remoteNodes(),
             allNodes,
             discoCache.serverNodes(),


[6/9] ignite git commit: IGNITE-6720 Move operation with file system outside checkpoint write lock - Fixes #2912.

Posted by sb...@apache.org.
IGNITE-6720 Move operation with file system outside checkpoint write lock - Fixes #2912.


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

Branch: refs/heads/ignite-5935
Commit: f0500e274acb1ca397b511c25c0b58bc55d9a3c2
Parents: a93d0bf
Author: Eduard Shangareev <es...@gridgain.com>
Authored: Thu Oct 26 17:41:17 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Thu Oct 26 17:41:17 2017 +0300

----------------------------------------------------------------------
 .../preloader/GridDhtPartitionsExchangeFuture.java  |  3 ++-
 .../persistence/GridCacheDatabaseSharedManager.java | 16 +++++++++++++++-
 .../snapshot/IgniteCacheSnapshotManager.java        |  6 ++++--
 .../persistence/snapshot/SnapshotOperation.java     |  6 +++---
 .../cache/query/QueryEntityIndexDescriptor.java     |  2 ++
 5 files changed, 26 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f0500e27/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git 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
index 9c7451e..abfefe8 100644
--- 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
@@ -1458,7 +1458,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
             grpValidRes = m;
         }
 
-        tryToPerformLocalSnapshotOperation();
+        if (!cctx.localNode().isClient())
+            tryToPerformLocalSnapshotOperation();
 
         cctx.cache().onExchangeDone(initialVersion(), exchActions, err);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f0500e27/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
index 920af17..2dcee89 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
@@ -137,6 +137,7 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.util.worker.GridWorker;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgniteOutClosure;
 import org.apache.ignite.mxbean.DataStorageMetricsMXBean;
 import org.apache.ignite.thread.IgniteThread;
@@ -936,6 +937,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
                 }
             }, false));
         }
+
         for (IgniteInternalFuture<Void> clearFut : clearFuts) {
             try {
                 clearFut.get();
@@ -2265,6 +2267,8 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
 
             boolean hasPages;
 
+            IgniteFuture snapFut = null;
+
             checkpointLock.writeLock().lock();
 
             try {
@@ -2306,7 +2310,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
                     lsnr.onCheckpointBegin(ctx0);
 
                 if (curr.nextSnapshot)
-                    snapshotMgr.onMarkCheckPointBegin(curr.snapshotOperation, map);
+                    snapFut = snapshotMgr.onMarkCheckPointBegin(curr.snapshotOperation, map);
 
                 for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
                     if (grp.isLocal())
@@ -2347,6 +2351,16 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
 
             curr.cpBeginFut.onDone();
 
+            if (snapFut != null) {
+                try {
+                    snapFut.get();
+                }
+                catch (IgniteException e) {
+                    U.error(log, "Failed to wait for snapshot operation initialization: " +
+                        curr.snapshotOperation + "]", e);
+                }
+            }
+
             if (hasPages) {
                 assert cpPtr != null;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f0500e27/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteCacheSnapshotManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteCacheSnapshotManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteCacheSnapshotManager.java
index 5746c17..45c0b11 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteCacheSnapshotManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteCacheSnapshotManager.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot;
 
 import java.nio.ByteBuffer;
 import java.util.UUID;
+
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.events.DiscoveryEvent;
 import org.apache.ignite.internal.GridKernalContext;
@@ -30,6 +31,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.GridCacheSharedManagerAdapter;
 import org.apache.ignite.internal.processors.cache.persistence.partstate.PartitionAllocationMap;
 import org.apache.ignite.internal.processors.cluster.IgniteChangeGlobalStateSupport;
+import org.apache.ignite.lang.IgniteFuture;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -70,11 +72,11 @@ public class IgniteCacheSnapshotManager<T extends SnapshotOperation> extends Gri
      *
      * @return {@code true} if next operation must be snapshot, {@code false} if checkpoint must be executed.
      */
-    public boolean onMarkCheckPointBegin(
+    public IgniteFuture<?> onMarkCheckPointBegin(
         T snapshotOperation,
         PartitionAllocationMap map
     ) throws IgniteCheckedException {
-        return false;
+        return null;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/f0500e27/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotOperation.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotOperation.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotOperation.java
index 6722eb6..dfdf832 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotOperation.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotOperation.java
@@ -30,15 +30,15 @@ public interface SnapshotOperation extends Serializable {
      *
      * @return Cache names.
      */
-    Set<Integer> cacheGroupIds();
+    public Set<Integer> cacheGroupIds();
 
     /**
      * Cache names included to this snapshot.
      */
-    Set<String> cacheNames();
+    public Set<String> cacheNames();
 
     /**
      * Any custom extra parameter.
      */
-    Object extraParameter();
+    public Object extraParameter();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/f0500e27/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityIndexDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityIndexDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityIndexDescriptor.java
index 2fb5837..0436f10 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityIndexDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityIndexDescriptor.java
@@ -43,8 +43,10 @@ public class QueryEntityIndexDescriptor implements GridQueryIndexDescriptor {
         });
     /** */
     private final QueryIndexType type;
+
     /** */
     private final int inlineSize;
+
     /** Fields which should be indexed in descending order. */
     private Collection<String> descendings;
 


[4/9] ignite git commit: IGNITE-6534: SQL: configure NotNull fields with annotations. This closes #2782.

Posted by sb...@apache.org.
IGNITE-6534: SQL: configure NotNull fields with annotations. This closes #2782.


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

Branch: refs/heads/ignite-5935
Commit: b0c2598aaf535f3d1f2eafb0d70b2bcbced8c936
Parents: 4c8bc53
Author: Roman Shtykh <rs...@yahoo.com>
Authored: Thu Oct 26 17:13:49 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Thu Oct 26 17:13:49 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/QueryEntity.java    | 11 ++++--
 .../cache/query/annotations/QuerySqlField.java  |  7 ++++
 .../cache/query/QueryEntityTypeDescriptor.java  | 19 +++++++++++
 .../query/IgniteSqlNotNullConstraintTest.java   | 35 +++++++++++---------
 4 files changed, 54 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b0c2598a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
index 0b82d6a..2002b4f 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/QueryEntity.java
@@ -134,7 +134,7 @@ public class QueryEntity implements Serializable {
      * @param valCls Value type.
      */
     public QueryEntity(Class<?> keyCls, Class<?> valCls) {
-        this(convert(processKeyAndValueClasses(keyCls,valCls)));
+        this(convert(processKeyAndValueClasses(keyCls, valCls)));
     }
 
     /**
@@ -353,6 +353,7 @@ public class QueryEntity implements Serializable {
 
     /**
      * Sets table name for this query entity.
+     *
      * @param tableName table name
      */
     public void setTableName(String tableName) {
@@ -382,6 +383,7 @@ public class QueryEntity implements Serializable {
 
     /**
      * Utility method for building query entities programmatically.
+     *
      * @param fullName Full name of the field.
      * @param type Type of the field.
      * @param alias Field alias.
@@ -469,6 +471,9 @@ public class QueryEntity implements Serializable {
         if (!F.isEmpty(idxs))
             entity.setIndexes(idxs);
 
+        if (!F.isEmpty(desc.notNullFields()))
+            entity.setNotNullFields(desc.notNullFields());
+
         return entity;
     }
 
@@ -591,6 +596,9 @@ public class QueryEntity implements Serializable {
                 desc.addFieldToIndex(idxName, prop.fullName(), 0, sqlAnn.descending());
             }
 
+            if (sqlAnn.notNull())
+                desc.addNotNullField(prop.fullName());
+
             if ((!F.isEmpty(sqlAnn.groups()) || !F.isEmpty(sqlAnn.orderedGroups()))
                 && sqlAnn.inlineSize() != QueryIndex.DFLT_INLINE_SIZE) {
                 throw new CacheException("Inline size cannot be set on a field with group index [" +
@@ -612,7 +620,6 @@ public class QueryEntity implements Serializable {
             desc.addFieldToTextIndex(prop.fullName());
     }
 
-
     /** {@inheritDoc} */
     @Override public boolean equals(Object o) {
         if (this == o)

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0c2598a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
index 64aaa3a..0343474 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/query/annotations/QuerySqlField.java
@@ -57,6 +57,13 @@ public @interface QuerySqlField {
     boolean descending() default false;
 
     /**
+     * Specifies whether the specified field can be {@code null}.
+     *
+     * @return {@code True} if the field is not allowed to accept {@code null} values.
+     */
+    boolean notNull() default false;
+
+    /**
      * Array of index groups this field belongs to. Groups are used for compound indexes,
      * whenever index should be created on more than one field. All fields within the same
      * group will belong to the same index.

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0c2598a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
index 837a08f..fd0ef2b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/QueryEntityTypeDescriptor.java
@@ -52,6 +52,9 @@ public class QueryEntityTypeDescriptor {
     private final Map<String, QueryEntityIndexDescriptor> indexes = new HashMap<>();
 
     /** */
+    private Set<String> notNullFields = new HashSet<>();
+
+    /** */
     private QueryEntityIndexDescriptor fullTextIdx;
 
     /** */
@@ -175,6 +178,22 @@ public class QueryEntityTypeDescriptor {
     }
 
     /**
+     * Adds a notNull field.
+     *
+     * @param field notNull field.
+     */
+    public void addNotNullField(String field) {
+        notNullFields.add(field);
+    }
+
+    /**
+     * @return notNull fields.
+     */
+    public Set<String> notNullFields() {
+        return notNullFields;
+    }
+
+    /**
      * @return Class properties.
      */
     public Map<String, QueryEntityClassProperty> properties() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/b0c2598a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlNotNullConstraintTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlNotNullConstraintTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlNotNullConstraintTest.java
index 8283003..0c3b42c 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlNotNullConstraintTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/IgniteSqlNotNullConstraintTest.java
@@ -77,7 +77,7 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
     private static String CACHE_PERSON = "person-PARTITIONED-TRANSACTIONAL";
 
     /** Name of SQL table. */
-    private static String TABLE_PERSON = "\"" + CACHE_PERSON +  "\".\"PERSON\"";
+    private static String TABLE_PERSON = "\"" + CACHE_PERSON + "\".\"PERSON\"";
 
     /** Template of cache with read-through setting. */
     private static String CACHE_READ_THROUGH = "cacheReadThrough";
@@ -151,17 +151,19 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
     private List<CacheConfiguration> cacheConfigurations() {
         List<CacheConfiguration> res = new ArrayList<>();
 
-        for (boolean wrt : new boolean[] { false, true}) {
-            res.add(buildCacheConfiguration(CacheMode.LOCAL, CacheAtomicityMode.ATOMIC, false, wrt));
-            res.add(buildCacheConfiguration(CacheMode.LOCAL, CacheAtomicityMode.TRANSACTIONAL, false, wrt));
+        for (boolean wrt : new boolean[] {false, true}) {
+            for (boolean annot : new boolean[] {false, true}) {
+                res.add(buildCacheConfiguration(CacheMode.LOCAL, CacheAtomicityMode.ATOMIC, false, wrt, annot));
+                res.add(buildCacheConfiguration(CacheMode.LOCAL, CacheAtomicityMode.TRANSACTIONAL, false, wrt, annot));
 
-            res.add(buildCacheConfiguration(CacheMode.REPLICATED, CacheAtomicityMode.ATOMIC, false, wrt));
-            res.add(buildCacheConfiguration(CacheMode.REPLICATED, CacheAtomicityMode.TRANSACTIONAL, false, wrt));
+                res.add(buildCacheConfiguration(CacheMode.REPLICATED, CacheAtomicityMode.ATOMIC, false, wrt, annot));
+                res.add(buildCacheConfiguration(CacheMode.REPLICATED, CacheAtomicityMode.TRANSACTIONAL, false, wrt, annot));
 
-            res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.ATOMIC, false, wrt));
-            res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.ATOMIC, true, wrt));
-            res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.TRANSACTIONAL, false, wrt));
-            res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.TRANSACTIONAL, true, wrt));
+                res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.ATOMIC, false, wrt, annot));
+                res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.ATOMIC, true, wrt, annot));
+                res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.TRANSACTIONAL, false, wrt, annot));
+                res.add(buildCacheConfiguration(CacheMode.PARTITIONED, CacheAtomicityMode.TRANSACTIONAL, true, wrt, annot));
+            }
         }
 
         return res;
@@ -169,11 +171,11 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
 
     /** */
     private CacheConfiguration buildCacheConfiguration(CacheMode mode,
-        CacheAtomicityMode atomicityMode, boolean hasNear, boolean writeThrough) {
+        CacheAtomicityMode atomicityMode, boolean hasNear, boolean writeThrough, boolean notNullAnnotated) {
 
         CacheConfiguration cfg = new CacheConfiguration(CACHE_PREFIX + "-" +
             mode.name() + "-" + atomicityMode.name() + (hasNear ? "-near" : "") +
-            (writeThrough ? "-writethrough" : ""));
+            (writeThrough ? "-writethrough" : "") + (notNullAnnotated ? "-annot" : ""));
 
         cfg.setCacheMode(mode);
         cfg.setAtomicityMode(atomicityMode);
@@ -181,7 +183,8 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
 
         QueryEntity qe = new QueryEntity(new QueryEntity(Integer.class, Person.class));
 
-        qe.setNotNullFields(Collections.singleton("name"));
+        if (!notNullAnnotated)
+            qe.setNotNullFields(Collections.singleton("name"));
 
         cfg.setQueryEntities(F.asList(qe));
 
@@ -716,7 +719,7 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
     /** */
     private void checkNotNullCheckDmlInsertValues(CacheAtomicityMode atomicityMode) throws Exception {
         executeSql("CREATE TABLE test(id INT PRIMARY KEY, name VARCHAR NOT NULL) WITH \"atomicity="
-                + atomicityMode.name() + "\"");
+            + atomicityMode.name() + "\"");
 
         GridTestUtils.assertThrows(log(), new Callable<Object>() {
             @Override public Object call() throws Exception {
@@ -1022,7 +1025,7 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
 
     /** */
     private void cleanup() throws Exception {
-        for (CacheConfiguration ccfg: cacheConfigurations()) {
+        for (CacheConfiguration ccfg : cacheConfigurations()) {
             String cacheName = ccfg.getName();
 
             if (ccfg.getCacheMode() == CacheMode.LOCAL) {
@@ -1088,7 +1091,7 @@ public class IgniteSqlNotNullConstraintTest extends GridCommonAbstractTest {
     /** */
     public static class Person {
         /** */
-        @QuerySqlField
+        @QuerySqlField(notNull = true)
         private String name;
 
         /** */


[2/9] ignite git commit: IGNITE-6111: SQL: ability to execute INSERT INTO without specifying column names. This closes #2881.

Posted by sb...@apache.org.
IGNITE-6111: SQL: ability to execute INSERT INTO without specifying column names. This closes #2881.


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

Branch: refs/heads/ignite-5935
Commit: 4c8bc53e6c597657ad6541a518fb0e4c031c7799
Parents: 4c31549
Author: devozerov <vo...@gridgain.com>
Authored: Thu Oct 26 16:03:58 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Thu Oct 26 16:03:58 2017 +0300

----------------------------------------------------------------------
 .../processors/query/h2/IgniteH2Indexing.java   | 27 ++++++++-
 .../processors/query/h2/opt/GridH2Table.java    | 60 ++++++++++++++++++++
 .../IgniteCacheInsertSqlQuerySelfTest.java      | 18 ++++++
 3 files changed, 104 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/4c8bc53e/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 9321c85..a861614 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -392,13 +392,38 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                 return stmt;
             }
 
-            stmt = c.prepareStatement(sql);
+            stmt = prepare0(c, sql);
 
             cache.put(sql, stmt);
 
             return stmt;
         }
         else
+            return prepare0(c, sql);
+    }
+
+    /**
+     * Prepare statement.
+     *
+     * @param c Connection.
+     * @param sql SQL.
+     * @return Prepared statement.
+     * @throws SQLException If failed.
+     */
+    private PreparedStatement prepare0(Connection c, String sql) throws SQLException {
+        boolean insertHack = GridH2Table.insertHackRequired(sql);
+
+        if (insertHack) {
+            GridH2Table.insertHack(true);
+
+            try {
+                return c.prepareStatement(sql);
+            }
+            finally {
+                GridH2Table.insertHack(false);
+            }
+        }
+        else
             return c.prepareStatement(sql);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/4c8bc53e/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index 6c353e9..ac70c54 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -36,6 +36,7 @@ import org.apache.ignite.internal.processors.query.h2.database.H2RowFactory;
 import org.apache.ignite.internal.processors.query.h2.database.H2TreeIndex;
 import org.apache.ignite.internal.util.typedef.F;
 import org.h2.command.ddl.CreateTableData;
+import org.h2.command.dml.Insert;
 import org.h2.engine.DbObject;
 import org.h2.engine.Session;
 import org.h2.engine.SysProperties;
@@ -63,6 +64,9 @@ import static org.apache.ignite.internal.processors.query.h2.opt.GridH2KeyValueR
  * H2 Table implementation.
  */
 public class GridH2Table extends TableBase {
+    /** Insert hack flag. */
+    private static final ThreadLocal<Boolean> INSERT_HACK = new ThreadLocal<>();
+
     /** Cache context. */
     private final GridCacheContext cctx;
 
@@ -958,4 +962,60 @@ public class GridH2Table extends TableBase {
             unlock(true);
         }
     }
+
+    /** {@inheritDoc} */
+    @Override public Column[] getColumns() {
+        Boolean insertHack = INSERT_HACK.get();
+
+        if (insertHack != null && insertHack) {
+            StackTraceElement[] elems = Thread.currentThread().getStackTrace();
+
+            StackTraceElement elem = elems[2];
+
+            if (F.eq(elem.getClassName(), Insert.class.getName()) && F.eq(elem.getMethodName(), "prepare")) {
+                Column[] columns0 = new Column[columns.length - 3];
+
+                System.arraycopy(columns, 3, columns0, 0, columns0.length);
+
+                return columns0;
+            }
+        }
+
+        return columns;
+    }
+
+    /**
+     * Set insert hack flag.
+     *
+     * @param val Value.
+     */
+    public static void insertHack(boolean val) {
+        INSERT_HACK.set(val);
+    }
+
+    /**
+     * Check whether insert hack is required. This is true in case statement contains "INSERT INTO ... VALUES".
+     *
+     * @param sql SQL statement.
+     * @return {@code True} if target combination is found.
+     */
+    @SuppressWarnings("RedundantIfStatement")
+    public static boolean insertHackRequired(String sql) {
+        if (F.isEmpty(sql))
+            return false;
+
+        sql = sql.toLowerCase();
+
+        int idxInsert = sql.indexOf("insert");
+
+        if (idxInsert < 0)
+            return false;
+
+        int idxInto = sql.indexOf("into", idxInsert);
+
+        if (idxInto < 0)
+            return false;
+
+        return true;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/4c8bc53e/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
index fbf01fa..0f72883 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheInsertSqlQuerySelfTest.java
@@ -119,6 +119,24 @@ public class IgniteCacheInsertSqlQuerySelfTest extends IgniteCacheAbstractInsert
     }
 
     /**
+     * Test insert with implicit column names.
+     */
+    public void testImplicitColumnNames() {
+        IgniteCache<Key, Person> p = ignite(0).cache("K2P").withKeepBinary();
+
+        p.query(new SqlFieldsQuery(
+            "insert into Person values (1, 1, 'Vova')")).getAll();
+
+        assertEquals(createPerson(1, "Vova"), p.get(new Key(1)));
+
+        p.query(new SqlFieldsQuery(
+            "insert into Person values (2, 2, 'Sergi'), (3, 3, 'Alex')")).getAll();
+
+        assertEquals(createPerson(2, "Sergi"), p.get(new Key(2)));
+        assertEquals(createPerson(3, "Alex"), p.get(new Key(3)));
+    }
+
+    /**
      *
      */
     public void testFieldsCaseSensitivity() {


[9/9] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-3478' into ignite-5935

Posted by sb...@apache.org.
Merge remote-tracking branch 'remotes/origin/ignite-3478' into ignite-5935


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

Branch: refs/heads/ignite-5935
Commit: f4041a2ec536fa36451ab74370f132ee671ba873
Parents: 1c2fded 39f7ae9
Author: sboikov <sb...@gridgain.com>
Authored: Fri Oct 27 11:08:07 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Oct 27 11:08:07 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/QueryEntity.java    |  11 +-
 .../cache/query/annotations/QuerySqlField.java  |   7 +
 .../internal/managers/discovery/DiscoCache.java |  45 +++--
 .../discovery/DiscoveryCustomMessage.java       |  13 +-
 .../discovery/GridDiscoveryManager.java         | 191 +++++++++++--------
 .../cache/CacheAffinityChangeMessage.java       |   8 +
 .../ClientCacheChangeDiscoveryMessage.java      |   9 +
 .../ClientCacheChangeDummyDiscoveryMessage.java |   9 +
 .../cache/DynamicCacheChangeBatch.java          |   9 +
 .../binary/MetadataUpdateAcceptedMessage.java   |   9 +
 .../binary/MetadataUpdateProposedMessage.java   |   9 +
 .../GridDhtPartitionsExchangeFuture.java        |   3 +-
 .../GridCacheDatabaseSharedManager.java         |  16 +-
 .../snapshot/IgniteCacheSnapshotManager.java    |   6 +-
 .../persistence/snapshot/SnapshotOperation.java |   6 +-
 .../cache/query/QueryEntityIndexDescriptor.java |   2 +
 .../cache/query/QueryEntityTypeDescriptor.java  |  19 ++
 .../cluster/ChangeGlobalStateFinishMessage.java |   9 +
 .../cluster/ChangeGlobalStateMessage.java       |  11 +-
 .../continuous/AbstractContinuousMessage.java   |  10 +
 .../StartRoutineAckDiscoveryMessage.java        |   2 +-
 .../StartRoutineDiscoveryMessage.java           |   2 +-
 .../StopRoutineAckDiscoveryMessage.java         |   2 +-
 .../continuous/StopRoutineDiscoveryMessage.java |   2 +-
 .../marshaller/MappingAcceptedMessage.java      |   9 +
 .../marshaller/MappingProposedMessage.java      |   9 +
 .../message/SchemaAbstractDiscoveryMessage.java |  10 +
 .../message/SchemaProposeDiscoveryMessage.java  |   3 +-
 .../communication/tcp/TcpCommunicationSpi.java  |   3 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   2 +
 ...entConnectAfterCommunicationFailureTest.java | 156 +++++++++++++++
 .../IgniteDiscoveryCacheReuseSelfTest.java      |  89 +++++++++
 .../IgniteClientReconnectTestSuite.java         |   4 +-
 .../IgniteSpiDiscoverySelfTestSuite.java        |   6 +-
 .../processors/query/h2/IgniteH2Indexing.java   |  27 ++-
 .../processors/query/h2/opt/GridH2Table.java    |  60 ++++++
 .../IgniteCacheInsertSqlQuerySelfTest.java      |  18 ++
 .../query/IgniteSqlNotNullConstraintTest.java   |  35 ++--
 38 files changed, 708 insertions(+), 133 deletions(-)
----------------------------------------------------------------------