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);
 

Reply via email to