This is an automated email from the ASF dual-hosted git repository.

agoncharuk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 01f0e9e  IGNITE-11236 Added distributed metastorage to the list of 
Ignite features - Fixes #6047.
01f0e9e is described below

commit 01f0e9e501a0cd3a8513c801c816e33404031583
Author: ibessonov <bessonov...@gmail.com>
AuthorDate: Tue Feb 26 20:59:30 2019 +0300

    IGNITE-11236 Added distributed metastorage to the list of Ignite features - 
Fixes #6047.
    
    Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com>
---
 .../org/apache/ignite/internal/GridComponent.java  |   3 +
 .../org/apache/ignite/internal/IgniteFeatures.java |  25 +++-
 .../DistributedMetaStorageCasAckMessage.java       |   5 +-
 .../DistributedMetaStorageCasMessage.java          |   2 +-
 .../persistence/DistributedMetaStorageImpl.java    | 163 +++++++++++++++++----
 .../DistributedMetaStorageUpdateAckMessage.java    |  10 +-
 .../DistributedMetaStorageUpdateMessage.java       |  12 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java       |   6 +-
 .../ignite/spi/discovery/tcp/TcpDiscoveryImpl.java |   2 +-
 .../tcp/internal/DiscoveryDataPacket.java          |   7 +-
 .../metastorage/DistributedMetaStorageTest.java    |   6 +-
 .../apache/ignite/testframework/GridTestUtils.java |   3 +-
 .../zk/internal/ZookeeperDiscoveryImpl.java        |   2 +-
 13 files changed, 188 insertions(+), 58 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java 
b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
index 2e86198..31dfcd6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridComponent.java
@@ -77,6 +77,9 @@ public interface GridComponent {
 
         /** Distributed MetaStorage processor. */
         META_STORAGE;
+
+        /** Cached values array. */
+        public static final DiscoveryDataExchangeType[] VALUES = values();
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
index e7df1e9..011c419 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java
@@ -34,7 +34,10 @@ public enum IgniteFeatures {
     TCP_COMMUNICATION_SPI_HANDSHAKE_WAIT_MESSAGE(0),
 
     /** Cache metrics v2 support. */
-    CACHE_METRICS_V2(1);
+    CACHE_METRICS_V2(1),
+
+    /** Distributed metastorage. */
+    DISTRIBUTED_METASTORAGE(2);
 
     /**
      * Unique feature identifier.
@@ -64,7 +67,25 @@ public enum IgniteFeatures {
     public static boolean nodeSupports(ClusterNode clusterNode, IgniteFeatures 
feature) {
         final byte[] features = clusterNode.attribute(ATTR_IGNITE_FEATURES);
 
-        return features != null && 
BitSet.valueOf(features).get(feature.getFeatureId());
+        if (features == null)
+            return false;
+
+        int featureId = feature.getFeatureId();
+
+        // Same as "BitSet.valueOf(features).get(featureId)"
+
+        int byteIdx = featureId >>> 3;
+
+        if (byteIdx >= features.length)
+            return false;
+
+        int bitIdx = featureId & 0x7;
+
+        boolean res = (features[byteIdx] & (1 << bitIdx)) != 0;
+
+        assert res == BitSet.valueOf(features).get(featureId);
+
+        return res;
     }
 
     /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasAckMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasAckMessage.java
index a403454..30dda35 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasAckMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasAckMessage.java
@@ -29,8 +29,9 @@ class DistributedMetaStorageCasAckMessage extends 
DistributedMetaStorageUpdateAc
     private final boolean updated;
 
     /** */
-    public DistributedMetaStorageCasAckMessage(UUID reqId, boolean active, 
boolean updated) {
-        super(reqId, active);
+    public DistributedMetaStorageCasAckMessage(UUID reqId, String errorMsg, 
boolean updated) {
+        super(reqId, errorMsg);
+
         this.updated = updated;
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasMessage.java
index d5d5f8f..a357277 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasMessage.java
@@ -57,7 +57,7 @@ class DistributedMetaStorageCasMessage extends 
DistributedMetaStorageUpdateMessa
 
     /** {@inheritDoc} */
     @Override @Nullable public DiscoveryCustomMessage ackMessage() {
-        return new DistributedMetaStorageCasAckMessage(requestId(), 
isActive(), matches);
+        return new DistributedMetaStorageCasAckMessage(requestId(), 
errorMessage(), matches);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
index 2f67848..c3b3169 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageImpl.java
@@ -19,6 +19,7 @@ package 
org.apache.ignite.internal.processors.metastorage.persistence;
 
 import java.io.Serializable;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -32,13 +33,16 @@ import java.util.function.BiConsumer;
 import java.util.function.Predicate;
 import java.util.stream.LongStream;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteException;
 import org.apache.ignite.IgniteSystemProperties;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.failure.FailureContext;
 import org.apache.ignite.failure.FailureType;
 import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteFeatures;
 import org.apache.ignite.internal.managers.discovery.DiscoveryCustomMessage;
 import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
+import org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import 
org.apache.ignite.internal.processors.cache.persistence.metastorage.MetaStorage;
@@ -56,14 +60,17 @@ import 
org.apache.ignite.internal.util.future.GridFutureAdapter;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.spi.IgniteNodeValidationResult;
 import org.apache.ignite.spi.discovery.DiscoveryDataBag;
+import org.apache.ignite.spi.discovery.DiscoverySpi;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.TestOnly;
 
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_GLOBAL_METASTORAGE_HISTORY_MAX_BYTES;
 import static 
org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.META_STORAGE;
+import static 
org.apache.ignite.internal.IgniteFeatures.DISTRIBUTED_METASTORAGE;
 import static 
org.apache.ignite.internal.processors.cache.GridCacheUtils.isPersistenceEnabled;
 import static 
org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageHistoryItem.EMPTY_ARRAY;
 import static 
org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageUtil.historyItemPrefix;
@@ -83,6 +90,10 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
     /** Default upper bound of history size in bytes. */
     private static final long DFLT_MAX_HISTORY_BYTES = 100 * 1024 * 1024;
 
+    /** Message indicating that clusted is in a mixed state and writing cannot 
be completed because of that. */
+    public static final String NOT_SUPPORTED_MSG = "Ignite cluster has nodes 
that don't support distributed metastorage" +
+        " feature. Writing cannot be completed.";
+
     /** Cached subscription processor instance. Exists to make code shorter. */
     private final GridInternalSubscriptionProcessor subscrProcessor;
 
@@ -159,9 +170,25 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         subscrProcessor = ctx.internalSubscriptionProcessor();
     }
 
+    /**
+     * @return {@code True} if all nodes in the cluster support discributed 
metastorage feature.
+     * @see IgniteFeatures#DISTRIBUTED_METASTORAGE
+     */
+    private boolean isSupported() {
+        DiscoverySpi discoSpi = ctx.config().getDiscoverySpi();
+
+        if (discoSpi instanceof IgniteDiscoverySpi)
+            return 
((IgniteDiscoverySpi)discoSpi).allNodesSupport(DISTRIBUTED_METASTORAGE);
+        else {
+            Collection<ClusterNode> nodes = discoSpi.getRemoteNodes();
+
+            return IgniteFeatures.allNodesSupports(nodes, 
DISTRIBUTED_METASTORAGE);
+        }
+    }
+
     /** {@inheritDoc} */
     @Override public void start() throws IgniteCheckedException {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         if (isPersistenceEnabled(ctx.config())) {
@@ -216,7 +243,7 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
 
     /** {@inheritDoc} */
     @Override public void onActivate(GridKernalContext kctx) throws 
IgniteCheckedException {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         if (!isPersistenceEnabled(ctx.config())) {
@@ -246,7 +273,7 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
 
     /** {@inheritDoc} */
     @Override public void onDeActivate(GridKernalContext kctx) {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         synchronized (innerStateLock) {
@@ -444,7 +471,7 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
 
     /** {@inheritDoc} */
     @Override public void collectJoiningNodeData(DiscoveryDataBag dataBag) {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         assert startupExtras != null;
@@ -463,7 +490,12 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
             hist
         );
 
-        dataBag.addJoiningNodeData(COMPONENT_ID, data);
+        try {
+            dataBag.addJoiningNodeData(COMPONENT_ID, 
JdkMarshaller.DEFAULT.marshal(data));
+        }
+        catch (IgniteCheckedException e) {
+            throw new IgniteException(e);
+        }
     }
 
     /** Returns current baseline topology id of {@code -1} if there's no 
baseline topology found. */
@@ -478,29 +510,47 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         ClusterNode node,
         DiscoveryDataBag.JoiningNodeDiscoveryData discoData
     ) {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return null;
 
-        if (!discoData.hasJoiningNodeData() || 
!isPersistenceEnabled(ctx.config()))
-            return null;
+        synchronized (innerStateLock) {
+            DistributedMetaStorageVersion locVer = getActualVersion();
 
-        DistributedMetaStorageJoiningNodeData joiningData =
-            (DistributedMetaStorageJoiningNodeData)discoData.joiningNodeData();
+            if (!discoData.hasJoiningNodeData()) {
+                // Joining node doesn't support distributed metastorage 
feature.
 
-        DistributedMetaStorageVersion remoteVer = joiningData.ver;
+                if (isSupported() && locVer.id > 0 && !(node.isClient() || 
node.isDaemon())) {
+                    String errorMsg = "Node not supporting distributed 
metastorage feature" +
+                        " is not allowed to join the cluster";
+
+                    return new IgniteNodeValidationResult(node.id(), errorMsg, 
errorMsg);
+                }
+                else
+                    return null;
+            }
 
-        DistributedMetaStorageHistoryItem[] remoteHist = joiningData.hist;
+            DistributedMetaStorageJoiningNodeData joiningData = 
getJoiningNodeData(discoData);
 
-        int remoteHistSize = remoteHist.length;
+            if (joiningData == null) {
+                String errorMsg = "Cannot unmarshal joining node data";
 
-        int remoteBltId = joiningData.bltId;
+                return new IgniteNodeValidationResult(node.id(), errorMsg, 
errorMsg);
+            }
 
-        boolean clusterIsActive = isActive();
+            if (!isPersistenceEnabled(ctx.config()))
+                return null;
 
-        String errorMsg;
+            DistributedMetaStorageVersion remoteVer = joiningData.ver;
 
-        synchronized (innerStateLock) {
-            DistributedMetaStorageVersion locVer = getActualVersion();
+            DistributedMetaStorageHistoryItem[] remoteHist = joiningData.hist;
+
+            int remoteHistSize = remoteHist.length;
+
+            int remoteBltId = joiningData.bltId;
+
+            boolean clusterIsActive = isActive();
+
+            String errorMsg;
 
             int locBltId = getBaselineTopologyId();
 
@@ -572,24 +622,29 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
                         " Please check the order in which you start cluster 
nodes.";
                 }
             }
-        }
 
-        return (errorMsg == null) ? null : new 
IgniteNodeValidationResult(node.id(), errorMsg, errorMsg);
+            return (errorMsg == null) ? null : new 
IgniteNodeValidationResult(node.id(), errorMsg, errorMsg);
+        }
     }
 
     /** {@inheritDoc} */
     @Override public void 
onJoiningNodeDataReceived(DiscoveryDataBag.JoiningNodeDiscoveryData discoData) {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         if (!discoData.hasJoiningNodeData())
             return;
 
-        DistributedMetaStorageJoiningNodeData joiningData =
-            (DistributedMetaStorageJoiningNodeData)discoData.joiningNodeData();
+        DistributedMetaStorageJoiningNodeData joiningData = 
getJoiningNodeData(discoData);
+
+        if (joiningData == null)
+            return;
 
         DistributedMetaStorageVersion remoteVer = joiningData.ver;
 
+        if (!isSupported() && remoteVer.id > 0)
+            return;
+
         synchronized (innerStateLock) {
             DistributedMetaStorageVersion actualVer = getActualVersion();
 
@@ -613,7 +668,7 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
 
     /** {@inheritDoc} */
     @Override public void collectGridNodeData(DiscoveryDataBag dataBag) {
-        if (ctx.clientNode())
+        if (ctx.clientNode() || ctx.isDaemon())
             return;
 
         if (dataBag.commonDataCollectedFor(COMPONENT_ID))
@@ -624,8 +679,13 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         if (!discoData.hasJoiningNodeData())
             return;
 
-        DistributedMetaStorageJoiningNodeData joiningData =
-            (DistributedMetaStorageJoiningNodeData)discoData.joiningNodeData();
+        if (!isSupported())
+            return;
+
+        DistributedMetaStorageJoiningNodeData joiningData = 
getJoiningNodeData(discoData);
+
+        if (joiningData == null)
+            return;
 
         DistributedMetaStorageVersion remoteVer = joiningData.ver;
 
@@ -697,6 +757,24 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         }
     }
 
+    /** */
+    @Nullable private DistributedMetaStorageJoiningNodeData getJoiningNodeData(
+        DiscoveryDataBag.JoiningNodeDiscoveryData discoData
+    ) {
+        byte[] data = (byte[])discoData.joiningNodeData();
+
+        assert data != null;
+
+        try {
+            return JdkMarshaller.DEFAULT.unmarshal(data, U.gridClassLoader());
+        }
+        catch (IgniteCheckedException e) {
+            log.error("Unable to unmarshal joinging node data for distributed 
metastorage component.", e);
+
+            return null;
+        }
+    }
+
     /**
      * Returns number of all available history items. Might be a history from 
remote node snapshot or/and deferred
      * updates from another remote node. Depends on the current node state.
@@ -795,10 +873,10 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
 
     /** {@inheritDoc} */
     @Override public void 
onGridDataReceived(DiscoveryDataBag.GridDiscoveryData data) {
-        DistributedMetaStorageClusterNodeData nodeData = 
(DistributedMetaStorageClusterNodeData)data.commonData();
+        synchronized (innerStateLock) {
+            DistributedMetaStorageClusterNodeData nodeData = 
(DistributedMetaStorageClusterNodeData)data.commonData();
 
-        if (nodeData != null) {
-            synchronized (innerStateLock) {
+            if (nodeData != null) {
                 if (nodeData.fullData == null) {
                     if (nodeData.updates != null) {
                         for (DistributedMetaStorageHistoryItem update : 
nodeData.updates)
@@ -808,6 +886,10 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
                 else
                     writeFullDataLater(nodeData);
             }
+            else if (!(ctx.clientNode() || ctx.isDaemon()) && 
getActualVersion().id > 0) {
+                throw new IgniteException("Cannot join the cluster because it 
doesn't support distributed metastorage" +
+                    " feature and this node has not empty distributed 
metastorage data");
+            }
         }
     }
 
@@ -821,6 +903,9 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
      * cluster is not active.
      */
     private GridFutureAdapter<?> startWrite(String key, byte[] valBytes) 
throws IgniteCheckedException {
+       if (!isSupported())
+            throw new IgniteCheckedException(NOT_SUPPORTED_MSG);
+
         UUID reqId = UUID.randomUUID();
 
         GridFutureAdapter<Boolean> fut = new GridFutureAdapter<>();
@@ -839,6 +924,9 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
      */
     private GridFutureAdapter<Boolean> startCas(String key, byte[] 
expValBytes, byte[] newValBytes)
         throws IgniteCheckedException {
+         if (!isSupported())
+            throw new IgniteCheckedException(NOT_SUPPORTED_MSG);
+
         UUID reqId = UUID.randomUUID();
 
         GridFutureAdapter<Boolean> fut = new GridFutureAdapter<>();
@@ -865,8 +953,17 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         ClusterNode node,
         DistributedMetaStorageUpdateMessage msg
     ) {
+        if (msg.errorMessage() != null)
+            return;
+
         if (!isActive()) {
-            msg.setActive(false);
+            msg.errorMessage("Ignite cluster is not active");
+
+            return;
+        }
+
+        if (!isSupported()) {
+            msg.errorMessage(NOT_SUPPORTED_MSG);
 
             return;
         }
@@ -900,7 +997,9 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
         GridFutureAdapter<Boolean> fut = updateFuts.remove(msg.requestId());
 
         if (fut != null) {
-            if (msg.isActive()) {
+            String errorMsg = msg.errorMessage();
+
+            if (errorMsg == null) {
                 Boolean res = msg instanceof 
DistributedMetaStorageCasAckMessage
                     ? ((DistributedMetaStorageCasAckMessage)msg).updated()
                     : null;
@@ -908,7 +1007,7 @@ public class DistributedMetaStorageImpl extends 
GridProcessorAdapter
                 fut.onDone(res);
             }
             else
-                fut.onDone(new IllegalStateException("Ignite cluster is not 
active"));
+                fut.onDone(new IllegalStateException(errorMsg));
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
index 0e05d93..e930ea8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateAckMessage.java
@@ -38,12 +38,12 @@ class DistributedMetaStorageUpdateAckMessage implements 
DiscoveryCustomMessage {
     private final UUID reqId;
 
     /** */
-    private final boolean active;
+    private final String errorMsg;
 
     /** */
-    public DistributedMetaStorageUpdateAckMessage(UUID reqId, boolean active) {
+    public DistributedMetaStorageUpdateAckMessage(UUID reqId, String errorMsg) 
{
         this.reqId = reqId;
-        this.active = active;
+        this.errorMsg = errorMsg;
     }
 
     /** {@inheritDoc} */
@@ -62,8 +62,8 @@ class DistributedMetaStorageUpdateAckMessage implements 
DiscoveryCustomMessage {
     }
 
     /** */
-    public boolean isActive() {
-        return active;
+    public String errorMessage() {
+        return errorMsg;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
index cc3f37f..dafc4a9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
@@ -44,7 +44,7 @@ class DistributedMetaStorageUpdateMessage implements 
DiscoveryCustomMessage {
     private final byte[] valBytes;
 
     /** */
-    private boolean active = true;
+    private String errorMsg;
 
     /** */
     public DistributedMetaStorageUpdateMessage(UUID reqId, String key, byte[] 
valBytes) {
@@ -79,18 +79,18 @@ class DistributedMetaStorageUpdateMessage implements 
DiscoveryCustomMessage {
     }
 
     /** */
-    public void setActive(boolean active) {
-        this.active = active;
+    public void errorMessage(String errorMsg) {
+        this.errorMsg = errorMsg;
     }
 
     /** */
-    protected boolean isActive() {
-        return active;
+    protected String errorMessage() {
+        return errorMsg;
     }
 
     /** {@inheritDoc} */
     @Override @Nullable public DiscoveryCustomMessage ackMessage() {
-        return new DistributedMetaStorageUpdateAckMessage(reqId, active);
+        return new DistributedMetaStorageUpdateAckMessage(reqId, errorMsg);
     }
 
     /** {@inheritDoc} */
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 7adef67..214641d 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
@@ -152,9 +152,9 @@ import org.jetbrains.annotations.Nullable;
 
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_DISCOVERY_CLIENT_RECONNECT_HISTORY_SIZE;
+import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_NODE_IDS_HISTORY_SIZE;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID;
-import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED;
 import static org.apache.ignite.IgniteSystemProperties.getInteger;
 import static org.apache.ignite.events.EventType.EVT_NODE_FAILED;
 import static org.apache.ignite.events.EventType.EVT_NODE_JOINED;
@@ -163,12 +163,12 @@ import static 
org.apache.ignite.events.EventType.EVT_NODE_METRICS_UPDATED;
 import static org.apache.ignite.events.EventType.EVT_NODE_SEGMENTED;
 import static org.apache.ignite.failure.FailureType.CRITICAL_ERROR;
 import static org.apache.ignite.failure.FailureType.SYSTEM_WORKER_TERMINATION;
+import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_LATE_AFFINITY_ASSIGNMENT;
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_COMPACT_FOOTER;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_BINARY_STRING_SER_VER_2;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MARSHALLER_USE_DFLT_SUID;
-import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED;
 import static org.apache.ignite.spi.IgnitePortProtocol.TCP;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.AUTH_FAILED;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.CHECK_FAILED;
@@ -177,9 +177,9 @@ import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.DISCONNECTED;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.DISCONNECTING;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.DUPLICATE_ID;
-import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.RING_FAILED;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.LEFT;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.LOOPBACK_PROBLEM;
+import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.RING_FAILED;
 import static 
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoverySpiState.STOPPING;
 import static 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage.STATUS_OK;
 import static 
org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryStatusCheckMessage.STATUS_RECON;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
index 7e5b7a2..0862614 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoveryImpl.java
@@ -218,7 +218,7 @@ abstract class TcpDiscoveryImpl {
 
     /**
      * @param feature Feature to check.
-     * @return {@code True} if all nodes support the given featire, {@code 
false} otherwise.
+     * @return {@code true} if all nodes support the given feature, {@code 
false} otherwise.
      */
     public abstract boolean allNodesSupport(IgniteFeatures feature);
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java
index bec8cee..f342503 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/DiscoveryDataPacket.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.GridComponent;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.marshaller.Marshaller;
@@ -284,8 +285,12 @@ public class DiscoveryDataPacket implements Serializable {
                 if (CONTINUOUS_PROC.ordinal() == binEntry.getKey() &&
                         X.hasCause(e, ClassNotFoundException.class) && 
clientNode)
                     U.warn(log, "Failed to unmarshal continuous query remote 
filter on client node. Can be ignored.");
-                else
+                else if (binEntry.getKey() < 
GridComponent.DiscoveryDataExchangeType.VALUES.length)
                     U.error(log, "Failed to unmarshal discovery data for 
component: "  + binEntry.getKey(), e);
+                else {
+                    U.warn(log, "Failed to unmarshal discovery data." +
+                        " Component " + binEntry.getKey() + " is not found.");
+                }
             }
         }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java
index 0e0a448..5161bf3 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java
@@ -113,7 +113,7 @@ public class DistributedMetaStorageTest extends 
GridCommonAbstractTest {
     public void testMultipleNodes() throws Exception {
         int cnt = 4;
 
-        startGridsMultiThreaded(cnt);
+        startGrids(cnt);
 
         grid(0).cluster().active(true);
 
@@ -139,7 +139,7 @@ public class DistributedMetaStorageTest extends 
GridCommonAbstractTest {
     public void testListenersOnWrite() throws Exception {
         int cnt = 4;
 
-        startGridsMultiThreaded(cnt);
+        startGrids(cnt);
 
         grid(0).cluster().active(true);
 
@@ -172,7 +172,7 @@ public class DistributedMetaStorageTest extends 
GridCommonAbstractTest {
     public void testListenersOnRemove() throws Exception {
         int cnt = 4;
 
-        startGridsMultiThreaded(cnt);
+        startGrids(cnt);
 
         grid(0).cluster().active(true);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
index e254c39..29ee741 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java
@@ -368,7 +368,8 @@ public final class GridTestUtils {
 
             while (t != null) {
                 if (cls == t.getClass() && (msg == null || (t.getMessage() != 
null && t.getMessage().contains(msg)))) {
-                    log.info("Caught expected exception: " + t.getMessage());
+                    if (log != null && log.isInfoEnabled())
+                        log.info("Caught expected exception: " + 
t.getMessage());
 
                     return t;
                 }
diff --git 
a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
 
b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
index b21e335..8d887f9 100644
--- 
a/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
+++ 
b/modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/ZookeeperDiscoveryImpl.java
@@ -564,7 +564,7 @@ public class ZookeeperDiscoveryImpl {
 
     /**
      * @param feature Feature to check.
-     * @return {@code true} if all nodes support the given feature, false 
otherwise.
+     * @return {@code true} if all nodes support the given feature, {@code 
false} otherwise.
      */
     public boolean allNodesSupport(IgniteFeatures feature) {
         checkState();

Reply via email to