From e3ef837cf7530b1f2619190a7d8915577e2864aa Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Mon, 27 Jan 2020 18:54:08 +0300 Subject: [PATCH 1/8] IGNITE-12580: NPE fix. --- .../internal/processors/metric/GridMetricManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java index 8ad0a5e66f2fb..3c51cbfb3c9f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java @@ -386,14 +386,20 @@ public void remove(String regName) { notifyListeners(mreg, metricRegRemoveLsnrs, log); + + DistributedMetaStorage metastorage0 = metastorage; + + if (metastorage0 == null) + return; + try { GridCompoundFuture opsFut = new GridCompoundFuture<>(); for (Metric m : mreg) { if (m instanceof HitRateMetric) - opsFut.add(metastorage.removeAsync(metricName(HITRATE_CFG_PREFIX, m.name()))); + opsFut.add(metastorage0.removeAsync(metricName(HITRATE_CFG_PREFIX, m.name()))); else if (m instanceof HistogramMetric) - opsFut.add(metastorage.removeAsync(metricName(HISTOGRAM_CFG_PREFIX, m.name()))); + opsFut.add(metastorage0.removeAsync(metricName(HISTOGRAM_CFG_PREFIX, m.name()))); } opsFut.markInitialized(); From 0aa4a8d891599740f8abbc1c1e22d804cc4e8f8b Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 14:52:41 +0300 Subject: [PATCH 2/8] IGNITE-12580: Failing test repeated run --- ...alModeChangeDuringRebalancingSelfTest.java | 283 ------------------ .../testsuites/IgnitePdsTestSuite2.java | 21 +- 2 files changed, 5 insertions(+), 299 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java index 5e605300f75f5..643f7b699c9f4 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java @@ -22,8 +22,6 @@ import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.file.OpenOption; -import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicReference; @@ -34,7 +32,6 @@ import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; -import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; @@ -60,7 +57,6 @@ import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.MvccFeatureChecker; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; -import org.junit.Assert; import org.junit.Test; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -234,16 +230,6 @@ public void testWalDisabledDuringRebalancing() throws Exception { doTestSimple(); } - /** - * @throws Exception If failed. - */ - @Test - public void testWalNotDisabledIfParameterSetToFalse() throws Exception { - disableWalDuringRebalancing = false; - - doTestSimple(); - } - /** * @throws Exception If failed. */ @@ -319,178 +305,6 @@ else if (timestamp >= rebalanceStartedTimestamp && timestamp <= rebalanceFinishe assertEquals(disableWalDuringRebalancing ? 1 : 0, checkpointsAfterRebalance); // checkpoint if WAL was re-activated } - /** - * @throws Exception If failed. - */ - @Test - public void testWalDisabledDuringRebalancingWithPendingTxTracker() throws Exception { - enablePendingTxTracker = true; - dfltCacheBackupCnt = 2; - - Ignite ignite = startGrids(3); - - ignite.cluster().baselineAutoAdjustEnabled(false); - ignite.cluster().active(true); - - ignite.cluster().setBaselineTopology(3); - - IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); - - stopGrid(2); - - awaitExchange((IgniteEx)ignite); - - // Ensure each partition has received an update. - for (int k = 0; k < RendezvousAffinityFunction.DFLT_PARTITION_COUNT; k++) - cache.put(k, k); - - IgniteEx newIgnite = startGrid(2); - - awaitExchange(newIgnite); - - CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); - - assertFalse(grpCtx.walEnabled()); - - long rebalanceStartedTs = System.currentTimeMillis(); - - for (Ignite g : G.allGrids()) - g.cache(DEFAULT_CACHE_NAME).rebalance(); - - awaitPartitionMapExchange(); - - assertTrue(grpCtx.walEnabled()); - - long rebalanceFinishedTs = System.currentTimeMillis(); - - CheckpointHistory cpHist = - ((GridCacheDatabaseSharedManager)newIgnite.context().cache().context().database()).checkpointHistory(); - - assertNotNull(cpHist); - - // Ensure there was a checkpoint on WAL re-activation. - assertEquals( - 1, - cpHist.checkpoints() - .stream() - .filter(ts -> rebalanceStartedTs <= ts && ts <= rebalanceFinishedTs) - .count()); - } - - /** - * @throws Exception If failed. - */ - @Test - public void testLocalAndGlobalWalStateInterdependence() throws Exception { - Ignite ignite = startGrids(3); - - ignite.cluster().baselineAutoAdjustEnabled(false); - ignite.cluster().active(true); - - IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); - - for (int k = 0; k < getKeysCount(); k++) - cache.put(k, k); - - IgniteEx newIgnite = startGrid(3); - - newIgnite.cluster().setBaselineTopology(ignite.cluster().nodes()); - - awaitExchange(newIgnite); - - CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); - - assertFalse(grpCtx.walEnabled()); - - ignite.cluster().disableWal(DEFAULT_CACHE_NAME); - - for (Ignite g : G.allGrids()) - g.cache(DEFAULT_CACHE_NAME).rebalance(); - - awaitPartitionMapExchange(); - - assertFalse(grpCtx.walEnabled()); // WAL is globally disabled - - ignite.cluster().enableWal(DEFAULT_CACHE_NAME); - - assertTrue(grpCtx.walEnabled()); - } - - /** - * Test that local WAL mode changing works well with exchanges merge. - * - * @throws Exception If failed. - */ - @Test - public void testWithExchangesMerge() throws Exception { - final int nodeCnt = 4; - final int keyCnt = getKeysCount(); - - Ignite ignite = startGrids(nodeCnt); - - ignite.cluster().active(true); - - IgniteCache cache = ignite.cache(REPL_CACHE); - - for (int k = 0; k < keyCnt; k++) - cache.put(k, k); - - stopGrid(2); - stopGrid(3); - - // Rewrite data to trigger further rebalance. - for (int k = 0; k < keyCnt; k++) - cache.put(k, k * 2); - - // Start several grids in parallel to trigger exchanges merge. - startGridsMultiThreaded(2, 2); - - for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { - CacheGroupContext grpCtx = grid(nodeIdx).cachex(REPL_CACHE).context().group(); - - assertTrue(GridTestUtils.waitForCondition(new GridAbsPredicate() { - @Override public boolean apply() { - return !grpCtx.walEnabled(); - } - }, 5_000)); - } - - // Invoke rebalance manually. - for (Ignite g : G.allGrids()) - g.cache(REPL_CACHE).rebalance(); - - awaitPartitionMapExchange(); - - for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { - CacheGroupContext grpCtx = grid(nodeIdx).cachex(REPL_CACHE).context().group(); - - assertTrue(grpCtx.walEnabled()); - } - - // Check no data loss. - for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { - IgniteCache cache0 = grid(nodeIdx).cache(REPL_CACHE); - - for (int k = 0; k < keyCnt; k++) - Assert.assertEquals("nodeIdx=" + nodeIdx + ", key=" + k, (Integer)(2 * k), cache0.get(k)); - } - } - - /** - * @throws Exception If failed. - */ - @Test - public void testParallelExchangeDuringRebalance() throws Exception { - doTestParallelExchange(supplyMessageLatch); - } - - /** - * @throws Exception If failed. - */ - @Test - public void testParallelExchangeDuringCheckpoint() throws Exception { - doTestParallelExchange(fileIOLatch); - } /** * @throws Exception If failed. @@ -541,103 +355,6 @@ private void doTestParallelExchange(AtomicReference latchRef) th assertTrue(waitForCondition(grpCtx::walEnabled, 2_000)); } - /** - * @throws Exception If failed. - */ - @Test - public void testDataClearedAfterRestartWithDisabledWal() throws Exception { - Ignite ignite = startGrid(0); - - ignite.cluster().baselineAutoAdjustEnabled(false); - ignite.cluster().active(true); - - IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); - - int keysCnt = getKeysCount(); - - for (int k = 0; k < keysCnt; k++) - cache.put(k, k); - - IgniteEx newIgnite = startGrid(1); - - newIgnite.cluster().setBaselineTopology(2); - - // Await fully exchange complete. - awaitExchange(newIgnite); - - CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); - - assertFalse(grpCtx.localWalEnabled()); - - stopGrid(1); - stopGrid(0); - - newIgnite = startGrid(1); - - newIgnite.cluster().active(true); - - newIgnite.cluster().setBaselineTopology(newIgnite.cluster().nodes()); - - cache = newIgnite.cache(DEFAULT_CACHE_NAME); - - for (int k = 0; k < keysCnt; k++) - assertFalse("k=" + k +", v=" + cache.get(k), cache.containsKey(k)); - - Set keys = new TreeSet<>(); - - for (int k = 0; k < keysCnt; k++) - keys.add(k); - - assertFalse(cache.containsKeys(keys)); - } - - /** - * @throws Exception If failed. - */ - @Test - public void testWalNotDisabledAfterShrinkingBaselineTopology() throws Exception { - Ignite ignite = startGrids(4); - - ignite.cluster().baselineAutoAdjustEnabled(false); - ignite.cluster().active(true); - - IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); - - int keysCnt = getKeysCount(); - - for (int k = 0; k < keysCnt; k++) - cache.put(k, k); - - for (Ignite g : G.allGrids()) { - CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); - - assertTrue(grpCtx.walEnabled()); - } - - stopGrid(2); - - ignite.cluster().setBaselineTopology(5); - - // Await fully exchange complete. - awaitExchange((IgniteEx)ignite); - - for (Ignite g : G.allGrids()) { - CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); - - assertTrue(grpCtx.walEnabled()); - - g.cache(DEFAULT_CACHE_NAME).rebalance(); - } - - awaitPartitionMapExchange(); - - for (Ignite g : G.allGrids()) { - CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); - - assertTrue(grpCtx.walEnabled()); - } - } - /** * * @param ig Ignite. diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java index dcd60b96a1759..cce5733dd01e5 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java @@ -31,13 +31,6 @@ import org.apache.ignite.internal.processors.cache.persistence.IgniteRebalanceScheduleResendPartitionsTest; import org.apache.ignite.internal.processors.cache.persistence.LocalWalModeChangeDuringRebalancingSelfTest; import org.apache.ignite.internal.processors.cache.persistence.LocalWalModeNoChangeDuringRebalanceOnNonNodeAssignTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.ClientAffinityAssignmentWithBaselineTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.ClusterActivationEventTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.ClusterActivationEventWithPersistenceTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteAbsentEvictionNodeOutOfBaselineTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteAllBaselineNodesOnlineFullApiSelfTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteOfflineBaselineNodeFullApiSelfTest; -import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteOnlineNodeOutOfBaselineFullApiSelfTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsRebalancingOnNotStableTopologyTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsReserveWalSegmentsTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsReserveWalSegmentsWithCompactionTest; @@ -71,19 +64,11 @@ import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalDeletionArchiveFsyncTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalDeletionArchiveLogOnlyTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalRolloverTypesTest; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteDataIntegrityTests; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteFsyncReplayWalIteratorInvalidCrcTest; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgnitePureJavaCrcCompatibility; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteReplayWalIteratorInvalidCrcTest; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteStandaloneWalIteratorInvalidCrcTest; -import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteWithoutArchiverWalIteratorInvalidCrcTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.reader.IgniteWalReaderTest; import org.apache.ignite.internal.processors.cache.persistence.freelist.FreeListCachingTest; import org.apache.ignite.internal.processors.cache.persistence.wal.reader.FilteredWalIteratorTest; import org.apache.ignite.internal.processors.cache.persistence.wal.reader.StandaloneWalRecordsIteratorTest; import org.apache.ignite.internal.processors.cache.persistence.wal.scanner.WalScannerTest; -import org.apache.ignite.internal.processors.cluster.ClusterStateChangeEventTest; -import org.apache.ignite.internal.processors.cluster.ClusterStateChangeEventWithPersistenceTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -105,6 +90,10 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); + for (int i=0; i<1000; i++) { + suite.add(LocalWalModeChangeDuringRebalancingSelfTest.class); + } +/* // Integrity test. GridTestUtils.addTestIfNeeded(suite, IgniteDataIntegrityTests.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteStandaloneWalIteratorInvalidCrcTest.class, ignoredTests); @@ -127,7 +116,7 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, ClusterActivationEventWithPersistenceTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClusterStateChangeEventTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClusterStateChangeEventWithPersistenceTest.class, ignoredTests); - +*/ return suite; } From 8d15fe30cb9e6fc9aefcf83ab1134abd3f15a30d Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 14:56:43 +0300 Subject: [PATCH 3/8] IGNITE-12580: Failing test repeated run --- .../ignite/internal/processors/metric/GridMetricManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java index 3c51cbfb3c9f0..56886c0f37ba8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/GridMetricManager.java @@ -386,7 +386,6 @@ public void remove(String regName) { notifyListeners(mreg, metricRegRemoveLsnrs, log); - DistributedMetaStorage metastorage0 = metastorage; if (metastorage0 == null) From 93af1dcc703bfc8c6abb465cd52bc1ce56f6f843 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 15:09:30 +0300 Subject: [PATCH 4/8] IGNITE-12580: Failing test repeated run --- ...alModeChangeDuringRebalancingSelfTest.java | 37 ------------------- .../IgnitePdsNativeIoTestSuite2.java | 3 -- 2 files changed, 40 deletions(-) delete mode 100644 modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java diff --git a/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java b/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java deleted file mode 100644 index 400f3298b24c5..0000000000000 --- a/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.persistence; - -import org.junit.Test; - -/** - * Version of test to be executed in Direct IO suite. - * Contains reduced number of records, because Direct IO does not support tmpfs. - */ -public class IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest extends LocalWalModeChangeDuringRebalancingSelfTest { - /** {@inheritDoc} */ - @Override protected int getKeysCount() { - return 1_000; - } - - /** {@inheritDoc} */ - @Test - @Override public void testWithExchangesMerge() throws Exception { - - super.testWithExchangesMerge(); - } -} diff --git a/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java b/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java index 714b562146a39..ae0e49d32c7fd 100644 --- a/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java +++ b/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; import org.apache.ignite.internal.processors.cache.persistence.DiskPageCompressionIntegrationDirectIOTest; -import org.apache.ignite.internal.processors.cache.persistence.IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest; import org.apache.ignite.internal.processors.cache.persistence.IgniteNativeIoPdsRecoveryAfterFileCorruptionTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.IgniteNativeIoWalFlushFsyncSelfTest; import org.apache.ignite.testframework.junits.DynamicSuite; @@ -44,8 +43,6 @@ public static List> suite() { //Integrity test with reduced count of pages. suite.add(IgniteNativeIoPdsRecoveryAfterFileCorruptionTest.class); - suite.add(IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.class); - suite.add(IgniteNativeIoWalFlushFsyncSelfTest.class); return suite; From 7f6b2626ad6f6270dd2f1676d966db424c9b6f29 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 18:11:38 +0300 Subject: [PATCH 5/8] IGNITE-12580: Failing test repeated run --- .../java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java index cce5733dd01e5..f2a51dff1622a 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java @@ -90,7 +90,7 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - for (int i=0; i<1000; i++) { + for (int i=0; i<500; i++) { suite.add(LocalWalModeChangeDuringRebalancingSelfTest.class); } /* From 0a37006d2541eb40e4e285d2f983cf08a8551318 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 20:32:10 +0300 Subject: [PATCH 6/8] IGNITE-12580: Failing test repeated run --- .../java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java index f2a51dff1622a..639077ceaabc7 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java @@ -90,7 +90,7 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - for (int i=0; i<500; i++) { + for (int i=0; i<250; i++) { suite.add(LocalWalModeChangeDuringRebalancingSelfTest.class); } /* From 650067922913e07cbc2b0b67bb511b4e6e0f6e98 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Tue, 28 Jan 2020 23:23:05 +0300 Subject: [PATCH 7/8] IGNITE-12580: Failing test repeated run --- .../java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java index 639077ceaabc7..763360d3365dc 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java @@ -90,7 +90,7 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - for (int i=0; i<250; i++) { + for (int i=0; i<100; i++) { suite.add(LocalWalModeChangeDuringRebalancingSelfTest.class); } /* From 37f600954bc771b7e38cfb5ea80935e10edde32a Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 29 Jan 2020 10:44:36 +0300 Subject: [PATCH 8/8] IGNITE-12580: revert unnecessary changes. --- ...alModeChangeDuringRebalancingSelfTest.java | 283 ++++++++++++++++++ .../testsuites/IgnitePdsTestSuite2.java | 21 +- ...alModeChangeDuringRebalancingSelfTest.java | 37 +++ .../IgnitePdsNativeIoTestSuite2.java | 3 + 4 files changed, 339 insertions(+), 5 deletions(-) create mode 100644 modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java index 643f7b699c9f4..5e605300f75f5 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/LocalWalModeChangeDuringRebalancingSelfTest.java @@ -22,6 +22,8 @@ import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.file.OpenOption; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicReference; @@ -32,6 +34,7 @@ import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; @@ -57,6 +60,7 @@ import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.MvccFeatureChecker; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assert; import org.junit.Test; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -230,6 +234,16 @@ public void testWalDisabledDuringRebalancing() throws Exception { doTestSimple(); } + /** + * @throws Exception If failed. + */ + @Test + public void testWalNotDisabledIfParameterSetToFalse() throws Exception { + disableWalDuringRebalancing = false; + + doTestSimple(); + } + /** * @throws Exception If failed. */ @@ -305,6 +319,178 @@ else if (timestamp >= rebalanceStartedTimestamp && timestamp <= rebalanceFinishe assertEquals(disableWalDuringRebalancing ? 1 : 0, checkpointsAfterRebalance); // checkpoint if WAL was re-activated } + /** + * @throws Exception If failed. + */ + @Test + public void testWalDisabledDuringRebalancingWithPendingTxTracker() throws Exception { + enablePendingTxTracker = true; + dfltCacheBackupCnt = 2; + + Ignite ignite = startGrids(3); + + ignite.cluster().baselineAutoAdjustEnabled(false); + ignite.cluster().active(true); + + ignite.cluster().setBaselineTopology(3); + + IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); + + stopGrid(2); + + awaitExchange((IgniteEx)ignite); + + // Ensure each partition has received an update. + for (int k = 0; k < RendezvousAffinityFunction.DFLT_PARTITION_COUNT; k++) + cache.put(k, k); + + IgniteEx newIgnite = startGrid(2); + + awaitExchange(newIgnite); + + CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); + + assertFalse(grpCtx.walEnabled()); + + long rebalanceStartedTs = System.currentTimeMillis(); + + for (Ignite g : G.allGrids()) + g.cache(DEFAULT_CACHE_NAME).rebalance(); + + awaitPartitionMapExchange(); + + assertTrue(grpCtx.walEnabled()); + + long rebalanceFinishedTs = System.currentTimeMillis(); + + CheckpointHistory cpHist = + ((GridCacheDatabaseSharedManager)newIgnite.context().cache().context().database()).checkpointHistory(); + + assertNotNull(cpHist); + + // Ensure there was a checkpoint on WAL re-activation. + assertEquals( + 1, + cpHist.checkpoints() + .stream() + .filter(ts -> rebalanceStartedTs <= ts && ts <= rebalanceFinishedTs) + .count()); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testLocalAndGlobalWalStateInterdependence() throws Exception { + Ignite ignite = startGrids(3); + + ignite.cluster().baselineAutoAdjustEnabled(false); + ignite.cluster().active(true); + + IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); + + for (int k = 0; k < getKeysCount(); k++) + cache.put(k, k); + + IgniteEx newIgnite = startGrid(3); + + newIgnite.cluster().setBaselineTopology(ignite.cluster().nodes()); + + awaitExchange(newIgnite); + + CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); + + assertFalse(grpCtx.walEnabled()); + + ignite.cluster().disableWal(DEFAULT_CACHE_NAME); + + for (Ignite g : G.allGrids()) + g.cache(DEFAULT_CACHE_NAME).rebalance(); + + awaitPartitionMapExchange(); + + assertFalse(grpCtx.walEnabled()); // WAL is globally disabled + + ignite.cluster().enableWal(DEFAULT_CACHE_NAME); + + assertTrue(grpCtx.walEnabled()); + } + + /** + * Test that local WAL mode changing works well with exchanges merge. + * + * @throws Exception If failed. + */ + @Test + public void testWithExchangesMerge() throws Exception { + final int nodeCnt = 4; + final int keyCnt = getKeysCount(); + + Ignite ignite = startGrids(nodeCnt); + + ignite.cluster().active(true); + + IgniteCache cache = ignite.cache(REPL_CACHE); + + for (int k = 0; k < keyCnt; k++) + cache.put(k, k); + + stopGrid(2); + stopGrid(3); + + // Rewrite data to trigger further rebalance. + for (int k = 0; k < keyCnt; k++) + cache.put(k, k * 2); + + // Start several grids in parallel to trigger exchanges merge. + startGridsMultiThreaded(2, 2); + + for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { + CacheGroupContext grpCtx = grid(nodeIdx).cachex(REPL_CACHE).context().group(); + + assertTrue(GridTestUtils.waitForCondition(new GridAbsPredicate() { + @Override public boolean apply() { + return !grpCtx.walEnabled(); + } + }, 5_000)); + } + + // Invoke rebalance manually. + for (Ignite g : G.allGrids()) + g.cache(REPL_CACHE).rebalance(); + + awaitPartitionMapExchange(); + + for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { + CacheGroupContext grpCtx = grid(nodeIdx).cachex(REPL_CACHE).context().group(); + + assertTrue(grpCtx.walEnabled()); + } + + // Check no data loss. + for (int nodeIdx = 2; nodeIdx < nodeCnt; nodeIdx++) { + IgniteCache cache0 = grid(nodeIdx).cache(REPL_CACHE); + + for (int k = 0; k < keyCnt; k++) + Assert.assertEquals("nodeIdx=" + nodeIdx + ", key=" + k, (Integer)(2 * k), cache0.get(k)); + } + } + + /** + * @throws Exception If failed. + */ + @Test + public void testParallelExchangeDuringRebalance() throws Exception { + doTestParallelExchange(supplyMessageLatch); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testParallelExchangeDuringCheckpoint() throws Exception { + doTestParallelExchange(fileIOLatch); + } /** * @throws Exception If failed. @@ -355,6 +541,103 @@ private void doTestParallelExchange(AtomicReference latchRef) th assertTrue(waitForCondition(grpCtx::walEnabled, 2_000)); } + /** + * @throws Exception If failed. + */ + @Test + public void testDataClearedAfterRestartWithDisabledWal() throws Exception { + Ignite ignite = startGrid(0); + + ignite.cluster().baselineAutoAdjustEnabled(false); + ignite.cluster().active(true); + + IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); + + int keysCnt = getKeysCount(); + + for (int k = 0; k < keysCnt; k++) + cache.put(k, k); + + IgniteEx newIgnite = startGrid(1); + + newIgnite.cluster().setBaselineTopology(2); + + // Await fully exchange complete. + awaitExchange(newIgnite); + + CacheGroupContext grpCtx = newIgnite.cachex(DEFAULT_CACHE_NAME).context().group(); + + assertFalse(grpCtx.localWalEnabled()); + + stopGrid(1); + stopGrid(0); + + newIgnite = startGrid(1); + + newIgnite.cluster().active(true); + + newIgnite.cluster().setBaselineTopology(newIgnite.cluster().nodes()); + + cache = newIgnite.cache(DEFAULT_CACHE_NAME); + + for (int k = 0; k < keysCnt; k++) + assertFalse("k=" + k +", v=" + cache.get(k), cache.containsKey(k)); + + Set keys = new TreeSet<>(); + + for (int k = 0; k < keysCnt; k++) + keys.add(k); + + assertFalse(cache.containsKeys(keys)); + } + + /** + * @throws Exception If failed. + */ + @Test + public void testWalNotDisabledAfterShrinkingBaselineTopology() throws Exception { + Ignite ignite = startGrids(4); + + ignite.cluster().baselineAutoAdjustEnabled(false); + ignite.cluster().active(true); + + IgniteCache cache = ignite.cache(DEFAULT_CACHE_NAME); + + int keysCnt = getKeysCount(); + + for (int k = 0; k < keysCnt; k++) + cache.put(k, k); + + for (Ignite g : G.allGrids()) { + CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); + + assertTrue(grpCtx.walEnabled()); + } + + stopGrid(2); + + ignite.cluster().setBaselineTopology(5); + + // Await fully exchange complete. + awaitExchange((IgniteEx)ignite); + + for (Ignite g : G.allGrids()) { + CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); + + assertTrue(grpCtx.walEnabled()); + + g.cache(DEFAULT_CACHE_NAME).rebalance(); + } + + awaitPartitionMapExchange(); + + for (Ignite g : G.allGrids()) { + CacheGroupContext grpCtx = ((IgniteEx)g).cachex(DEFAULT_CACHE_NAME).context().group(); + + assertTrue(grpCtx.walEnabled()); + } + } + /** * * @param ig Ignite. diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java index 763360d3365dc..dcd60b96a1759 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite2.java @@ -31,6 +31,13 @@ import org.apache.ignite.internal.processors.cache.persistence.IgniteRebalanceScheduleResendPartitionsTest; import org.apache.ignite.internal.processors.cache.persistence.LocalWalModeChangeDuringRebalancingSelfTest; import org.apache.ignite.internal.processors.cache.persistence.LocalWalModeNoChangeDuringRebalanceOnNonNodeAssignTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.ClientAffinityAssignmentWithBaselineTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.ClusterActivationEventTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.ClusterActivationEventWithPersistenceTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteAbsentEvictionNodeOutOfBaselineTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteAllBaselineNodesOnlineFullApiSelfTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteOfflineBaselineNodeFullApiSelfTest; +import org.apache.ignite.internal.processors.cache.persistence.baseline.IgniteOnlineNodeOutOfBaselineFullApiSelfTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsRebalancingOnNotStableTopologyTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsReserveWalSegmentsTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsReserveWalSegmentsWithCompactionTest; @@ -64,11 +71,19 @@ import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalDeletionArchiveFsyncTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalDeletionArchiveLogOnlyTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.WalRolloverTypesTest; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteDataIntegrityTests; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteFsyncReplayWalIteratorInvalidCrcTest; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgnitePureJavaCrcCompatibility; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteReplayWalIteratorInvalidCrcTest; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteStandaloneWalIteratorInvalidCrcTest; +import org.apache.ignite.internal.processors.cache.persistence.db.wal.crc.IgniteWithoutArchiverWalIteratorInvalidCrcTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.reader.IgniteWalReaderTest; import org.apache.ignite.internal.processors.cache.persistence.freelist.FreeListCachingTest; import org.apache.ignite.internal.processors.cache.persistence.wal.reader.FilteredWalIteratorTest; import org.apache.ignite.internal.processors.cache.persistence.wal.reader.StandaloneWalRecordsIteratorTest; import org.apache.ignite.internal.processors.cache.persistence.wal.scanner.WalScannerTest; +import org.apache.ignite.internal.processors.cluster.ClusterStateChangeEventTest; +import org.apache.ignite.internal.processors.cluster.ClusterStateChangeEventWithPersistenceTest; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.DynamicSuite; import org.junit.runner.RunWith; @@ -90,10 +105,6 @@ public static List> suite() { public static List> suite(Collection ignoredTests) { List> suite = new ArrayList<>(); - for (int i=0; i<100; i++) { - suite.add(LocalWalModeChangeDuringRebalancingSelfTest.class); - } -/* // Integrity test. GridTestUtils.addTestIfNeeded(suite, IgniteDataIntegrityTests.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, IgniteStandaloneWalIteratorInvalidCrcTest.class, ignoredTests); @@ -116,7 +127,7 @@ public static List> suite(Collection ignoredTests) { GridTestUtils.addTestIfNeeded(suite, ClusterActivationEventWithPersistenceTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClusterStateChangeEventTest.class, ignoredTests); GridTestUtils.addTestIfNeeded(suite, ClusterStateChangeEventWithPersistenceTest.class, ignoredTests); -*/ + return suite; } diff --git a/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java b/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java new file mode 100644 index 0000000000000..400f3298b24c5 --- /dev/null +++ b/modules/direct-io/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.java @@ -0,0 +1,37 @@ +/* + * 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.persistence; + +import org.junit.Test; + +/** + * Version of test to be executed in Direct IO suite. + * Contains reduced number of records, because Direct IO does not support tmpfs. + */ +public class IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest extends LocalWalModeChangeDuringRebalancingSelfTest { + /** {@inheritDoc} */ + @Override protected int getKeysCount() { + return 1_000; + } + + /** {@inheritDoc} */ + @Test + @Override public void testWithExchangesMerge() throws Exception { + + super.testWithExchangesMerge(); + } +} diff --git a/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java b/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java index ae0e49d32c7fd..714b562146a39 100644 --- a/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java +++ b/modules/direct-io/src/test/java/org/apache/ignite/testsuites/IgnitePdsNativeIoTestSuite2.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.ignite.internal.processors.cache.persistence.DiskPageCompressionIntegrationDirectIOTest; +import org.apache.ignite.internal.processors.cache.persistence.IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest; import org.apache.ignite.internal.processors.cache.persistence.IgniteNativeIoPdsRecoveryAfterFileCorruptionTest; import org.apache.ignite.internal.processors.cache.persistence.db.wal.IgniteNativeIoWalFlushFsyncSelfTest; import org.apache.ignite.testframework.junits.DynamicSuite; @@ -43,6 +44,8 @@ public static List> suite() { //Integrity test with reduced count of pages. suite.add(IgniteNativeIoPdsRecoveryAfterFileCorruptionTest.class); + suite.add(IgniteNativeIoLocalWalModeChangeDuringRebalancingSelfTest.class); + suite.add(IgniteNativeIoWalFlushFsyncSelfTest.class); return suite;