Repository: ignite Updated Branches: refs/heads/master 4f515fe22 -> 8f2d25f5b
IGNITE-7577 Fixing public API active flag on baseline changes - Fixes #3455. Signed-off-by: Alexey Goncharuk <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/8f2d25f5 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/8f2d25f5 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/8f2d25f5 Branch: refs/heads/master Commit: 8f2d25f5b3284fc7321c689cb4232bfacedf13f8 Parents: 4f515fe Author: Alexey Goncharuk <[email protected]> Authored: Wed Jan 31 11:24:57 2018 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Wed Jan 31 11:24:57 2018 +0300 ---------------------------------------------------------------------- .../cluster/DiscoveryDataClusterState.java | 9 +- .../cluster/GridClusterStateProcessor.java | 2 +- .../distributed/CacheBaselineTopologyTest.java | 102 +++++++++++-------- 3 files changed, 71 insertions(+), 42 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/8f2d25f5/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/DiscoveryDataClusterState.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/DiscoveryDataClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/DiscoveryDataClusterState.java index 1c8e830..dea2ce7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/DiscoveryDataClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/DiscoveryDataClusterState.java @@ -146,13 +146,20 @@ public class DiscoveryDataClusterState implements Serializable { } /** - * @return {@code True} if state change is in progress. + * @return {@code True} if any cluster state change is in progress (e.g. active state change, baseline change). */ public boolean transition() { return transitionReqId != null; } /** + * @return {@code True} if cluster active state change is in progress, {@code false} otherwise. + */ + public boolean activeStateChanging() { + return transition() && active != prevState.active; + } + + /** * @return State change exchange version. */ public AffinityTopologyVersion transitionTopologyVersion() { http://git-wip-us.apache.org/repos/asf/ignite/blob/8f2d25f5/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java index f28df8a..aa23b61 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/GridClusterStateProcessor.java @@ -180,7 +180,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I assert globalState != null; - if (globalState.transition()) { + if (globalState.transition() && globalState.activeStateChanging()) { Boolean transitionRes = globalState.transitionResult(); if (transitionRes != null) http://git-wip-us.apache.org/repos/asf/ignite/blob/8f2d25f5/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheBaselineTopologyTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheBaselineTopologyTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheBaselineTopologyTest.java index e70773d..7b40b03 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheBaselineTopologyTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheBaselineTopologyTest.java @@ -30,8 +30,6 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheAtomicityMode; import org.apache.ignite.cache.CacheMode; -import org.apache.ignite.cache.CacheWriteSynchronizationMode; -import org.apache.ignite.cache.PartitionLossPolicy; import org.apache.ignite.cluster.BaselineNode; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; @@ -40,9 +38,10 @@ import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.WALMode; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology; -import org.apache.ignite.internal.util.lang.GridAbsPredicate; -import org.apache.ignite.internal.util.typedef.PA; +import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -85,6 +84,8 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + cfg.setConsistentId(igniteInstanceName); + cfg.setDataStorageConfiguration( new DataStorageConfiguration().setDefaultDataRegionConfiguration( new DataRegionConfiguration() @@ -116,7 +117,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { IgniteEx ignite = grid(0); - ignite.active(true); + ignite.cluster().active(true); awaitPartitionMapExchange(); @@ -258,6 +259,42 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { } /** + * @throws Exception if failed. + */ + public void testClusterActiveWhileBaselineChanging() throws Exception { + startGrids(NODE_COUNT); + + IgniteEx ig = grid(0); + + ig.cluster().active(true); + + assertTrue(ig.cluster().active()); + + startGrid(NODE_COUNT); + + IgniteInternalFuture fut = GridTestUtils.runAsync(() -> { + try { + U.sleep(100); + } + catch (IgniteInterruptedCheckedException e) { + e.printStackTrace(); + } + ig.cluster().setBaselineTopology(NODE_COUNT + 1); + }); + + while (!fut.isDone()) { + assertTrue(grid(0).cluster().active()); + assertTrue(grid(0).context().state().publicApiActiveState(false)); + assertTrue(grid(NODE_COUNT).cluster().active()); + assertTrue(grid(NODE_COUNT).context().state().publicApiActiveState(false)); + } + + assertNull(String.valueOf(fut.error()), fut.error()); + + assertEquals(NODE_COUNT + 1, ig.cluster().currentBaselineTopology().size()); + } + + /** * @throws Exception If failed. */ private void testBaselineTopologyChanges(boolean fromClient) throws Exception { @@ -275,7 +312,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { else ignite = grid(0); - ignite.active(true); + ignite.cluster().active(true); awaitPartitionMapExchange(); @@ -287,14 +324,13 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { nodes.put(ig.cluster().localNode(), ig); } - IgniteCache<Integer, Integer> cache = - ignite.createCache( - new CacheConfiguration<Integer, Integer>() - .setName(CACHE_NAME) - .setCacheMode(PARTITIONED) - .setBackups(1) - .setPartitionLossPolicy(READ_ONLY_SAFE) - ); + ignite.createCache( + new CacheConfiguration<Integer, Integer>() + .setName(CACHE_NAME) + .setCacheMode(PARTITIONED) + .setBackups(1) + .setPartitionLossPolicy(READ_ONLY_SAFE) + ); int key = -1; @@ -307,8 +343,6 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { assert key >= 0; - int part = ignite.affinity(CACHE_NAME).partition(key); - Collection<ClusterNode> initialMapping = ignite.affinity(CACHE_NAME).mapKeyToPrimaryAndBackups(key); assert initialMapping.size() == 2 : initialMapping; @@ -474,7 +508,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { IgniteEx ig = grid(0); - ig.active(true); + ig.cluster().active(true); IgniteCache<Integer, Integer> cache = ig.createCache( @@ -544,14 +578,13 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { primary = grid(primaryIdx); backup = grid(backupIdx); - boolean activated = GridTestUtils.waitForCondition(new GridAbsPredicate() { - @Override public boolean apply() { - for (int i = 0; i < NODE_COUNT; i++) - if (!grid(i).active()) - return false; - - return true; + boolean activated = GridTestUtils.waitForCondition(() -> { + for (int i = 0; i < NODE_COUNT; i++) { + if (!grid(i).cluster().active()) + return false; } + + return true; }, 10_000); assert activated; @@ -580,7 +613,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { Ignite ignite3 = grid(3); - ignite3.active(true); + ignite3.cluster().active(true); CacheConfiguration<Object, Object> repCacheCfg = new CacheConfiguration<>("replicated") .setCacheMode(CacheMode.REPLICATED) @@ -600,12 +633,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { startGrids(5); - GridTestUtils.waitForCondition(new PA() { - @Override - public boolean apply() { - return grid(0).cluster().active(); - } - }, getTestTimeout()); + GridTestUtils.waitForCondition(() -> grid(0).cluster().active(), getTestTimeout()); for (int g = 0; g < 5; g++) { for (int i = 0; i < 100; i++) @@ -621,7 +649,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { Ignite ignite3 = grid(3); - ignite3.active(true); + ignite3.cluster().active(true); stopGrid(0); @@ -640,12 +668,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { startGrids(5); - GridTestUtils.waitForCondition(new PA() { - @Override - public boolean apply() { - return grid(0).cluster().active(); - } - }, getTestTimeout()); + GridTestUtils.waitForCondition(() -> grid(0).cluster().active(), getTestTimeout()); for (int g = 0; g < 5; g++) { for (int i = 0; i < 2048; i++) @@ -678,8 +701,7 @@ public class CacheBaselineTopologyTest extends GridCommonAbstractTest { private Collection<BaselineNode> baselineNodes(Collection<ClusterNode> clNodes) { Collection<BaselineNode> res = new ArrayList<>(clNodes.size()); - for (ClusterNode clN : clNodes) - res.add(clN); + res.addAll(clNodes); return res; }
