IGNITE-9741 Fix SegmentArchivedStorage and SegmentCompressStorage remain `iterrupted` after de-activation occurs before activation - Fixes #4878.
Signed-off-by: Dmitriy Govorukhin <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/caa4b0aa Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/caa4b0aa Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/caa4b0aa Branch: refs/heads/ignite-5797 Commit: caa4b0aa9d117d08d78186c82627b23b1d21fb5e Parents: 2f9faf1 Author: Anton Kalashnikov <[email protected]> Authored: Mon Oct 1 17:39:24 2018 +0300 Committer: Dmitriy Govorukhin <[email protected]> Committed: Mon Oct 1 17:39:24 2018 +0300 ---------------------------------------------------------------------- .../wal/FileWriteAheadLogManager.java | 7 +- .../IgniteClusterActivateDeactivateTest.java | 86 +++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/caa4b0aa/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java index 8388bb2..28d9b07 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java @@ -323,7 +323,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl private final SegmentFileInputFactory segmentFileInputFactory; /** Holder of actual information of latest manipulation on WAL segments. */ - private final SegmentAware segmentAware; + private volatile SegmentAware segmentAware; /** Updater for {@link #currHnd}, used for verify there are no concurrent update for current log segment handle */ private static final AtomicReferenceFieldUpdater<FileWriteAheadLogManager, FileWriteHandle> CURR_HND_UPD = @@ -422,7 +422,6 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl evt = ctx.event(); failureProcessor = ctx.failure(); - segmentAware = new SegmentAware(dsCfg.getWalSegments(), dsCfg.isWalCompactionEnabled()); } /** @@ -480,6 +479,8 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl IgniteBiTuple<Long, Long> tup = scanMinMaxArchiveIndices(); + segmentAware = new SegmentAware(dsCfg.getWalSegments(), dsCfg.isWalCompactionEnabled()); + segmentAware.lastTruncatedArchiveIdx(tup == null ? -1 : tup.get1() - 1); long lastAbsArchivedIdx = tup == null ? -1 : tup.get2(); @@ -2412,7 +2413,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl private abstract static class FileHandle { /** I/O interface for read/write operations with file */ SegmentIO fileIO; - + /** Segment idx corresponded to fileIo*/ final long segmentIdx; http://git-wip-us.apache.org/repos/asf/ignite/blob/caa4b0aa/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClusterActivateDeactivateTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClusterActivateDeactivateTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClusterActivateDeactivateTest.java index f6b4ddd..87d7d16 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClusterActivateDeactivateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClusterActivateDeactivateTest.java @@ -72,6 +72,8 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest /** Non-persistent data region name. */ private static final String NO_PERSISTENCE_REGION = "no-persistence-region"; + /** */ + private static final int DEFAULT_CACHES_COUNT = 2; /** */ boolean client; @@ -122,6 +124,8 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest memCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration() .setMaxSize(150L * 1024 * 1024) .setPersistenceEnabled(persistenceEnabled())); + memCfg.setWalSegments(2); + memCfg.setWalSegmentSize(512 * 1024); memCfg.setDataRegionConfigurations(new DataRegionConfiguration() .setMaxSize(150L * 1024 * 1024) @@ -227,7 +231,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest assertTrue(ignite(i).cluster().active()); for (int i = 0; i < srvs + clients; i++) { - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(i), CACHE_NAME_PREFIX + c, true); checkCache(ignite(i), CU.UTILITY_CACHE_NAME, true); @@ -239,7 +243,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest startGrid(srvs + clients); - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(srvs + clients), CACHE_NAME_PREFIX + c, true); checkCaches(srvs + clients + 1, CACHES); @@ -248,18 +252,76 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest startGrid(srvs + clients + 1); - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(srvs + clients + 1), CACHE_NAME_PREFIX + c, false); checkCaches(srvs + clients + 2, CACHES); } /** + * @throws Exception If failed. + */ + public void testReActivateSimple_5_Servers_4_Clients_FromClient() throws Exception { + reactivateSimple(5, 4, 6); + } + + /** + * @throws Exception If failed. + */ + public void testReActivateSimple_5_Servers_4_Clients_FromServer() throws Exception { + reactivateSimple(5, 4, 0); + } + + /** + * @param srvs Number of servers. + * @param clients Number of clients. + * @param activateFrom Index of node stating activation. + * @throws Exception If failed. + */ + public void reactivateSimple(int srvs, int clients, int activateFrom) throws Exception { + activateSimple(srvs, clients, activateFrom); + + rolloverSegmentAtLeastTwice(activateFrom); + + for (int i = 0; i < srvs + clients; i++) { + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) + checkCache(ignite(i), CACHE_NAME_PREFIX + c, true); + + checkCache(ignite(i), CU.UTILITY_CACHE_NAME, true); + } + + ignite(activateFrom).cluster().active(false); + + ignite(activateFrom).cluster().active(true); + + rolloverSegmentAtLeastTwice(activateFrom); + + for (int i = 0; i < srvs + clients; i++) { + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) + checkCache(ignite(i), CACHE_NAME_PREFIX + c, true); + + checkCache(ignite(i), CU.UTILITY_CACHE_NAME, true); + } + } + + /** + * Work directory have 2 segments by default. This method do full circle. + */ + private void rolloverSegmentAtLeastTwice(int activateFrom) { + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) { + IgniteCache<Object, Object> cache = ignite(activateFrom).cache(CACHE_NAME_PREFIX + c); + //this should be enough including free-,meta- page and etc. + for (int i = 0; i < 1000; i++) + cache.put(i, i); + } + } + + /** * @param nodes Number of nodes. * @param caches Number of caches. */ final void checkCaches(int nodes, int caches) { - for (int i = 0; i < nodes; i++) { + for (int i = 0; i < nodes; i++) { for (int c = 0; c < caches; c++) { IgniteCache<Integer, Integer> cache = ignite(i).cache(CACHE_NAME_PREFIX + c); @@ -322,7 +384,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest activeFut.get(); startFut.get(); - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(2), CACHE_NAME_PREFIX + c, true); if (withNewCache) { @@ -379,7 +441,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest } if (blockMsgNodes.length == 0) - blockMsgNodes = new int[]{1}; + blockMsgNodes = new int[] {1}; final AffinityTopologyVersion STATE_CHANGE_TOP_VER = new AffinityTopologyVersion(srvs + clients, minorVer); @@ -474,7 +536,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest ignite(2).cluster().active(true); - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(2), CACHE_NAME_PREFIX + c, true); if (withNewCache) { @@ -646,7 +708,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest } for (int i = 0; i < srvs; i++) { - for (int c = 0; c < 2; c++) + for (int c = 0; c < DEFAULT_CACHES_COUNT; c++) checkCache(ignite(i), CACHE_NAME_PREFIX + c, true); } @@ -939,7 +1001,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest public void testInactiveTopologyChanges() throws Exception { testSpi = true; - testSpiRecord = new Class[]{GridDhtPartitionsSingleMessage.class, GridDhtPartitionsFullMessage.class}; + testSpiRecord = new Class[] {GridDhtPartitionsSingleMessage.class, GridDhtPartitionsFullMessage.class}; active = false; @@ -1141,13 +1203,13 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest client = false; - IgniteInternalFuture startFut1 = GridTestUtils.runAsync((Callable) () -> { + IgniteInternalFuture startFut1 = GridTestUtils.runAsync((Callable)() -> { startGrid(4); return null; }, "start-node1"); - IgniteInternalFuture startFut2 = GridTestUtils.runAsync((Callable) () -> { + IgniteInternalFuture startFut2 = GridTestUtils.runAsync((Callable)() -> { startGrid(5); return null; @@ -1184,7 +1246,7 @@ public class IgniteClusterActivateDeactivateTest extends GridCommonAbstractTest final int nodes = 2; - IgniteEx crd = (IgniteEx) startGrids(nodes); + IgniteEx crd = (IgniteEx)startGrids(nodes); crd.cluster().active(true);
