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

irakov 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 e2c597f  IGNITE-12013 NullPointerException is thrown by 
ExchangeLatchManager during cache creation - Fixes #7335.
e2c597f is described below

commit e2c597fff12192f736738569e244d0aee96b6e97
Author: Slava Koptilin <[email protected]>
AuthorDate: Fri Jan 31 01:09:21 2020 +0300

    IGNITE-12013 NullPointerException is thrown by ExchangeLatchManager during 
cache creation - Fixes #7335.
    
    Signed-off-by: Ivan Rakov <[email protected]>
---
 .../managers/discovery/GridDiscoveryManager.java   |   6 +-
 .../affinity/GridAffinityAssignmentCache.java      |  16 +-
 .../preloader/GridDhtPartitionsExchangeFuture.java |   4 +-
 .../dht/preloader/latch/ExchangeLatchManager.java  |  12 +-
 ...IgniteExchangeLatchManagerDiscoHistoryTest.java | 293 +++++++++++++++++++++
 .../testsuites/IgniteCacheMvccTestSuite6.java      |   2 +
 .../ignite/testsuites/IgniteCacheTestSuite6.java   |   2 +
 7 files changed, 315 insertions(+), 20 deletions(-)

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 01ff5d3..8cc317a 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
@@ -183,9 +183,6 @@ public class GridDiscoveryManager extends 
GridManagerAdapter<DiscoverySpi> {
     /** */
     public static final String NODES_SYS_VIEW_DESC = "Cluster nodes";
 
-    /** Discovery cached history size. */
-    private static final int DISCOVERY_HISTORY_SIZE = 
getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, 500);
-
     /** Predicate filtering out daemon nodes. */
     private static final IgnitePredicate<ClusterNode> FILTER_NOT_DAEMON = new 
P1<ClusterNode>() {
         @Override public boolean apply(ClusterNode n) {
@@ -200,6 +197,9 @@ public class GridDiscoveryManager extends 
GridManagerAdapter<DiscoverySpi> {
         }
     };
 
+    /** Discovery cached history size. */
+    private final int DISCOVERY_HISTORY_SIZE = 
getInteger(IGNITE_DISCOVERY_HISTORY_SIZE, 500);
+
     /** */
     private final Object discoEvtMux = new Object();
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
index 40e86b1..9297ae8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
@@ -355,7 +355,7 @@ public class GridAffinityAssignmentCache {
                 assignment = IdealAffinityAssignment.create(
                     topVer,
                     sorted,
-                    baselineAssignmentWithoutOfflineNodes(topVer)
+                    baselineAssignmentWithoutOfflineNodes(discoCache)
                 );
             }
             else if (skipCalculation)
@@ -367,7 +367,7 @@ public class GridAffinityAssignmentCache {
                 assignment = IdealAffinityAssignment.create(
                     topVer,
                     sorted,
-                    baselineAssignmentWithoutOfflineNodes(topVer)
+                    baselineAssignmentWithoutOfflineNodes(discoCache)
                 );
             }
             else {
@@ -388,7 +388,7 @@ public class GridAffinityAssignmentCache {
 
                 assignment = 
IdealAffinityAssignment.createWithPreservedPrimaries(
                     topVer,
-                    baselineAssignmentWithoutOfflineNodes(topVer),
+                    baselineAssignmentWithoutOfflineNodes(discoCache),
                     baselineAssignment
                 );
             }
@@ -455,16 +455,14 @@ public class GridAffinityAssignmentCache {
     }
 
     /**
-     * @param topVer Topology version.
+     * @param disco Discovery history.
      * @return Baseline assignment with filtered out offline nodes.
      */
-    private List<List<ClusterNode>> 
baselineAssignmentWithoutOfflineNodes(AffinityTopologyVersion topVer) {
+    private List<List<ClusterNode>> 
baselineAssignmentWithoutOfflineNodes(DiscoCache disco) {
         Map<Object, ClusterNode> alives = new HashMap<>();
 
-        for (ClusterNode node : ctx.discovery().nodes(topVer)) {
-            if (!node.isClient() && !node.isDaemon())
-                alives.put(node.consistentId(), node);
-        }
+        for (ClusterNode node : disco.serverNodes())
+            alives.put(node.consistentId(), node);
 
         List<List<ClusterNode>> assignment = baselineAssignment.assignment();
 
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 667fa74..28bf6dc 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
@@ -1508,8 +1508,8 @@ public class GridDhtPartitionsExchangeFuture extends 
GridDhtTopologyFutureAdapte
         timeBag.finishGlobalStage("WAL history reservation");
 
         // Skipping wait on local join is available when all cluster nodes 
have the same protocol.
-        boolean skipWaitOnLocalJoin = 
cctx.exchange().latch().canSkipJoiningNodes(initialVersion())
-            && localJoinExchange();
+        boolean skipWaitOnLocalJoin = localJoinExchange()
+            && cctx.exchange().latch().canSkipJoiningNodes(initialVersion());
 
         if (context().exchangeFreeSwitch())
             waitPartitionRelease(true, false);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
index 263f150..53b576a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
@@ -275,6 +275,7 @@ public class ExchangeLatchManager {
      *
      * @param topVer Topology version.
      * @return Collection of nodes with at least one cache configured.
+     * @throws IgniteException If nodes for the given {@code topVer} cannot be 
found in the discovery history.
      */
     private Collection<ClusterNode> 
aliveNodesForTopologyVer(AffinityTopologyVersion topVer) {
         if (topVer == AffinityTopologyVersion.NONE)
@@ -286,9 +287,9 @@ public class ExchangeLatchManager {
                 return histNodes.stream().filter(n -> !n.isClient() && 
!n.isDaemon() && discovery.alive(n))
                     .collect(Collectors.toList());
             else
-                throw new IgniteException("Topology " + topVer + " not found 
in discovery history "
-                    + "; consider increasing IGNITE_DISCOVERY_HISTORY_SIZE 
property. Current value is "
-                    + 
IgniteSystemProperties.getInteger(IgniteSystemProperties.IGNITE_DISCOVERY_HISTORY_SIZE,
 -1));
+                throw new IgniteException("Topology " + topVer + " not found 
in discovery history. "
+                        + "Consider increasing IGNITE_DISCOVERY_HISTORY_SIZE 
property. Current value is "
+                        + 
IgniteSystemProperties.getInteger(IgniteSystemProperties.IGNITE_DISCOVERY_HISTORY_SIZE,
 -1));
         }
     }
 
@@ -351,11 +352,10 @@ public class ExchangeLatchManager {
      * Checks that latch manager can use V2 protocol and skip joining nodes 
from latch participants.
      *
      * @param topVer Topology version.
+     * @throws IgniteException If nodes for the given {@code topVer} cannot be 
found in the discovery history.
      */
     public boolean canSkipJoiningNodes(AffinityTopologyVersion topVer) {
-        Collection<ClusterNode> applicableNodes = 
topVer.equals(AffinityTopologyVersion.NONE)
-            ? discovery.aliveServerNodes()
-            : discovery.topology(topVer.topologyVersion());
+        Collection<ClusterNode> applicableNodes = 
aliveNodesForTopologyVer(topVer);
 
         return applicableNodes.stream()
             .allMatch(node -> 
node.version().compareTo(PROTOCOL_V2_VERSION_SINCE) >= 0);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteExchangeLatchManagerDiscoHistoryTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteExchangeLatchManagerDiscoHistoryTest.java
new file mode 100644
index 0000000..71cd842
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/datastructures/IgniteExchangeLatchManagerDiscoHistoryTest.java
@@ -0,0 +1,293 @@
+/*
+ * 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.processors.cache.datastructures;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.failure.AbstractFailureHandler;
+import org.apache.ignite.failure.FailureContext;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.IgnitionEx;
+import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture;
+import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.PartitionsExchangeAware;
+import 
org.apache.ignite.internal.processors.cache.distributed.dht.preloader.latch.ExchangeLatchManager;
+import 
org.apache.ignite.internal.processors.metastorage.DistributedMetastorageLifecycleListener;
+import 
org.apache.ignite.internal.processors.metastorage.ReadableDistributedMetaStorage;
+import org.apache.ignite.internal.util.typedef.X;
+import org.apache.ignite.lifecycle.LifecycleBean;
+import org.apache.ignite.lifecycle.LifecycleEventType;
+import org.apache.ignite.resources.IgniteInstanceResource;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.TestTcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.WithSystemProperty;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_DISCOVERY_HISTORY_SIZE;
+
+/**
+ * Test {@link ExchangeLatchManager} throws {@link IgniteException} with 
appropriate message when topology history
+ * cannot be obtained.
+ */
+public class IgniteExchangeLatchManagerDiscoHistoryTest extends 
GridCommonAbstractTest {
+    /** Topology history size. */
+    private static final int TOPOLOGY_HISTORY_SIZE = 2;
+
+    /** Disco cache size. */
+    private static final String DISCO_HISTORY_SIZE = "2";
+
+    /** Timeout in millis. */
+    private static final long DEFAULT_TIMEOUT = 30_000;
+
+    /** Lifecycle bean that is used to register required listeners. */
+    private LifecycleBean lifecycleBean;
+
+    /** Flag indicates that a node, that is starting, should have short 
topology history. */
+    private boolean victim;
+
+    /** Discovery SPI that is used by the node with short topology history. */
+    private CustomTcpDiscoverySpi disco;
+
+    /** Failure context. */
+    private final AtomicReference<FailureContext> cpFailureCtx = new 
AtomicReference<>();
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String 
igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        TcpDiscoveryIpFinder ipFinder = 
((TcpDiscoverySpi)cfg.getDiscoverySpi()).getIpFinder();
+
+        int topHistSize = victim? TOPOLOGY_HISTORY_SIZE: 
TcpDiscoverySpi.DFLT_TOP_HISTORY_SIZE;
+
+        CustomTcpDiscoverySpi discoSpi = new 
CustomTcpDiscoverySpi(topHistSize, ipFinder);
+
+        cfg.setDiscoverySpi(discoSpi);
+
+        if (victim) {
+            cfg.setFailureHandler(new AbstractFailureHandler() {
+                /** {@inheritDoc} */
+                @Override protected boolean handle(Ignite ignite, 
FailureContext failureCtx) {
+                    cpFailureCtx.compareAndSet(null, failureCtx);
+
+                    // Invalidate kernel context.
+                    return true;
+                }
+            });
+
+            cfg.setLifecycleBeans(lifecycleBean);
+
+            disco = discoSpi;
+        }
+
+        return cfg;
+    }
+
+    /**
+     * Prepares test for execution.
+     */
+    @Before
+    public void startup() {
+        shutdown();
+    }
+
+    /**
+     * Cleans after the test.
+     */
+    @After
+    public void shutdown() {
+        lifecycleBean = null;
+
+        victim = false;
+
+        cpFailureCtx.set(null);
+
+        disco = null;
+
+        stopAllGrids();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @Test
+    @WithSystemProperty(key = IGNITE_DISCOVERY_HISTORY_SIZE, value = 
DISCO_HISTORY_SIZE)
+    public void testProperException() throws Exception {
+        final IgniteEx crd = startGrid(0);
+
+        final CountDownLatch exchangeLatch = new CountDownLatch(1);
+
+        final CountDownLatch startSrvsLatch = new CountDownLatch(1);
+
+        final AtomicReference<Exception> err = new AtomicReference<>();
+
+        // Lifecycle bean that is used to register PartitionsExchangeAware 
listener.
+        lifecycleBean = new LifecycleBean() {
+            /** Ignite instance. */
+            @IgniteInstanceResource
+            IgniteEx ignite;
+
+            /** {@inheritDoc} */
+            @Override public void onLifecycleEvent(LifecycleEventType evt) 
throws IgniteException {
+                if (evt == LifecycleEventType.BEFORE_NODE_START) {
+                    // The goal is registering PartitionsExchangeAware 
listener before the discovery manager is started.
+                    ignite.context().internalSubscriptionProcessor()
+                        .registerDistributedMetastorageListener(new 
DistributedMetastorageLifecycleListener() {
+                            @Override public void 
onReadyForRead(ReadableDistributedMetaStorage metastorage) {
+                                ignite.context().cache().context().exchange()
+                                    .registerExchangeAwareComponent(new 
PartitionsExchangeAware() {
+                                        /** {@inheritDoc} */
+                                        @Override public void 
onInitBeforeTopologyLock(GridDhtPartitionsExchangeFuture fut) {
+                                            try {
+                                                // Let's start nodes.
+                                                startSrvsLatch.countDown();
+
+                                                // Blocks the initial exchange 
and waits for other nodes.
+                                                
exchangeLatch.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+                                            }
+                                            catch (Exception e) {
+                                                err.compareAndSet(null, e);
+                                            }
+                                        }
+                                });
+                            }
+                    });
+                }
+            }
+        };
+
+        // Start server node with short topology history.
+        victim = true;
+
+        GridTestUtils.runAsync(() ->startGrid(1));
+
+        // Waits for the initial exchange.
+        startSrvsLatch.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+
+        victim = false;
+
+        lifecycleBean = null;
+
+        List<IgniteInternalFuture> srvFuts = new 
ArrayList<>(TOPOLOGY_HISTORY_SIZE);
+
+        try {
+            // Major topology version that is corresponding to the start of 
the node with short topology history.
+            final long topVer = 2;
+
+            // Starting server nodes to exhaust the topology history.
+            for (int i = 2; i < 3 * TOPOLOGY_HISTORY_SIZE && 
!disco.isEmptyTopologyHistory(topVer); ++i) {
+                final int currNodeIdx = i;
+
+                final int joinedNodesCnt = disco.totalJoinedNodes();
+
+                srvFuts.add(GridTestUtils.runAsync(() -> 
startGrid(currNodeIdx)));
+
+                assertTrue("Failed to wait for a new server node 
[joinedNodesCnt=" + joinedNodesCnt + "]",
+                    GridTestUtils.waitForCondition(
+                        () -> disco.totalJoinedNodes() >= (joinedNodesCnt + 
1), DEFAULT_TIMEOUT));
+            }
+
+            assertTrue(
+                "Disco cache history is not empty for the topology 
[majorTopVer=" + topVer + ']',
+                disco.isEmptyTopologyHistory(topVer));
+
+            // Let's continue the ongoing exchange.
+            exchangeLatch.countDown();
+
+            boolean failureHnd = GridTestUtils.waitForCondition(() -> 
cpFailureCtx.get() != null, DEFAULT_TIMEOUT);
+
+            assertNull(
+                "Unexpected exception (probably, the topology history still 
exists [err=" + err + ']',
+                err.get());
+
+            assertTrue("Failure handler was not triggered.", failureHnd);
+
+            // Check that IgniteException was thrown instead of 
NullPointerException.
+            assertTrue(
+                "IgniteException must be thrown.",
+                X.hasCause(cpFailureCtx.get().error(), IgniteException.class));
+
+            // Check that message contains a hint to fix the issue.
+            GridTestUtils.assertContains(
+                log,
+                cpFailureCtx.get().error().getMessage(),
+                "Consider increasing IGNITE_DISCOVERY_HISTORY_SIZE property. 
Current value is " + DISCO_HISTORY_SIZE);
+        }
+        finally {
+            IgnitionEx.stop(getTestIgniteInstanceName(1), true, true);
+
+            srvFuts.forEach(f -> {
+                try {
+                    f.get(DEFAULT_TIMEOUT);
+                }
+                catch (IgniteCheckedException e) {
+                    err.compareAndSet(null, e);
+                }
+            });
+        }
+
+        assertNull("Unexpected exception [err=" + err.get() + ']', err.get());
+    }
+
+    /**
+     * Custom discovery SPI that allows specifying a short topology history 
for testing purposes.
+     */
+    private static class CustomTcpDiscoverySpi extends TestTcpDiscoverySpi {
+        /**
+         * Creates a new instance of discovery spi with the given size of 
topology snapshots history.
+         *
+         * @param topHistSize Size of topology snapshots history.
+         * @param ipFinder IP finder
+         */
+        CustomTcpDiscoverySpi(int topHistSize, TcpDiscoveryIpFinder ipFinder) {
+            this.topHistSize = topHistSize;
+
+            setIpFinder(ipFinder);
+        }
+
+        /**
+         * Returns the number of joined nodes.
+         *
+         * @return Number of joined nodes.
+         */
+        int totalJoinedNodes() {
+            return stats.joinedNodesCount();
+        }
+
+        /**
+         * Returns {@code true} if the given topology version is already 
removed from the history.
+         *
+         * @param topVer Major topology version.
+         * @return {@code true} if the given topology version is already 
removed from the history.
+         */
+        boolean isEmptyTopologyHistory(long topVer) {
+            return ((IgniteEx)ignite).context().discovery().topology(topVer) 
== null;
+        }
+    }
+}
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
index 8596a41..3db1f05 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
@@ -33,6 +33,7 @@ import 
org.apache.ignite.internal.processors.cache.ReplicatedMvccTxPessimisticCa
 import 
org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest;
 import 
org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest;
 import 
org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerCoordinatorFailTest;
+import 
org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerDiscoHistoryTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.ExchangeMergeStaleServerNodesTest;
@@ -82,6 +83,7 @@ public class IgniteCacheMvccTestSuite6 {
         ignoredTests.add(CacheExchangeMergeTest.class);
         ignoredTests.add(ExchangeMergeStaleServerNodesTest.class);
         ignoredTests.add(IgniteExchangeLatchManagerCoordinatorFailTest.class);
+        ignoredTests.add(IgniteExchangeLatchManagerDiscoHistoryTest.class);
         ignoredTests.add(PartitionsExchangeCoordinatorFailoverTest.class);
         ignoredTests.add(CacheParallelStartTest.class);
         ignoredTests.add(IgniteCache150ClientsTest.class);
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
index d8bf783..96c2f30 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
@@ -31,6 +31,7 @@ import 
org.apache.ignite.internal.processors.cache.ReplicatedAtomicCacheGetsDist
 import 
org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest;
 import 
org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest;
 import 
org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerCoordinatorFailTest;
+import 
org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerDiscoHistoryTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest;
 import 
org.apache.ignite.internal.processors.cache.distributed.CachePartitionLossDetectionOnNodeLeftTest;
@@ -127,6 +128,7 @@ public class IgniteCacheTestSuite6 {
         GridTestUtils.addTestIfNeeded(suite, 
TxOptimisticOnPartitionExchangeTest.class, ignoredTests);
 
         GridTestUtils.addTestIfNeeded(suite, 
IgniteExchangeLatchManagerCoordinatorFailTest.class, ignoredTests);
+        GridTestUtils.addTestIfNeeded(suite, 
IgniteExchangeLatchManagerDiscoHistoryTest.class, ignoredTests);
 
         GridTestUtils.addTestIfNeeded(suite, 
PartitionsExchangeCoordinatorFailoverTest.class, ignoredTests);
         GridTestUtils.addTestIfNeeded(suite, 
CacheTryLockMultithreadedTest.class, ignoredTests);

Reply via email to