From 6ecdbf8fbd36e6c95c2786deefafc05d71993f93 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Mon, 3 Feb 2020 19:20:07 +0300 Subject: [PATCH 01/82] IGNITE-12597 : first impl --- .../commandline/DeactivateCommand.java | 96 ++++++++++++++++++- .../ignite/util/GridCommandHandlerTest.java | 39 ++++++++ 2 files changed, 133 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 0704fa88e2e60..1b3dfc4d8149a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -21,6 +21,21 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; +import java.util.Collection; +import java.util.List; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteException; +import org.apache.ignite.compute.ComputeJob; +import org.apache.ignite.compute.ComputeJobAdapter; +import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.compute.ComputeTaskSplitAdapter; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.internal.processors.task.GridInternal; +import java.util.Collections; +import org.apache.ignite.internal.visor.VisorTaskArgument; +import org.apache.ignite.resources.IgniteInstanceResource; +import org.jetbrains.annotations.Nullable; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; @@ -36,9 +51,12 @@ public class DeactivateCommand implements Command { /** Cluster name. */ private String clusterName; + /** Force cluster deactivation even it might have in-mem caches. */ + private boolean force; + /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { - Command.usage(logger, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION)); + Command.usage(logger, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION, "--force")); } /** {@inheritDoc} */ @@ -50,7 +68,7 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public String confirmationPrompt() { - return "Warning: the command will deactivate a cluster \"" + clusterName + "\"."; + return "Warning: the command will deactivate a cluster \"" + clusterName + "\". Make sure there are no caches not backed with persistent storage."; } /** @@ -63,6 +81,12 @@ public class DeactivateCommand implements Command { logger.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { + + if (!force && hasInMemCaches(client, clientCfg)) { + throw new IllegalStateException("Your cluster has in-memory cache configured. " + + "During deactivation all data from these caches will be cleared! Use --force to skip this."); + } + GridClientClusterState state = client.state(); state.active(false); @@ -78,6 +102,27 @@ public class DeactivateCommand implements Command { return null; } + /** {@inheritDoc} */ + @Override public void parseArguments(CommandArgIterator argIter) { + if (argIter.hasNextArg()) { + String arg = argIter.peekNextArg(); + if ("--force".equalsIgnoreCase(arg)) { + force = true; + argIter.nextArg(""); + } + } + } + + /** Launches task to search for in-mem caches. */ + boolean hasInMemCaches(GridClient client, GridClientConfiguration clientCfg) throws Exception { + return TaskExecutor.executeTask( + client, + FindNotPersistentCachesTask.class, + null, + clientCfg + ); + } + /** {@inheritDoc} */ @Override public Void arg() { return null; @@ -87,4 +132,51 @@ public class DeactivateCommand implements Command { @Override public String name() { return DEACTIVATE.toCommandName(); } + + /** Searches for any non-persistent cache. */ + private static class FindNotPersistentCachesJob extends ComputeJobAdapter { + + @IgniteInstanceResource + private Ignite ignite; + + @Override public Boolean execute() throws IgniteException { + //Find data region to set persistent flag + for(String cacheName : ignite.cacheNames()){ + CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); + + DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null + ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() + : null; + + if (regionCfg == null) { + for (DataRegionConfiguration dataRegionCfg : ignite.configuration().getDataStorageConfiguration() + .getDataRegionConfigurations()) { + if (dataRegionCfg.getName().equals(cacheCfg.getDataRegionName())) { + regionCfg = dataRegionCfg; + break; + } + } + } + + if(!regionCfg.isPersistenceEnabled()) + return true; + } + + return false; + } + } + + /** Searches for any non-persistent cache. */ + @GridInternal + private static class FindNotPersistentCachesTask extends ComputeTaskSplitAdapter { + @Override + protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { + return Collections.singletonList(new FindNotPersistentCachesJob()); + } + + @Nullable @Override public Boolean reduce(List results) throws IgniteException { + ComputeJobResult jobResult = results.get(0); + return jobResult.getData(); + } + } } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index a9c8620cdbc1d..121d055030cee 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -253,6 +253,45 @@ public void testDeactivate() throws Exception { assertContains(log, testOut.toString(), "Command deprecated. Use --set-state instead."); } + /** + * Test deactivation works via control.sh when a non-persistent cache involved. + * + * @throws Exception If failed. + */ + @Test + public void testDeactivateNonPersistent() throws Exception { + dataRegionConfiguration = new DataRegionConfiguration() + .setName("non-persistent-dataRegion") + .setPersistenceEnabled(false); + + Ignite ignite = startGrids(1); + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + + ignite.cluster().state(ACTIVE); + + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + + injectTestSystemOut(); + + ignite.createCache(new CacheConfiguration<>("non-persistent-cache") + .setDataRegionName("non-persistent-dataRegion")); + + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); + + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + assertContains(log, testOut.toString(), "Your cluster has in-memory cache configured. " + + "During deactivation all data from these caches will be cleared!"); + + assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + } + /** * Test the deactivation command on the active and no cluster with checking * the cluster name(which is set through the system property) in From 4d4aae017a153636e31438202d2a586a137e957e Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 4 Feb 2020 12:31:32 +0300 Subject: [PATCH 02/82] IGNITE-12597 : + checking of reuse-data-region system property --- .../commandline/DeactivateCommand.java | 40 ++++++++++++------- .../ignite/util/GridCommandHandlerTest.java | 17 +++++--- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 1b3dfc4d8149a..19f5571feb745 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -36,11 +36,13 @@ import org.apache.ignite.internal.visor.VisorTaskArgument; import org.apache.ignite.resources.IgniteInstanceResource; import org.jetbrains.annotations.Nullable; +import org.apache.ignite.IgniteSystemProperties; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * Command to deactivate cluster. @@ -55,8 +57,8 @@ public class DeactivateCommand implements Command { private boolean force; /** {@inheritDoc} */ - @Override public void printUsage(Logger logger) { - Command.usage(logger, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION, "--force")); + @Override public void printUsage(Logger log) { + Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION, "--force")); } /** {@inheritDoc} */ @@ -68,7 +70,10 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public String confirmationPrompt() { - return "Warning: the command will deactivate a cluster \"" + clusterName + "\". Make sure there are no caches not backed with persistent storage."; + return "Warning: the command will deactivate a cluster \"" + clusterName + "\"." + + (IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) + ? "" + : " Make sure there are no caches not backed with persistent storage."); } /** @@ -77,24 +82,26 @@ public class DeactivateCommand implements Command { * @param clientCfg Client configuration. * @throws Exception If failed to deactivate. */ - @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { - logger.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); + @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { + log.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { - if (!force && hasInMemCaches(client, clientCfg)) { - throw new IllegalStateException("Your cluster has in-memory cache configured. " + - "During deactivation all data from these caches will be cleared! Use --force to skip this."); + //Search for in-memory-only caches. Warn of possible data loss. + if (!IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) && !force + && hasInMemCaches(client, clientCfg)) { + throw new IllegalStateException("The cluster has at least one cache configured without persistense. " + + "During deactivation all data from these caches will be erased! Type --force to proceed."); } GridClientClusterState state = client.state(); state.active(false); - logger.info("Cluster deactivated"); + log.info("Cluster deactivated."); } catch (Exception e) { - logger.severe("Failed to deactivate cluster."); + log.severe("Failed to deactivate cluster."); throw e; } @@ -139,8 +146,10 @@ private static class FindNotPersistentCachesJob extends ComputeJobAdapter { @IgniteInstanceResource private Ignite ignite; + /** */ + @SuppressWarnings("unchecked") @Override public Boolean execute() throws IgniteException { - //Find data region to set persistent flag + //Find data region to set persistent flag. for(String cacheName : ignite.cacheNames()){ CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); @@ -169,14 +178,15 @@ private static class FindNotPersistentCachesJob extends ComputeJobAdapter { /** Searches for any non-persistent cache. */ @GridInternal private static class FindNotPersistentCachesTask extends ComputeTaskSplitAdapter { - @Override - protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { + + /** Provides one job. */ + @Override protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { return Collections.singletonList(new FindNotPersistentCachesJob()); } + /** Only one result is expected. */ @Nullable @Override public Boolean reduce(List results) throws IgniteException { - ComputeJobResult jobResult = results.get(0); - return jobResult.getData(); + return results.get(0).getData(); } } } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 121d055030cee..fd488062f7a46 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -99,6 +99,7 @@ import org.apache.ignite.transactions.TransactionTimeoutException; import org.jetbrains.annotations.NotNull; import org.junit.Test; +import org.apache.ignite.IgniteSystemProperties; import static java.io.File.separatorChar; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CLUSTER_NAME; @@ -124,6 +125,7 @@ import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * Command line handler test. @@ -279,14 +281,17 @@ public void testDeactivateNonPersistent() throws Exception { ignite.createCache(new CacheConfiguration<>("non-persistent-cache") .setDataRegionName("non-persistent-dataRegion")); - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); + if (IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) + assertEquals(EXIT_CODE_OK, execute("--deactivate")); + else { + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - assertContains(log, testOut.toString(), "Your cluster has in-memory cache configured. " + - "During deactivation all data from these caches will be cleared!"); + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + assertContains(log, testOut.toString(), "During deactivation all data from these caches will be erased!"); - assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); + assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); + } assertFalse(ignite.cluster().active()); assertEquals(INACTIVE, ignite.cluster().state()); From f36c5791314431affdeca626020c8d8ee86dfe08 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 4 Feb 2020 16:22:00 +0300 Subject: [PATCH 03/82] IGNITE-12597 : + fix in the JMX --- .../apache/ignite/internal/IgniteKernal.java | 23 +++++++++- .../commandline/DeactivateCommand.java | 45 +++++++++++++------ .../apache/ignite/mxbean/IgniteMXBean.java | 22 ++++++++- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 3c4698d9d84f3..4b4ae67cc5d94 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -231,6 +231,7 @@ import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor; import org.jetbrains.annotations.Nullable; +import org.apache.ignite.internal.commandline.DeactivateCommand; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONFIG_URL; @@ -3944,9 +3945,29 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te } } + /** {@inheritDoc} */ + @Override public void activate() { + cluster().state(ClusterState.ACTIVE); + } + + /** {@inheritDoc} */ + @Override public void deactivate(boolean force) { + //Check if cluster ir ready for deactivation. + if (cluster().state() == ClusterState.ACTIVE && !force) { + String msg = DeactivateCommand.isClusterReadyForDeactivation((cls -> compute().execute(cls, null))); + if (!msg.isEmpty()) + throw new IllegalStateException(msg + " To proceed launch with the force flag."); + } + + cluster().state(ClusterState.INACTIVE); + } + /** {@inheritDoc} */ @Override public void active(boolean active) { - cluster().active(active); + if (active) + active(); + else + deactivate(false); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 19f5571feb745..c09c48f78b062 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -31,12 +31,16 @@ import org.apache.ignite.compute.ComputeTaskSplitAdapter; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.processors.task.GridInternal; import java.util.Collections; import org.apache.ignite.internal.visor.VisorTaskArgument; import org.apache.ignite.resources.IgniteInstanceResource; import org.jetbrains.annotations.Nullable; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.compute.ComputeTask; +import com.sun.istack.internal.NotNull; +import java.util.function.Function; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; @@ -56,6 +60,22 @@ public class DeactivateCommand implements Command { /** Force cluster deactivation even it might have in-mem caches. */ private boolean force; + /** + * Checks if resonable to deactivate without flag 'force'. + * + * @param taskLauncher Computation task launcher. The task has no params, just need to be launched for its result. + * @return Empty (not-null) message if cluster is ready. Or warning text telling why deactivation is not advised. + */ + @NotNull public static String isClusterReadyForDeactivation( + Function>, Boolean> taskLauncher) { + if (!IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) + && taskLauncher.apply(FindNotPersistentCachesTask.class)) { + return "The cluster has at least one cache configured without persistense. " + + "During deactivation all data from these caches will be erased!"; + } + return ""; + } + /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION, "--force")); @@ -88,10 +108,17 @@ public class DeactivateCommand implements Command { try (GridClient client = Command.startClient(clientCfg)) { //Search for in-memory-only caches. Warn of possible data loss. - if (!IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) && !force - && hasInMemCaches(client, clientCfg)) { - throw new IllegalStateException("The cluster has at least one cache configured without persistense. " + - "During deactivation all data from these caches will be erased! Type --force to proceed."); + if (!force) { + String msg = isClusterReadyForDeactivation((cls) -> { + try { + return TaskExecutor.executeTask(client, FindNotPersistentCachesTask.class, null, clientCfg); + } + catch (GridClientException e) { + throw new RuntimeException("Failed to launch task to check if cluster is ready for deactivation.", e); + } + }); + if (!msg.isEmpty()) + throw new IllegalStateException(msg + " Type --force to proceed."); } GridClientClusterState state = client.state(); @@ -120,16 +147,6 @@ && hasInMemCaches(client, clientCfg)) { } } - /** Launches task to search for in-mem caches. */ - boolean hasInMemCaches(GridClient client, GridClientConfiguration clientCfg) throws Exception { - return TaskExecutor.executeTask( - client, - FindNotPersistentCachesTask.class, - null, - clientCfg - ); - } - /** {@inheritDoc} */ @Override public Void arg() { return null; diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 79dfe61c0f88a..8683c544794db 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -388,11 +388,31 @@ public interface IgniteMXBean { ) public boolean pingNode(String nodeId); + /** Activates cluster. */ + @MXBeanDescription( + "Execute activation process." + ) + @MXBeanParametersNames( + "active" + ) + public void activate(); + + /** Deactivates cluster. */ + @MXBeanDescription( + "Execute deactivation process." + ) + @MXBeanParametersNames( + "force" + ) + public void deactivate(boolean force); + /** * @param active Activate/DeActivate flag. + * @deprecated Use {@link #activate()} and {@link #deactivate(boolean)} instead. */ + @Deprecated @MXBeanDescription( - "Execute activate or deactivate process." + "Execute activate or deactivate process. Deactivation may require flag 'force'." ) @MXBeanParametersNames( "active" From 1aac619c3c2124aa6944b266a0c3b7c6dddc46af Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 4 Feb 2020 17:48:30 +0300 Subject: [PATCH 04/82] IGNITE-12597 : Think is ready except the JMX tests --- .../apache/ignite/internal/IgniteKernal.java | 20 +-- .../ClusterStateChangeCommand.java | 125 +++++++++++++++++- .../commandline/DeactivateCommand.java | 93 +------------ .../apache/ignite/mxbean/IgniteMXBean.java | 2 +- .../CommandHandlerParsingTest.java | 14 ++ .../ignite/util/GridCommandHandlerTest.java | 70 +++++++++- 6 files changed, 220 insertions(+), 104 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 4b4ae67cc5d94..0a50b0f2b3d46 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -231,7 +231,7 @@ import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor; import org.jetbrains.annotations.Nullable; -import org.apache.ignite.internal.commandline.DeactivateCommand; +import org.apache.ignite.internal.commandline.ClusterStateChangeCommand; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONFIG_URL; @@ -3945,6 +3945,14 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te } } + /** {@inheritDoc} */ + @Override public void active(boolean active) { + if (active) + activate(); + else + deactivate(false); + } + /** {@inheritDoc} */ @Override public void activate() { cluster().state(ClusterState.ACTIVE); @@ -3954,7 +3962,7 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te @Override public void deactivate(boolean force) { //Check if cluster ir ready for deactivation. if (cluster().state() == ClusterState.ACTIVE && !force) { - String msg = DeactivateCommand.isClusterReadyForDeactivation((cls -> compute().execute(cls, null))); + String msg = ClusterStateChangeCommand.isClusterReadyForDeactivation((cls -> compute().execute(cls, null))); if (!msg.isEmpty()) throw new IllegalStateException(msg + " To proceed launch with the force flag."); } @@ -3962,14 +3970,6 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te cluster().state(ClusterState.INACTIVE); } - /** {@inheritDoc} */ - @Override public void active(boolean active) { - if (active) - active(); - else - deactivate(false); - } - /** */ private Collection baselineNodes() { Collection srvNodes = cluster().forServers().nodes(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index d9b8809e66de2..657d4677e4605 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -23,6 +23,27 @@ import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import com.sun.istack.internal.NotNull; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; +import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteException; +import org.apache.ignite.compute.ComputeJob; +import org.apache.ignite.compute.ComputeJobAdapter; +import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.compute.ComputeTask; +import org.apache.ignite.compute.ComputeTaskSplitAdapter; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.internal.client.GridClientException; +import org.apache.ignite.internal.processors.task.GridInternal; +import org.apache.ignite.internal.visor.VisorTaskArgument; +import org.apache.ignite.resources.IgniteInstanceResource; +import org.jetbrains.annotations.Nullable; +import org.apache.ignite.IgniteSystemProperties; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -42,6 +63,27 @@ public class ClusterStateChangeCommand implements Command { /** Cluster name. */ private String clusterName; + /** Force cluster deactivation even it might have in-mem caches. */ + private boolean force; + + /** + * Checks if it is resonable to deactivate cluster. + * + * @param taskLauncher Computation task launcher. The task has no params, just needs to be launched for its result. + * @return Empty (not-null) message if cluster is ready. Or warning text telling why deactivation is not advised. + */ + @NotNull public static String isClusterReadyForDeactivation( + Function>, Boolean> taskLauncher) { + + if (!IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE) + && taskLauncher.apply(FindNotPersistentCachesTask.class)) { + return "The cluster has at least one cache configured without persistense. " + + "During deactivation all data from these caches will be erased!"; + } + + return ""; + } + /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Map params = new LinkedHashMap<>(); @@ -50,7 +92,8 @@ public class ClusterStateChangeCommand implements Command { params.put(INACTIVE.toString(), "Deactivate cluster."); params.put(ACTIVE_READ_ONLY.toString(), "Activate cluster. Cache updates are denied."); - Command.usage(log, "Change cluster state:", SET_STATE, params, or((Object[])ClusterState.values()), optional(CMD_AUTO_CONFIRMATION)); + Command.usage(log, "Change cluster state:", SET_STATE, params, or((Object[])ClusterState.values()), + optional("--force", CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -62,12 +105,32 @@ public class ClusterStateChangeCommand implements Command { /** {@inheritDoc} */ @Override public String confirmationPrompt() { - return "Warning: the command will change state of cluster with name \"" + clusterName + "\" to " + state + "."; + String msg = "Warning: the command will change state of cluster with name \"" + clusterName + "\" to " + state + "."; + + if (state == INACTIVE && !IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) + msg += " Make sure there are no caches not backed with persistent storage."; + + return msg; } /** {@inheritDoc} */ @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { + + //Search for in-memory-only caches. Warn of possible data loss. + if (state == INACTIVE && !force) { + String msg = isClusterReadyForDeactivation((cls) -> { + try { + return TaskExecutor.executeTask(client, cls, null, clientCfg); + } + catch (GridClientException e) { + throw new RuntimeException("Failed to launch task for checking if cluster is ready for deactivation.", e); + } + }); + if (!msg.isEmpty()) + throw new IllegalStateException(msg + " Type --force to proceed."); + } + client.state().state(state); log.info("Cluster state changed to " + state); @@ -75,7 +138,7 @@ public class ClusterStateChangeCommand implements Command { return null; } catch (Throwable e) { - log.info("Failed to change cluster state to " + state); + log.info("Failed to change cluster state to " + state); throw e; } @@ -91,6 +154,14 @@ public class ClusterStateChangeCommand implements Command { catch (IllegalArgumentException e) { throw new IllegalArgumentException("Can't parse new cluster state. State: " + s, e); } + + if (argIter.hasNextArg()) { + String arg = argIter.peekNextArg(); + if ("--force".equalsIgnoreCase(arg)) { + force = true; + argIter.nextArg(""); + } + } } /** {@inheritDoc} */ @@ -102,4 +173,52 @@ public class ClusterStateChangeCommand implements Command { @Override public String name() { return SET_STATE.toCommandName(); } + + /** Searches for any non-persistent cache. */ + private static class FindNotPersistentCachesJob extends ComputeJobAdapter { + + @IgniteInstanceResource + private Ignite ignite; + + /** */ + @SuppressWarnings("unchecked") + @Override public Boolean execute() throws IgniteException { + //Find data region to set persistent flag. + for (String cacheName : ignite.cacheNames()) { + CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); + + DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null + ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() + : Stream.of(ignite.configuration().getDataStorageConfiguration() + .getDataRegionConfigurations()).filter(region -> region.getName().equals(cacheCfg.getDataRegionName())) + .findFirst().orElse(null); + + if (regionCfg == null) + throw new IgniteException("Failed to check if cluster is ready for deactivation. " + + "While searching for non-persistent caches, " + + "no data region found: \"" + cacheCfg.getDataRegionName() + "\" for cache \"" + cacheName + "\". " + + "Check configurations of memory storage and caches."); + + if (!regionCfg.isPersistenceEnabled()) + return true; + } + + return false; + } + } + + /** Searches for any non-persistent cache. */ + @GridInternal + private static class FindNotPersistentCachesTask extends ComputeTaskSplitAdapter { + + /** Provides one job. */ + @Override protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { + return Collections.singletonList(new FindNotPersistentCachesJob()); + } + + /** Only one result is expected. */ + @Nullable @Override public Boolean reduce(List results) throws IgniteException { + return results.get(0).getData(); + } + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index c09c48f78b062..c4e68a524fc0f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -21,26 +21,8 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; -import java.util.Collection; -import java.util.List; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; -import org.apache.ignite.compute.ComputeJob; -import org.apache.ignite.compute.ComputeJobAdapter; -import org.apache.ignite.compute.ComputeJobResult; -import org.apache.ignite.compute.ComputeTaskSplitAdapter; -import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.internal.client.GridClientException; -import org.apache.ignite.internal.processors.task.GridInternal; -import java.util.Collections; -import org.apache.ignite.internal.visor.VisorTaskArgument; -import org.apache.ignite.resources.IgniteInstanceResource; -import org.jetbrains.annotations.Nullable; import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.compute.ComputeTask; -import com.sun.istack.internal.NotNull; -import java.util.function.Function; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; @@ -60,25 +42,10 @@ public class DeactivateCommand implements Command { /** Force cluster deactivation even it might have in-mem caches. */ private boolean force; - /** - * Checks if resonable to deactivate without flag 'force'. - * - * @param taskLauncher Computation task launcher. The task has no params, just need to be launched for its result. - * @return Empty (not-null) message if cluster is ready. Or warning text telling why deactivation is not advised. - */ - @NotNull public static String isClusterReadyForDeactivation( - Function>, Boolean> taskLauncher) { - if (!IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) - && taskLauncher.apply(FindNotPersistentCachesTask.class)) { - return "The cluster has at least one cache configured without persistense. " + - "During deactivation all data from these caches will be erased!"; - } - return ""; - } - /** {@inheritDoc} */ @Override public void printUsage(Logger log) { - Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION, "--force")); + Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, + optional("--force", CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -109,12 +76,12 @@ public class DeactivateCommand implements Command { //Search for in-memory-only caches. Warn of possible data loss. if (!force) { - String msg = isClusterReadyForDeactivation((cls) -> { + String msg = ClusterStateChangeCommand.isClusterReadyForDeactivation((cls) -> { try { - return TaskExecutor.executeTask(client, FindNotPersistentCachesTask.class, null, clientCfg); + return TaskExecutor.executeTask(client, cls, null, clientCfg); } catch (GridClientException e) { - throw new RuntimeException("Failed to launch task to check if cluster is ready for deactivation.", e); + throw new RuntimeException("Failed to launch task for checking check if cluster is ready for deactivation.", e); } }); if (!msg.isEmpty()) @@ -156,54 +123,4 @@ public class DeactivateCommand implements Command { @Override public String name() { return DEACTIVATE.toCommandName(); } - - /** Searches for any non-persistent cache. */ - private static class FindNotPersistentCachesJob extends ComputeJobAdapter { - - @IgniteInstanceResource - private Ignite ignite; - - /** */ - @SuppressWarnings("unchecked") - @Override public Boolean execute() throws IgniteException { - //Find data region to set persistent flag. - for(String cacheName : ignite.cacheNames()){ - CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); - - DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null - ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() - : null; - - if (regionCfg == null) { - for (DataRegionConfiguration dataRegionCfg : ignite.configuration().getDataStorageConfiguration() - .getDataRegionConfigurations()) { - if (dataRegionCfg.getName().equals(cacheCfg.getDataRegionName())) { - regionCfg = dataRegionCfg; - break; - } - } - } - - if(!regionCfg.isPersistenceEnabled()) - return true; - } - - return false; - } - } - - /** Searches for any non-persistent cache. */ - @GridInternal - private static class FindNotPersistentCachesTask extends ComputeTaskSplitAdapter { - - /** Provides one job. */ - @Override protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { - return Collections.singletonList(new FindNotPersistentCachesJob()); - } - - /** Only one result is expected. */ - @Nullable @Override public Boolean reduce(List results) throws IgniteException { - return results.get(0).getData(); - } - } } diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 8683c544794db..e070fe338067d 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -412,7 +412,7 @@ public interface IgniteMXBean { */ @Deprecated @MXBeanDescription( - "Execute activate or deactivate process. Deactivation may require flag 'force'." + "Execute activate or deactivate process. Deprecated. Use activate() / deactivate(). Deactivation may require flag 'force'." ) @MXBeanParametersNames( "active" diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java index 0348fd8ee6173..0d2eee5c35c03 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java @@ -365,6 +365,10 @@ public void testParseAutoConfirmationFlag() { checkCommonParametersCorrectlyParsed(cmdL, args, true); + args = parseArgs(asList(cmdL.text(), "--force", "--yes")); + + checkCommonParametersCorrectlyParsed(cmdL, args, true); + break; } case SET_STATE: { @@ -378,6 +382,16 @@ public void testParseAutoConfirmationFlag() { assertEquals(newState, argState.toString()); } + for (String newState : asList("ACTIVE_READ_ONLY", "ACTIVE", "INACTIVE")) { + args = parseArgs(asList(cmdL.text(), newState, "--force", "--yes")); + + checkCommonParametersCorrectlyParsed(cmdL, args, true); + + ClusterState argState = ((ClusterStateChangeCommand)args.command()).arg(); + + assertEquals(newState, argState.toString()); + } + break; } case BASELINE: { diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index fd488062f7a46..d03b3057e6733 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -125,7 +125,6 @@ import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC; import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC; import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * Command line handler test. @@ -281,7 +280,7 @@ public void testDeactivateNonPersistent() throws Exception { ignite.createCache(new CacheConfiguration<>("non-persistent-cache") .setDataRegionName("non-persistent-dataRegion")); - if (IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) + if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) assertEquals(EXIT_CODE_OK, execute("--deactivate")); else { assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); @@ -297,6 +296,73 @@ public void testDeactivateNonPersistent() throws Exception { assertEquals(INACTIVE, ignite.cluster().state()); } + /** + * Test deactivation works via control.sh using --set-change command. + * + * @throws Exception If failed. + */ + @Test + public void testDeactivateWithSetState() throws Exception { + Ignite ignite = startGrids(1); + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + + ignite.cluster().state(ACTIVE); + + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + + injectTestSystemOut(); + + assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive")); + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + } + + /** + * Test deactivation works via control.sh and --set-state command when a non-persistent cache involved. + * + * @throws Exception If failed. + */ + @Test + public void testDeactivateNonPersistentWithSetState() throws Exception { + dataRegionConfiguration = new DataRegionConfiguration() + .setName("non-persistent-dataRegion") + .setPersistenceEnabled(false); + + Ignite ignite = startGrids(1); + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + + ignite.cluster().state(ACTIVE); + + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + + injectTestSystemOut(); + + ignite.createCache(new CacheConfiguration<>("non-persistent-cache") + .setDataRegionName("non-persistent-dataRegion")); + + if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) + assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive")); + else { + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--set-state", "inactive")); + + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + assertContains(log, testOut.toString(), "During deactivation all data from these caches will be erased!"); + + assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive", "--force")); + } + + assertFalse(ignite.cluster().active()); + assertEquals(INACTIVE, ignite.cluster().state()); + } + /** * Test the deactivation command on the active and no cluster with checking * the cluster name(which is set through the system property) in From e0f6ac491d512cb1ff439290b3f372893d88ca06 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 4 Feb 2020 19:39:25 +0300 Subject: [PATCH 05/82] IGNITE-12597 : Think the ticket is done. Attempt #1. --- .../ClusterStateChangeCommand.java | 4 +- .../IgniteBasicWithPersistenceTestSuite.java | 5 +- .../ignite/util/GridCommandHandlerTest.java | 25 ------ .../util/mbeans/GridStateMBeanTest.java | 79 +++++++++++++++++++ 4 files changed, 85 insertions(+), 28 deletions(-) create mode 100644 modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 657d4677e4605..2907f7ef7511e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -77,7 +77,7 @@ public class ClusterStateChangeCommand implements Command { if (!IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE) && taskLauncher.apply(FindNotPersistentCachesTask.class)) { - return "The cluster has at least one cache configured without persistense. " + + return "The cluster has at least one cache configured without persistence. " + "During deactivation all data from these caches will be erased!"; } @@ -117,7 +117,7 @@ public class ClusterStateChangeCommand implements Command { @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { - //Search for in-memory-only caches. Warn of possible data loss. + //Search for in-memory-only caches. Fail if possible data loss. if (state == INACTIVE && !force) { String msg = isClusterReadyForDeactivation((cls) -> { try { diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java index 6d797b4af8e77..0bace61040f6c 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java @@ -42,6 +42,7 @@ import org.apache.ignite.util.GridCommandHandlerTest; import org.apache.ignite.util.GridCommandHandlerWithSSLTest; import org.apache.ignite.util.GridInternalTaskUnusedWalSegmentsTest; +import org.apache.ignite.util.mbeans.GridStateMBeanTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -80,7 +81,9 @@ MasterKeyChangeTest.class, MasterKeyChangeConsistencyCheckTest.class, - EncryptionMXBeanTest.class + EncryptionMXBeanTest.class, + + GridStateMBeanTest.class }) public class IgniteBasicWithPersistenceTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index d03b3057e6733..49da8e83dab84 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -296,31 +296,6 @@ public void testDeactivateNonPersistent() throws Exception { assertEquals(INACTIVE, ignite.cluster().state()); } - /** - * Test deactivation works via control.sh using --set-change command. - * - * @throws Exception If failed. - */ - @Test - public void testDeactivateWithSetState() throws Exception { - Ignite ignite = startGrids(1); - - assertFalse(ignite.cluster().active()); - assertEquals(INACTIVE, ignite.cluster().state()); - - ignite.cluster().state(ACTIVE); - - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - - injectTestSystemOut(); - - assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive")); - - assertFalse(ignite.cluster().active()); - assertEquals(INACTIVE, ignite.cluster().state()); - } - /** * Test deactivation works via control.sh and --set-state command when a non-persistent cache involved. * diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java new file mode 100644 index 0000000000000..f72ec33d591c1 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java @@ -0,0 +1,79 @@ +package org.apache.ignite.util.mbeans; + +import org.apache.ignite.Ignite; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.mxbean.IgniteMXBean; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; + +/** MBean test of cluster state operations. */ +public class GridStateMBeanTest extends GridCommonAbstractTest { + /** */ + protected boolean persistenceEnabled = false; + + /** */ + protected boolean activeAtStart = false; + + /** */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + cfg.setClusterStateOnStart(activeAtStart ? ACTIVE : INACTIVE); + DataStorageConfiguration dsCfg = cfg.getDataStorageConfiguration(); + if(dsCfg==null) + cfg.setDataStorageConfiguration(dsCfg = new DataStorageConfiguration()); + + dsCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(persistenceEnabled); + + return cfg; + } + + /** + * Test deactivation works via JMX + * + * @throws Exception If failed. + */ + @Test + public void testNotDeactivated() throws Exception { + persistenceEnabled = false; + activeAtStart = true; + + Ignite ignite = startGrids(1); + IgniteMXBean mxBean = (IgniteMXBean)ignite; + + assertTrue(mxBean.active()); + assertEquals(ACTIVE.name(), mxBean.clusterState()); + + ignite.createCache("non-persistent-cache"); + + try { + mxBean.deactivate(false); + } catch (Exception e){ + assertTrue(e.getMessage().contains("The cluster has at least one cache configured without persistence")); + } + + assertTrue(mxBean.active()); + assertEquals(ACTIVE.name(), mxBean.clusterState()); + + ignite.destroyCache("non-persistent-cache"); + + mxBean.deactivate(false); + + assertFalse(mxBean.active()); + assertEquals(INACTIVE.name(), mxBean.clusterState()); + + mxBean.activate(); + assertTrue(mxBean.active()); + + ignite.createCache("non-persistent-cache"); + + mxBean.deactivate(true); + + assertFalse(mxBean.active()); + assertEquals(INACTIVE.name(), mxBean.clusterState()); + } +} From 172c4320636902f6ab58a08f41c851ba06cecc22 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 4 Feb 2020 19:57:25 +0300 Subject: [PATCH 06/82] IGNITE-12597 : Small fix in messages. --- .../src/main/java/org/apache/ignite/internal/IgniteKernal.java | 2 +- .../ignite/internal/commandline/ClusterStateChangeCommand.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 0a50b0f2b3d46..47914746f5b91 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -3964,7 +3964,7 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te if (cluster().state() == ClusterState.ACTIVE && !force) { String msg = ClusterStateChangeCommand.isClusterReadyForDeactivation((cls -> compute().execute(cls, null))); if (!msg.isEmpty()) - throw new IllegalStateException(msg + " To proceed launch with the force flag."); + throw new IllegalStateException(msg + " Please, enable force flag to deactivate cluster."); } cluster().state(ClusterState.INACTIVE); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 2907f7ef7511e..e855d39aa4bfb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -128,7 +128,7 @@ public class ClusterStateChangeCommand implements Command { } }); if (!msg.isEmpty()) - throw new IllegalStateException(msg + " Type --force to proceed."); + throw new IllegalStateException(msg + " Please, add --force to deactivate cluster."); } client.state().state(state); From 9149f0ac13dd9a7edb8ce91f75aa327db2ee84ba Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 5 Feb 2020 16:44:28 +0300 Subject: [PATCH 07/82] IGNITE-12597 : Fixed checking of erase-mem-on-deactivation-flag. Now within the job, not on client node. --- .../apache/ignite/internal/IgniteKernal.java | 5 ++ .../ignite/internal/IgniteNodeAttributes.java | 3 ++ .../ClusterStateChangeCommand.java | 49 +++++++++---------- .../commandline/DeactivateCommand.java | 6 +-- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 47914746f5b91..14a941b940a64 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -302,6 +302,8 @@ import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MEMORY_ERASURE_ON_DEACTIVATION; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * This class represents an implementation of the main Ignite API {@link Ignite} which is expanded by additional @@ -1960,6 +1962,9 @@ private void fillNodeAttributes(boolean notifyEnabled) throws IgniteCheckedExcep ctx.addNodeAttribute(ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, ctx.service() instanceof IgniteServiceProcessor); + + //Allows to predict behavior on deactivation. + add(ATTR_MEMORY_ERASURE_ON_DEACTIVATION, !getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 187e979a35a38..7a7386e34a4b5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -206,6 +206,9 @@ public final class IgniteNodeAttributes { public static final String ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED = ATTR_PREFIX + ".event.driven.service.processor.enabled"; + /** Flag of in-memory data erasure on deactivation. */ + public static final String ATTR_MEMORY_ERASURE_ON_DEACTIVATION = ATTR_CACHE + ".persistence.eraseMemOnDeactivation"; + /** * Enforces singleton. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index e855d39aa4bfb..e397400556ca5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -43,7 +43,6 @@ import org.apache.ignite.internal.visor.VisorTaskArgument; import org.apache.ignite.resources.IgniteInstanceResource; import org.jetbrains.annotations.Nullable; -import org.apache.ignite.IgniteSystemProperties; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -52,6 +51,7 @@ import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MEMORY_ERASURE_ON_DEACTIVATION; /** * Command to change cluster state. @@ -75,8 +75,7 @@ public class ClusterStateChangeCommand implements Command { @NotNull public static String isClusterReadyForDeactivation( Function>, Boolean> taskLauncher) { - if (!IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE) - && taskLauncher.apply(FindNotPersistentCachesTask.class)) { + if (taskLauncher.apply(FindNotPersistentCachesTask.class)) { return "The cluster has at least one cache configured without persistence. " + "During deactivation all data from these caches will be erased!"; } @@ -105,12 +104,7 @@ public class ClusterStateChangeCommand implements Command { /** {@inheritDoc} */ @Override public String confirmationPrompt() { - String msg = "Warning: the command will change state of cluster with name \"" + clusterName + "\" to " + state + "."; - - if (state == INACTIVE && !IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) - msg += " Make sure there are no caches not backed with persistent storage."; - - return msg; + return "Warning: the command will change state of cluster with name \"" + clusterName + "\" to " + state + "."; } /** {@inheritDoc} */ @@ -183,24 +177,25 @@ private static class FindNotPersistentCachesJob extends ComputeJobAdapter { /** */ @SuppressWarnings("unchecked") @Override public Boolean execute() throws IgniteException { - //Find data region to set persistent flag. - for (String cacheName : ignite.cacheNames()) { - CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); - - DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null - ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() - : Stream.of(ignite.configuration().getDataStorageConfiguration() - .getDataRegionConfigurations()).filter(region -> region.getName().equals(cacheCfg.getDataRegionName())) - .findFirst().orElse(null); - - if (regionCfg == null) - throw new IgniteException("Failed to check if cluster is ready for deactivation. " + - "While searching for non-persistent caches, " + - "no data region found: \"" + cacheCfg.getDataRegionName() + "\" for cache \"" + cacheName + "\". " + - "Check configurations of memory storage and caches."); - - if (!regionCfg.isPersistenceEnabled()) - return true; + //Find any node with disabled memory reusage on deactivation/activation. + boolean cacheDataCanBeLost = ignite.cluster().forPredicate(node-> + (Boolean)node.attributes().getOrDefault(ATTR_MEMORY_ERASURE_ON_DEACTIVATION, true)) + .nodes().stream().findAny().isPresent(); + + if (cacheDataCanBeLost) { + //Find data region to set persistent flag. + for (String cacheName : ignite.cacheNames()) { + CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); + + DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null + ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() + : Stream.of(ignite.configuration().getDataStorageConfiguration() + .getDataRegionConfigurations()).filter(region -> region.getName().equals(cacheCfg.getDataRegionName())) + .findFirst().orElse(null); + + if (regionCfg != null && !regionCfg.isPersistenceEnabled()) + return true; + } } return false; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index c4e68a524fc0f..117b8e755a0c0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -28,7 +28,6 @@ import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * Command to deactivate cluster. @@ -57,10 +56,7 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public String confirmationPrompt() { - return "Warning: the command will deactivate a cluster \"" + clusterName + "\"." + - (IgniteSystemProperties.getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE) - ? "" - : " Make sure there are no caches not backed with persistent storage."); + return "Warning: the command will deactivate a cluster \"" + clusterName + "\"."; } /** From 9a90f533020aa475fb2166731ecd53cbe17fba09 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 5 Feb 2020 20:36:15 +0300 Subject: [PATCH 08/82] IGNITE-12597 : Fixed checking of erase-mem-on-deactivation-flag. Now within the job, not on client node. --- .../apache/ignite/internal/IgniteKernal.java | 28 +++-- .../ignite/internal/IgniteNodeAttributes.java | 2 +- .../ClusterStateChangeCommand.java | 116 +++--------------- .../commandline/DeactivateCommand.java | 21 ++-- .../processors/cache/GridCacheProcessor.java | 14 +++ .../cluster/VisorCheckDeactivationTask.java | 70 +++++++++++ .../apache/ignite/mxbean/IgniteMXBean.java | 55 +++------ .../util/mbeans/GridStateMBeanTest.java | 6 +- 8 files changed, 143 insertions(+), 169 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 14a941b940a64..ca015555a5886 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -231,7 +231,9 @@ import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor; import org.jetbrains.annotations.Nullable; -import org.apache.ignite.internal.commandline.ClusterStateChangeCommand; +import java.util.stream.Collectors; +import org.apache.ignite.internal.visor.VisorTaskArgument; +import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONFIG_URL; @@ -302,7 +304,7 @@ import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MEMORY_ERASURE_ON_DEACTIVATION; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_KEEP_MEMORY_ON_DEACTIVATION; import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** @@ -1964,7 +1966,7 @@ private void fillNodeAttributes(boolean notifyEnabled) throws IgniteCheckedExcep ctx.service() instanceof IgniteServiceProcessor); //Allows to predict behavior on deactivation. - add(ATTR_MEMORY_ERASURE_ON_DEACTIVATION, !getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); + add(ATTR_KEEP_MEMORY_ON_DEACTIVATION, getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); } /** @@ -3952,10 +3954,7 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { - if (active) - activate(); - else - deactivate(false); + cluster().active(active); } /** {@inheritDoc} */ @@ -3965,11 +3964,16 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void deactivate(boolean force) { - //Check if cluster ir ready for deactivation. - if (cluster().state() == ClusterState.ACTIVE && !force) { - String msg = ClusterStateChangeCommand.isClusterReadyForDeactivation((cls -> compute().execute(cls, null))); - if (!msg.isEmpty()) - throw new IllegalStateException(msg + " Please, enable force flag to deactivate cluster."); + // Check if cluster ir ready for deactivation. + if ((cluster().state() == ClusterState.ACTIVE || cluster().state() == ClusterState.ACTIVE_READ_ONLY) + && !force) { + Boolean readyForDeactivation = compute().execute(VisorCheckDeactivationTask.class, + new VisorTaskArgument<>(cluster().nodes().stream().map(ClusterNode::id).collect(Collectors.toList()), + null, false)); + + if (!readyForDeactivation) + throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES + + " Please, enable force flag to deactivate cluster."); } cluster().state(ClusterState.INACTIVE); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 7a7386e34a4b5..5fca5b6925f4a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -207,7 +207,7 @@ public final class IgniteNodeAttributes { ".event.driven.service.processor.enabled"; /** Flag of in-memory data erasure on deactivation. */ - public static final String ATTR_MEMORY_ERASURE_ON_DEACTIVATION = ATTR_CACHE + ".persistence.eraseMemOnDeactivation"; + public static final String ATTR_KEEP_MEMORY_ON_DEACTIVATION = ATTR_CACHE + ".persistence.keepMemDataOnDeactivation"; /** * Enforces singleton. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index e397400556ca5..861befce3d1c3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -23,26 +23,7 @@ import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; -import com.sun.istack.internal.NotNull; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Stream; -import org.apache.ignite.Ignite; -import org.apache.ignite.IgniteException; -import org.apache.ignite.compute.ComputeJob; -import org.apache.ignite.compute.ComputeJobAdapter; -import org.apache.ignite.compute.ComputeJobResult; -import org.apache.ignite.compute.ComputeTask; -import org.apache.ignite.compute.ComputeTaskSplitAdapter; -import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.configuration.DataRegionConfiguration; -import org.apache.ignite.internal.client.GridClientException; -import org.apache.ignite.internal.processors.task.GridInternal; -import org.apache.ignite.internal.visor.VisorTaskArgument; -import org.apache.ignite.resources.IgniteInstanceResource; -import org.jetbrains.annotations.Nullable; +import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -51,12 +32,14 @@ import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MEMORY_ERASURE_ON_DEACTIVATION; /** * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { + /** */ + private static final String FLAG_FORCE = "--force"; + /** New cluster state */ private ClusterState state; @@ -66,23 +49,6 @@ public class ClusterStateChangeCommand implements Command { /** Force cluster deactivation even it might have in-mem caches. */ private boolean force; - /** - * Checks if it is resonable to deactivate cluster. - * - * @param taskLauncher Computation task launcher. The task has no params, just needs to be launched for its result. - * @return Empty (not-null) message if cluster is ready. Or warning text telling why deactivation is not advised. - */ - @NotNull public static String isClusterReadyForDeactivation( - Function>, Boolean> taskLauncher) { - - if (taskLauncher.apply(FindNotPersistentCachesTask.class)) { - return "The cluster has at least one cache configured without persistence. " + - "During deactivation all data from these caches will be erased!"; - } - - return ""; - } - /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Map params = new LinkedHashMap<>(); @@ -92,7 +58,7 @@ public class ClusterStateChangeCommand implements Command { params.put(ACTIVE_READ_ONLY.toString(), "Activate cluster. Cache updates are denied."); Command.usage(log, "Change cluster state:", SET_STATE, params, or((Object[])ClusterState.values()), - optional("--force", CMD_AUTO_CONFIRMATION)); + optional(FLAG_FORCE, CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -110,19 +76,14 @@ public class ClusterStateChangeCommand implements Command { /** {@inheritDoc} */ @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { - - //Search for in-memory-only caches. Fail if possible data loss. + // Search for in-memory-only caches. Fail if data loss might appear. if (state == INACTIVE && !force) { - String msg = isClusterReadyForDeactivation((cls) -> { - try { - return TaskExecutor.executeTask(client, cls, null, clientCfg); - } - catch (GridClientException e) { - throw new RuntimeException("Failed to launch task for checking if cluster is ready for deactivation.", e); - } - }); - if (!msg.isEmpty()) - throw new IllegalStateException(msg + " Please, add --force to deactivate cluster."); + Boolean readyToDeactivate = TaskExecutor.executeTask(client, VisorCheckDeactivationTask.class, + null, clientCfg); + + if (!readyToDeactivate) + throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES + + " Please, add " + FLAG_FORCE + " to deactivate cluster."); } client.state().state(state); @@ -151,8 +112,10 @@ public class ClusterStateChangeCommand implements Command { if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); - if ("--force".equalsIgnoreCase(arg)) { + + if (FLAG_FORCE.equalsIgnoreCase(arg)) { force = true; + argIter.nextArg(""); } } @@ -167,53 +130,4 @@ public class ClusterStateChangeCommand implements Command { @Override public String name() { return SET_STATE.toCommandName(); } - - /** Searches for any non-persistent cache. */ - private static class FindNotPersistentCachesJob extends ComputeJobAdapter { - - @IgniteInstanceResource - private Ignite ignite; - - /** */ - @SuppressWarnings("unchecked") - @Override public Boolean execute() throws IgniteException { - //Find any node with disabled memory reusage on deactivation/activation. - boolean cacheDataCanBeLost = ignite.cluster().forPredicate(node-> - (Boolean)node.attributes().getOrDefault(ATTR_MEMORY_ERASURE_ON_DEACTIVATION, true)) - .nodes().stream().findAny().isPresent(); - - if (cacheDataCanBeLost) { - //Find data region to set persistent flag. - for (String cacheName : ignite.cacheNames()) { - CacheConfiguration cacheCfg = ignite.cache(cacheName).getConfiguration(CacheConfiguration.class); - - DataRegionConfiguration regionCfg = cacheCfg.getDataRegionName() == null - ? ignite.configuration().getDataStorageConfiguration().getDefaultDataRegionConfiguration() - : Stream.of(ignite.configuration().getDataStorageConfiguration() - .getDataRegionConfigurations()).filter(region -> region.getName().equals(cacheCfg.getDataRegionName())) - .findFirst().orElse(null); - - if (regionCfg != null && !regionCfg.isPersistenceEnabled()) - return true; - } - } - - return false; - } - } - - /** Searches for any non-persistent cache. */ - @GridInternal - private static class FindNotPersistentCachesTask extends ComputeTaskSplitAdapter { - - /** Provides one job. */ - @Override protected Collection split(int gridSize, VisorTaskArgument arg) throws IgniteException { - return Collections.singletonList(new FindNotPersistentCachesJob()); - } - - /** Only one result is expected. */ - @Nullable @Override public Boolean reduce(List results) throws IgniteException { - return results.get(0).getData(); - } - } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 117b8e755a0c0..6e0067dc0707f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -21,8 +21,7 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.client.GridClientException; -import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; @@ -70,18 +69,14 @@ public class DeactivateCommand implements Command { try (GridClient client = Command.startClient(clientCfg)) { - //Search for in-memory-only caches. Warn of possible data loss. + // Search for in-memory-only caches. Fail if possible data loss. if (!force) { - String msg = ClusterStateChangeCommand.isClusterReadyForDeactivation((cls) -> { - try { - return TaskExecutor.executeTask(client, cls, null, clientCfg); - } - catch (GridClientException e) { - throw new RuntimeException("Failed to launch task for checking check if cluster is ready for deactivation.", e); - } - }); - if (!msg.isEmpty()) - throw new IllegalStateException(msg + " Type --force to proceed."); + Boolean readyToDeactivate = TaskExecutor.executeTask(client, VisorCheckDeactivationTask.class, + null, clientCfg); + + if (!readyToDeactivate) + throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES + + " Please, add --force to deactivate cluster."); } GridClientClusterState state = client.state(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index e64e03b1c56f8..b06c92b249438 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -4536,6 +4536,20 @@ public Collection persistentCaches() { .collect(Collectors.toList()); } + /** + * @return Collection of in-memory cache descriptors. + */ + public Collection inMemoryCaches(CacheType... cacheTypes) { + Set cacheTypeFilter = cacheTypes.length == 0 + ? Collections.emptySet() + : Stream.of(cacheTypes).collect(Collectors.toSet()); + + return cachesInfo.registeredCaches().values().stream() + .filter(desc -> (cacheTypeFilter.isEmpty() || cacheTypeFilter.contains(desc.cacheType())) + && !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())) + .collect(Collectors.toList()); + } + /** * @return Collection of persistent cache group descriptors. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java new file mode 100644 index 0000000000000..9d7e3d35b9a54 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java @@ -0,0 +1,70 @@ +/* + * 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.visor.cluster; + +import org.apache.ignite.IgniteException; +import org.apache.ignite.internal.processors.cache.CacheType; +import org.apache.ignite.internal.processors.task.GridInternal; +import org.apache.ignite.internal.visor.VisorJob; +import org.apache.ignite.internal.visor.VisorOneNodeTask; + +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_KEEP_MEMORY_ON_DEACTIVATION; + +/** + * Task for checking if deactiation is safe. Returns false when deactivation can lead to data loss. + */ +@GridInternal +public class VisorCheckDeactivationTask extends VisorOneNodeTask { + /** Serial version uid. */ + private static final long serialVersionUID = 0L; + + /** */ + public static final String WARN_DEACTIVATION_IN_MEM_CACHES = + "The cluster has at least one cache configured without persistence. " + + "During deactivation all data from these caches will be erased!"; + + /** {@inheritDoc} */ + @Override protected VisorJob job(Void arg) { + return new VisorCheckDeactivationJob(arg, debug); + } + + /** The task for checking if deactiation is safe. Returns false if deactivation can lead to data loss. */ + private static class VisorCheckDeactivationJob extends VisorJob { + /** Serial version uid. */ + private static final long serialVersionUID = 0L; + + /** + * Create job with specified argument. + * + * @param arg Job argument. + */ + protected VisorCheckDeactivationJob(Void arg, boolean debug) { + super(arg, debug); + } + + /** {@inheritDoc} */ + @Override protected Boolean run(Void arg) throws IgniteException { + // Find any node with disabled memory reusage on deactivation/activation. + boolean cacheDataCanBeLost = ignite.cluster().forPredicate(node -> + !(Boolean)node.attributes().getOrDefault(ATTR_KEEP_MEMORY_ON_DEACTIVATION, false)) + .nodes().stream().findAny().isPresent(); + + return !cacheDataCanBeLost || ignite.context().cache().inMemoryCaches(CacheType.USER).isEmpty(); + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index e070fe338067d..e1602e4c62cb0 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -363,12 +363,8 @@ public interface IgniteMXBean { */ @MXBeanDescription("This method allows manually remove the checkpoint with given key. Return true " + "if specified checkpoint was indeed removed, false otherwise.") - @MXBeanParametersNames( - "key" - ) - @MXBeanParametersDescriptions( - "Checkpoint key to remove." - ) + @MXBeanParametersNames("key") + @MXBeanParametersDescriptions("Checkpoint key to remove.") public boolean removeCheckpoint(String key); /** @@ -380,30 +376,18 @@ public interface IgniteMXBean { */ @MXBeanDescription("Pings node with given node ID to see whether it is alive. " + "Returns whether or not node is alive.") - @MXBeanParametersNames( - "nodeId" - ) - @MXBeanParametersDescriptions( - "String presentation of node ID. See java.util.UUID class for details." - ) + @MXBeanParametersNames("nodeId") + @MXBeanParametersDescriptions("String presentation of node ID. See java.util.UUID class for details.") public boolean pingNode(String nodeId); /** Activates cluster. */ - @MXBeanDescription( - "Execute activation process." - ) - @MXBeanParametersNames( - "active" - ) + @MXBeanDescription("Execute activation process.") + @MXBeanParametersNames("active") public void activate(); /** Deactivates cluster. */ - @MXBeanDescription( - "Execute deactivation process." - ) - @MXBeanParametersNames( - "force" - ) + @MXBeanDescription("Execute deactivation process.") + @MXBeanParametersNames("force") public void deactivate(boolean force); /** @@ -412,11 +396,10 @@ public interface IgniteMXBean { */ @Deprecated @MXBeanDescription( - "Execute activate or deactivate process. Deprecated. Use activate() / deactivate(). Deactivation may require flag 'force'." - ) - @MXBeanParametersNames( - "active" + "Execute activate or deactivate process. Deprecated. " + + "Use activate() / deactivate(). Deactivation may require flag 'force'." ) + @MXBeanParametersNames("active") public void active(boolean active); /** @@ -444,12 +427,8 @@ public interface IgniteMXBean { * @throws JMException Thrown if undeploy failed. */ @MXBeanDescription("Makes the best attempt to undeploy a task from the whole grid.") - @MXBeanParametersNames( - "taskName" - ) - @MXBeanParametersDescriptions( - "Name of the task to undeploy." - ) + @MXBeanParametersNames("taskName") + @MXBeanParametersDescriptions("Name of the task to undeploy.") public void undeployTaskFromGrid(String taskName) throws JMException; /** @@ -485,12 +464,8 @@ public interface IgniteMXBean { */ @MXBeanDescription("Pings node with given host name to see if it is alive. " + "Returns whether or not node is alive.") - @MXBeanParametersNames( - "host" - ) - @MXBeanParametersDescriptions( - "Host name or IP address of the node to ping." - ) + @MXBeanParametersNames("host") + @MXBeanParametersDescriptions("Host name or IP address of the node to ping.") public boolean pingNodeByAddress(String host); /** diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java index f72ec33d591c1..c2297ecec3c2e 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java @@ -6,6 +6,7 @@ import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; +import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -52,8 +53,9 @@ public void testNotDeactivated() throws Exception { try { mxBean.deactivate(false); - } catch (Exception e){ - assertTrue(e.getMessage().contains("The cluster has at least one cache configured without persistence")); + } + catch (Exception e) { + assertTrue(e.getMessage().contains(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES)); } assertTrue(mxBean.active()); From 4dfd7f8dbd259d301b2f5a3c06c3feaf76960ff3 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 5 Feb 2020 20:42:03 +0300 Subject: [PATCH 09/82] IGNITE-12597 : Lost fixws after review --- .../ignite/internal/commandline/DeactivateCommand.java | 9 ++++++--- .../src/main/resources/META-INF/classnames.properties | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 6e0067dc0707f..7d23b479c7744 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -34,6 +34,9 @@ */ @Deprecated public class DeactivateCommand implements Command { + /** */ + private static final String FLAG_FORCE = "--force"; + /** Cluster name. */ private String clusterName; @@ -43,7 +46,7 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, - optional("--force", CMD_AUTO_CONFIRMATION)); + optional(FLAG_FORCE, CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -76,7 +79,7 @@ public class DeactivateCommand implements Command { if (!readyToDeactivate) throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES - + " Please, add --force to deactivate cluster."); + + " Please, add " + FLAG_FORCE + " to deactivate cluster."); } GridClientClusterState state = client.state(); @@ -98,7 +101,7 @@ public class DeactivateCommand implements Command { @Override public void parseArguments(CommandArgIterator argIter) { if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); - if ("--force".equalsIgnoreCase(arg)) { + if (FLAG_FORCE.equalsIgnoreCase(arg)) { force = true; argIter.nextArg(""); } diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties index db821f1aa077d..791a19ac49abf 100644 --- a/modules/core/src/main/resources/META-INF/classnames.properties +++ b/modules/core/src/main/resources/META-INF/classnames.properties @@ -2358,6 +2358,8 @@ org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask$VisorPageLocksTrackerJob org.apache.ignite.internal.visor.encryption.VisorGetMasterKeyNameTask org.apache.ignite.internal.visor.encryption.VisorGetMasterKeyNameTask$VisorGetMasterKeyNameJob +org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask +org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask$VisorCheckDeactivationJob org.apache.ignite.internal.visor.encryption.VisorChangeMasterKeyTask org.apache.ignite.internal.visor.encryption.VisorChangeMasterKeyTask$VisorChangeMasterKeyJob org.apache.ignite.internal.visor.util.VisorClusterGroupEmptyException From edd2a52af20227cb3881a0bd1bdacf716782baf7 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 5 Feb 2020 20:42:03 +0300 Subject: [PATCH 10/82] IGNITE-12597 : fix after review. --- .../apache/ignite/internal/IgniteKernal.java | 23 +++++-------- .../ignite/internal/IgniteNodeAttributes.java | 2 +- .../ClusterStateChangeCommand.java | 14 ++++---- .../commandline/DeactivateCommand.java | 18 +++++----- .../cluster/GridClusterStateProcessor.java | 21 ++++++++++++ .../cluster/VisorCheckDeactivationTask.java | 15 +------- .../apache/ignite/mxbean/IgniteMXBean.java | 34 ++++++++++++++----- .../util/mbeans/GridStateMBeanTest.java | 4 +-- 8 files changed, 76 insertions(+), 55 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index ca015555a5886..e454642bf2370 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -231,9 +231,6 @@ import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor; import org.jetbrains.annotations.Nullable; -import java.util.stream.Collectors; -import org.apache.ignite.internal.visor.VisorTaskArgument; -import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.IgniteSystemProperties.IGNITE_BINARY_MARSHALLER_USE_STRING_SERIALIZATION_VER_2; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CONFIG_URL; @@ -304,7 +301,7 @@ import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_KEEP_MEMORY_ON_DEACTIVATION; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_REUSE_MEMORY_ON_DEACTIVATE; import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** @@ -1965,8 +1962,8 @@ private void fillNodeAttributes(boolean notifyEnabled) throws IgniteCheckedExcep ctx.addNodeAttribute(ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, ctx.service() instanceof IgniteServiceProcessor); - //Allows to predict behavior on deactivation. - add(ATTR_KEEP_MEMORY_ON_DEACTIVATION, getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); + // Allows to predict behavior on deactivation. + add(ATTR_REUSE_MEMORY_ON_DEACTIVATE, getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); } /** @@ -3964,15 +3961,11 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void deactivate(boolean force) { - // Check if cluster ir ready for deactivation. - if ((cluster().state() == ClusterState.ACTIVE || cluster().state() == ClusterState.ACTIVE_READ_ONLY) - && !force) { - Boolean readyForDeactivation = compute().execute(VisorCheckDeactivationTask.class, - new VisorTaskArgument<>(cluster().nodes().stream().map(ClusterNode::id).collect(Collectors.toList()), - null, false)); - - if (!readyForDeactivation) - throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES + // Check if cluster is ready for deactivation. + if (cluster().state() != ClusterState.INACTIVE && !force) { + + if (!context().state().isDeactivationSafe()) + throw new IllegalStateException(GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING + " Please, enable force flag to deactivate cluster."); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 5fca5b6925f4a..56954891fa0af 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -207,7 +207,7 @@ public final class IgniteNodeAttributes { ".event.driven.service.processor.enabled"; /** Flag of in-memory data erasure on deactivation. */ - public static final String ATTR_KEEP_MEMORY_ON_DEACTIVATION = ATTR_CACHE + ".persistence.keepMemDataOnDeactivation"; + public static final String ATTR_REUSE_MEMORY_ON_DEACTIVATE = ATTR_CACHE + ".persistence.reuseMemoryOnDeactivation"; /** * Enforces singleton. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 861befce3d1c3..f25269a072f75 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -32,13 +32,15 @@ import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; +import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; /** * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { /** */ - private static final String FLAG_FORCE = "--force"; + static final String FORCE_COMMAND = "--force"; /** New cluster state */ private ClusterState state; @@ -58,7 +60,7 @@ public class ClusterStateChangeCommand implements Command { params.put(ACTIVE_READ_ONLY.toString(), "Activate cluster. Cache updates are denied."); Command.usage(log, "Change cluster state:", SET_STATE, params, or((Object[])ClusterState.values()), - optional(FLAG_FORCE, CMD_AUTO_CONFIRMATION)); + optional(FORCE_COMMAND, CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -78,12 +80,12 @@ public class ClusterStateChangeCommand implements Command { try (GridClient client = Command.startClient(clientCfg)) { // Search for in-memory-only caches. Fail if data loss might appear. if (state == INACTIVE && !force) { - Boolean readyToDeactivate = TaskExecutor.executeTask(client, VisorCheckDeactivationTask.class, + Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, null, clientCfg); if (!readyToDeactivate) - throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES - + " Please, add " + FLAG_FORCE + " to deactivate cluster."); + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); } client.state().state(state); @@ -113,7 +115,7 @@ public class ClusterStateChangeCommand implements Command { if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); - if (FLAG_FORCE.equalsIgnoreCase(arg)) { + if (FORCE_COMMAND.equalsIgnoreCase(arg)) { force = true; argIter.nextArg(""); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 7d23b479c7744..4ac97f3758462 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -27,6 +27,9 @@ import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; +import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; +import static org.apache.ignite.internal.commandline.ClusterStateChangeCommand.FORCE_COMMAND; /** * Command to deactivate cluster. @@ -34,9 +37,6 @@ */ @Deprecated public class DeactivateCommand implements Command { - /** */ - private static final String FLAG_FORCE = "--force"; - /** Cluster name. */ private String clusterName; @@ -46,7 +46,7 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, - optional(FLAG_FORCE, CMD_AUTO_CONFIRMATION)); + optional(FORCE_COMMAND, CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -74,12 +74,12 @@ public class DeactivateCommand implements Command { // Search for in-memory-only caches. Fail if possible data loss. if (!force) { - Boolean readyToDeactivate = TaskExecutor.executeTask(client, VisorCheckDeactivationTask.class, + Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, null, clientCfg); if (!readyToDeactivate) - throw new IllegalStateException(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES - + " Please, add " + FLAG_FORCE + " to deactivate cluster."); + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); } GridClientClusterState state = client.state(); @@ -101,8 +101,10 @@ public class DeactivateCommand implements Command { @Override public void parseArguments(CommandArgIterator argIter) { if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); - if (FLAG_FORCE.equalsIgnoreCase(arg)) { + + if (FORCE_COMMAND.equalsIgnoreCase(arg)) { force = true; + argIter.nextArg(""); } } 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 1c7fb558a1f10..d736bc8149f3f 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 @@ -107,6 +107,7 @@ import static org.apache.ignite.internal.IgniteFeatures.CLUSTER_READ_ONLY_MODE; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.extractDataStorage; +import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_REUSE_MEMORY_ON_DEACTIVATE; /** * @@ -115,6 +116,13 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I /** */ private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; + /** + * Warning of unsafe deactivation. May be used with {@link #isDeactivationSafe()}. + * */ + public static final String DATA_LOST_ON_DEACTIVATION_WARNING = + "Cluster has nodes configured without persistence. " + + "During deactivation in-memory data and objects can be lost!"; + /** */ private boolean inMemoryMode; @@ -1654,6 +1662,19 @@ public boolean isBaselineAutoAdjustEnabled() { return distributedBaselineConfiguration.isBaselineAutoAdjustEnabled(); } + /** + * @return {@code False} if cluster deactivation can erase user's data and objects. + * {@code True} If deactivation is safe. + */ + public boolean isDeactivationSafe() { + // Find any node with disabled memory reusage on deactivation/activation. + boolean cacheDataCanBeLost = ctx.cluster().get().forServers().forPredicate(node -> + !(Boolean)node.attributes().getOrDefault(ATTR_REUSE_MEMORY_ON_DEACTIVATE, false)) + .nodes().stream().findAny().isPresent(); + + return !cacheDataCanBeLost || ctx.cache().inMemoryCaches().isEmpty(); + } + /** * @param baselineAutoAdjustEnabled Value of manual baseline control or auto adjusting baseline. {@code True} If * cluster in auto-adjust. {@code False} If cluster in manuale. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java index 9d7e3d35b9a54..89b7f24c3a816 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java @@ -18,13 +18,10 @@ package org.apache.ignite.internal.visor.cluster; import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.processors.cache.CacheType; import org.apache.ignite.internal.processors.task.GridInternal; import org.apache.ignite.internal.visor.VisorJob; import org.apache.ignite.internal.visor.VisorOneNodeTask; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_KEEP_MEMORY_ON_DEACTIVATION; - /** * Task for checking if deactiation is safe. Returns false when deactivation can lead to data loss. */ @@ -33,11 +30,6 @@ public class VisorCheckDeactivationTask extends VisorOneNodeTask /** Serial version uid. */ private static final long serialVersionUID = 0L; - /** */ - public static final String WARN_DEACTIVATION_IN_MEM_CACHES = - "The cluster has at least one cache configured without persistence. " + - "During deactivation all data from these caches will be erased!"; - /** {@inheritDoc} */ @Override protected VisorJob job(Void arg) { return new VisorCheckDeactivationJob(arg, debug); @@ -59,12 +51,7 @@ protected VisorCheckDeactivationJob(Void arg, boolean debug) { /** {@inheritDoc} */ @Override protected Boolean run(Void arg) throws IgniteException { - // Find any node with disabled memory reusage on deactivation/activation. - boolean cacheDataCanBeLost = ignite.cluster().forPredicate(node -> - !(Boolean)node.attributes().getOrDefault(ATTR_KEEP_MEMORY_ON_DEACTIVATION, false)) - .nodes().stream().findAny().isPresent(); - - return !cacheDataCanBeLost || ignite.context().cache().inMemoryCaches(CacheType.USER).isEmpty(); + return ignite.context().state().isDeactivationSafe(); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index e1602e4c62cb0..db9af049281cb 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -363,8 +363,12 @@ public interface IgniteMXBean { */ @MXBeanDescription("This method allows manually remove the checkpoint with given key. Return true " + "if specified checkpoint was indeed removed, false otherwise.") - @MXBeanParametersNames("key") - @MXBeanParametersDescriptions("Checkpoint key to remove.") + @MXBeanParametersNames( + "key" + ) + @MXBeanParametersDescriptions( + "Checkpoint key to remove." + ) public boolean removeCheckpoint(String key); /** @@ -376,18 +380,22 @@ public interface IgniteMXBean { */ @MXBeanDescription("Pings node with given node ID to see whether it is alive. " + "Returns whether or not node is alive.") - @MXBeanParametersNames("nodeId") - @MXBeanParametersDescriptions("String presentation of node ID. See java.util.UUID class for details.") + @MXBeanParametersNames( + "nodeId" + ) + @MXBeanParametersDescriptions( + "String presentation of node ID. See java.util.UUID class for details." + ) public boolean pingNode(String nodeId); /** Activates cluster. */ @MXBeanDescription("Execute activation process.") - @MXBeanParametersNames("active") public void activate(); /** Deactivates cluster. */ @MXBeanDescription("Execute deactivation process.") @MXBeanParametersNames("force") + @MXBeanParametersDescriptions("Force deactivation. Can lead to data loss.") public void deactivate(boolean force); /** @@ -427,8 +435,12 @@ public interface IgniteMXBean { * @throws JMException Thrown if undeploy failed. */ @MXBeanDescription("Makes the best attempt to undeploy a task from the whole grid.") - @MXBeanParametersNames("taskName") - @MXBeanParametersDescriptions("Name of the task to undeploy.") + @MXBeanParametersNames( + "taskName" + ) + @MXBeanParametersDescriptions( + "Name of the task to undeploy." + ) public void undeployTaskFromGrid(String taskName) throws JMException; /** @@ -464,8 +476,12 @@ public interface IgniteMXBean { */ @MXBeanDescription("Pings node with given host name to see if it is alive. " + "Returns whether or not node is alive.") - @MXBeanParametersNames("host") - @MXBeanParametersDescriptions("Host name or IP address of the node to ping.") + @MXBeanParametersNames( + "host" + ) + @MXBeanParametersDescriptions( + "Host name or IP address of the node to ping." + ) public boolean pingNodeByAddress(String host); /** diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java index c2297ecec3c2e..ab3441efc2ca7 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java @@ -6,7 +6,7 @@ import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; -import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; +import org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -55,7 +55,7 @@ public void testNotDeactivated() throws Exception { mxBean.deactivate(false); } catch (Exception e) { - assertTrue(e.getMessage().contains(VisorCheckDeactivationTask.WARN_DEACTIVATION_IN_MEM_CACHES)); + assertTrue(e.getMessage().contains(GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING)); } assertTrue(mxBean.active()); From 5d2dc697105c0445eac64ab9bdac69314ed296ff Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 6 Feb 2020 15:56:23 +0300 Subject: [PATCH 11/82] deleteme --- .../apache/ignite/internal/IgniteKernal.java | 9 ++-- .../ignite/internal/IgniteNodeAttributes.java | 4 +- .../ClusterStateChangeCommand.java | 3 +- .../commandline/DeactivateCommand.java | 3 +- .../ignite/util/GridCommandHandlerTest.java | 52 ++++++++++++++++++- 5 files changed, 61 insertions(+), 10 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index e454642bf2370..53b8e3d54e6f1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -299,6 +299,7 @@ import static org.apache.ignite.internal.IgniteVersionUtils.VER; import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR; import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_REUSE_MEMORY_ON_DEACTIVATE; @@ -3962,11 +3963,9 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void deactivate(boolean force) { // Check if cluster is ready for deactivation. - if (cluster().state() != ClusterState.INACTIVE && !force) { - - if (!context().state().isDeactivationSafe()) - throw new IllegalStateException(GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING - + " Please, enable force flag to deactivate cluster."); + if (!force && !context().state().isDeactivationSafe()) { + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " Please, enable force flag to deactivate cluster."); } cluster().state(ClusterState.INACTIVE); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 56954891fa0af..43be823d0ba9b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -206,8 +206,8 @@ public final class IgniteNodeAttributes { public static final String ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED = ATTR_PREFIX + ".event.driven.service.processor.enabled"; - /** Flag of in-memory data erasure on deactivation. */ - public static final String ATTR_REUSE_MEMORY_ON_DEACTIVATE = ATTR_CACHE + ".persistence.reuseMemoryOnDeactivation"; + /** Flag of in-memory data erasure on deactivate. */ + public static final String ATTR_REUSE_MEMORY_ON_DEACTIVATE = ATTR_CACHE + ".persistence.reuseMemoryOnDeactivate"; /** * Enforces singleton. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index f25269a072f75..737a99030f22f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -83,9 +83,10 @@ public class ClusterStateChangeCommand implements Command { Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, null, clientCfg); - if (!readyToDeactivate) + if (!readyToDeactivate) { throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); + } } client.state().state(state); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 4ac97f3758462..aadeb24e7c235 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -77,9 +77,10 @@ public class DeactivateCommand implements Command { Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, null, clientCfg); - if (!readyToDeactivate) + if (!readyToDeactivate) { throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); + } } GridClientClusterState state = client.state(); diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 49da8e83dab84..5794712d6f680 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.util; +import com.sun.tools.javac.util.Assert; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -50,15 +51,19 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteDataStreamer; import org.apache.ignite.IgniteException; +import org.apache.ignite.cache.CacheMode; +import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cluster.BaselineNode; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.GridJobExecuteResponse; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.TestRecordingCommunicationSpi; import org.apache.ignite.internal.client.util.GridConcurrentHashSet; import org.apache.ignite.internal.commandline.CommandHandler; @@ -81,6 +86,7 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry; import org.apache.ignite.internal.processors.cache.transactions.TransactionProxyImpl; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; +import org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor; import org.apache.ignite.internal.util.lang.GridAbsPredicate; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.internal.util.typedef.T2; @@ -103,6 +109,7 @@ import static java.io.File.separatorChar; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CLUSTER_NAME; +import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; @@ -227,6 +234,49 @@ public void testReadOnlyEnableDisable() throws Exception { assertContains(log, testOut.toString(), "Cluster state changed to ACTIVE"); } + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + cfg.getDataStorageConfiguration().getDefaultDataRegionConfiguration().setPersistenceEnabled(false); + return cfg; + } + + @Test + public void testDataPresent() throws Exception { + System.setProperty(IGNITE_REUSE_MEMORY_ON_DEACTIVATE, "true"); + + IgniteEx i = startGrid(0); + + String name = "non-persistent-cache"; + + i.createCache(name).put(1L, 1L); + + assertEquals(1L, i.cache(name).get(1L)); + + i.cluster().state(ClusterState.INACTIVE); + i.cluster().state(ClusterState.ACTIVE); + + assertEquals(1L, i.cache(name).get(1L)); //Assertion error here! + } + + @Test + public void testChangeState() throws Exception { + // We assume reuse-mem-on-deactivate is on. + System.setProperty(IGNITE_REUSE_MEMORY_ON_DEACTIVATE, "true"); + + Ignite ignite = startGrids(3); + + // A cache without persistence + IgniteCache cache = ignite.createCache("non-persistent-cache"); + assertNull(((CacheConfiguration)cache.getConfiguration(CacheConfiguration.class)).getDataRegionName()); + + cache.put(1L,1L); + + ignite.cluster().state(INACTIVE); + ignite.cluster().state(ACTIVE); + + assertEquals( 1L, cache.get(1L) ); + } + /** * Test deactivation works via control.sh * @@ -287,7 +337,7 @@ public void testDeactivateNonPersistent() throws Exception { assertTrue(ignite.cluster().active()); assertEquals(ACTIVE, ignite.cluster().state()); - assertContains(log, testOut.toString(), "During deactivation all data from these caches will be erased!"); + assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); } From 3fa51ccb7a089ab64df9597b43581a3fa18aba76 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 6 Feb 2020 16:59:17 +0300 Subject: [PATCH 12/82] IGNITE-12597 : fix after review #n. --- .../ClusterStateChangeCommand.java | 6 +- .../commandline/DeactivateCommand.java | 2 +- .../processors/cache/GridCacheProcessor.java | 9 +-- .../ignite/util/GridCommandHandlerTest.java | 63 ++----------------- .../util/mbeans/GridStateMBeanTest.java | 38 +---------- .../control.sh_help.output | 4 +- 6 files changed, 17 insertions(+), 105 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 737a99030f22f..a9f0da347f84f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -39,7 +39,9 @@ * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { - /** */ + /** + * Forces cluster deactivation wihtout checking of safety of the operation. + * */ static final String FORCE_COMMAND = "--force"; /** New cluster state */ @@ -60,7 +62,7 @@ public class ClusterStateChangeCommand implements Command { params.put(ACTIVE_READ_ONLY.toString(), "Activate cluster. Cache updates are denied."); Command.usage(log, "Change cluster state:", SET_STATE, params, or((Object[])ClusterState.values()), - optional(FORCE_COMMAND, CMD_AUTO_CONFIRMATION)); + optional(FORCE_COMMAND), optional(CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index aadeb24e7c235..f546836fb02e9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -46,7 +46,7 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public void printUsage(Logger log) { Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, - optional(FORCE_COMMAND, CMD_AUTO_CONFIRMATION)); + optional(FORCE_COMMAND), optional(CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index b06c92b249438..4104665bb5d08 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -4539,14 +4539,9 @@ public Collection persistentCaches() { /** * @return Collection of in-memory cache descriptors. */ - public Collection inMemoryCaches(CacheType... cacheTypes) { - Set cacheTypeFilter = cacheTypes.length == 0 - ? Collections.emptySet() - : Stream.of(cacheTypes).collect(Collectors.toSet()); - + public Collection inMemoryCaches() { return cachesInfo.registeredCaches().values().stream() - .filter(desc -> (cacheTypeFilter.isEmpty() || cacheTypeFilter.contains(desc.cacheType())) - && !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())) + .filter(desc -> !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())) .collect(Collectors.toList()); } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 5794712d6f680..23907172cc005 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -17,7 +17,6 @@ package org.apache.ignite.util; -import com.sun.tools.javac.util.Assert; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -51,19 +50,15 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteDataStreamer; import org.apache.ignite.IgniteException; -import org.apache.ignite.cache.CacheMode; -import org.apache.ignite.cache.CacheWriteSynchronizationMode; import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction; import org.apache.ignite.cluster.BaselineNode; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; -import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.GridJobExecuteResponse; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.IgnitionEx; import org.apache.ignite.internal.TestRecordingCommunicationSpi; import org.apache.ignite.internal.client.util.GridConcurrentHashSet; import org.apache.ignite.internal.commandline.CommandHandler; @@ -109,7 +104,6 @@ import static java.io.File.separatorChar; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CLUSTER_NAME; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL; import static org.apache.ignite.cache.CacheMode.PARTITIONED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; @@ -234,49 +228,6 @@ public void testReadOnlyEnableDisable() throws Exception { assertContains(log, testOut.toString(), "Cluster state changed to ACTIVE"); } - @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - cfg.getDataStorageConfiguration().getDefaultDataRegionConfiguration().setPersistenceEnabled(false); - return cfg; - } - - @Test - public void testDataPresent() throws Exception { - System.setProperty(IGNITE_REUSE_MEMORY_ON_DEACTIVATE, "true"); - - IgniteEx i = startGrid(0); - - String name = "non-persistent-cache"; - - i.createCache(name).put(1L, 1L); - - assertEquals(1L, i.cache(name).get(1L)); - - i.cluster().state(ClusterState.INACTIVE); - i.cluster().state(ClusterState.ACTIVE); - - assertEquals(1L, i.cache(name).get(1L)); //Assertion error here! - } - - @Test - public void testChangeState() throws Exception { - // We assume reuse-mem-on-deactivate is on. - System.setProperty(IGNITE_REUSE_MEMORY_ON_DEACTIVATE, "true"); - - Ignite ignite = startGrids(3); - - // A cache without persistence - IgniteCache cache = ignite.createCache("non-persistent-cache"); - assertNull(((CacheConfiguration)cache.getConfiguration(CacheConfiguration.class)).getDataRegionName()); - - cache.put(1L,1L); - - ignite.cluster().state(INACTIVE); - ignite.cluster().state(ACTIVE); - - assertEquals( 1L, cache.get(1L) ); - } - /** * Test deactivation works via control.sh * @@ -330,17 +281,13 @@ public void testDeactivateNonPersistent() throws Exception { ignite.createCache(new CacheConfiguration<>("non-persistent-cache") .setDataRegionName("non-persistent-dataRegion")); - if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) - assertEquals(EXIT_CODE_OK, execute("--deactivate")); - else { - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); - assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); - } + assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); assertFalse(ignite.cluster().active()); assertEquals(INACTIVE, ignite.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java index ab3441efc2ca7..3a596cc707cd1 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java @@ -10,29 +10,10 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; /** MBean test of cluster state operations. */ public class GridStateMBeanTest extends GridCommonAbstractTest { - /** */ - protected boolean persistenceEnabled = false; - - /** */ - protected boolean activeAtStart = false; - - /** */ - @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { - IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - - cfg.setClusterStateOnStart(activeAtStart ? ACTIVE : INACTIVE); - DataStorageConfiguration dsCfg = cfg.getDataStorageConfiguration(); - if(dsCfg==null) - cfg.setDataStorageConfiguration(dsCfg = new DataStorageConfiguration()); - - dsCfg.getDefaultDataRegionConfiguration().setPersistenceEnabled(persistenceEnabled); - - return cfg; - } - /** * Test deactivation works via JMX * @@ -40,39 +21,26 @@ public class GridStateMBeanTest extends GridCommonAbstractTest { */ @Test public void testNotDeactivated() throws Exception { - persistenceEnabled = false; - activeAtStart = true; - Ignite ignite = startGrids(1); IgniteMXBean mxBean = (IgniteMXBean)ignite; assertTrue(mxBean.active()); assertEquals(ACTIVE.name(), mxBean.clusterState()); - ignite.createCache("non-persistent-cache"); - try { + // There is at least the system cache. Might be internal caches. Difficult to predict data erasure. mxBean.deactivate(false); } catch (Exception e) { - assertTrue(e.getMessage().contains(GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING)); + assertTrue(e.getMessage().contains(DATA_LOST_ON_DEACTIVATION_WARNING)); } assertTrue(mxBean.active()); assertEquals(ACTIVE.name(), mxBean.clusterState()); - ignite.destroyCache("non-persistent-cache"); - - mxBean.deactivate(false); - - assertFalse(mxBean.active()); - assertEquals(INACTIVE.name(), mxBean.clusterState()); - mxBean.activate(); assertTrue(mxBean.active()); - ignite.createCache("non-persistent-cache"); - mxBean.deactivate(true); assertFalse(mxBean.active()); diff --git a/modules/core/src/test/resources/org.apache.ignite.util/control.sh_help.output b/modules/core/src/test/resources/org.apache.ignite.util/control.sh_help.output index c3c825fb017f2..17755838a9c2b 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/control.sh_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/control.sh_help.output @@ -13,13 +13,13 @@ This utility can do the following commands: control.(sh|bat) --activate Deactivate cluster (deprecated. Use --set-state instead): - control.(sh|bat) --deactivate [--yes] + control.(sh|bat) --deactivate [--force] [--yes] Print current cluster state: control.(sh|bat) --state Change cluster state: - control.(sh|bat) --set-state INACTIVE|ACTIVE|ACTIVE_READ_ONLY [--yes] + control.(sh|bat) --set-state INACTIVE|ACTIVE|ACTIVE_READ_ONLY [--force] [--yes] Parameters: ACTIVE - Activate cluster. Cache updates are allowed. From cd26b383174dfb7460a016f52441d6d9945e5cbb Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 6 Feb 2020 17:07:10 +0300 Subject: [PATCH 13/82] IGNITE-12597 : fix. --- .../apache/ignite/util/GridCommandHandlerTest.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 23907172cc005..9d12e7a7e95fd 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -319,17 +319,13 @@ public void testDeactivateNonPersistentWithSetState() throws Exception { ignite.createCache(new CacheConfiguration<>("non-persistent-cache") .setDataRegionName("non-persistent-dataRegion")); - if (IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE)) - assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive")); - else { - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--set-state", "inactive")); + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--set-state", "inactive")); - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - assertContains(log, testOut.toString(), "During deactivation all data from these caches will be erased!"); + assertTrue(ignite.cluster().active()); + assertEquals(ACTIVE, ignite.cluster().state()); + assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); - assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive", "--force")); - } + assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive", "--force")); assertFalse(ignite.cluster().active()); assertEquals(INACTIVE, ignite.cluster().state()); From fbb406faeb24938ab332bb44c8fcd2cb67b3fa5e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 7 Feb 2020 11:33:27 +0300 Subject: [PATCH 14/82] IGNITE-12597 : Removed checking of reuse-mem-on-deactivate. Useless. Won't work. --- .../java/org/apache/ignite/internal/IgniteKernal.java | 5 ----- .../apache/ignite/internal/IgniteNodeAttributes.java | 3 --- .../processors/cluster/GridClusterStateProcessor.java | 10 ++-------- .../org/apache/ignite/util/GridCommandHandlerTest.java | 1 - .../apache/ignite/util/mbeans/GridStateMBeanTest.java | 3 --- 5 files changed, 2 insertions(+), 20 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 53b8e3d54e6f1..c534a1cd37306 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -302,8 +302,6 @@ import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_REUSE_MEMORY_ON_DEACTIVATE; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_REUSE_MEMORY_ON_DEACTIVATE; /** * This class represents an implementation of the main Ignite API {@link Ignite} which is expanded by additional @@ -1962,9 +1960,6 @@ private void fillNodeAttributes(boolean notifyEnabled) throws IgniteCheckedExcep ctx.addNodeAttribute(ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED, ctx.service() instanceof IgniteServiceProcessor); - - // Allows to predict behavior on deactivation. - add(ATTR_REUSE_MEMORY_ON_DEACTIVATE, getBoolean(IGNITE_REUSE_MEMORY_ON_DEACTIVATE)); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java index 43be823d0ba9b..187e979a35a38 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteNodeAttributes.java @@ -206,9 +206,6 @@ public final class IgniteNodeAttributes { public static final String ATTR_EVENT_DRIVEN_SERVICE_PROCESSOR_ENABLED = ATTR_PREFIX + ".event.driven.service.processor.enabled"; - /** Flag of in-memory data erasure on deactivate. */ - public static final String ATTR_REUSE_MEMORY_ON_DEACTIVATE = ATTR_CACHE + ".persistence.reuseMemoryOnDeactivate"; - /** * Enforces singleton. */ 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 d736bc8149f3f..02df06c0e7b48 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 @@ -107,7 +107,6 @@ import static org.apache.ignite.internal.IgniteFeatures.CLUSTER_READ_ONLY_MODE; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.extractDataStorage; -import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_REUSE_MEMORY_ON_DEACTIVATE; /** * @@ -120,7 +119,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I * Warning of unsafe deactivation. May be used with {@link #isDeactivationSafe()}. * */ public static final String DATA_LOST_ON_DEACTIVATION_WARNING = - "Cluster has nodes configured without persistence. " + + "Cluster has caches configured without persistence. " + "During deactivation in-memory data and objects can be lost!"; /** */ @@ -1667,12 +1666,7 @@ public boolean isBaselineAutoAdjustEnabled() { * {@code True} If deactivation is safe. */ public boolean isDeactivationSafe() { - // Find any node with disabled memory reusage on deactivation/activation. - boolean cacheDataCanBeLost = ctx.cluster().get().forServers().forPredicate(node -> - !(Boolean)node.attributes().getOrDefault(ATTR_REUSE_MEMORY_ON_DEACTIVATE, false)) - .nodes().stream().findAny().isPresent(); - - return !cacheDataCanBeLost || ctx.cache().inMemoryCaches().isEmpty(); + return ctx.cache().inMemoryCaches().isEmpty(); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 9d12e7a7e95fd..205ad2e027ddf 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -100,7 +100,6 @@ import org.apache.ignite.transactions.TransactionTimeoutException; import org.jetbrains.annotations.NotNull; import org.junit.Test; -import org.apache.ignite.IgniteSystemProperties; import static java.io.File.separatorChar; import static org.apache.ignite.IgniteSystemProperties.IGNITE_CLUSTER_NAME; diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java index 3a596cc707cd1..cb6e63974e897 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java @@ -1,12 +1,9 @@ package org.apache.ignite.util.mbeans; import org.apache.ignite.Ignite; -import org.apache.ignite.configuration.DataStorageConfiguration; -import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; -import org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; From d80a31088fea24d2e653fce3298ba27d74afa965 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Fri, 7 Feb 2020 12:11:59 +0300 Subject: [PATCH 15/82] IGNITE-12597 : Minor fixes. --- .../internal/commandline/ClusterStateChangeCommand.java | 4 +--- .../apache/ignite/internal/commandline/DeactivateCommand.java | 1 - .../processors/cluster/GridClusterStateProcessor.java | 4 +--- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index a9f0da347f84f..b5fd226755b20 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -39,9 +39,7 @@ * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { - /** - * Forces cluster deactivation wihtout checking of safety of the operation. - * */ + /** Forces cluster deactivation wihtout checking of safety of the operation. */ static final String FORCE_COMMAND = "--force"; /** New cluster state */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index f546836fb02e9..2c2b47ea6230f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -71,7 +71,6 @@ public class DeactivateCommand implements Command { log.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { - // Search for in-memory-only caches. Fail if possible data loss. if (!force) { Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, 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 02df06c0e7b48..0fdf9c2fa0649 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 @@ -115,9 +115,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I /** */ private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; - /** - * Warning of unsafe deactivation. May be used with {@link #isDeactivationSafe()}. - * */ + /** Warning of unsafe deactivation. May be used with {@link #isDeactivationSafe()}. */ public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Cluster has caches configured without persistence. " + "During deactivation in-memory data and objects can be lost!"; From 7f0920c76b37a7c43efc741985ca3991a9d27c75 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 7 Feb 2020 15:49:53 +0300 Subject: [PATCH 16/82] IGNITE-12597 : Redeem IgniteMXBean --- .../apache/ignite/cluster/ClusterState.java | 9 ++- .../apache/ignite/internal/IgniteKernal.java | 37 ++++++------ .../apache/ignite/mxbean/IgniteMXBean.java | 25 +++----- .../IgniteBasicWithPersistenceTestSuite.java | 4 +- .../ignite/util/GridCommandHandlerTest.java | 57 +++++++------------ ...st.java => GridMBeanClusterStateTest.java} | 33 ++++++----- 6 files changed, 78 insertions(+), 87 deletions(-) rename modules/core/src/test/java/org/apache/ignite/util/mbeans/{GridStateMBeanTest.java => GridMBeanClusterStateTest.java} (54%) diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index b87cb9855824f..6cef256f4c5f1 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -23,7 +23,14 @@ * Cluster states. */ public enum ClusterState { - /** Cluster deactivated. Cache operations aren't allowed. */ + /** + * Cluster deactivated. Cache operations aren't allowed. + *

+ * NOTE: + * Please be aware that deactivation can cause data loss. + * This process clears all in-memory caches including the system ones. + * Thus, all in-memory-only data and objects are erased. + */ INACTIVE, /** Cluster activated. All cache operations are allowed. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index c534a1cd37306..a0c42d5459375 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -245,6 +245,7 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_SUCCESS_FILE; import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.IgniteSystemProperties.snapshot; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.GridKernalState.DISCONNECTED; import static org.apache.ignite.internal.GridKernalState.STARTED; import static org.apache.ignite.internal.GridKernalState.STARTING; @@ -3947,23 +3948,10 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { - cluster().active(active); - } - - /** {@inheritDoc} */ - @Override public void activate() { - cluster().state(ClusterState.ACTIVE); - } - - /** {@inheritDoc} */ - @Override public void deactivate(boolean force) { - // Check if cluster is ready for deactivation. - if (!force && !context().state().isDeactivationSafe()) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " Please, enable force flag to deactivate cluster."); - } + if (!active) + checkDeactivation(); - cluster().state(ClusterState.INACTIVE); + cluster().active(active); } /** */ @@ -4761,12 +4749,27 @@ void waitPreviousReconnect() { } /** {@inheritDoc} */ - @Override public void clusterState(String state) { + @Override public void clusterState(String state, boolean force) { ClusterState newState = ClusterState.valueOf(state); + if (newState == INACTIVE && !force) + checkDeactivation(); + cluster().state(newState); } + /** + * Check if cluster is ready for deactivation. + * + * @throws IllegalStateException if deactivation is unsafe. + */ + private void checkDeactivation() { + if (!context().state().isDeactivationSafe()) { + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " Please, enable force flag to deactivate cluster."); + } + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(IgniteKernal.class, this); diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index db9af049281cb..f8a6701cf4d66 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -388,26 +388,15 @@ public interface IgniteMXBean { ) public boolean pingNode(String nodeId); - /** Activates cluster. */ - @MXBeanDescription("Execute activation process.") - public void activate(); - - /** Deactivates cluster. */ - @MXBeanDescription("Execute deactivation process.") - @MXBeanParametersNames("force") - @MXBeanParametersDescriptions("Force deactivation. Can lead to data loss.") - public void deactivate(boolean force); - /** * @param active Activate/DeActivate flag. - * @deprecated Use {@link #activate()} and {@link #deactivate(boolean)} instead. */ - @Deprecated @MXBeanDescription( - "Execute activate or deactivate process. Deprecated. " + - "Use activate() / deactivate(). Deactivation may require flag 'force'." + "Execute activate or deactivate process." + ) + @MXBeanParametersNames( + "active" ) - @MXBeanParametersNames("active") public void active(boolean active); /** @@ -713,9 +702,9 @@ void runIoTest( * See {@link ClusterState} */ @MXBeanDescription("Changes current cluster state.") - @MXBeanParametersNames("state") - @MXBeanParametersDescriptions("New cluster state.") - public void clusterState(String state); + @MXBeanParametersNames({"state", "force"}) + @MXBeanParametersDescriptions({"New cluster state.", "Skip checking of safety of the operation."}) + public void clusterState(String state, boolean force); /** * Gets last cluster state change operation. diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java index 0bace61040f6c..8336be8b936b0 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicWithPersistenceTestSuite.java @@ -42,7 +42,7 @@ import org.apache.ignite.util.GridCommandHandlerTest; import org.apache.ignite.util.GridCommandHandlerWithSSLTest; import org.apache.ignite.util.GridInternalTaskUnusedWalSegmentsTest; -import org.apache.ignite.util.mbeans.GridStateMBeanTest; +import org.apache.ignite.util.mbeans.GridMBeanClusterStateTest; import org.junit.runner.RunWith; import org.junit.runners.Suite; @@ -83,7 +83,7 @@ EncryptionMXBeanTest.class, - GridStateMBeanTest.class + GridMBeanClusterStateTest.class }) public class IgniteBasicWithPersistenceTestSuite { } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 205ad2e027ddf..3b2d224f3c809 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -255,50 +255,31 @@ public void testDeactivate() throws Exception { } /** - * Test deactivation works via control.sh when a non-persistent cache involved. + * Test "deactivate" via control.sh when a non-persistent cache involved. * * @throws Exception If failed. */ @Test public void testDeactivateNonPersistent() throws Exception { - dataRegionConfiguration = new DataRegionConfiguration() - .setName("non-persistent-dataRegion") - .setPersistenceEnabled(false); - - Ignite ignite = startGrids(1); - - assertFalse(ignite.cluster().active()); - assertEquals(INACTIVE, ignite.cluster().state()); - - ignite.cluster().state(ACTIVE); - - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - - injectTestSystemOut(); - - ignite.createCache(new CacheConfiguration<>("non-persistent-cache") - .setDataRegionName("non-persistent-dataRegion")); - - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--deactivate")); - - assertTrue(ignite.cluster().active()); - assertEquals(ACTIVE, ignite.cluster().state()); - assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); - - assertEquals(EXIT_CODE_OK, execute("--deactivate", "--force")); - - assertFalse(ignite.cluster().active()); - assertEquals(INACTIVE, ignite.cluster().state()); + deactivateNonPersistent( true ); } /** - * Test deactivation works via control.sh and --set-state command when a non-persistent cache involved. + * Test "set-state inactive" via control.sh when a non-persistent cache involved. * * @throws Exception If failed. */ @Test - public void testDeactivateNonPersistentWithSetState() throws Exception { + public void testSetInactiveonPersistent() throws Exception { + deactivateNonPersistent( false ); + } + + /** + * Launches "deactivate" of "set-state inactive" works via control.sh when a non-persistent cache involved. + * + * @param usingDeprecatedDeactivate deactivates cluster using deprecated "deactivate" command. + */ + private void deactivateNonPersistent(boolean usingDeprecatedDeactivate) throws Exception { dataRegionConfiguration = new DataRegionConfiguration() .setName("non-persistent-dataRegion") .setPersistenceEnabled(false); @@ -313,18 +294,22 @@ public void testDeactivateNonPersistentWithSetState() throws Exception { assertTrue(ignite.cluster().active()); assertEquals(ACTIVE, ignite.cluster().state()); - injectTestSystemOut(); - ignite.createCache(new CacheConfiguration<>("non-persistent-cache") .setDataRegionName("non-persistent-dataRegion")); - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--set-state", "inactive")); + injectTestSystemOut(); + + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, usingDeprecatedDeactivate + ? execute("--deactivate") + : execute("--set-state", "inactive")); assertTrue(ignite.cluster().active()); assertEquals(ACTIVE, ignite.cluster().state()); assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); - assertEquals(EXIT_CODE_OK, execute("--set-state", "inactive", "--force")); + assertEquals(EXIT_CODE_OK, usingDeprecatedDeactivate + ? execute("--deactivate", "--force") + : execute("--set-state", "inactive", "--force")); assertFalse(ignite.cluster().active()); assertEquals(INACTIVE, ignite.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java similarity index 54% rename from modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java rename to modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index cb6e63974e897..3a0f37d2a2496 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridStateMBeanTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -1,6 +1,9 @@ package org.apache.ignite.util.mbeans; import org.apache.ignite.Ignite; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -8,9 +11,10 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; +import static org.apache.ignite.testframework.GridTestUtils.assertThrows; /** MBean test of cluster state operations. */ -public class GridStateMBeanTest extends GridCommonAbstractTest { +public class GridMBeanClusterStateTest extends GridCommonAbstractTest { /** * Test deactivation works via JMX * @@ -18,27 +22,30 @@ public class GridStateMBeanTest extends GridCommonAbstractTest { */ @Test public void testNotDeactivated() throws Exception { - Ignite ignite = startGrids(1); + IgniteEx ignite = startGrids(2); IgniteMXBean mxBean = (IgniteMXBean)ignite; + IgniteCache cache = ignite.createCache("non-persistent-cache"); + assertTrue(mxBean.active()); assertEquals(ACTIVE.name(), mxBean.clusterState()); - try { - // There is at least the system cache. Might be internal caches. Difficult to predict data erasure. - mxBean.deactivate(false); - } - catch (Exception e) { - assertTrue(e.getMessage().contains(DATA_LOST_ON_DEACTIVATION_WARNING)); - } + assertFalse(ignite.context().state().isDeactivationSafe()); - assertTrue(mxBean.active()); - assertEquals(ACTIVE.name(), mxBean.clusterState()); + assertThrows(log, () -> { + mxBean.active(false); + return null; + }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + + assertThrows(log, () -> { + mxBean.clusterState(INACTIVE.name(), false); + return null; + }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); - mxBean.activate(); assertTrue(mxBean.active()); + assertEquals(ACTIVE.name(), mxBean.clusterState()); - mxBean.deactivate(true); + mxBean.clusterState(INACTIVE.name(), true); assertFalse(mxBean.active()); assertEquals(INACTIVE.name(), mxBean.clusterState()); From 64a1f84c7f6620aa86dc8802a0c44aa221ec9bb7 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Fri, 7 Feb 2020 16:24:47 +0300 Subject: [PATCH 17/82] IGNITE-12597 : code style --- .../java/org/apache/ignite/util/GridCommandHandlerTest.java | 6 +++--- .../ignite/util/mbeans/GridMBeanClusterStateTest.java | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 3b2d224f3c809..64e173c6bd9b6 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -261,7 +261,7 @@ public void testDeactivate() throws Exception { */ @Test public void testDeactivateNonPersistent() throws Exception { - deactivateNonPersistent( true ); + checkDeactivateNonPersistent( true ); } /** @@ -271,7 +271,7 @@ public void testDeactivateNonPersistent() throws Exception { */ @Test public void testSetInactiveonPersistent() throws Exception { - deactivateNonPersistent( false ); + checkDeactivateNonPersistent(false); } /** @@ -279,7 +279,7 @@ public void testSetInactiveonPersistent() throws Exception { * * @param usingDeprecatedDeactivate deactivates cluster using deprecated "deactivate" command. */ - private void deactivateNonPersistent(boolean usingDeprecatedDeactivate) throws Exception { + private void checkDeactivateNonPersistent(boolean usingDeprecatedDeactivate) throws Exception { dataRegionConfiguration = new DataRegionConfiguration() .setName("non-persistent-dataRegion") .setPersistenceEnabled(false); diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index 3a0f37d2a2496..9912880fcd3d3 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -34,11 +34,13 @@ public void testNotDeactivated() throws Exception { assertThrows(log, () -> { mxBean.active(false); + return null; }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); assertThrows(log, () -> { mxBean.clusterState(INACTIVE.name(), false); + return null; }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); From ea322f78f09783e0f2e392b4b6852e3c013b2e44 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Fri, 7 Feb 2020 17:07:58 +0300 Subject: [PATCH 18/82] IGNITE-12597 : fix force-change-state. --- .../apache/ignite/internal/IgniteKernal.java | 28 +++++++++---------- .../apache/ignite/mxbean/IgniteMXBean.java | 14 +++++++++- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index a0c42d5459375..2494cee335325 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -3948,8 +3948,11 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { - if (!active) - checkDeactivation(); + if (!active && !ctx.state().isDeactivationSafe()) { + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To force changing of cluster state call " + + "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); + } cluster().active(active); } @@ -4748,26 +4751,21 @@ void waitPreviousReconnect() { ctx.cluster().get().clearNodeMap(); } + /** {@inheritDoc} */ + @Override public void clusterState(String state) { + clusterState(state, false); + } + /** {@inheritDoc} */ @Override public void clusterState(String state, boolean force) { ClusterState newState = ClusterState.valueOf(state); - if (newState == INACTIVE && !force) - checkDeactivation(); - - cluster().state(newState); - } - - /** - * Check if cluster is ready for deactivation. - * - * @throws IllegalStateException if deactivation is unsafe. - */ - private void checkDeactivation() { - if (!context().state().isDeactivationSafe()) { + if (newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + " Please, enable force flag to deactivate cluster."); } + + cluster().state(newState); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index f8a6701cf4d66..ef6bc4780af5e 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -702,8 +702,20 @@ void runIoTest( * See {@link ClusterState} */ @MXBeanDescription("Changes current cluster state.") + @MXBeanParametersNames("state") + @MXBeanParametersDescriptions("New cluster state.") + public void clusterState(String state); + + /** + * Changes current cluster state. Can skip checking safety of the operation. + * + * @param state String representation of new cluster state. + * @param force Disables checking of operation safety. + * See {@link ClusterState} + */ + @MXBeanDescription("Changes current cluster state.") @MXBeanParametersNames({"state", "force"}) - @MXBeanParametersDescriptions({"New cluster state.", "Skip checking of safety of the operation."}) + @MXBeanParametersDescriptions({"New cluster state.", "Disables checking of operation safety."}) public void clusterState(String state, boolean force); /** From f06d4dd6a101c7e2458be4e13fd752c4026d601a Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Fri, 7 Feb 2020 18:36:47 +0300 Subject: [PATCH 19/82] IGNITE-12597 : fix. --- .../apache/ignite/internal/IgniteKernal.java | 10 +++++++- .../apache/ignite/mxbean/IgniteMXBean.java | 6 ++--- .../ignite/util/GridCommandHandlerTest.java | 23 +++++++++---------- .../mbeans/GridMBeanClusterStateTest.java | 8 +++++-- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 2494cee335325..4ab5fef995c03 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -4753,7 +4753,15 @@ void waitPreviousReconnect() { /** {@inheritDoc} */ @Override public void clusterState(String state) { - clusterState(state, false); + ClusterState newState = ClusterState.valueOf(state); + + if (newState == INACTIVE && !ctx.state().isDeactivationSafe()) { + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To force changing of cluster state call " + + "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); + } + + cluster().state(newState); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index ef6bc4780af5e..bf1cd695b6877 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -710,12 +710,12 @@ void runIoTest( * Changes current cluster state. Can skip checking safety of the operation. * * @param state String representation of new cluster state. - * @param force Disables checking of operation safety. - * See {@link ClusterState} + * @param force If true then skips checking of operation safety. + * @see ClusterState */ @MXBeanDescription("Changes current cluster state.") @MXBeanParametersNames({"state", "force"}) - @MXBeanParametersDescriptions({"New cluster state.", "Disables checking of operation safety."}) + @MXBeanParametersDescriptions({"New cluster state.", "If true then skips checking of operation safety."}) public void clusterState(String state, boolean force); /** diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 64e173c6bd9b6..aff1216e66488 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -260,8 +260,8 @@ public void testDeactivate() throws Exception { * @throws Exception If failed. */ @Test - public void testDeactivateNonPersistent() throws Exception { - checkDeactivateNonPersistent( true ); + public void testDeactivateNonPNersistent() throws Exception { + checkDeactivateNonPersistent("--deactivate"); } /** @@ -271,15 +271,15 @@ public void testDeactivateNonPersistent() throws Exception { */ @Test public void testSetInactiveonPersistent() throws Exception { - checkDeactivateNonPersistent(false); + checkDeactivateNonPersistent("--set-state", "inactive"); } /** - * Launches "deactivate" of "set-state inactive" works via control.sh when a non-persistent cache involved. + * Launches cluster deactivation. Works via control.sh when a non-persistent cache involved. * - * @param usingDeprecatedDeactivate deactivates cluster using deprecated "deactivate" command. + * @param cmd Certain command to deactivate cluster. */ - private void checkDeactivateNonPersistent(boolean usingDeprecatedDeactivate) throws Exception { + private void checkDeactivateNonPersistent(String... cmd) throws Exception { dataRegionConfiguration = new DataRegionConfiguration() .setName("non-persistent-dataRegion") .setPersistenceEnabled(false); @@ -299,17 +299,16 @@ private void checkDeactivateNonPersistent(boolean usingDeprecatedDeactivate) thr injectTestSystemOut(); - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, usingDeprecatedDeactivate - ? execute("--deactivate") - : execute("--set-state", "inactive")); + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute(cmd)); assertTrue(ignite.cluster().active()); assertEquals(ACTIVE, ignite.cluster().state()); assertContains(log, testOut.toString(), GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING); - assertEquals(EXIT_CODE_OK, usingDeprecatedDeactivate - ? execute("--deactivate", "--force") - : execute("--set-state", "inactive", "--force")); + List forceCmd = new ArrayList<>(Arrays.asList(cmd)); + forceCmd.add("--force"); + + assertEquals(EXIT_CODE_OK, execute(forceCmd)); assertFalse(ignite.cluster().active()); assertEquals(INACTIVE, ignite.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index 9912880fcd3d3..225626f8bca47 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -1,8 +1,6 @@ package org.apache.ignite.util.mbeans; -import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; -import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; @@ -38,6 +36,12 @@ public void testNotDeactivated() throws Exception { return null; }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + assertThrows(log, () -> { + mxBean.clusterState(INACTIVE.name()); + + return null; + }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + assertThrows(log, () -> { mxBean.clusterState(INACTIVE.name(), false); From 46635a33332b34411dab27f91d61fa24fdd516e2 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 7 Feb 2020 18:42:40 +0300 Subject: [PATCH 20/82] IGNITE-12597 : spell fix. --- .../ignite/internal/commandline/ClusterStateChangeCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index b5fd226755b20..576a657aad967 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -39,7 +39,7 @@ * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { - /** Forces cluster deactivation wihtout checking of safety of the operation. */ + /** Forces cluster deactivation without checking of safety of the operation. */ static final String FORCE_COMMAND = "--force"; /** New cluster state */ From 7ff1a3b9097cdabd87acd859b9998a70487f31d1 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 10 Feb 2020 13:43:49 +0300 Subject: [PATCH 21/82] IGNITE-12597 : removed exception throwing for the internal calls satbility. --- .../main/java/org/apache/ignite/internal/IgniteKernal.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 4ab5fef995c03..026eda62b4a14 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -3948,12 +3948,6 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { - if (!active && !ctx.state().isDeactivationSafe()) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To force changing of cluster state call " + - "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); - } - cluster().active(active); } From 7b2512a369005a919e2d3152067e571addf38d3d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 10 Feb 2020 17:56:29 +0300 Subject: [PATCH 22/82] IGNITE-12646 : checking of deactivation returned --- .../main/java/org/apache/ignite/internal/IgniteKernal.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 026eda62b4a14..4ab5fef995c03 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -3948,6 +3948,12 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { + if (!active && !ctx.state().isDeactivationSafe()) { + throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To force changing of cluster state call " + + "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); + } + cluster().active(active); } From 7ab38188998371f0bbdd2306fd855b2eb70b4533 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 11 Feb 2020 12:37:24 +0300 Subject: [PATCH 23/82] IGNITE-12646 : Suggestion of fixing mbean interface IgniteMXBean. --- .../main/java/org/apache/ignite/Ignite.java | 1 + .../java/org/apache/ignite/IgniteCluster.java | 1 + .../apache/ignite/internal/IgniteKernal.java | 24 ++++++---------- .../commandline/DeactivateCommand.java | 14 +++++----- .../apache/ignite/mxbean/IgniteMXBean.java | 19 ++++++------- .../ignite/util/GridCommandHandlerTest.java | 4 +-- .../mbeans/GridMBeanClusterStateTest.java | 28 +++++++++++++++++-- 7 files changed, 54 insertions(+), 37 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 72f5fa59c4e75..2c33ab1428385 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -663,6 +663,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig /** * Changes Ignite grid state to active or inactive. + * Be aware that deactivation of cluster can lead to data loss. @see org.apache.ignite.ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 05dcf3eba5578..7d8a7bcf0b002 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -455,6 +455,7 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes Ignite grid state to active or inactive. + * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 4ab5fef995c03..840beb47a0285 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -245,6 +245,7 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_SUCCESS_FILE; import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.IgniteSystemProperties.snapshot; +import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.GridKernalState.DISCONNECTED; import static org.apache.ignite.internal.GridKernalState.STARTED; @@ -3948,15 +3949,14 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te /** {@inheritDoc} */ @Override public void active(boolean active) { - if (!active && !ctx.state().isDeactivationSafe()) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To force changing of cluster state call " + - "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); - } - cluster().active(active); } + /** {@inheritDoc} */ + @Override public void activate(boolean active, boolean force) { + clusterState(active ? ACTIVE.name() : INACTIVE.name(), force); + } + /** */ private Collection baselineNodes() { Collection srvNodes = cluster().forServers().nodes(); @@ -4753,15 +4753,7 @@ void waitPreviousReconnect() { /** {@inheritDoc} */ @Override public void clusterState(String state) { - ClusterState newState = ClusterState.valueOf(state); - - if (newState == INACTIVE && !ctx.state().isDeactivationSafe()) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To force changing of cluster state call " + - "clusterState(\"" + INACTIVE.name().toLowerCase() + "\", true)."); - } - - cluster().state(newState); + clusterState(state, false); } /** {@inheritDoc} */ @@ -4770,7 +4762,7 @@ void waitPreviousReconnect() { if (newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " Please, enable force flag to deactivate cluster."); + + " To change cluster state on \"" + state + "\" pass the force flag."); } cluster().state(newState); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 2c2b47ea6230f..31c30fed0f138 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -44,8 +44,8 @@ public class DeactivateCommand implements Command { private boolean force; /** {@inheritDoc} */ - @Override public void printUsage(Logger log) { - Command.usage(log, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, + @Override public void printUsage(Logger logger) { + Command.usage(logger, "Deactivate cluster (deprecated. Use " + SET_STATE.toString() + " instead):", DEACTIVATE, optional(FORCE_COMMAND), optional(CMD_AUTO_CONFIRMATION)); } @@ -67,11 +67,11 @@ public class DeactivateCommand implements Command { * @param clientCfg Client configuration. * @throws Exception If failed to deactivate. */ - @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { - log.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { + logger.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { - // Search for in-memory-only caches. Fail if possible data loss. + // Search for in-memory-only caches. Fails if data loss can occur. if (!force) { Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, null, clientCfg); @@ -86,10 +86,10 @@ public class DeactivateCommand implements Command { state.active(false); - log.info("Cluster deactivated."); + logger.info("Cluster deactivated"); } catch (Exception e) { - log.severe("Failed to deactivate cluster."); + logger.severe("Failed to deactivate cluster."); throw e; } diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index bf1cd695b6877..1547913b8fa12 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -389,15 +389,14 @@ public interface IgniteMXBean { public boolean pingNode(String nodeId); /** - * @param active Activate/DeActivate flag. + * @param active If {@code True}, starts activation process. If {@code False}, starts deactivation process. + * @param force If {@code True}, skips checking of operation safety. */ - @MXBeanDescription( - "Execute activate or deactivate process." - ) - @MXBeanParametersNames( - "active" - ) - public void active(boolean active); + @MXBeanDescription("Activates or deactivates cluster. Can skip checking if this operation is safe.") + @MXBeanParametersNames({"active", "force"}) + @MXBeanParametersDescriptions({"If True, starts activation process. If False, starts deactivation process.", + "If True, skips checking of operation safety."}) + public void activate(boolean active, boolean force); /** * Checks if Ignite grid is active. If Ignite grid is not active return {@code False}. @@ -710,10 +709,10 @@ void runIoTest( * Changes current cluster state. Can skip checking safety of the operation. * * @param state String representation of new cluster state. - * @param force If true then skips checking of operation safety. + * @param force If {@code True} then skips checking of operation safety. * @see ClusterState */ - @MXBeanDescription("Changes current cluster state.") + @MXBeanDescription("Changes current cluster state. Can skip checking if this operation is safe.") @MXBeanParametersNames({"state", "force"}) @MXBeanParametersDescriptions({"New cluster state.", "If true then skips checking of operation safety."}) public void clusterState(String state, boolean force); diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index aff1216e66488..373374dbd511a 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -260,7 +260,7 @@ public void testDeactivate() throws Exception { * @throws Exception If failed. */ @Test - public void testDeactivateNonPNersistent() throws Exception { + public void testDeactivateNonPersistent() throws Exception { checkDeactivateNonPersistent("--deactivate"); } @@ -270,7 +270,7 @@ public void testDeactivateNonPNersistent() throws Exception { * @throws Exception If failed. */ @Test - public void testSetInactiveonPersistent() throws Exception { + public void testSetInactiveNonPersistent() throws Exception { checkDeactivateNonPersistent("--set-state", "inactive"); } diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index 225626f8bca47..0ac7c1361bcb5 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -1,5 +1,6 @@ package org.apache.ignite.util.mbeans; +import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.mxbean.IgniteMXBean; @@ -14,7 +15,7 @@ /** MBean test of cluster state operations. */ public class GridMBeanClusterStateTest extends GridCommonAbstractTest { /** - * Test deactivation works via JMX + * Test deactivation works via JMX ({@link IgniteMXBean}) and {@link Ignite}. * * @throws Exception If failed. */ @@ -26,12 +27,22 @@ public void testNotDeactivated() throws Exception { IgniteCache cache = ignite.createCache("non-persistent-cache"); assertTrue(mxBean.active()); + assertTrue(ignite.active()); assertEquals(ACTIVE.name(), mxBean.clusterState()); assertFalse(ignite.context().state().isDeactivationSafe()); + // Deactivation through the 'code' must not fail. + ignite.active(false); + assertFalse(ignite.active()); + assertEquals(INACTIVE.name(), mxBean.clusterState()); + + ignite.active(true); + assertTrue(ignite.active()); + + // Manual deactivation must not fail and warn of possible data loss. assertThrows(log, () -> { - mxBean.active(false); + mxBean.activate(false, false); return null; }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); @@ -48,12 +59,25 @@ public void testNotDeactivated() throws Exception { return null; }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + assertTrue(ignite.active()); assertTrue(mxBean.active()); assertEquals(ACTIVE.name(), mxBean.clusterState()); + // Forced deactivation. mxBean.clusterState(INACTIVE.name(), true); assertFalse(mxBean.active()); assertEquals(INACTIVE.name(), mxBean.clusterState()); + + mxBean.activate(true, false); + + assertTrue(mxBean.active()); + assertEquals(ACTIVE.name(), mxBean.clusterState()); + + // Forced deactivation. + mxBean.activate(false, true); + + assertFalse(mxBean.active()); + assertEquals(INACTIVE.name(), mxBean.clusterState()); } } From fbc2de5694540f26ba3c95a6912c6956417b43d2 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 11 Feb 2020 14:13:34 +0300 Subject: [PATCH 24/82] IGNITE-12646 : + some javadoc --- modules/core/src/main/java/org/apache/ignite/IgniteCluster.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 7d8a7bcf0b002..5df0452fa6da0 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -473,6 +473,7 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. + * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param newState New cluster state. * @throws IgniteException If there is an already started transaction or lock in the same thread. From 5eef09766ac96bddd5a0807715803e95314ae804 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 11 Feb 2020 14:33:19 +0300 Subject: [PATCH 25/82] IGNITE-12646 : + enchanced javadoc --- .../main/java/org/apache/ignite/IgniteCluster.java | 4 ++++ .../java/org/apache/ignite/mxbean/IgniteMXBean.java | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 5df0452fa6da0..8e96c155523fd 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -455,6 +455,8 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes Ignite grid state to active or inactive. + *

+ * NOTE: * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. @@ -473,6 +475,8 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. + *

+ * NOTE: * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 1547913b8fa12..f03083c35c433 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -389,8 +389,14 @@ public interface IgniteMXBean { public boolean pingNode(String nodeId); /** + * Changes grid state to active or inactive. Can skip checking safety of the operation. + *

+ * NOTE: + * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * * @param active If {@code True}, starts activation process. If {@code False}, starts deactivation process. * @param force If {@code True}, skips checking of operation safety. + * @throws IllegalStateException if state stange can lead to data loss and the force flag is not activated. */ @MXBeanDescription("Activates or deactivates cluster. Can skip checking if this operation is safe.") @MXBeanParametersNames({"active", "force"}) @@ -696,6 +702,9 @@ void runIoTest( /** * Changes current cluster state. + *

+ * NOTE: + * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param state String representation of new cluster state. * See {@link ClusterState} @@ -707,6 +716,9 @@ void runIoTest( /** * Changes current cluster state. Can skip checking safety of the operation. + *

+ * NOTE: + * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. * * @param state String representation of new cluster state. * @param force If {@code True} then skips checking of operation safety. From 508e35d4ea18203a050b61ecfe7f0c710992aa71 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 12 Feb 2020 16:39:49 +0300 Subject: [PATCH 26/82] IGNITE-12646 : changed IgniteCluster, Ignite, IgniteMXBean --- .../main/java/org/apache/ignite/Ignite.java | 8 +++-- .../java/org/apache/ignite/IgniteCluster.java | 22 +++++++++++-- .../apache/ignite/internal/IgniteKernal.java | 15 +-------- ...hangeOfClusterStateIsNotSafeException.java | 22 +++++++++++++ .../cluster/IgniteClusterAsyncImpl.java | 5 +++ .../internal/cluster/IgniteClusterImpl.java | 25 +++++++------- .../processors/cache/GridCacheProcessor.java | 9 ----- .../cluster/GridClusterStateProcessor.java | 5 ++- .../GridChangeClusterStateCommandHandler.java | 2 +- .../apache/ignite/mxbean/IgniteMXBean.java | 28 +++++++++------- .../multijvm/IgniteClusterProcessProxy.java | 5 +++ .../ignite/util/GridCommandHandlerTest.java | 3 -- .../mbeans/GridMBeanClusterStateTest.java | 33 +++++++------------ 13 files changed, 104 insertions(+), 78 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 2c33ab1428385..ce43bddb538b6 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -24,6 +24,7 @@ import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.affinity.Affinity; import org.apache.ignite.cluster.ClusterGroup; +import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.AtomicConfiguration; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.CollectionConfiguration; @@ -31,6 +32,7 @@ import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.plugin.IgnitePlugin; @@ -663,11 +665,13 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig /** * Changes Ignite grid state to active or inactive. - * Be aware that deactivation of cluster can lead to data loss. @see org.apache.ignite.ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link IgniteCluster#active(boolean)} instead. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. + * @deprecated Use {@link IgniteCluster#state(ClusterState)} + * or {@link IgniteCluster#state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active); diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 8e96c155523fd..35f0d00d40f3e 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -27,6 +27,7 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterStartNodeResult; import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.processors.cluster.baseline.autoadjust.BaselineAutoAdjustStatus; import org.apache.ignite.lang.IgniteAsyncSupport; import org.apache.ignite.lang.IgniteAsyncSupported; @@ -457,11 +458,12 @@ public IgniteFuture> startNodesAsync(Collecti * Changes Ignite grid state to active or inactive. *

* NOTE: - * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link #state(ClusterState)} instead. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. + * @deprecated Use {@link #state(ClusterState) or {@link #state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active); @@ -477,13 +479,27 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * * @param newState New cluster state. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * @throws IgniteException If there is an already started transaction or lock in the same thread. */ public void state(ClusterState newState) throws IgniteException; + /** + * Changes current cluster state to given {@code newState} cluster state. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * + * @param newState New cluster state. + * @param force If {@code True} then skips checking of operation safety. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss and the force flag is not set. + * @throws IgniteException If there is an already started transaction or lock in the same thread. + */ + public void state(ClusterState newState, boolean force) throws IgniteException; + /** * Gets current baseline topology. If baseline topology was not set, will return {@code null}. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 840beb47a0285..b1663b8532fff 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -245,8 +245,6 @@ import static org.apache.ignite.IgniteSystemProperties.IGNITE_SUCCESS_FILE; import static org.apache.ignite.IgniteSystemProperties.getBoolean; import static org.apache.ignite.IgniteSystemProperties.snapshot; -import static org.apache.ignite.cluster.ClusterState.ACTIVE; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.GridKernalState.DISCONNECTED; import static org.apache.ignite.internal.GridKernalState.STARTED; import static org.apache.ignite.internal.GridKernalState.STARTING; @@ -301,7 +299,6 @@ import static org.apache.ignite.internal.IgniteVersionUtils.VER; import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR; import static org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START; import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START; @@ -3952,11 +3949,6 @@ public IgniteInternalFuture getOrCreateCacheAsync(String cacheName, String te cluster().active(active); } - /** {@inheritDoc} */ - @Override public void activate(boolean active, boolean force) { - clusterState(active ? ACTIVE.name() : INACTIVE.name(), force); - } - /** */ private Collection baselineNodes() { Collection srvNodes = cluster().forServers().nodes(); @@ -4760,12 +4752,7 @@ void waitPreviousReconnect() { @Override public void clusterState(String state, boolean force) { ClusterState newState = ClusterState.valueOf(state); - if (newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on \"" + state + "\" pass the force flag."); - } - - cluster().state(newState); + cluster().state(newState, force); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java new file mode 100644 index 0000000000000..44fbfcb795317 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java @@ -0,0 +1,22 @@ +package org.apache.ignite.internal.cluster; + +import org.apache.ignite.IgniteException; + +/** + * Warns of possibility to lose data on change of cluster state. + */ +public class ChangeOfClusterStateIsNotSafeException extends IgniteException { + /** */ + private static final long serialVersionUID = 0L; + + /** Default constructor. */ + public ChangeOfClusterStateIsNotSafeException() { + } + + /** + * @param msg Message. + */ + public ChangeOfClusterStateIsNotSafeException(String msg) { + super(msg); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java index a001b56ae9b0b..3c7f922a27a96 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java @@ -425,4 +425,9 @@ public IgniteFuture baselineAutoAdjustTimeoutAsync(long baselineAutoAdjustTim @Override public void state(ClusterState newState) throws IgniteException { cluster.state(newState); } + + /** {@inheritDoc} */ + @Override public void state(ClusterState newState, boolean force) throws IgniteException { + cluster.state(newState, force); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 7fc666a2131f5..e1f3be0c75c31 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -73,8 +73,10 @@ import org.apache.ignite.lang.IgniteProductVersion; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.specifications; @@ -309,17 +311,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void active(boolean active) { - guard(); - - try { - ctx.state().changeGlobalState(active, serverNodes(), false).get(); - } - catch (IgniteCheckedException e) { - throw U.convertException(e); - } - finally { - unguard(); - } + state(active ? ClusterState.ACTIVE : INACTIVE); } /** {@inheritDoc} */ @@ -336,6 +328,17 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void state(ClusterState newState) throws IgniteException { + state(newState, false); + } + + /** {@inheritDoc} */ + @Override public void state(ClusterState newState, boolean force) throws IgniteException { + if (!force && newState == INACTIVE && !ctx.state().isDeactivationSafe()) { + throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To change cluster state on \"" + newState + "\" pass the force flag: " + + "IgniteCluster#state(INACTIVE, true)"); + } + guard(); try { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 4104665bb5d08..e64e03b1c56f8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -4536,15 +4536,6 @@ public Collection persistentCaches() { .collect(Collectors.toList()); } - /** - * @return Collection of in-memory cache descriptors. - */ - public Collection inMemoryCaches() { - return cachesInfo.registeredCaches().values().stream() - .filter(desc -> !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())) - .collect(Collectors.toList()); - } - /** * @return Collection of persistent cache group descriptors. */ 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 0fdf9c2fa0649..57117c5cebaad 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 @@ -107,6 +107,7 @@ import static org.apache.ignite.internal.IgniteFeatures.CLUSTER_READ_ONLY_MODE; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.extractDataStorage; +import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isPersistentCache; /** * @@ -1664,7 +1665,9 @@ public boolean isBaselineAutoAdjustEnabled() { * {@code True} If deactivation is safe. */ public boolean isDeactivationSafe() { - return ctx.cache().inMemoryCaches().isEmpty(); + return !ctx.cache().cacheDescriptors().values().stream() + .anyMatch(desc -> + !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 7de6d1426a255..3b520b73f7402 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -73,7 +73,7 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.grid().cluster().state(req.state()); + ctx.grid().cluster().state(req.state(), true); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index f03083c35c433..2f64247de1d08 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -22,6 +22,7 @@ import java.util.UUID; import javax.management.JMException; import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.processors.metric.GridMetricManager; /** @@ -389,20 +390,21 @@ public interface IgniteMXBean { public boolean pingNode(String nodeId); /** - * Changes grid state to active or inactive. Can skip checking safety of the operation. + * Changes grid state to active or inactive. *

* NOTE: - * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * - * @param active If {@code True}, starts activation process. If {@code False}, starts deactivation process. - * @param force If {@code True}, skips checking of operation safety. - * @throws IllegalStateException if state stange can lead to data loss and the force flag is not activated. + * @param active Activate/DeActivate flag. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. */ - @MXBeanDescription("Activates or deactivates cluster. Can skip checking if this operation is safe.") - @MXBeanParametersNames({"active", "force"}) - @MXBeanParametersDescriptions({"If True, starts activation process. If False, starts deactivation process.", - "If True, skips checking of operation safety."}) - public void activate(boolean active, boolean force); + @MXBeanDescription( + "Execute activate or deactivate process." + ) + @MXBeanParametersNames( + "active" + ) + public void active(boolean active); /** * Checks if Ignite grid is active. If Ignite grid is not active return {@code False}. @@ -704,9 +706,10 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * * @param state String representation of new cluster state. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * See {@link ClusterState} */ @MXBeanDescription("Changes current cluster state.") @@ -718,10 +721,11 @@ void runIoTest( * Changes current cluster state. Can skip checking safety of the operation. *

* NOTE: - * Be aware that deactivation of cluster can lead to data loss. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * * @param state String representation of new cluster state. * @param force If {@code True} then skips checking of operation safety. + * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss and the force flag is not set. * @see ClusterState */ @MXBeanDescription("Changes current cluster state. Can skip checking if this operation is safe.") diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java index c8e6fb37bcdc9..4c3c45867836c 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java @@ -402,6 +402,11 @@ public IgniteClusterProcessProxy(IgniteProcessProxy proxy) { throw new UnsupportedOperationException("Operation is not supported yet."); } + /** {@inheritDoc} */ + @Override public void state(ClusterState newState, boolean force) throws IgniteException { + throw new UnsupportedOperationException("Operation is not supported yet."); + } + /** * */ diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 373374dbd511a..7442ae0914cb9 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -286,9 +286,6 @@ private void checkDeactivateNonPersistent(String... cmd) throws Exception { Ignite ignite = startGrids(1); - assertFalse(ignite.cluster().active()); - assertEquals(INACTIVE, ignite.cluster().state()); - ignite.cluster().state(ACTIVE); assertTrue(ignite.cluster().active()); diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index 0ac7c1361bcb5..e16b54e696ebc 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -3,6 +3,8 @@ import org.apache.ignite.Ignite; import org.apache.ignite.IgniteCache; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; +import org.apache.ignite.internal.processors.cache.persistence.wal.crc.IgniteDataIntegrityViolationException; import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; @@ -32,32 +34,30 @@ public void testNotDeactivated() throws Exception { assertFalse(ignite.context().state().isDeactivationSafe()); - // Deactivation through the 'code' must not fail. - ignite.active(false); - assertFalse(ignite.active()); - assertEquals(INACTIVE.name(), mxBean.clusterState()); + // Manual deactivation must not fail and warn of possible data loss. + assertThrows(log, () -> { + mxBean.active(false); - ignite.active(true); - assertTrue(ignite.active()); + return null; + }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - // Manual deactivation must not fail and warn of possible data loss. assertThrows(log, () -> { - mxBean.activate(false, false); + ignite.active(false); return null; - }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); assertThrows(log, () -> { mxBean.clusterState(INACTIVE.name()); return null; - }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); assertThrows(log, () -> { mxBean.clusterState(INACTIVE.name(), false); return null; - }, Exception.class, DATA_LOST_ON_DEACTIVATION_WARNING); + }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); assertTrue(ignite.active()); assertTrue(mxBean.active()); @@ -68,16 +68,5 @@ public void testNotDeactivated() throws Exception { assertFalse(mxBean.active()); assertEquals(INACTIVE.name(), mxBean.clusterState()); - - mxBean.activate(true, false); - - assertTrue(mxBean.active()); - assertEquals(ACTIVE.name(), mxBean.clusterState()); - - // Forced deactivation. - mxBean.activate(false, true); - - assertFalse(mxBean.active()); - assertEquals(INACTIVE.name(), mxBean.clusterState()); } } From b12428fb1f6cad191c943be9b549bf27ed976c50 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 13 Feb 2020 11:31:37 +0300 Subject: [PATCH 27/82] IGNITE-12646 : another exception --- .../apache/ignite/internal/commandline/DeactivateCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 31c30fed0f138..d6a16670ba227 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -21,6 +21,7 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; @@ -77,7 +78,7 @@ public class DeactivateCommand implements Command { null, clientCfg); if (!readyToDeactivate) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING + throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); } } From 4dea12dba9c4ebc3ae07d4ca64df0f9ac4112b8e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 13 Feb 2020 11:31:37 +0300 Subject: [PATCH 28/82] IGNITE-12646 : fix of import --- .../org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java index e16b54e696ebc..ef31b168aa970 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java @@ -4,7 +4,6 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; -import org.apache.ignite.internal.processors.cache.persistence.wal.crc.IgniteDataIntegrityViolationException; import org.apache.ignite.mxbean.IgniteMXBean; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.junit.Test; From 5520fe83831fd3f769a16ff81c86179c9935966b Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 13 Feb 2020 20:39:39 +0300 Subject: [PATCH 29/82] IGNITE-12646 : first working version of new IgniteCluster#state(ClusterState, boolean force) --- .../java/org/apache/ignite/IgniteCluster.java | 13 ++-- .../ignite/internal/IgniteFeatures.java | 5 +- .../client/GridClientClusterState.java | 21 ++++- .../GridServerDoesNotSupportException.java | 45 +++++++++++ .../impl/GridClientClusterStateImpl.java | 32 +++++++- .../impl/connection/GridClientConnection.java | 31 +++++++- .../GridClientNioTcpConnection.java | 23 +++--- .../ClusterStateChangeCommand.java | 16 +--- .../ignite/internal/commandline/Command.java | 44 +++++++++++ .../commandline/DeactivateCommand.java | 21 +---- .../internal/commandline/TxCommands.java | 32 +------- .../GridClientClusterStateForcedRequest.java | 76 +++++++++++++++++++ .../GridClientClusterStateRequest.java | 14 +++- .../GridChangeClusterStateCommandHandler.java | 2 +- .../protocols/tcp/GridTcpRestNioListener.java | 6 ++ .../request/GridRestClusterStateRequest.java | 11 +++ .../cluster/VisorCheckDeactivationTask.java | 57 -------------- .../resources/META-INF/classnames.properties | 3 +- 18 files changed, 303 insertions(+), 149 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 35f0d00d40f3e..0f6bf55b7410e 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -456,14 +456,12 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes Ignite grid state to active or inactive. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. + * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. - * @deprecated Use {@link #state(ClusterState) or {@link #state(ClusterState, boolean)} instead. + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active); @@ -477,18 +475,19 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * Fails if the operation is not safe. @see ClusterState#INACTIVE. * * @param newState New cluster state. * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * @throws IgniteException If there is an already started transaction or lock in the same thread. + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ + @Deprecated public void state(ClusterState newState) throws IgniteException; /** * Changes current cluster state to given {@code newState} cluster state. + * Fails if the operation is not safe and force is not set. *

* NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java index 956d72faca1e2..3a867fb61efee 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java @@ -83,7 +83,10 @@ public enum IgniteFeatures { MASTER_KEY_CHANGE(20), /** ContinuousQuery with security subject id support. */ - CONT_QRY_SECURITY_AWARE(21); + CONT_QRY_SECURITY_AWARE(21), + + /** Preventing data loss on deactivation. */ + FORCED_CHANGE_OF_CLUSTER_STATE(22); /** * Unique feature identifier. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 6476a58dbc416..5b9bd7692fa60 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -24,8 +24,11 @@ */ public interface GridClientClusterState { /** + * Changes Ignite grid state to active or inactive. + * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. + * * @param active {@code True} activate, {@code False} deactivate. - * @deprecated Use {@link #state()} instead. + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active) throws GridClientException; @@ -45,12 +48,28 @@ public interface GridClientClusterState { /** * Changes cluster state to {@code newState}. + * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. * * @param newState New cluster state. * @throws GridClientException If the request to change the cluster state failed. + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ + @Deprecated public void state(ClusterState newState) throws GridClientException; + /** + * Changes cluster state to {@code newState}. Fails if the operation is not safe and force + * is {@code False}. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. + * + * @param newState New cluster state. + * @param force New cluster state. + * @throws GridClientException If the request to change the cluster state failed. + */ + public void state(ClusterState newState, boolean force) throws GridClientException; + /** * Get the cluster name. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java new file mode 100644 index 0000000000000..71e01d5ed546f --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java @@ -0,0 +1,45 @@ +/* + * 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.client; + +/** + * Thrown when detected a server node unsupporting command, operation or version. + */ +public class GridServerDoesNotSupportException extends GridClientException { + /** */ + private static final long serialVersionUID = 0L; + + /** + * Creates exception with specified error message. + * + * @param msg Error message. + */ + public GridServerDoesNotSupportException(String msg) { + super(msg); + } + + /** + * Creates exception with specified error message and cause. + * + * @param msg Error message. + * @param cause Error cause. + */ + public GridServerDoesNotSupportException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 2cdcc14cae84a..da61edf6ad7fc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -18,14 +18,21 @@ package org.apache.ignite.internal.client.impl; import java.util.Collection; +import java.util.UUID; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.client.GridClientPredicate; +import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.apache.ignite.internal.client.balancer.GridClientLoadBalancer; import org.apache.ignite.internal.client.impl.connection.GridClientConnection; +import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; +import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; +import static org.apache.ignite.internal.commandline.Command.checkFeatureSupportedByCluster; + /** * */ @@ -50,7 +57,7 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void active(final boolean active) throws GridClientException { - withReconnectHandling((conn, nodeId) -> conn.changeState(active, nodeId)).get(); + state(active ? ACTIVE : INACTIVE); } /** {@inheritDoc} */ @@ -65,7 +72,28 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState) throws GridClientException { - withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId)).get(); + state(newState, false); + } + + /** {@inheritDoc} */ + @Override public void state(ClusterState newState, boolean force) throws GridClientException { + // Check compapability of new forced deactivation on all nodes. + UUID oldVerServerNode = checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, + false, false); + + if (oldVerServerNode == null) + withReconnectHandling((con, nodeId) -> con.changeState(newState, force, nodeId)).get(); + else { + if (force) { + throw new GridServerDoesNotSupportException("Unable to forcibly change state of cluster on \"" + + newState.name() + "\". Found a node not supporting forced version this command: " + + oldVerServerNode + ". You can try without the flag 'force'."); + } + else { + // Send old version of the command not supporting 'force'. + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId)).get(); + } + } } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 329d5ae6c4c51..15a4dcddafb82 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -309,27 +309,50 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a boolean keepBinaries) throws GridClientConnectionResetException, GridClientClosedException; /** - * Change grid global state. + * Change grid global state. Fails if the operation is not safe and force is {@code False}. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * * @param active Active. + * @param force If {@code True} then skips checking of operation safety. * @param destNodeId Destination node id. - * @deprecated Use {@link #changeState(ClusterState, UUID)} instead. + * @deprecated Use {@link #changeState(ClusterState, boolean, UUID)} instead. */ @Deprecated - public abstract GridClientFuture changeState(boolean active, UUID destNodeId) + public abstract GridClientFuture changeState(boolean active, boolean force, UUID destNodeId) throws GridClientClosedException, GridClientConnectionResetException; /** - * Changes grid global state. + * Changes grid global state. Fails if the operation is not safe. + * Uses old version of change state request that guaranties comaptibility with old-version-servers. + * But cannot pass the force flag like {@link #changeState(ClusterState, boolean, UUID)}. * * @param state New cluster state. * @param destNodeId Destination node id. * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. + * @deprecated Use {@link #changeState(ClusterState, boolean, UUID)} instead. */ + @Deprecated public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId) throws GridClientClosedException, GridClientConnectionResetException; + /** + * Changes grid global state. Fails if the operation is not safe and force is {@code False}. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * + * @param state New cluster state. + * @param force If {@code True} then skips checking of operation safety. + * @param destNodeId Destination node id. + * @throws GridClientConnectionResetException In case of error. + * @throws GridClientClosedException If client was manually closed before request was sent over network. + */ + public abstract GridClientFuture changeState(ClusterState state, boolean force, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException; + /** * Get current grid state. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 762f6b3032920..74dad46a7862b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -61,6 +61,7 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheBean; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientMessage; @@ -811,23 +812,27 @@ private GridClientAuthenticationRequest buildAuthRequest() { } /** {@inheritDoc} */ - @Override public GridClientFuture changeState( - boolean active, - UUID destNodeId - ) throws GridClientClosedException, GridClientConnectionResetException { - return changeState(active ? ACTIVE : INACTIVE, destNodeId); + @Override public GridClientFuture changeState(boolean active, boolean force, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException { + return changeState(active ? ACTIVE : INACTIVE, force, destNodeId); } /** {@inheritDoc} */ - @Override public GridClientFuture changeState( - ClusterState state, - UUID destNodeId - ) throws GridClientClosedException, GridClientConnectionResetException { + @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException { assert state != null; return makeRequest(GridClientClusterStateRequest.state(state), destNodeId); } + /** {@inheritDoc} */ + @Override public GridClientFuture changeState(ClusterState state, boolean force, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException { + assert state != null; + + return makeRequest(GridClientClusterStateForcedRequest.state(state, force), destNodeId); + } + /** {@inheritDoc} */ @Override public GridClientFuture currentState( UUID destNodeId diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 576a657aad967..65c99bf0f9e90 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -23,7 +23,6 @@ import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; @@ -32,8 +31,6 @@ import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; -import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; /** * Command to change cluster state. @@ -78,18 +75,7 @@ public class ClusterStateChangeCommand implements Command { /** {@inheritDoc} */ @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { - // Search for in-memory-only caches. Fail if data loss might appear. - if (state == INACTIVE && !force) { - Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, - null, clientCfg); - - if (!readyToDeactivate) { - throw new IllegalStateException(DATA_LOST_ON_DEACTIVATION_WARNING - + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); - } - } - - client.state().state(state); + client.state().state(state, force); log.info("Cluster state changed to " + state); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java index d65ced180ca7e..9d5252f02ddd2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java @@ -17,13 +17,20 @@ package org.apache.ignite.internal.commandline; +import java.util.Collection; import java.util.Comparator; import java.util.Map; +import java.util.UUID; import java.util.logging.Logger; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.internal.IgniteFeatures; +import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientFactory; +import org.apache.ignite.internal.client.GridClientNode; +import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.SB; import org.jetbrains.annotations.Nullable; @@ -40,6 +47,43 @@ * @param Generic for getArg method which should return command-specific paramters which it would be run with. */ public interface Command { + /** + * Checks that all cluster nodes support specified feature. + * + * @param client Client. + * @param feature Feature. + * @param validateClientNodes Whether client nodes should be checked as well. + * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting feature. + * @throws GridServerDoesNotSupportException If failIfUnsupportedFound is {@code True} and found a node + * unsupporting feature. + * @return Id of node unsupporting feature. {@code null} if all nodes support feature. + */ + public static UUID checkFeatureSupportedByCluster( + GridClient client, + IgniteFeatures feature, + boolean validateClientNodes, + boolean failIfUnsupportedFound + ) throws GridClientException { + Collection nodes = validateClientNodes ? + client.compute().nodes() : + client.compute().nodes(GridClientNode::connectable); + + for (GridClientNode node : nodes) { + byte[] featuresAttrBytes = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_FEATURES); + + if (!IgniteFeatures.nodeSupports(featuresAttrBytes, feature)) { + if (failIfUnsupportedFound) { + throw new GridServerDoesNotSupportException("Failed to execute command: cluster contains node that " + + "doesn't support feature [nodeId=" + node.nodeId() + ", feature=" + feature + ']'); + } + else + return node.nodeId(); + } + } + + return null; + } + /** * Method to create thin client for communication with cluster. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index d6a16670ba227..2cedd7a82b06b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -18,18 +18,14 @@ package org.apache.ignite.internal.commandline; import java.util.logging.Logger; +import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClient; -import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; -import org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; -import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.commandline.ClusterStateChangeCommand.FORCE_COMMAND; /** @@ -72,20 +68,7 @@ public class DeactivateCommand implements Command { logger.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { - // Search for in-memory-only caches. Fails if data loss can occur. - if (!force) { - Boolean readyToDeactivate = executeTask(client, VisorCheckDeactivationTask.class, - null, clientCfg); - - if (!readyToDeactivate) { - throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING - + " Please, add " + FORCE_COMMAND + " to deactivate cluster."); - } - } - - GridClientClusterState state = client.state(); - - state.active(false); + client.state().state(ClusterState.INACTIVE, force); logger.info("Cluster deactivated"); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java index 8c1d64e1ae522..d0d8640f7db36 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.commandline; import java.util.ArrayList; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -29,11 +28,9 @@ import java.util.regex.PatternSyntaxException; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.internal.IgniteFeatures; -import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientException; -import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.commandline.argument.CommandArgUtils; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.util.typedef.F; @@ -52,6 +49,7 @@ import org.apache.ignite.internal.visor.tx.VisorTxTaskResult; import org.apache.ignite.transactions.TransactionState; +import static org.apache.ignite.internal.commandline.Command.checkFeatureSupportedByCluster; import static org.apache.ignite.internal.commandline.CommandList.TX; import static org.apache.ignite.internal.commandline.CommandLogger.DOUBLE_INDENT; import static org.apache.ignite.internal.commandline.CommandLogger.optional; @@ -350,7 +348,7 @@ private static String nodeDescription(ClusterNode node) { * @param client Client. */ private Object transactionInfo(GridClient client, GridClientConfiguration conf) throws GridClientException { - checkFeatureSupportedByCluster(client, IgniteFeatures.TX_INFO_COMMAND, true); + checkFeatureSupportedByCluster(client, IgniteFeatures.TX_INFO_COMMAND, true, true); GridCacheVersion nearXidVer = executeTask(client, FetchNearXidVersionTask.class, args.txInfoArgument(), conf); @@ -553,32 +551,6 @@ private void printTxInfoHistoricalResult(Map res } } - /** - * Checks that all cluster nodes support specified feature. - * - * @param client Client. - * @param feature Feature. - * @param validateClientNodes Whether client nodes should be checked as well. - */ - private static void checkFeatureSupportedByCluster( - GridClient client, - IgniteFeatures feature, - boolean validateClientNodes - ) throws GridClientException { - Collection nodes = validateClientNodes ? - client.compute().nodes() : - client.compute().nodes(GridClientNode::connectable); - - for (GridClientNode node : nodes) { - byte[] featuresAttrBytes = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_FEATURES); - - if (!IgniteFeatures.nodeSupports(featuresAttrBytes, feature)) { - throw new IllegalStateException("Failed to execute command: cluster contains node that " + - "doesn't support feature [nodeId=" + node.nodeId() + ", feature=" + feature + ']'); - } - } - } - /** {@inheritDoc} */ @Override public String name() { return TX.toCommandName(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java new file mode 100644 index 0000000000000..393b639bc667c --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java @@ -0,0 +1,76 @@ +/* + * 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.rest.client.message; + +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import org.apache.ignite.cluster.ClusterState; + +/** + * Enchanced version of {@link GridClientClusterStateRequest}. + * Introduced to support forced version of the change state command and keep backward compatibility + * with nodes of old version that may occur in cluster. + */ +public class GridClientClusterStateForcedRequest extends GridClientClusterStateRequest { + /** */ + private static final long serialVersionUID = 0L; + + /** Forced change of cluster state. */ + private boolean force; + + /** + * @param state New cluster state. + * @param force Forced change of cluster state. + * @return Cluster state change request. + */ + public static GridClientClusterStateForcedRequest state(ClusterState state, boolean force) { + return new GridClientClusterStateForcedRequest(GridClientClusterStateRequest.state(state), force); + } + + /** Default constructor for the exernalization. */ + public GridClientClusterStateForcedRequest() { + // No op. + } + + /** Copying constructor. */ + private GridClientClusterStateForcedRequest(GridClientClusterStateRequest clusterStateReq, boolean force) { + super(clusterStateReq); + + this.force = force; + } + + /** */ + public boolean forced() { + return force; + } + + /** {@inheritDoc} */ + @Override public void writeExternal(ObjectOutput out) throws IOException { + super.writeExternal(out); + + out.writeBoolean(force); + } + + /** {@inheritDoc} */ + @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { + super.readExternal(in); + + force = in.readBoolean(); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 319a4361102b2..6589abfab4bd3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -24,8 +24,9 @@ import org.apache.ignite.internal.util.typedef.internal.U; /** - * + * @deprecated Use {@link GridClientClusterStateForcedRequest} */ +@Deprecated public class GridClientClusterStateRequest extends GridClientAbstractMessage { /** */ private static final long serialVersionUID = 0L; @@ -69,6 +70,17 @@ public static GridClientClusterStateRequest state(ClusterState state) { return msg; } + /** Default constructor for the exernalization. */ + public GridClientClusterStateRequest() { + // No op. + } + + /** Copying constructor. */ + protected GridClientClusterStateRequest(GridClientClusterStateRequest src) { + reqCurrentState = src.reqCurrentState; + state = src.state; + } + /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 3b520b73f7402..762d9e3fa8453 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -73,7 +73,7 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.grid().cluster().state(req.state(), true); + ctx.grid().cluster().state(req.state(), req.forced()); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java index e07c4d109beaf..c28723537ce1b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java @@ -36,6 +36,7 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientAuthenticationRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeResponse; @@ -387,6 +388,8 @@ else if (msg instanceof GridClientStateRequest) { else if (msg instanceof GridClientClusterStateRequest) { GridClientClusterStateRequest req = (GridClientClusterStateRequest)msg; + boolean forced = msg instanceof GridClientClusterStateForcedRequest; + GridRestClusterStateRequest restChangeReq = new GridRestClusterStateRequest(); if (req.isReqCurrentState()) { @@ -396,6 +399,9 @@ else if (msg instanceof GridClientClusterStateRequest) { else { restChangeReq.state(req.state()); restChangeReq.command(CLUSTER_SET_STATE); + + if(forced) + restChangeReq.forced(((GridClientClusterStateForcedRequest)msg).forced()); } restReq = restChangeReq; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 82de9a3c888c4..61156401bd8a1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -29,6 +29,14 @@ public class GridRestClusterStateRequest extends GridRestRequest { /** New state. */ private ClusterState state; + /** Forced change of the state. */ + private boolean force; + + /** */ + public void forced(boolean forced) { + force = forced; + } + /** */ public void reqCurrentMode() { reqCurrentMode = true; @@ -39,6 +47,9 @@ public boolean isReqCurrentMode() { return reqCurrentMode; } + /** */ + public boolean forced(){ return force; } + /** */ public ClusterState state() { return state; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java deleted file mode 100644 index 89b7f24c3a816..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cluster/VisorCheckDeactivationTask.java +++ /dev/null @@ -1,57 +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.visor.cluster; - -import org.apache.ignite.IgniteException; -import org.apache.ignite.internal.processors.task.GridInternal; -import org.apache.ignite.internal.visor.VisorJob; -import org.apache.ignite.internal.visor.VisorOneNodeTask; - -/** - * Task for checking if deactiation is safe. Returns false when deactivation can lead to data loss. - */ -@GridInternal -public class VisorCheckDeactivationTask extends VisorOneNodeTask { - /** Serial version uid. */ - private static final long serialVersionUID = 0L; - - /** {@inheritDoc} */ - @Override protected VisorJob job(Void arg) { - return new VisorCheckDeactivationJob(arg, debug); - } - - /** The task for checking if deactiation is safe. Returns false if deactivation can lead to data loss. */ - private static class VisorCheckDeactivationJob extends VisorJob { - /** Serial version uid. */ - private static final long serialVersionUID = 0L; - - /** - * Create job with specified argument. - * - * @param arg Job argument. - */ - protected VisorCheckDeactivationJob(Void arg, boolean debug) { - super(arg, debug); - } - - /** {@inheritDoc} */ - @Override protected Boolean run(Void arg) throws IgniteException { - return ignite.context().state().isDeactivationSafe(); - } - } -} diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties index 791a19ac49abf..da1e2e11d3f86 100644 --- a/modules/core/src/main/resources/META-INF/classnames.properties +++ b/modules/core/src/main/resources/META-INF/classnames.properties @@ -1659,6 +1659,7 @@ org.apache.ignite.internal.processors.rest.client.message.GridClientMessage org.apache.ignite.internal.processors.rest.client.message.GridClientNodeBean org.apache.ignite.internal.processors.rest.client.message.GridClientNodeMetricsBean org.apache.ignite.internal.processors.rest.client.message.GridClientPingPacket +org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest org.apache.ignite.internal.processors.rest.client.message.GridClientResponse org.apache.ignite.internal.processors.rest.client.message.GridClientStateRequest @@ -2358,8 +2359,6 @@ org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask$VisorPageLocksTrackerJob org.apache.ignite.internal.visor.encryption.VisorGetMasterKeyNameTask org.apache.ignite.internal.visor.encryption.VisorGetMasterKeyNameTask$VisorGetMasterKeyNameJob -org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask -org.apache.ignite.internal.visor.cluster.VisorCheckDeactivationTask$VisorCheckDeactivationJob org.apache.ignite.internal.visor.encryption.VisorChangeMasterKeyTask org.apache.ignite.internal.visor.encryption.VisorChangeMasterKeyTask$VisorChangeMasterKeyJob org.apache.ignite.internal.visor.util.VisorClusterGroupEmptyException From 622a9b562e0d97a68d2918c476df4b73b767fc5f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 14 Feb 2020 16:13:28 +0300 Subject: [PATCH 30/82] IGNITE-12614 : fixed REST, java tests. --- .../JettyRestProcessorAbstractSelfTest.java | 66 +++++++++++++++++-- .../java/org/apache/ignite/IgniteCluster.java | 2 +- .../ignite/internal/IgniteFeatures.java | 2 +- .../client/GridClientClusterState.java | 2 +- .../impl/connection/GridClientConnection.java | 4 +- .../internal/cluster/IgniteClusterImpl.java | 11 ++-- .../ignite/internal/commandline/Command.java | 8 +-- .../GridClientClusterStateForcedRequest.java | 2 +- .../GridChangeStateCommandHandler.java | 4 +- .../protocols/tcp/GridTcpRestNioListener.java | 2 +- .../request/GridRestChangeStateRequest.java | 9 +++ .../request/GridRestClusterStateRequest.java | 3 + .../apache/ignite/mxbean/IgniteMXBean.java | 4 ++ .../cache/ClusterStateAbstractTest.java | 8 +-- .../cache/ClusterStateClientAbstractTest.java | 4 +- .../ClusterStateNoRebalanceAbstractTest.java | 2 +- .../cache/ClusterStateServerAbstractTest.java | 6 +- .../ClusterStateThinClientAbstractTest.java | 4 +- .../IgniteClusterActivateDeactivateTest.java | 13 ++-- .../distributed/CacheParallelStartTest.java | 4 +- .../baseline/ClusterActivationEventTest.java | 10 +-- .../AbstractNodeJoinTemplate.java | 3 +- .../cluster/ClusterStateChangeEventTest.java | 2 +- .../DistributedMetaStorageTest.java | 3 +- .../ServiceDeploymentOnActivationTest.java | 4 +- .../http/jetty/GridJettyRestHandler.java | 26 ++++++++ 26 files changed, 155 insertions(+), 53 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index 784cebcf3454e..b261b1d5137ce 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -143,8 +143,11 @@ import static org.apache.ignite.cache.CacheMode.REPLICATED; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_ASYNC; import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC; +import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.configuration.WALMode.NONE; import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_PARTITIONED; import static org.apache.ignite.internal.processors.query.QueryUtils.TEMPLATE_REPLICATED; import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_FAILED; @@ -254,18 +257,36 @@ private void assertCacheMetrics(String content) throws IOException { * @throws IOException If parsing failed. */ protected JsonNode validateJsonResponse(String content) throws IOException { + return validateJsonResponse(content, false); + } + + /** + * Validates JSON response. + * + * @param content Content to check. + * @param errorExpected is error expected. + * @return REST result if {@code errorExpected} is {@code False}. Error instead. + * @throws IOException If parsing failed. + */ + protected JsonNode validateJsonResponse(String content, boolean errorExpected) throws IOException { assertNotNull(content); + assertFalse(content.isEmpty()); JsonNode node = JSON_MAPPER.readTree(content); - assertTrue("Unexpected error: " + node.get("error").asText(), node.get("error").isNull()); + JsonNode errNode = node.get("error"); + + if (errorExpected) + assertTrue("Expected an error.", !errNode.isNull()); + else + assertTrue("Unexpected error: " + errNode.asText(), errNode.isNull()); assertEquals(STATUS_SUCCESS, node.get("successStatus").asInt()); assertNotSame(securityEnabled(), node.get("sessionToken").isNull()); - return node.get("response"); + return node.get(errorExpected ? "error" : "response"); } /** @@ -887,11 +908,23 @@ public void testGetAndReplace() throws Exception { public void testDeactivateActivate() throws Exception { assertClusterState(true); + changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", INACTIVE.name()); + + changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", INACTIVE.name(), "force", "true"); + + changeClusterState(GridRestCommand.CLUSTER_SET_STATE, "state", ACTIVE.name()); + changeClusterState(GridRestCommand.CLUSTER_DEACTIVATE); + + changeClusterState(GridRestCommand.CLUSTER_DEACTIVATE, "force", "true"); + changeClusterState(GridRestCommand.CLUSTER_ACTIVATE); // same for deprecated. changeClusterState(GridRestCommand.CLUSTER_INACTIVE); + + changeClusterState(GridRestCommand.CLUSTER_INACTIVE, "force", "true"); + changeClusterState(GridRestCommand.CLUSTER_ACTIVE); initCache(); @@ -3181,16 +3214,35 @@ private void assertClusterState(boolean exp) throws Exception { * Change cluster state and test new state. * * @param cmd Command. + * @param params Aruments for the cmd. * @throws Exception If failed. */ - private void changeClusterState(GridRestCommand cmd) throws Exception { - String ret = content(null, cmd); + private void changeClusterState(GridRestCommand cmd, String... params) throws Exception { + String ret = content(null, cmd, params); - JsonNode res = validateJsonResponse(ret); + boolean force = false; + + boolean deactivate = cmd == GridRestCommand.CLUSTER_INACTIVE || cmd == GridRestCommand.CLUSTER_DEACTIVATE; + + for (int i = 0; i < params.length; ++i) { + String p = params[i]; + if ("force".equals(p) && params[i + 1].equals("true")) + force = true; + if (cmd == GridRestCommand.CLUSTER_SET_STATE && p.equals("state")) + deactivate = params[i + 1].equals(INACTIVE.name()); + } + + boolean errorExpected = !force && deactivate; + + JsonNode res = validateJsonResponse(ret, errorExpected); assertFalse(res.isNull()); - assertTrue(res.asText().startsWith(cmd.key())); - assertClusterState(cmd == GridRestCommand.CLUSTER_ACTIVATE || cmd == GridRestCommand.CLUSTER_ACTIVE); + if (errorExpected) + assertTrue(res.asText().contains(DATA_LOST_ON_DEACTIVATION_WARNING)); + else + assertTrue(res.asText().startsWith(cmd.key())); + + assertClusterState(!deactivate || !force); } } diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 0f6bf55b7410e..e157c4a1ea48a 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -487,7 +487,7 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. - * Fails if the operation is not safe and force is not set. + * Fails if the operation is not safe and {@code force} is not set. *

* NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java index 3a867fb61efee..0ffd8b5e78748 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java @@ -85,7 +85,7 @@ public enum IgniteFeatures { /** ContinuousQuery with security subject id support. */ CONT_QRY_SECURITY_AWARE(21), - /** Preventing data loss on deactivation. */ + /** Preventing loss of in-memory data when deactivating the cluster. */ FORCED_CHANGE_OF_CLUSTER_STATE(22); /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 5b9bd7692fa60..a3d612edf25d1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -58,7 +58,7 @@ public interface GridClientClusterState { public void state(ClusterState newState) throws GridClientException; /** - * Changes cluster state to {@code newState}. Fails if the operation is not safe and force + * Changes cluster state to {@code newState}. Fails if the operation is not safe and {@code force} * is {@code False}. *

* NOTE: diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 15a4dcddafb82..eeabe10cdf884 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -309,7 +309,7 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a boolean keepBinaries) throws GridClientConnectionResetException, GridClientClosedException; /** - * Change grid global state. Fails if the operation is not safe and force is {@code False}. + * Change grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. @@ -339,7 +339,7 @@ public abstract GridClientFuture changeState(ClusterState state, UUID destNod throws GridClientClosedException, GridClientConnectionResetException; /** - * Changes grid global state. Fails if the operation is not safe and force is {@code False}. + * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index e1f3be0c75c31..7e57db00a7ea8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -333,15 +333,14 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean force) throws IgniteException { - if (!force && newState == INACTIVE && !ctx.state().isDeactivationSafe()) { - throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on \"" + newState + "\" pass the force flag: " + - "IgniteCluster#state(INACTIVE, true)"); - } - guard(); try { + if (state() != INACTIVE && newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { + throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To change cluster state on '" + newState.name() + "' pass the force flag."); + } + ctx.state().changeGlobalState(newState, serverNodes(), false).get(); } catch (IgniteCheckedException e) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java index 9d5252f02ddd2..e0c9d2decaf83 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java @@ -53,10 +53,10 @@ public interface Command { * @param client Client. * @param feature Feature. * @param validateClientNodes Whether client nodes should be checked as well. - * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting feature. - * @throws GridServerDoesNotSupportException If failIfUnsupportedFound is {@code True} and found a node - * unsupporting feature. - * @return Id of node unsupporting feature. {@code null} if all nodes support feature. + * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting {@code feature}. + * @throws GridServerDoesNotSupportException If {@code failIfUnsupportedFound} is {@code True} and found a node + * unsupporting {@code feature}. + * @return Id of node unsupporting {@code feature}. {@code null} if all nodes support {@code feature} . */ public static UUID checkFeatureSupportedByCluster( GridClient client, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java index 393b639bc667c..2ae8ae9dc18e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java @@ -25,7 +25,7 @@ /** * Enchanced version of {@link GridClientClusterStateRequest}. * Introduced to support forced version of the change state command and keep backward compatibility - * with nodes of old version that may occur in cluster. + * with nodes of old version that may occur in cluster at the rolling updates. */ public class GridClientClusterStateForcedRequest extends GridClientClusterStateRequest { /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index 3bea4fd57ee67..0aa6a084b6e52 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -28,6 +28,8 @@ import org.apache.ignite.internal.util.future.GridFutureAdapter; import org.apache.ignite.internal.util.typedef.internal.U; +import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_ACTIVATE; import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_ACTIVE; import static org.apache.ignite.internal.processors.rest.GridRestCommand.CLUSTER_CURRENT_STATE; @@ -73,7 +75,7 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { case CLUSTER_INACTIVE: log.warning(req.command().key() + " is deprecated. Use newer commands."); default: - ctx.grid().cluster().active(req.active()); + ctx.grid().cluster().state(req.active() ? ACTIVE : INACTIVE, req.force()); res.setResponse(req.command().key() + " started"); break; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java index c28723537ce1b..b5e070c59729f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java @@ -400,7 +400,7 @@ else if (msg instanceof GridClientClusterStateRequest) { restChangeReq.state(req.state()); restChangeReq.command(CLUSTER_SET_STATE); - if(forced) + if (forced) restChangeReq.forced(((GridClientClusterStateForcedRequest)msg).forced()); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index 8bbfedd1a27c6..f64cc4569f1b5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -27,6 +27,9 @@ public class GridRestChangeStateRequest extends GridRestRequest { /** Request current state. */ private boolean reqCurrentState; + /** Forced chage state. */ + private boolean force; + /** * */ @@ -54,4 +57,10 @@ public boolean isReqCurrentState() { public void reqCurrentState() { reqCurrentState = true; } + + /** */ + public void force(boolean force){ this.force = force; } + + /** */ + public boolean force() { return force; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 61156401bd8a1..65af028754976 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -23,6 +23,9 @@ * */ public class GridRestClusterStateRequest extends GridRestRequest { + /** Name of the request param 'force'. */ + public static final String ARG_FORCE = "force"; + /** Request current state. */ private boolean reqCurrentMode; diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 2f64247de1d08..427d8d4b70da6 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -397,7 +397,9 @@ public interface IgniteMXBean { * * @param active Activate/DeActivate flag. * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. + * @deprecated Use {@link #clusterState(String, boolean)} instead. */ + @Deprecated @MXBeanDescription( "Execute activate or deactivate process." ) @@ -711,7 +713,9 @@ void runIoTest( * @param state String representation of new cluster state. * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * See {@link ClusterState} + * @deprecated Use {@link #clusterState(String, boolean)} instead */ + @Deprecated @MXBeanDescription("Changes current cluster state.") @MXBeanParametersNames("state") @MXBeanParametersDescriptions("New cluster state.") diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java index a7c0101862193..d7d075417550b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java @@ -73,14 +73,14 @@ public abstract class ClusterStateAbstractTest extends GridCommonAbstractTest { @Override protected void beforeTest() throws Exception { super.beforeTest(); - grid(0).cluster().state(INACTIVE); + grid(0).cluster().state(INACTIVE, true); checkInactive(nodesCount()); } /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { - grid(0).cluster().state(INACTIVE); + grid(0).cluster().state(INACTIVE, true); checkInactive(nodesCount()); @@ -130,7 +130,7 @@ public void testDeactivationFromReadOnly() { protected abstract CacheConfiguration cacheConfiguration(String cacheName); /** */ - protected abstract void changeState(ClusterState state); + protected abstract void changeState(ClusterState state, boolean force); /** * Changes cluster state from {@code initialState} to {@code targetState}. @@ -163,7 +163,7 @@ private void changeStateAndCheckBehaviour(ClusterState initialState, ClusterStat checkClusterState(nodesCount(), initialState); - changeState(targetState); + changeState(targetState, true); checkClusterState(nodesCount(), targetState); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java index 652dc26f90132..cfa4c50b1a919 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java @@ -48,11 +48,11 @@ public abstract class ClusterStateClientAbstractTest extends ClusterStateAbstrac } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state) { + @Override protected void changeState(ClusterState state, boolean force) { IgniteEx cl = grid(GRID_CNT); assertTrue(cl.configuration().isClientMode()); - cl.cluster().state(state); + cl.cluster().state(state, force); } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java index ccce702a1b05c..ef12afbbc8412 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java @@ -147,7 +147,7 @@ public void testNoRebalancing() throws Exception { assertEquals(k, cache0.get(k)); } - grid(0).cluster().state(INACTIVE); + grid(0).cluster().state(INACTIVE, true); checkInactive(GRID_CNT); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java index 5879a2b158eff..9c8f293b84adf 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java @@ -139,8 +139,8 @@ public void testDynamicCacheStart() { } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state) { - grid(0).cluster().state(state); + @Override protected void changeState(ClusterState state, boolean force) { + grid(0).cluster().state(state, force); } /** */ @@ -198,7 +198,7 @@ private void changeClusterStateWithPendingLock(ClusterState newState, String exc */ Callable changeStateClo(ClusterState state) { return () -> { - grid(0).cluster().state(state); + grid(0).cluster().state(state, true); return null; }; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java index 56e4ab22418db..7965742ef7a1c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java @@ -69,9 +69,9 @@ public abstract class ClusterStateThinClientAbstractTest extends ClusterStateAbs } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state) { + @Override protected void changeState(ClusterState state, boolean force) { try { - gridClient.state().state(state); + gridClient.state().state(state, force); } catch (GridClientException e) { throw new RuntimeException("Can't change state to " + state, e); 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 05b7ddf68688f..a3e7b53da2cc6 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 @@ -430,7 +430,7 @@ private void reactivateSimple(int srvs, int clients, int activateFrom, ClusterSt for (int i = 0; i < srvs + clients; i++) checkCachesOnNode(i, DEFAULT_CACHES_COUNT); - ignite(activateFrom).cluster().state(INACTIVE); + ignite(activateFrom).cluster().state(INACTIVE, true); ignite(activateFrom).cluster().state(state); if (state == ACTIVE) @@ -594,7 +594,8 @@ private IgniteInternalFuture startNodesAndBlockStatusChange( blockExchangeSingleMessage(spi, STATE_CHANGE_TOP_VER); } - IgniteInternalFuture stateChangeFut = runAsync(() -> ignite(stateChangeFrom).cluster().state(targetState)); + IgniteInternalFuture stateChangeFut = runAsync(() -> + ignite(stateChangeFrom).cluster().state(targetState, true)); for (TestRecordingCommunicationSpi spi : spis) spi.waitForBlocked(); @@ -929,7 +930,7 @@ private void changeStateSimple( checkClusterState(nodesCnt, initialState); - ignite(changeFrom).cluster().state(targetState); + ignite(changeFrom).cluster().state(targetState, true); checkClusterState(nodesCnt, targetState); @@ -1173,7 +1174,7 @@ private void clientReconnectClusterState( if (transition) { blockExchangeSingleMessage(spi1, STATE_CHANGE_TOP_VER); - stateFut.set(runAsync(() -> srv.cluster().state(targetState), initialState + "->" + targetState)); + stateFut.set(runAsync(() -> srv.cluster().state(targetState, true), initialState + "->" + targetState)); try { U.sleep(500); @@ -1183,7 +1184,7 @@ private void clientReconnectClusterState( } } else - srv.cluster().state(targetState); + srv.cluster().state(targetState, true); }); if (transition) { @@ -1589,7 +1590,7 @@ private void checkClusterStateNotWaitForDeactivation(ClusterState initialState) for (int gridIdx = 0; gridIdx < nodes; gridIdx++) blockExchangeSingleMessage(TestRecordingCommunicationSpi.spi(grid(gridIdx)), deactivationTopVer); - IgniteInternalFuture deactivationFut = runAsync(() -> crd.cluster().state(INACTIVE)); + IgniteInternalFuture deactivationFut = runAsync(() -> crd.cluster().state(INACTIVE, true)); // Wait for deactivation start. assertTrue(GridTestUtils.waitForCondition( diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java index a542aad46ba03..0e6619528c3c7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java @@ -33,6 +33,8 @@ import org.jetbrains.annotations.Nullable; import org.junit.Test; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; + /** * Test covers parallel start and stop of caches. */ @@ -154,7 +156,7 @@ private void testParallelStartAndStop(boolean parallel) throws Exception { assertCaches(igniteEx2); - igniteEx.cluster().active(false); + igniteEx.cluster().state(INACTIVE, true); assertCachesAfterStop(igniteEx); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java index 323b385a21f7e..1f76bc7065c87 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java @@ -193,7 +193,7 @@ public void testClusterDeactivationListenerSleep() throws Exception { private void clusterChangeState(ClusterState initState, ClusterState state, int evtType) throws Exception { assertNotSame(initState, state); - checkClusterEvents(cluster -> cluster.state(state), lsnr, initState, evtType, 1); + checkClusterEvents(cluster -> cluster.state(state, true), lsnr, initState, evtType, 1); } /** @@ -208,7 +208,7 @@ private void clusterChangeState(ClusterState initState, ClusterState state, int private void clusterChangeStateWithDelay(ClusterState initState, ClusterState state, int evtType) throws Exception { assertNotSame(initState, state); - checkClusterEvents(cluster -> cluster.state(state), delayLsnr, initState, evtType, 1); + checkClusterEvents(cluster -> cluster.state(state, true), delayLsnr, initState, evtType, 1); } /** @@ -225,8 +225,8 @@ private void clusterChangeStateTwice(ClusterState initState, ClusterState state, ClusterActivationTestTask task = new ClusterActivationTestTask() { @Override public void execute(IgniteCluster cluster) { - cluster.state(state); - cluster.state(state); + cluster.state(state, true); + cluster.state(state, true); } }; @@ -249,7 +249,7 @@ private void checkClusterEvents( IgniteEx crd = grid(0); if (crd.cluster().state() != initState) - crd.cluster().state(initState); + crd.cluster().state(initState, true); for (Ignite ignite : G.allGrids()) assertEquals(ignite.name(), initState, ignite.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java index d48b38c6784bb..c8c4e885a9f60 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import org.apache.ignite.cache.CacheAtomicityMode; +import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; @@ -627,7 +628,7 @@ public void execute() throws Exception { else { System.out.println(">>> DeActivate cluster"); - crd.active(false); + crd.cluster().state(ClusterState.INACTIVE, true); System.out.println(">>> Check after cluster deActivated"); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java index 12f89d5e88a80..da3b16a300caa 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java @@ -128,7 +128,7 @@ private void changeStateAndCheckEvents(ClusterState state) throws IgniteCheckedE evtFuts.put(node, waitForLocalEvent(node.events(), e -> e.localOrder() > event.localOrder(), EVT_CLUSTER_STATE_CHANGED)); } - crd.cluster().state(state); + crd.cluster().state(state, true); for (Ignite node : evtFuts.keySet()) { assertEquals(node.name(), state, node.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java index 97616fb3e37ba..c9fab88ed1c37 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java @@ -43,6 +43,7 @@ import org.junit.Test; import static org.apache.ignite.IgniteSystemProperties.IGNITE_GLOBAL_METASTORAGE_HISTORY_MAX_BYTES; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; /** * Test for {@link DistributedMetaStorageImpl} with disabled persistence. @@ -309,7 +310,7 @@ public void testDeactivateActivate() throws Exception { metastorage(0).write("key2", "value2"); - grid(0).cluster().active(false); + grid(0).cluster().state(INACTIVE, true); startGrid(1); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java index 1591686796c81..dc59e18194f01 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java @@ -30,6 +30,8 @@ import org.junit.Before; import org.junit.Test; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; + /** * Tests check: *

@@ -169,7 +171,7 @@ private void checkRedeployment(int srvsNum, int clientsNum, IgnitePredicate params, boolean dfltVal) throws IgniteCheckedException { + assert key != null; + + String val = (String)params.get(key); + + try { + return val == null ? dfltVal : Boolean.parseBoolean(val); + } + catch (NumberFormatException ignore) { + throw new IgniteCheckedException(format(FAILED_TO_PARSE_FORMAT, "Boolean", key, val)); + } + } + /** * Retrieves int value from parameters map. * @@ -790,6 +812,8 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) else restReq0.active(false); + restReq0.force(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq = restReq0; break; @@ -805,6 +829,8 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) ClusterState newState = enumValue("state", params, ClusterState.class); restReq0.state(newState); + + restReq0.forced(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); } restReq = restReq0; From 8c6f22684e37585d05137e94ab66a2740108cbde Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 20 Feb 2020 02:37:13 +0300 Subject: [PATCH 31/82] IGNITE-12701 : fix after review --- .../main/java/org/apache/ignite/Ignite.java | 6 +- .../java/org/apache/ignite/IgniteCluster.java | 6 +- .../ignite/internal/IgniteFeatures.java | 5 +- .../apache/ignite/internal/IgniteKernal.java | 7 +- .../client/GridClientClusterState.java | 3 +- .../impl/GridClientClusterStateImpl.java | 4 +- .../impl/connection/GridClientConnection.java | 6 +- .../GridClientNioTcpConnection.java | 4 +- .../internal/client/util/GridClientUtils.java | 43 +++++++++++ .../internal/cluster/IgniteClusterImpl.java | 10 +-- .../ClusterStateChangeCommand.java | 2 +- .../ignite/internal/commandline/Command.java | 44 ------------ .../commandline/DeactivateCommand.java | 2 +- .../internal/commandline/TxCommands.java | 2 +- .../cluster/ChangeGlobalStateMessage.java | 13 ++++ .../cluster/GridClusterStateProcessor.java | 37 +++++++--- .../cluster/IGridClusterStateProcessor.java | 18 +++++ .../GridClientClusterStateRequest.java | 2 +- ...a => GridClientClusterStateRequestV2.java} | 12 ++-- .../GridChangeClusterStateCommandHandler.java | 2 +- .../protocols/tcp/GridTcpRestNioListener.java | 8 +-- .../request/GridRestChangeStateRequest.java | 8 ++- .../request/GridRestClusterStateRequest.java | 8 ++- .../apache/ignite/mxbean/IgniteMXBean.java | 31 -------- .../resources/META-INF/classnames.properties | 2 +- .../cache/ClusterStateAbstractTest.java | 8 +-- .../cache/ClusterStateClientAbstractTest.java | 4 +- .../ClusterStateNoRebalanceAbstractTest.java | 2 +- .../cache/ClusterStateServerAbstractTest.java | 6 +- .../ClusterStateThinClientAbstractTest.java | 4 +- .../IgniteClusterActivateDeactivateTest.java | 14 ++-- .../distributed/CacheParallelStartTest.java | 4 +- .../baseline/ClusterActivationEventTest.java | 10 +-- .../AbstractNodeJoinTemplate.java | 3 +- .../cluster/ClusterStateChangeEventTest.java | 2 +- .../DistributedMetaStorageTest.java | 3 +- .../ServiceDeploymentOnActivationTest.java | 4 +- .../IgniteBasicWithPersistenceTestSuite.java | 5 +- .../mbeans/GridMBeanClusterStateTest.java | 71 ------------------- .../http/jetty/GridJettyRestHandler.java | 5 +- 40 files changed, 183 insertions(+), 247 deletions(-) rename modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/{GridClientClusterStateForcedRequest.java => GridClientClusterStateRequestV2.java} (81%) delete mode 100644 modules/core/src/test/java/org/apache/ignite/util/mbeans/GridMBeanClusterStateTest.java diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index ce43bddb538b6..e66e20a84dc36 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -665,12 +665,12 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig /** * Changes Ignite grid state to active or inactive. - * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. - * @deprecated Use {@link IgniteCluster#state(ClusterState)} + * @deprecated Use {@link IgniteCluster#state(ClusterState, boolean)} * or {@link IgniteCluster#state(ClusterState, boolean)} instead. */ @Deprecated diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index e157c4a1ea48a..513bb466749ec 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -460,7 +460,6 @@ public IgniteFuture> startNodesAsync(Collecti * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated @@ -478,7 +477,6 @@ public IgniteFuture> startNodesAsync(Collecti * Fails if the operation is not safe. @see ClusterState#INACTIVE. * * @param newState New cluster state. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * @throws IgniteException If there is an already started transaction or lock in the same thread. * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @@ -490,11 +488,11 @@ public IgniteFuture> startNodesAsync(Collecti * Fails if the operation is not safe and {@code force} is not set. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param newState New cluster state. * @param force If {@code True} then skips checking of operation safety. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss and the force flag is not set. * @throws IgniteException If there is an already started transaction or lock in the same thread. */ public void state(ClusterState newState, boolean force) throws IgniteException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java index 0ffd8b5e78748..7f959f2b91c6c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java @@ -86,7 +86,10 @@ public enum IgniteFeatures { CONT_QRY_SECURITY_AWARE(21), /** Preventing loss of in-memory data when deactivating the cluster. */ - FORCED_CHANGE_OF_CLUSTER_STATE(22); + FORCED_CHANGE_OF_CLUSTER_STATE(22), + + /** Long operations dump timeout. */ + LONG_OPERATIONS_DUMP_TIMEOUT(30); /** * Unique feature identifier. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index b1663b8532fff..3c4698d9d84f3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -4745,14 +4745,9 @@ void waitPreviousReconnect() { /** {@inheritDoc} */ @Override public void clusterState(String state) { - clusterState(state, false); - } - - /** {@inheritDoc} */ - @Override public void clusterState(String state, boolean force) { ClusterState newState = ClusterState.valueOf(state); - cluster().state(newState, force); + cluster().state(newState); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index a3d612edf25d1..0386772d9da22 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -62,7 +62,8 @@ public interface GridClientClusterState { * is {@code False}. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see org.apache.ignite.ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param newState New cluster state. * @param force New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index da61edf6ad7fc..3bef2a1a78120 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -31,7 +31,7 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; -import static org.apache.ignite.internal.commandline.Command.checkFeatureSupportedByCluster; +import static org.apache.ignite.internal.client.util.GridClientUtils.checkFeatureSupportedByCluster; /** * @@ -72,7 +72,7 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState) throws GridClientException { - state(newState, false); + state(newState, true); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index eeabe10cdf884..c6223be577a0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -312,7 +312,8 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * Change grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param active Active. * @param force If {@code True} then skips checking of operation safety. @@ -342,7 +343,8 @@ public abstract GridClientFuture changeState(ClusterState state, UUID destNod * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param state New cluster state. * @param force If {@code True} then skips checking of operation safety. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 74dad46a7862b..904d145f0ce44 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -61,7 +61,7 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheBean; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; -import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientMessage; @@ -830,7 +830,7 @@ private GridClientAuthenticationRequest buildAuthRequest() { throws GridClientClosedException, GridClientConnectionResetException { assert state != null; - return makeRequest(GridClientClusterStateForcedRequest.state(state, force), destNodeId); + return makeRequest(GridClientClusterStateRequestV2.state(state, force), destNodeId); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java index 7beae77d68a49..ccc665a4becf9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java @@ -23,12 +23,18 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import org.apache.ignite.internal.IgniteFeatures; +import org.apache.ignite.internal.IgniteNodeAttributes; +import org.apache.ignite.internal.client.GridClient; +import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.client.GridClientPredicate; import org.apache.ignite.internal.client.GridClientProtocol; +import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.jetbrains.annotations.Nullable; /** @@ -174,4 +180,41 @@ public static int safeAbs(int i) { return i < 0 ? 0 : i; } + + /** + * Checks that all cluster nodes support specified feature. + * + * @param client Client. + * @param feature Feature. + * @param validateClientNodes Whether client nodes should be checked as well. + * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting {@code feature}. + * @throws GridServerDoesNotSupportException If {@code failIfUnsupportedFound} is {@code True} and found a node + * unsupporting {@code feature}. + * @return Id of node unsupporting {@code feature}. {@code null} if all nodes support {@code feature} . + */ + public static UUID checkFeatureSupportedByCluster( + GridClient client, + IgniteFeatures feature, + boolean validateClientNodes, + boolean failIfUnsupportedFound + ) throws GridClientException { + Collection nodes = validateClientNodes ? + client.compute().nodes() : + client.compute().nodes(GridClientNode::connectable); + + for (GridClientNode node : nodes) { + byte[] featuresAttrBytes = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_FEATURES); + + if (!IgniteFeatures.nodeSupports(featuresAttrBytes, feature)) { + if (failIfUnsupportedFound) { + throw new GridServerDoesNotSupportException("Failed to execute command: cluster contains node that " + + "doesn't support feature [nodeId=" + node.nodeId() + ", feature=" + feature + ']'); + } + else + return node.nodeId(); + } + } + + return null; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 7e57db00a7ea8..cd2555a98f614 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -76,7 +76,6 @@ import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.specifications; @@ -328,7 +327,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void state(ClusterState newState) throws IgniteException { - state(newState, false); + state(newState, true); } /** {@inheritDoc} */ @@ -336,12 +335,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - if (state() != INACTIVE && newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { - throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on '" + newState.name() + "' pass the force flag."); - } - - ctx.state().changeGlobalState(newState, serverNodes(), false).get(); + ctx.state().changeGlobalState(newState, force, serverNodes(), false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 65c99bf0f9e90..161cfa52f4cdd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -45,7 +45,7 @@ public class ClusterStateChangeCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation even it might have in-mem caches. */ + /** Force cluster deactivation even it might have in-memory caches. */ private boolean force; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java index e0c9d2decaf83..d65ced180ca7e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java @@ -17,20 +17,13 @@ package org.apache.ignite.internal.commandline; -import java.util.Collection; import java.util.Comparator; import java.util.Map; -import java.util.UUID; import java.util.logging.Logger; import org.apache.ignite.IgniteSystemProperties; -import org.apache.ignite.internal.IgniteFeatures; -import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; -import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientFactory; -import org.apache.ignite.internal.client.GridClientNode; -import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.SB; import org.jetbrains.annotations.Nullable; @@ -47,43 +40,6 @@ * @param Generic for getArg method which should return command-specific paramters which it would be run with. */ public interface Command { - /** - * Checks that all cluster nodes support specified feature. - * - * @param client Client. - * @param feature Feature. - * @param validateClientNodes Whether client nodes should be checked as well. - * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting {@code feature}. - * @throws GridServerDoesNotSupportException If {@code failIfUnsupportedFound} is {@code True} and found a node - * unsupporting {@code feature}. - * @return Id of node unsupporting {@code feature}. {@code null} if all nodes support {@code feature} . - */ - public static UUID checkFeatureSupportedByCluster( - GridClient client, - IgniteFeatures feature, - boolean validateClientNodes, - boolean failIfUnsupportedFound - ) throws GridClientException { - Collection nodes = validateClientNodes ? - client.compute().nodes() : - client.compute().nodes(GridClientNode::connectable); - - for (GridClientNode node : nodes) { - byte[] featuresAttrBytes = node.attribute(IgniteNodeAttributes.ATTR_IGNITE_FEATURES); - - if (!IgniteFeatures.nodeSupports(featuresAttrBytes, feature)) { - if (failIfUnsupportedFound) { - throw new GridServerDoesNotSupportException("Failed to execute command: cluster contains node that " + - "doesn't support feature [nodeId=" + node.nodeId() + ", feature=" + feature + ']'); - } - else - return node.nodeId(); - } - } - - return null; - } - /** * Method to create thin client for communication with cluster. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 2cedd7a82b06b..a752c3afe61b1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -37,7 +37,7 @@ public class DeactivateCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation even it might have in-mem caches. */ + /** Force cluster deactivation even it might have in-memory caches. */ private boolean force; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java index d0d8640f7db36..6b0d10f6fc545 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java @@ -49,7 +49,7 @@ import org.apache.ignite.internal.visor.tx.VisorTxTaskResult; import org.apache.ignite.transactions.TransactionState; -import static org.apache.ignite.internal.commandline.Command.checkFeatureSupportedByCluster; +import static org.apache.ignite.internal.client.util.GridClientUtils.checkFeatureSupportedByCluster; import static org.apache.ignite.internal.commandline.CommandList.TX; import static org.apache.ignite.internal.commandline.CommandLogger.DOUBLE_INDENT; import static org.apache.ignite.internal.commandline.CommandLogger.optional; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index a74917d2d2a2e..2cc46b6738516 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -71,6 +71,9 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage { @GridToStringExclude @Nullable private transient ServiceDeploymentActions serviceDeploymentActions; + /** Forced change of cluster state. */ + private boolean force = true; + /** * @param reqId State change request ID. * @param initiatingNodeId Node initiated state change. @@ -204,6 +207,16 @@ public boolean forceChangeBaselineTopology() { return baselineTopology; } + /** + * @return Whether state changing must not check safety of this operation. + */ + boolean force() { + return force; + } + + /** */ + void force(boolean force){ this.force = force; } + /** * @return Timestamp. */ 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 57117c5cebaad..1de5247634564 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 @@ -48,6 +48,7 @@ import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.cluster.ClusterGroupAdapter; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.cluster.DistributedBaselineConfiguration; @@ -116,7 +117,7 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I /** */ private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; - /** Warning of unsafe deactivation. May be used with {@link #isDeactivationSafe()}. */ + /** Warning of unsafe deactivation. */ public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Cluster has caches configured without persistence. " + "During deactivation in-memory data and objects can be lost!"; @@ -626,6 +627,17 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { + if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe()) { + GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); + + if (stateFut != null) { + stateFut.onDone(new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To change cluster state on '" + msg.state().name() + "' pass the force flag.")); + } + + return false; + } + ExchangeActions exchangeActions; try { @@ -938,10 +950,11 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ) { - return changeGlobalState(state, baselineNodes, forceChangeBaselineTopology, false); + return changeGlobalState(state, force, baselineNodes, forceChangeBaselineTopology, false); } /** @@ -950,7 +963,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. * @return Global change state future. - * @deprecated Use {@link #changeGlobalState(ClusterState, Collection, boolean, boolean)} instead. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean, boolean)} instead. */ @Deprecated public IgniteInternalFuture changeGlobalState( @@ -959,11 +972,12 @@ public IgniteInternalFuture changeGlobalState( boolean forceChangeBaselineTopology, boolean isAutoAdjust ) { - return changeGlobalState(activate ? ACTIVE : INACTIVE, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); } /** * @param state New activate state. + * @param force If {@code True}, skips checking of the operation safety. * @param baselineNodes New BLT nodes. * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. @@ -971,6 +985,7 @@ public IgniteInternalFuture changeGlobalState( */ public IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -979,7 +994,7 @@ public IgniteInternalFuture changeGlobalState( null : calculateNewBaselineTopology(state, baselineNodes, forceChangeBaselineTopology); - return changeGlobalState0(state, newBlt, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState0(state, force, newBlt, forceChangeBaselineTopology, isAutoAdjust); } /** */ @@ -1049,6 +1064,7 @@ private Collection baselineNodes() { /** */ private IgniteInternalFuture changeGlobalState0( ClusterState state, + boolean force, BaselineTopology blt, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -1144,6 +1160,8 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); + msg.force(force); + IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { @@ -1661,13 +1679,14 @@ public boolean isBaselineAutoAdjustEnabled() { } /** - * @return {@code False} if cluster deactivation can erase user's data and objects. + * @return {@code False} if cluster deactivation would erase user's data and objects. * {@code True} If deactivation is safe. */ public boolean isDeactivationSafe() { - return !ctx.cache().cacheDescriptors().values().stream() - .anyMatch(desc -> - !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration())); + return ctx.cache().cacheDescriptors().values().stream() + .allMatch(desc -> + isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration()) || + (desc.cacheConfiguration().isWriteBehindEnabled() && desc.cacheConfiguration().isReadThrough())); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index f4e6850570eae..893e6328c15de 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -127,9 +127,27 @@ IgniteInternalFuture changeGlobalState( * @param baselineNodes New baseline nodes. * @param forceChangeBaselineTopology Force change baseline topology. * @return State change future. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean)} + */ + @Deprecated + default IgniteInternalFuture changeGlobalState( + ClusterState state, + Collection baselineNodes, + boolean forceChangeBaselineTopology + ) { + return changeGlobalState(state, true, baselineNodes, forceChangeBaselineTopology); + } + + /** + * @param state New cluster state. + * @param force If {@code True} skips checking of the operation safety. + * @param baselineNodes New baseline nodes. + * @param forceChangeBaselineTopology Force change baseline topology. + * @return State change future. */ IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 6589abfab4bd3..528e738ec581a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -24,7 +24,7 @@ import org.apache.ignite.internal.util.typedef.internal.U; /** - * @deprecated Use {@link GridClientClusterStateForcedRequest} + * @deprecated Use {@link GridClientClusterStateRequestV2} */ @Deprecated public class GridClientClusterStateRequest extends GridClientAbstractMessage { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java similarity index 81% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java rename to modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 2ae8ae9dc18e1..b0bf4e05571a8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateForcedRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -27,7 +27,7 @@ * Introduced to support forced version of the change state command and keep backward compatibility * with nodes of old version that may occur in cluster at the rolling updates. */ -public class GridClientClusterStateForcedRequest extends GridClientClusterStateRequest { +public class GridClientClusterStateRequestV2 extends GridClientClusterStateRequest { /** */ private static final long serialVersionUID = 0L; @@ -39,24 +39,24 @@ public class GridClientClusterStateForcedRequest extends GridClientClusterStateR * @param force Forced change of cluster state. * @return Cluster state change request. */ - public static GridClientClusterStateForcedRequest state(ClusterState state, boolean force) { - return new GridClientClusterStateForcedRequest(GridClientClusterStateRequest.state(state), force); + public static GridClientClusterStateRequestV2 state(ClusterState state, boolean force) { + return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), force); } /** Default constructor for the exernalization. */ - public GridClientClusterStateForcedRequest() { + public GridClientClusterStateRequestV2() { // No op. } /** Copying constructor. */ - private GridClientClusterStateForcedRequest(GridClientClusterStateRequest clusterStateReq, boolean force) { + private GridClientClusterStateRequestV2(GridClientClusterStateRequest clusterStateReq, boolean force) { super(clusterStateReq); this.force = force; } /** */ - public boolean forced() { + public boolean force() { return force; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 762d9e3fa8453..0e477c4ebcc7a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -73,7 +73,7 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.grid().cluster().state(req.state(), req.forced()); + ctx.grid().cluster().state(req.state(), req.force()); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java index b5e070c59729f..44efd8c96a842 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java @@ -36,7 +36,7 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientAuthenticationRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; -import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeResponse; @@ -388,7 +388,8 @@ else if (msg instanceof GridClientStateRequest) { else if (msg instanceof GridClientClusterStateRequest) { GridClientClusterStateRequest req = (GridClientClusterStateRequest)msg; - boolean forced = msg instanceof GridClientClusterStateForcedRequest; + boolean force = !(msg instanceof GridClientClusterStateRequestV2) || + ((GridClientClusterStateRequestV2)msg).force(); GridRestClusterStateRequest restChangeReq = new GridRestClusterStateRequest(); @@ -400,8 +401,7 @@ else if (msg instanceof GridClientClusterStateRequest) { restChangeReq.state(req.state()); restChangeReq.command(CLUSTER_SET_STATE); - if (forced) - restChangeReq.forced(((GridClientClusterStateForcedRequest)msg).forced()); + restChangeReq.force(force); } restReq = restChangeReq; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index f64cc4569f1b5..808b5bee766b6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -59,8 +59,12 @@ public void reqCurrentState() { } /** */ - public void force(boolean force){ this.force = force; } + public void force(boolean force) { + this.force = force; + } /** */ - public boolean force() { return force; } + public boolean force() { + return force; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 65af028754976..21989db0fe978 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -36,8 +36,8 @@ public class GridRestClusterStateRequest extends GridRestRequest { private boolean force; /** */ - public void forced(boolean forced) { - force = forced; + public void force(boolean force) { + this.force = force; } /** */ @@ -51,7 +51,9 @@ public boolean isReqCurrentMode() { } /** */ - public boolean forced(){ return force; } + public boolean force() { + return force; + } /** */ public ClusterState state() { diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 427d8d4b70da6..79dfe61c0f88a 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -22,7 +22,6 @@ import java.util.UUID; import javax.management.JMException; import org.apache.ignite.cluster.ClusterState; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.processors.metric.GridMetricManager; /** @@ -390,16 +389,8 @@ public interface IgniteMXBean { public boolean pingNode(String nodeId); /** - * Changes grid state to active or inactive. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. - * * @param active Activate/DeActivate flag. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. - * @deprecated Use {@link #clusterState(String, boolean)} instead. */ - @Deprecated @MXBeanDescription( "Execute activate or deactivate process." ) @@ -706,37 +697,15 @@ void runIoTest( /** * Changes current cluster state. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. * * @param state String representation of new cluster state. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss. * See {@link ClusterState} - * @deprecated Use {@link #clusterState(String, boolean)} instead */ - @Deprecated @MXBeanDescription("Changes current cluster state.") @MXBeanParametersNames("state") @MXBeanParametersDescriptions("New cluster state.") public void clusterState(String state); - /** - * Changes current cluster state. Can skip checking safety of the operation. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. @see ClusterState#INACTIVE. - * - * @param state String representation of new cluster state. - * @param force If {@code True} then skips checking of operation safety. - * @throws ChangeOfClusterStateIsNotSafeException if state stange leads to data loss and the force flag is not set. - * @see ClusterState - */ - @MXBeanDescription("Changes current cluster state. Can skip checking if this operation is safe.") - @MXBeanParametersNames({"state", "force"}) - @MXBeanParametersDescriptions({"New cluster state.", "If true then skips checking of operation safety."}) - public void clusterState(String state, boolean force); - /** * Gets last cluster state change operation. * diff --git a/modules/core/src/main/resources/META-INF/classnames.properties b/modules/core/src/main/resources/META-INF/classnames.properties index da1e2e11d3f86..b262833b8c275 100644 --- a/modules/core/src/main/resources/META-INF/classnames.properties +++ b/modules/core/src/main/resources/META-INF/classnames.properties @@ -1659,7 +1659,7 @@ org.apache.ignite.internal.processors.rest.client.message.GridClientMessage org.apache.ignite.internal.processors.rest.client.message.GridClientNodeBean org.apache.ignite.internal.processors.rest.client.message.GridClientNodeMetricsBean org.apache.ignite.internal.processors.rest.client.message.GridClientPingPacket -org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateForcedRequest +org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2 org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest org.apache.ignite.internal.processors.rest.client.message.GridClientResponse org.apache.ignite.internal.processors.rest.client.message.GridClientStateRequest diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java index d7d075417550b..a7c0101862193 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateAbstractTest.java @@ -73,14 +73,14 @@ public abstract class ClusterStateAbstractTest extends GridCommonAbstractTest { @Override protected void beforeTest() throws Exception { super.beforeTest(); - grid(0).cluster().state(INACTIVE, true); + grid(0).cluster().state(INACTIVE); checkInactive(nodesCount()); } /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { - grid(0).cluster().state(INACTIVE, true); + grid(0).cluster().state(INACTIVE); checkInactive(nodesCount()); @@ -130,7 +130,7 @@ public void testDeactivationFromReadOnly() { protected abstract CacheConfiguration cacheConfiguration(String cacheName); /** */ - protected abstract void changeState(ClusterState state, boolean force); + protected abstract void changeState(ClusterState state); /** * Changes cluster state from {@code initialState} to {@code targetState}. @@ -163,7 +163,7 @@ private void changeStateAndCheckBehaviour(ClusterState initialState, ClusterStat checkClusterState(nodesCount(), initialState); - changeState(targetState, true); + changeState(targetState); checkClusterState(nodesCount(), targetState); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java index cfa4c50b1a919..652dc26f90132 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateClientAbstractTest.java @@ -48,11 +48,11 @@ public abstract class ClusterStateClientAbstractTest extends ClusterStateAbstrac } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state, boolean force) { + @Override protected void changeState(ClusterState state) { IgniteEx cl = grid(GRID_CNT); assertTrue(cl.configuration().isClientMode()); - cl.cluster().state(state, force); + cl.cluster().state(state); } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java index ef12afbbc8412..ccce702a1b05c 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateNoRebalanceAbstractTest.java @@ -147,7 +147,7 @@ public void testNoRebalancing() throws Exception { assertEquals(k, cache0.get(k)); } - grid(0).cluster().state(INACTIVE, true); + grid(0).cluster().state(INACTIVE); checkInactive(GRID_CNT); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java index 9c8f293b84adf..5879a2b158eff 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateServerAbstractTest.java @@ -139,8 +139,8 @@ public void testDynamicCacheStart() { } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state, boolean force) { - grid(0).cluster().state(state, force); + @Override protected void changeState(ClusterState state) { + grid(0).cluster().state(state); } /** */ @@ -198,7 +198,7 @@ private void changeClusterStateWithPendingLock(ClusterState newState, String exc */ Callable changeStateClo(ClusterState state) { return () -> { - grid(0).cluster().state(state, true); + grid(0).cluster().state(state); return null; }; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java index 7965742ef7a1c..56e4ab22418db 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java @@ -69,9 +69,9 @@ public abstract class ClusterStateThinClientAbstractTest extends ClusterStateAbs } /** {@inheritDoc} */ - @Override protected void changeState(ClusterState state, boolean force) { + @Override protected void changeState(ClusterState state) { try { - gridClient.state().state(state, force); + gridClient.state().state(state); } catch (GridClientException e) { throw new RuntimeException("Can't change state to " + state, e); 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 a3e7b53da2cc6..f32da414bb22f 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 @@ -430,7 +430,7 @@ private void reactivateSimple(int srvs, int clients, int activateFrom, ClusterSt for (int i = 0; i < srvs + clients; i++) checkCachesOnNode(i, DEFAULT_CACHES_COUNT); - ignite(activateFrom).cluster().state(INACTIVE, true); + ignite(activateFrom).cluster().state(INACTIVE); ignite(activateFrom).cluster().state(state); if (state == ACTIVE) @@ -594,8 +594,7 @@ private IgniteInternalFuture startNodesAndBlockStatusChange( blockExchangeSingleMessage(spi, STATE_CHANGE_TOP_VER); } - IgniteInternalFuture stateChangeFut = runAsync(() -> - ignite(stateChangeFrom).cluster().state(targetState, true)); + IgniteInternalFuture stateChangeFut = runAsync(() -> ignite(stateChangeFrom).cluster().state(targetState)); for (TestRecordingCommunicationSpi spi : spis) spi.waitForBlocked(); @@ -930,7 +929,7 @@ private void changeStateSimple( checkClusterState(nodesCnt, initialState); - ignite(changeFrom).cluster().state(targetState, true); + ignite(changeFrom).cluster().state(targetState); checkClusterState(nodesCnt, targetState); @@ -1174,7 +1173,7 @@ private void clientReconnectClusterState( if (transition) { blockExchangeSingleMessage(spi1, STATE_CHANGE_TOP_VER); - stateFut.set(runAsync(() -> srv.cluster().state(targetState, true), initialState + "->" + targetState)); + stateFut.set(runAsync(() -> srv.cluster().state(targetState), initialState + "->" + targetState)); try { U.sleep(500); @@ -1184,7 +1183,7 @@ private void clientReconnectClusterState( } } else - srv.cluster().state(targetState, true); + srv.cluster().state(targetState); }); if (transition) { @@ -1590,7 +1589,7 @@ private void checkClusterStateNotWaitForDeactivation(ClusterState initialState) for (int gridIdx = 0; gridIdx < nodes; gridIdx++) blockExchangeSingleMessage(TestRecordingCommunicationSpi.spi(grid(gridIdx)), deactivationTopVer); - IgniteInternalFuture deactivationFut = runAsync(() -> crd.cluster().state(INACTIVE, true)); + IgniteInternalFuture deactivationFut = runAsync(() -> crd.cluster().state(INACTIVE)); // Wait for deactivation start. assertTrue(GridTestUtils.waitForCondition( @@ -1709,7 +1708,6 @@ final void checkNoCaches(int nodes) { } } - /** */ private void checkClusterState(int nodesCnt, ClusterState state) { for (int i = 0; i < nodesCnt; i++) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java index 0e6619528c3c7..a542aad46ba03 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheParallelStartTest.java @@ -33,8 +33,6 @@ import org.jetbrains.annotations.Nullable; import org.junit.Test; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; - /** * Test covers parallel start and stop of caches. */ @@ -156,7 +154,7 @@ private void testParallelStartAndStop(boolean parallel) throws Exception { assertCaches(igniteEx2); - igniteEx.cluster().state(INACTIVE, true); + igniteEx.cluster().active(false); assertCachesAfterStop(igniteEx); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java index 1f76bc7065c87..323b385a21f7e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/baseline/ClusterActivationEventTest.java @@ -193,7 +193,7 @@ public void testClusterDeactivationListenerSleep() throws Exception { private void clusterChangeState(ClusterState initState, ClusterState state, int evtType) throws Exception { assertNotSame(initState, state); - checkClusterEvents(cluster -> cluster.state(state, true), lsnr, initState, evtType, 1); + checkClusterEvents(cluster -> cluster.state(state), lsnr, initState, evtType, 1); } /** @@ -208,7 +208,7 @@ private void clusterChangeState(ClusterState initState, ClusterState state, int private void clusterChangeStateWithDelay(ClusterState initState, ClusterState state, int evtType) throws Exception { assertNotSame(initState, state); - checkClusterEvents(cluster -> cluster.state(state, true), delayLsnr, initState, evtType, 1); + checkClusterEvents(cluster -> cluster.state(state), delayLsnr, initState, evtType, 1); } /** @@ -225,8 +225,8 @@ private void clusterChangeStateTwice(ClusterState initState, ClusterState state, ClusterActivationTestTask task = new ClusterActivationTestTask() { @Override public void execute(IgniteCluster cluster) { - cluster.state(state, true); - cluster.state(state, true); + cluster.state(state); + cluster.state(state); } }; @@ -249,7 +249,7 @@ private void checkClusterEvents( IgniteEx crd = grid(0); if (crd.cluster().state() != initState) - crd.cluster().state(initState, true); + crd.cluster().state(initState); for (Ignite ignite : G.allGrids()) assertEquals(ignite.name(), initState, ignite.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java index c8c4e885a9f60..d48b38c6784bb 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/standbycluster/AbstractNodeJoinTemplate.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import org.apache.ignite.cache.CacheAtomicityMode; -import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; @@ -628,7 +627,7 @@ public void execute() throws Exception { else { System.out.println(">>> DeActivate cluster"); - crd.cluster().state(ClusterState.INACTIVE, true); + crd.active(false); System.out.println(">>> Check after cluster deActivated"); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java index da3b16a300caa..12f89d5e88a80 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cluster/ClusterStateChangeEventTest.java @@ -128,7 +128,7 @@ private void changeStateAndCheckEvents(ClusterState state) throws IgniteCheckedE evtFuts.put(node, waitForLocalEvent(node.events(), e -> e.localOrder() > event.localOrder(), EVT_CLUSTER_STATE_CHANGED)); } - crd.cluster().state(state, true); + crd.cluster().state(state); for (Ignite node : evtFuts.keySet()) { assertEquals(node.name(), state, node.cluster().state()); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java index c9fab88ed1c37..97616fb3e37ba 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/metastorage/DistributedMetaStorageTest.java @@ -43,7 +43,6 @@ import org.junit.Test; import static org.apache.ignite.IgniteSystemProperties.IGNITE_GLOBAL_METASTORAGE_HISTORY_MAX_BYTES; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; /** * Test for {@link DistributedMetaStorageImpl} with disabled persistence. @@ -310,7 +309,7 @@ public void testDeactivateActivate() throws Exception { metastorage(0).write("key2", "value2"); - grid(0).cluster().state(INACTIVE, true); + grid(0).cluster().active(false); startGrid(1); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java index dc59e18194f01..1591686796c81 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/ServiceDeploymentOnActivationTest.java @@ -30,8 +30,6 @@ import org.junit.Before; import org.junit.Test; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; - /** * Tests check: *

@@ -171,7 +169,7 @@ private void checkRedeployment(int srvsNum, int clientsNum, IgnitePredicate cache = ignite.createCache("non-persistent-cache"); - - assertTrue(mxBean.active()); - assertTrue(ignite.active()); - assertEquals(ACTIVE.name(), mxBean.clusterState()); - - assertFalse(ignite.context().state().isDeactivationSafe()); - - // Manual deactivation must not fail and warn of possible data loss. - assertThrows(log, () -> { - mxBean.active(false); - - return null; - }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - - assertThrows(log, () -> { - ignite.active(false); - - return null; - }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - - assertThrows(log, () -> { - mxBean.clusterState(INACTIVE.name()); - - return null; - }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - - assertThrows(log, () -> { - mxBean.clusterState(INACTIVE.name(), false); - - return null; - }, ChangeOfClusterStateIsNotSafeException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - - assertTrue(ignite.active()); - assertTrue(mxBean.active()); - assertEquals(ACTIVE.name(), mxBean.clusterState()); - - // Forced deactivation. - mxBean.clusterState(INACTIVE.name(), true); - - assertFalse(mxBean.active()); - assertEquals(INACTIVE.name(), mxBean.clusterState()); - } -} diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index 5989384f061fd..6dad8985bcb18 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -221,7 +221,8 @@ public class GridJettyRestHandler extends AbstractHandler { * @return Boolean value from parameters map or {@code dfltVal} if null or not exists. * @throws IgniteCheckedException If parsing failed. */ - private static boolean boolValue(String key, Map params, boolean dfltVal) throws IgniteCheckedException { + private static boolean boolValue(String key, Map params, boolean dfltVal) + throws IgniteCheckedException { assert key != null; String val = (String)params.get(key); @@ -830,7 +831,7 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) restReq0.state(newState); - restReq0.forced(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq0.force(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); } restReq = restReq0; From 7ee19a544e4c460df6cdcde470cc6b4e07f417ca Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 20 Feb 2020 12:12:18 +0300 Subject: [PATCH 32/82] IGNITE-12701 : redeem. --- .../main/java/org/apache/ignite/Ignite.java | 1 - .../java/org/apache/ignite/IgniteCluster.java | 1 - .../impl/GridClientClusterStateImpl.java | 10 ++++--- .../internal/cluster/IgniteClusterImpl.java | 8 +++++- .../cluster/ChangeGlobalStateMessage.java | 4 ++- .../cluster/GridClusterStateProcessor.java | 26 +++---------------- .../cluster/IGridClusterStateProcessor.java | 18 ------------- 7 files changed, 20 insertions(+), 48 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index e66e20a84dc36..beece2da5f084 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -32,7 +32,6 @@ import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.configuration.NearCacheConfiguration; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.plugin.IgnitePlugin; diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 513bb466749ec..067c00d9e1ca4 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -27,7 +27,6 @@ import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.cluster.ClusterStartNodeResult; import org.apache.ignite.cluster.ClusterState; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.processors.cluster.baseline.autoadjust.BaselineAutoAdjustStatus; import org.apache.ignite.lang.IgniteAsyncSupport; import org.apache.ignite.lang.IgniteAsyncSupported; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 3bef2a1a78120..5d9c167083380 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -84,10 +84,12 @@ public GridClientClusterStateImpl( if (oldVerServerNode == null) withReconnectHandling((con, nodeId) -> con.changeState(newState, force, nodeId)).get(); else { - if (force) { - throw new GridServerDoesNotSupportException("Unable to forcibly change state of cluster on \"" - + newState.name() + "\". Found a node not supporting forced version this command: " - + oldVerServerNode + ". You can try without the flag 'force'."); + if (!force) { + throw new GridServerDoesNotSupportException("Unable to change state of cluster on \"" + + newState.name() + "\". Found a node supporting only not-forced version this command: " + + oldVerServerNode + ". It can cause no checking of deactivation safety " + + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory " + + "data."); } else { // Send old version of the command not supporting 'force'. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index cd2555a98f614..b89f1af8ebcaa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -76,6 +76,7 @@ import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.specifications; @@ -335,7 +336,12 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(newState, force, serverNodes(), false).get(); + if (state() != INACTIVE && newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { + throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To change cluster state on '" + newState.name() + "' pass the force flag."); + } + + ctx.state().changeGlobalState(newState, serverNodes(), false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index 2cc46b6738516..bdf1e7a37afa9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -215,7 +215,9 @@ boolean force() { } /** */ - void force(boolean force){ this.force = force; } + void force(boolean force) { + this.force = force; + } /** * @return Timestamp. 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 1de5247634564..f284daa6efe68 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 @@ -48,7 +48,6 @@ import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.cluster.ClusterGroupAdapter; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.cluster.DistributedBaselineConfiguration; @@ -627,17 +626,6 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { - if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe()) { - GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); - - if (stateFut != null) { - stateFut.onDone(new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on '" + msg.state().name() + "' pass the force flag.")); - } - - return false; - } - ExchangeActions exchangeActions; try { @@ -950,11 +938,10 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( ClusterState state, - boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ) { - return changeGlobalState(state, force, baselineNodes, forceChangeBaselineTopology, false); + return changeGlobalState(state, baselineNodes, forceChangeBaselineTopology, false); } /** @@ -963,7 +950,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. * @return Global change state future. - * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean, boolean)} instead. + * @deprecated Use {@link #changeGlobalState(ClusterState, Collection, boolean, boolean)} instead. */ @Deprecated public IgniteInternalFuture changeGlobalState( @@ -972,12 +959,11 @@ public IgniteInternalFuture changeGlobalState( boolean forceChangeBaselineTopology, boolean isAutoAdjust ) { - return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState(activate ? ACTIVE : INACTIVE, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); } /** * @param state New activate state. - * @param force If {@code True}, skips checking of the operation safety. * @param baselineNodes New BLT nodes. * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. @@ -985,7 +971,6 @@ public IgniteInternalFuture changeGlobalState( */ public IgniteInternalFuture changeGlobalState( ClusterState state, - boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -994,7 +979,7 @@ public IgniteInternalFuture changeGlobalState( null : calculateNewBaselineTopology(state, baselineNodes, forceChangeBaselineTopology); - return changeGlobalState0(state, force, newBlt, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState0(state, newBlt, forceChangeBaselineTopology, isAutoAdjust); } /** */ @@ -1064,7 +1049,6 @@ private Collection baselineNodes() { /** */ private IgniteInternalFuture changeGlobalState0( ClusterState state, - boolean force, BaselineTopology blt, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -1160,8 +1144,6 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); - msg.force(force); - IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index 893e6328c15de..f4e6850570eae 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -127,27 +127,9 @@ IgniteInternalFuture changeGlobalState( * @param baselineNodes New baseline nodes. * @param forceChangeBaselineTopology Force change baseline topology. * @return State change future. - * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean)} - */ - @Deprecated - default IgniteInternalFuture changeGlobalState( - ClusterState state, - Collection baselineNodes, - boolean forceChangeBaselineTopology - ) { - return changeGlobalState(state, true, baselineNodes, forceChangeBaselineTopology); - } - - /** - * @param state New cluster state. - * @param force If {@code True} skips checking of the operation safety. - * @param baselineNodes New baseline nodes. - * @param forceChangeBaselineTopology Force change baseline topology. - * @return State change future. */ IgniteInternalFuture changeGlobalState( ClusterState state, - boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ); From a7e940f185020babdba897e3771210562d1ecf5c Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 20 Feb 2020 12:46:40 +0300 Subject: [PATCH 33/82] IGNITE-12701 : minor comment fit. --- .../core/src/main/java/org/apache/ignite/IgniteCluster.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 067c00d9e1ca4..526d63a6c1837 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -473,7 +473,8 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. - * Fails if the operation is not safe. @see ClusterState#INACTIVE. + * Fails if the operation is not safe. + * @see ClusterState#INACTIVE * * @param newState New cluster state. * @throws IgniteException If there is an already started transaction or lock in the same thread. From 6830ec85b22c91592b2eaa642833f719c278de27 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 13:33:49 +0300 Subject: [PATCH 34/82] IGNITE-12701 : minor fix. --- .../processors/cluster/ChangeGlobalStateMessage.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index bdf1e7a37afa9..0fb53f0f30624 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -207,18 +207,6 @@ public boolean forceChangeBaselineTopology() { return baselineTopology; } - /** - * @return Whether state changing must not check safety of this operation. - */ - boolean force() { - return force; - } - - /** */ - void force(boolean force) { - this.force = force; - } - /** * @return Timestamp. */ From bf9ddc254d1d56d9bc5c34d9e00644d8eeaa1410 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 13:42:38 +0300 Subject: [PATCH 35/82] IGNITE-12701 : review fixes. --- modules/core/src/main/java/org/apache/ignite/Ignite.java | 3 +-- .../core/src/main/java/org/apache/ignite/IgniteCluster.java | 3 ++- .../ignite/internal/client/GridClientClusterState.java | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index beece2da5f084..382402f85c19a 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -669,8 +669,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link IgniteCluster#state(ClusterState, boolean)} - * or {@link IgniteCluster#state(ClusterState, boolean)} instead. + * @deprecated Use {@link IgniteCluster#state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active); diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 526d63a6c1837..e87a24a063463 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -455,7 +455,8 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes Ignite grid state to active or inactive. - * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. + * Fails if the operation is not safe. + * @see org.apache.ignite.ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 0386772d9da22..b7cd5987db4b2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -25,7 +25,8 @@ public interface GridClientClusterState { /** * Changes Ignite grid state to active or inactive. - * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. + * Fails if the operation is not safe. + * @see ClusterState#INACTIVE * * @param active {@code True} activate, {@code False} deactivate. * @deprecated Use {@link #state(ClusterState, boolean)} instead. @@ -48,7 +49,8 @@ public interface GridClientClusterState { /** * Changes cluster state to {@code newState}. - * Fails if the operation is not safe. @see org.apache.ignite.ClusterState#INACTIVE. + * Fails if the operation is not safe. + * @see ClusterState#INACTIVE * * @param newState New cluster state. * @throws GridClientException If the request to change the cluster state failed. From 29f0e626d0b4162d6b4c243a9a7a2f137a14ddb8 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 20 Feb 2020 15:18:57 +0300 Subject: [PATCH 36/82] IGNITE-12701 : back to checking of state change through the discovery. --- .../java/org/apache/ignite/IgniteCluster.java | 2 +- .../impl/GridClientClusterStateImpl.java | 2 +- .../internal/cluster/IgniteClusterImpl.java | 16 +++++++----- .../cluster/ChangeGlobalStateMessage.java | 12 +++++++++ .../cluster/GridClusterStateProcessor.java | 26 ++++++++++++++++--- .../cluster/IGridClusterStateProcessor.java | 18 +++++++++++++ 6 files changed, 64 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index e87a24a063463..40046dec1b924 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -456,7 +456,7 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes Ignite grid state to active or inactive. * Fails if the operation is not safe. - * @see org.apache.ignite.ClusterState#INACTIVE + * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 5d9c167083380..d2cbb0272b777 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -86,7 +86,7 @@ public GridClientClusterStateImpl( else { if (!force) { throw new GridServerDoesNotSupportException("Unable to change state of cluster on \"" - + newState.name() + "\". Found a node supporting only not-forced version this command: " + + newState.name() + "\". Found a node not supporting safe deactivation: " + oldVerServerNode + ". It can cause no checking of deactivation safety " + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory " + "data."); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index b89f1af8ebcaa..7214762ab3165 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -74,9 +74,10 @@ import org.jetbrains.annotations.Nullable; import static org.apache.ignite.cluster.ClusterState.INACTIVE; +import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; +import static org.apache.ignite.internal.IgniteFeatures.allNodesSupports; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.specifications; @@ -336,12 +337,15 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - if (state() != INACTIVE && newState == INACTIVE && !force && !ctx.state().isDeactivationSafe()) { - throw new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on '" + newState.name() + "' pass the force flag."); - } + boolean allNodesSupport = newState != INACTIVE + || allNodesSupports(forServers().nodes(), FORCED_CHANGE_OF_CLUSTER_STATE); + + if (allNodesSupport || force) + ctx.state().changeGlobalState(newState, force, serverNodes(), false).get(); - ctx.state().changeGlobalState(newState, serverNodes(), false).get(); + throw new IgniteException("Cannot change cluster state on \"" + newState.name() + + "\". Not all nodes support safe deactivation. You can try IgniteCluster#state(INACTIVE, true)." + + " Be aware that the deactivation clears in-memory data."); } catch (IgniteCheckedException e) { throw U.convertException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index 0fb53f0f30624..bdf1e7a37afa9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -207,6 +207,18 @@ public boolean forceChangeBaselineTopology() { return baselineTopology; } + /** + * @return Whether state changing must not check safety of this operation. + */ + boolean force() { + return force; + } + + /** */ + void force(boolean force) { + this.force = force; + } + /** * @return Timestamp. */ 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 27a06bc8bd8d8..6b48f0b62815a 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 @@ -48,6 +48,7 @@ import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; +import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.cluster.ClusterGroupAdapter; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.cluster.DistributedBaselineConfiguration; @@ -628,6 +629,17 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { + if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe()) { + GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); + + if (stateFut != null) { + stateFut.onDone(new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + + " To change cluster state on '" + msg.state().name() + "' pass the force flag.")); + } + + return false; + } + ExchangeActions exchangeActions; try { @@ -940,10 +952,11 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ) { - return changeGlobalState(state, baselineNodes, forceChangeBaselineTopology, false); + return changeGlobalState(state, force, baselineNodes, forceChangeBaselineTopology, false); } /** @@ -952,7 +965,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. * @return Global change state future. - * @deprecated Use {@link #changeGlobalState(ClusterState, Collection, boolean, boolean)} instead. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean, boolean)} instead. */ @Deprecated public IgniteInternalFuture changeGlobalState( @@ -961,11 +974,12 @@ public IgniteInternalFuture changeGlobalState( boolean forceChangeBaselineTopology, boolean isAutoAdjust ) { - return changeGlobalState(activate ? ACTIVE : INACTIVE, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); } /** * @param state New activate state. + * @param force If {@code True}, skips checking of the operation safety. * @param baselineNodes New BLT nodes. * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. @@ -973,6 +987,7 @@ public IgniteInternalFuture changeGlobalState( */ public IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -981,7 +996,7 @@ public IgniteInternalFuture changeGlobalState( null : calculateNewBaselineTopology(state, baselineNodes, forceChangeBaselineTopology); - return changeGlobalState0(state, newBlt, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState0(state, force, newBlt, forceChangeBaselineTopology, isAutoAdjust); } /** */ @@ -1051,6 +1066,7 @@ private Collection baselineNodes() { /** */ private IgniteInternalFuture changeGlobalState0( ClusterState state, + boolean force, BaselineTopology blt, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -1146,6 +1162,8 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); + msg.force(force); + IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index f4e6850570eae..893e6328c15de 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -127,9 +127,27 @@ IgniteInternalFuture changeGlobalState( * @param baselineNodes New baseline nodes. * @param forceChangeBaselineTopology Force change baseline topology. * @return State change future. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean)} + */ + @Deprecated + default IgniteInternalFuture changeGlobalState( + ClusterState state, + Collection baselineNodes, + boolean forceChangeBaselineTopology + ) { + return changeGlobalState(state, true, baselineNodes, forceChangeBaselineTopology); + } + + /** + * @param state New cluster state. + * @param force If {@code True} skips checking of the operation safety. + * @param baselineNodes New baseline nodes. + * @param forceChangeBaselineTopology Force change baseline topology. + * @return State change future. */ IgniteInternalFuture changeGlobalState( ClusterState state, + boolean force, Collection baselineNodes, boolean forceChangeBaselineTopology ); From 11ae88b8ff8a22383110f43666422a2cb1a06aa4 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 15:38:29 +0300 Subject: [PATCH 37/82] IGNITE-12701 : critical fix. --- .../ignite/internal/cluster/IgniteClusterImpl.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 7214762ab3165..f3804a682a9ef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -342,10 +342,11 @@ public IgniteClusterImpl(GridKernalContext ctx) { if (allNodesSupport || force) ctx.state().changeGlobalState(newState, force, serverNodes(), false).get(); - - throw new IgniteException("Cannot change cluster state on \"" + newState.name() - + "\". Not all nodes support safe deactivation. You can try IgniteCluster#state(INACTIVE, true)." + - " Be aware that the deactivation clears in-memory data."); + else { + throw new IgniteException("Cannot change cluster state on \"" + newState.name() + + "\". Not all nodes support safe deactivation. You can try IgniteCluster#state(INACTIVE, true)." + + " Be aware that the deactivation clears in-memory data."); + } } catch (IgniteCheckedException e) { throw U.convertException(e); From 8f9bf803fc7de508f17b1eadac964bd153a9093a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 15:54:58 +0300 Subject: [PATCH 38/82] IGNITE-12701 : codestyle fix. --- .../processors/rest/JettyRestProcessorAbstractSelfTest.java | 2 ++ .../internal/client/impl/GridClientClusterStateImpl.java | 6 +++--- .../processors/cluster/GridClusterStateProcessor.java | 2 -- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index b261b1d5137ce..b5093f547b262 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -3226,8 +3226,10 @@ private void changeClusterState(GridRestCommand cmd, String... params) throws Ex for (int i = 0; i < params.length; ++i) { String p = params[i]; + if ("force".equals(p) && params[i + 1].equals("true")) force = true; + if (cmd == GridRestCommand.CLUSTER_SET_STATE && p.equals("state")) deactivate = params[i + 1].equals(INACTIVE.name()); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index d2cbb0272b777..2356f5d154ab1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -87,9 +87,9 @@ public GridClientClusterStateImpl( if (!force) { throw new GridServerDoesNotSupportException("Unable to change state of cluster on \"" + newState.name() + "\". Found a node not supporting safe deactivation: " - + oldVerServerNode + ". It can cause no checking of deactivation safety " + - "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory " + - "data."); + + oldVerServerNode + ". It can cause no checking of deactivation safety " + + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory" + + " data."); } else { // Send old version of the command not supporting 'force'. 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 6b48f0b62815a..ec24ec52f0c94 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 @@ -1162,8 +1162,6 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); - msg.force(force); - IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { From b547ea67e8ef48da70f1cad291c0339708f0eabc Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 16:38:27 +0300 Subject: [PATCH 39/82] IGNITE-12701 : removed API change. --- .../main/java/org/apache/ignite/Ignite.java | 4 ++- .../java/org/apache/ignite/IgniteCluster.java | 24 ++++---------- .../cluster/IgniteClusterAsyncImpl.java | 5 --- .../internal/cluster/IgniteClusterImpl.java | 31 +++++++------------ .../cluster/GridClusterStateProcessor.java | 2 ++ .../GridChangeClusterStateCommandHandler.java | 4 ++- .../GridChangeStateCommandHandler.java | 3 +- .../apache/ignite/mxbean/IgniteMXBean.java | 10 ++++++ .../multijvm/IgniteClusterProcessProxy.java | 5 --- 9 files changed, 38 insertions(+), 50 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 382402f85c19a..4211345a1abf6 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -664,12 +664,14 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig /** * Changes Ignite grid state to active or inactive. + *

+ * NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link IgniteCluster#state(ClusterState, boolean)} instead. + * @deprecated Use {@link IgniteCluster#active(boolean)} instead. */ @Deprecated public void active(boolean active); diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 40046dec1b924..f07211e63f3f6 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -454,13 +454,15 @@ public IgniteFuture> startNodesAsync(Collecti public boolean active(); /** - * Changes Ignite grid state to active or inactive. - * Fails if the operation is not safe. + * Changes grid state to active or inactive. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link #state(ClusterState, boolean)} instead. + * @deprecated Use {@link #state(ClusterState)} instead. */ @Deprecated public void active(boolean active); @@ -474,29 +476,15 @@ public IgniteFuture> startNodesAsync(Collecti /** * Changes current cluster state to given {@code newState} cluster state. - * Fails if the operation is not safe. - * @see ClusterState#INACTIVE - * - * @param newState New cluster state. - * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @deprecated Use {@link #state(ClusterState, boolean)} instead. - */ - @Deprecated - public void state(ClusterState newState) throws IgniteException; - - /** - * Changes current cluster state to given {@code newState} cluster state. - * Fails if the operation is not safe and {@code force} is not set. *

* NOTE: * Be aware that cluster deactivation leads to loss of in-memory data. * @see ClusterState#INACTIVE * * @param newState New cluster state. - * @param force If {@code True} then skips checking of operation safety. * @throws IgniteException If there is an already started transaction or lock in the same thread. */ - public void state(ClusterState newState, boolean force) throws IgniteException; + public void state(ClusterState newState) throws IgniteException; /** * Gets current baseline topology. If baseline topology was not set, will return {@code null}. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java index 3c7f922a27a96..a001b56ae9b0b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterAsyncImpl.java @@ -425,9 +425,4 @@ public IgniteFuture baselineAutoAdjustTimeoutAsync(long baselineAutoAdjustTim @Override public void state(ClusterState newState) throws IgniteException { cluster.state(newState); } - - /** {@inheritDoc} */ - @Override public void state(ClusterState newState, boolean force) throws IgniteException { - cluster.state(newState, force); - } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index f3804a682a9ef..7fc666a2131f5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -73,9 +73,6 @@ import org.apache.ignite.lang.IgniteProductVersion; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; -import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; -import static org.apache.ignite.internal.IgniteFeatures.allNodesSupports; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; @@ -312,7 +309,17 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void active(boolean active) { - state(active ? ClusterState.ACTIVE : INACTIVE); + guard(); + + try { + ctx.state().changeGlobalState(active, serverNodes(), false).get(); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + finally { + unguard(); + } } /** {@inheritDoc} */ @@ -329,24 +336,10 @@ public IgniteClusterImpl(GridKernalContext ctx) { /** {@inheritDoc} */ @Override public void state(ClusterState newState) throws IgniteException { - state(newState, true); - } - - /** {@inheritDoc} */ - @Override public void state(ClusterState newState, boolean force) throws IgniteException { guard(); try { - boolean allNodesSupport = newState != INACTIVE - || allNodesSupports(forServers().nodes(), FORCED_CHANGE_OF_CLUSTER_STATE); - - if (allNodesSupport || force) - ctx.state().changeGlobalState(newState, force, serverNodes(), false).get(); - else { - throw new IgniteException("Cannot change cluster state on \"" + newState.name() - + "\". Not all nodes support safe deactivation. You can try IgniteCluster#state(INACTIVE, true)." + - " Be aware that the deactivation clears in-memory data."); - } + ctx.state().changeGlobalState(newState, serverNodes(), false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); 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 ec24ec52f0c94..6b48f0b62815a 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 @@ -1162,6 +1162,8 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); + msg.force(force); + IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 0e477c4ebcc7a..4c2106fbcdb85 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.rest.handlers.cluster; import java.util.Collection; +import java.util.Collections; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.rest.GridRestCommand; @@ -73,7 +74,8 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.grid().cluster().state(req.state(), req.force()); + ctx.state().changeGlobalState(req.state(), req.force(), Collections.emptyList(), + false).get(); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index 0aa6a084b6e52..f01df213685a9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -75,7 +75,8 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { case CLUSTER_INACTIVE: log.warning(req.command().key() + " is deprecated. Use newer commands."); default: - ctx.grid().cluster().state(req.active() ? ACTIVE : INACTIVE, req.force()); + ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.force(), + ctx.cluster().get().forServers().nodes(), false).get(); res.setResponse(req.command().key() + " started"); break; diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 47bb9254277d7..d561817b5f2f4 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -382,6 +382,12 @@ public boolean pingNode( ); /** + * Changes grid state to active or inactive. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE + * * @param active Activate/DeActivate flag. */ @MXBeanDescription( @@ -658,6 +664,10 @@ void runIoTest( /** * Changes current cluster state. + *

+ * NOTE: + * Be aware that cluster deactivation leads to loss of in-memory data. + * @see ClusterState#INACTIVE * * @param state String representation of new cluster state. * See {@link ClusterState} diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java index 4c3c45867836c..c8e6fb37bcdc9 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/multijvm/IgniteClusterProcessProxy.java @@ -402,11 +402,6 @@ public IgniteClusterProcessProxy(IgniteProcessProxy proxy) { throw new UnsupportedOperationException("Operation is not supported yet."); } - /** {@inheritDoc} */ - @Override public void state(ClusterState newState, boolean force) throws IgniteException { - throw new UnsupportedOperationException("Operation is not supported yet."); - } - /** * */ From 01e7437bb98b55b2daba43afb05259351d32eaad Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 20 Feb 2020 17:31:43 +0300 Subject: [PATCH 40/82] IGNITE-12701 : minority. --- .../rest/handlers/cluster/GridChangeStateCommandHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index f01df213685a9..b9870f780b965 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.rest.handlers.cluster; import java.util.Collection; +import java.util.Collections; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.rest.GridRestCommand; @@ -76,7 +77,7 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { log.warning(req.command().key() + " is deprecated. Use newer commands."); default: ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.force(), - ctx.cluster().get().forServers().nodes(), false).get(); + Collections.emptyList(), false).get(); res.setResponse(req.command().key() + " started"); break; From 01c33150f2c404e7b4353e3040aa9d2e50796042 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 21 Feb 2020 16:28:00 +0300 Subject: [PATCH 41/82] IGNITE-12701 : minority review fix. --- .../GridServerDoesNotSupportException.java | 45 ------------------- .../impl/GridClientClusterStateImpl.java | 3 +- .../internal/client/util/GridClientUtils.java | 4 +- ...hangeOfClusterStateIsNotSafeException.java | 22 --------- .../cluster/GridClusterStateProcessor.java | 3 +- 5 files changed, 3 insertions(+), 74 deletions(-) delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java deleted file mode 100644 index 71e01d5ed546f..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridServerDoesNotSupportException.java +++ /dev/null @@ -1,45 +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.client; - -/** - * Thrown when detected a server node unsupporting command, operation or version. - */ -public class GridServerDoesNotSupportException extends GridClientException { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Creates exception with specified error message. - * - * @param msg Error message. - */ - public GridServerDoesNotSupportException(String msg) { - super(msg); - } - - /** - * Creates exception with specified error message and cause. - * - * @param msg Error message. - * @param cause Error cause. - */ - public GridServerDoesNotSupportException(String msg, Throwable cause) { - super(msg, cause); - } -} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 2356f5d154ab1..ac5ed61db6408 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -24,7 +24,6 @@ import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.client.GridClientPredicate; -import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.apache.ignite.internal.client.balancer.GridClientLoadBalancer; import org.apache.ignite.internal.client.impl.connection.GridClientConnection; @@ -85,7 +84,7 @@ public GridClientClusterStateImpl( withReconnectHandling((con, nodeId) -> con.changeState(newState, force, nodeId)).get(); else { if (!force) { - throw new GridServerDoesNotSupportException("Unable to change state of cluster on \"" + throw new GridClientException("Unable to change state of cluster on \"" + newState.name() + "\". Found a node not supporting safe deactivation: " + oldVerServerNode + ". It can cause no checking of deactivation safety " + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory" diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java index ccc665a4becf9..aa3de9ebf693c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/util/GridClientUtils.java @@ -34,7 +34,6 @@ import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.client.GridClientPredicate; import org.apache.ignite.internal.client.GridClientProtocol; -import org.apache.ignite.internal.client.GridServerDoesNotSupportException; import org.jetbrains.annotations.Nullable; /** @@ -188,7 +187,6 @@ public static int safeAbs(int i) { * @param feature Feature. * @param validateClientNodes Whether client nodes should be checked as well. * @param failIfUnsupportedFound If {@code True}, fails when found a node unsupporting {@code feature}. - * @throws GridServerDoesNotSupportException If {@code failIfUnsupportedFound} is {@code True} and found a node * unsupporting {@code feature}. * @return Id of node unsupporting {@code feature}. {@code null} if all nodes support {@code feature} . */ @@ -207,7 +205,7 @@ public static UUID checkFeatureSupportedByCluster( if (!IgniteFeatures.nodeSupports(featuresAttrBytes, feature)) { if (failIfUnsupportedFound) { - throw new GridServerDoesNotSupportException("Failed to execute command: cluster contains node that " + + throw new GridClientException("Failed to execute command: cluster contains node that " + "doesn't support feature [nodeId=" + node.nodeId() + ", feature=" + feature + ']'); } else diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java deleted file mode 100644 index 44fbfcb795317..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/ChangeOfClusterStateIsNotSafeException.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.apache.ignite.internal.cluster; - -import org.apache.ignite.IgniteException; - -/** - * Warns of possibility to lose data on change of cluster state. - */ -public class ChangeOfClusterStateIsNotSafeException extends IgniteException { - /** */ - private static final long serialVersionUID = 0L; - - /** Default constructor. */ - public ChangeOfClusterStateIsNotSafeException() { - } - - /** - * @param msg Message. - */ - public ChangeOfClusterStateIsNotSafeException(String msg) { - super(msg); - } -} 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 6b48f0b62815a..9c09aac8e2609 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 @@ -48,7 +48,6 @@ import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.NodeStoppingException; -import org.apache.ignite.internal.cluster.ChangeOfClusterStateIsNotSafeException; import org.apache.ignite.internal.cluster.ClusterGroupAdapter; import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException; import org.apache.ignite.internal.cluster.DistributedBaselineConfiguration; @@ -633,7 +632,7 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); if (stateFut != null) { - stateFut.onDone(new ChangeOfClusterStateIsNotSafeException(DATA_LOST_ON_DEACTIVATION_WARNING + stateFut.onDone(new IgniteException(DATA_LOST_ON_DEACTIVATION_WARNING + " To change cluster state on '" + msg.state().name() + "' pass the force flag.")); } From 348a6572d948ae102111a3d28d32ac9dd82621d2 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Fri, 21 Feb 2020 20:02:38 +0300 Subject: [PATCH 42/82] IGNITE-12701 : last review. --- .../client/impl/GridClientClusterStateImpl.java | 3 ++- .../cluster/GridClusterStateProcessor.java | 3 ++- .../message/GridClientClusterStateRequestV2.java | 11 +++++++++-- .../rest/request/GridRestChangeStateRequest.java | 12 +++++++++--- .../rest/request/GridRestClusterStateRequest.java | 10 ++++++++-- 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index ac5ed61db6408..1c954acc6eeea 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -80,6 +80,7 @@ public GridClientClusterStateImpl( UUID oldVerServerNode = checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, false, false); + // Send new version of state change request supporting 'force' feature. if (oldVerServerNode == null) withReconnectHandling((con, nodeId) -> con.changeState(newState, force, nodeId)).get(); else { @@ -91,7 +92,7 @@ public GridClientClusterStateImpl( + " data."); } else { - // Send old version of the command not supporting 'force'. + // Send old version of the command not supporting 'force' feature. withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId)).get(); } } 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 9c09aac8e2609..4136d5492a481 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 @@ -973,7 +973,8 @@ public IgniteInternalFuture changeGlobalState( boolean forceChangeBaselineTopology, boolean isAutoAdjust ) { - return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, + isAutoAdjust); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index b0bf4e05571a8..551ee3c3b9763 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -48,14 +48,21 @@ public GridClientClusterStateRequestV2() { // No op. } - /** Copying constructor. */ + /** + * Copying constructor. + * + * @param clusterStateReq Original request, of the previous version. + * @param force If {@code True}, indicates to skip checking of state change safety. + */ private GridClientClusterStateRequestV2(GridClientClusterStateRequest clusterStateReq, boolean force) { super(clusterStateReq); this.force = force; } - /** */ + /** + * @return {@code True} if there is no need to check if state change is safe. + */ public boolean force() { return force; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index 808b5bee766b6..454aa1033d862 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -27,7 +27,7 @@ public class GridRestChangeStateRequest extends GridRestRequest { /** Request current state. */ private boolean reqCurrentState; - /** Forced chage state. */ + /** Forced chage state without checking of operation safety. */ private boolean force; /** @@ -58,12 +58,18 @@ public void reqCurrentState() { reqCurrentState = true; } - /** */ + /** + * Sets forced state change witout checking of operation safety. + * + * @param force If {@code True}, indicates to skip checking of state change safety. + */ public void force(boolean force) { this.force = force; } - /** */ + /** + * @return {@code True} if there is no need to check if state change is safe. + */ public boolean force() { return force; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 21989db0fe978..d0f9cb4f89033 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -35,7 +35,11 @@ public class GridRestClusterStateRequest extends GridRestRequest { /** Forced change of the state. */ private boolean force; - /** */ + /** + * Sets forced state change witout checking of operation safety. + * + * @param force If {@code True}, indicates to skip checking of state change safety. + */ public void force(boolean force) { this.force = force; } @@ -50,7 +54,9 @@ public boolean isReqCurrentMode() { return reqCurrentMode; } - /** */ + /** + * @return {@code True} if there is no need to check if state change is safe. + */ public boolean force() { return force; } From 856c9fffc159b866903b72c1304bc4fb87474573 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 25 Feb 2020 17:33:30 +0300 Subject: [PATCH 43/82] IGNITE-12701 : fix resetting params in the commands. --- .../ignite/internal/commandline/ClusterStateChangeCommand.java | 2 ++ .../apache/ignite/internal/commandline/DeactivateCommand.java | 2 ++ .../security/GridCommandHandlerSslWithSecurityTest.java | 1 + 3 files changed, 5 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 161cfa52f4cdd..b0c9f0377834a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -99,6 +99,8 @@ public class ClusterStateChangeCommand implements Command { throw new IllegalArgumentException("Can't parse new cluster state. State: " + s, e); } + force = false; + if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index a752c3afe61b1..5f7a9a7a6fde1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -83,6 +83,8 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public void parseArguments(CommandArgIterator argIter) { + force = false; + if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/GridCommandHandlerSslWithSecurityTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/GridCommandHandlerSslWithSecurityTest.java index 721412b072b2b..0849b1f1bdeeb 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/security/GridCommandHandlerSslWithSecurityTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/security/GridCommandHandlerSslWithSecurityTest.java @@ -93,6 +93,7 @@ else if (fmt.contains("truststore")) { List args = new ArrayList<>(); args.add(DEACTIVATE.text()); + args.add("--force"); args.add("--yes"); args.add("--user"); From d2e4c94275b8b7d0f9ea8569bf85a11886918df8 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 26 Feb 2020 12:06:20 +0300 Subject: [PATCH 44/82] IGNITE-12701 : attempt to fix nodeJS thin client test --- .../handlers/cluster/GridChangeClusterStateCommandHandler.java | 3 +-- .../rest/handlers/cluster/GridChangeStateCommandHandler.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 4c2106fbcdb85..02d7d5198df5d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.rest.handlers.cluster; import java.util.Collection; -import java.util.Collections; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.rest.GridRestCommand; @@ -74,7 +73,7 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.state().changeGlobalState(req.state(), req.force(), Collections.emptyList(), + ctx.state().changeGlobalState(req.state(), req.force(), ctx.cluster().get().forServers().nodes(), false).get(); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index b9870f780b965..f01df213685a9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.rest.handlers.cluster; import java.util.Collection; -import java.util.Collections; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.processors.rest.GridRestCommand; @@ -77,7 +76,7 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { log.warning(req.command().key() + " is deprecated. Use newer commands."); default: ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.force(), - Collections.emptyList(), false).get(); + ctx.cluster().get().forServers().nodes(), false).get(); res.setResponse(req.command().key() + " started"); break; From 7d9c80e75fd4936d45feda368d7c086791a796e4 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 26 Feb 2020 13:09:26 +0300 Subject: [PATCH 45/82] IGNITE-12701 : minority. --- .../rest/client/message/GridClientClusterStateRequest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 528e738ec581a..84442a85f6760 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -75,7 +75,11 @@ public GridClientClusterStateRequest() { // No op. } - /** Copying constructor. */ + /** + * Copying constructor. + * + * @param src The request to copy data from. + */ protected GridClientClusterStateRequest(GridClientClusterStateRequest src) { reqCurrentState = src.reqCurrentState; state = src.state; From 9721954fda2a965463aa58118c6278047f28617e Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Thu, 27 Feb 2020 14:20:00 +0300 Subject: [PATCH 46/82] IGNITE-12701 : critical fix : checking the feature before deactivation. --- .../processors/cluster/GridClusterStateProcessor.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 4136d5492a481..8dd44f658561a 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 @@ -96,8 +96,8 @@ import org.jetbrains.annotations.Nullable; import static org.apache.ignite.cluster.ClusterState.ACTIVE; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.cluster.ClusterState.lesserOf; import static org.apache.ignite.configuration.IgniteConfiguration.DFLT_STATE_ON_START; import static org.apache.ignite.events.EventType.EVT_NODE_FAILED; @@ -105,6 +105,8 @@ import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.STATE_PROC; import static org.apache.ignite.internal.IgniteFeatures.CLUSTER_READ_ONLY_MODE; +import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; +import static org.apache.ignite.internal.IgniteFeatures.allNodesSupports; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.extractDataStorage; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.isPersistentCache; @@ -628,7 +630,8 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { - if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe()) { + if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe() && + allNodesSupports(ctx.discovery().serverNodes(topVer), FORCED_CHANGE_OF_CLUSTER_STATE)) { GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); if (stateFut != null) { From 74c887f21b4d6a0d35cb10421a23a5ed2ad0b139 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Mar 2020 18:34:35 +0300 Subject: [PATCH 47/82] IGNITE-12701 : fixes after review. --- .../main/java/org/apache/ignite/Ignite.java | 2 +- .../java/org/apache/ignite/IgniteCluster.java | 4 +- .../apache/ignite/cluster/ClusterState.java | 4 +- .../client/GridClientClusterState.java | 2 +- .../impl/GridClientClusterStateImpl.java | 27 +++++------- .../impl/connection/GridClientConnection.java | 41 +++---------------- .../GridClientNioTcpConnection.java | 23 ++--------- .../apache/ignite/mxbean/IgniteMXBean.java | 4 +- .../http/jetty/GridJettyRestHandler.java | 17 +++----- 9 files changed, 32 insertions(+), 92 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 4211345a1abf6..0626c5d26aaec 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -666,7 +666,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig * Changes Ignite grid state to active or inactive. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index f07211e63f3f6..b17ac9408b439 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -457,7 +457,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes grid state to active or inactive. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. @@ -478,7 +478,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index 6cef256f4c5f1..e710c3479d960 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -27,9 +27,7 @@ public enum ClusterState { * Cluster deactivated. Cache operations aren't allowed. *

* NOTE: - * Please be aware that deactivation can cause data loss. - * This process clears all in-memory caches including the system ones. - * Thus, all in-memory-only data and objects are erased. + * After cluster deactivation all data from in-memory cache will be lost. */ INACTIVE, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index b7cd5987db4b2..e0bb4c92cc475 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -64,7 +64,7 @@ public interface GridClientClusterState { * is {@code False}. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 1c954acc6eeea..06d22fadbc59f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -76,26 +76,19 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean force) throws GridClientException { - // Check compapability of new forced deactivation on all nodes. - UUID oldVerServerNode = checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, + // When 'force' is false, check compapability of new forced deactivation on all nodes. + UUID oldVerNode = force ? null : checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, false, false); - // Send new version of state change request supporting 'force' feature. - if (oldVerServerNode == null) - withReconnectHandling((con, nodeId) -> con.changeState(newState, force, nodeId)).get(); - else { - if (!force) { - throw new GridClientException("Unable to change state of cluster on \"" - + newState.name() + "\". Found a node not supporting safe deactivation: " - + oldVerServerNode + ". It can cause no checking of deactivation safety " - + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory" - + " data."); - } - else { - // Send old version of the command not supporting 'force' feature. - withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId)).get(); - } + if (oldVerNode != null) { + throw new GridClientException("Unable to change state of cluster on \"" + + newState.name() + "\". Found a node not supporting safe deactivation: " + + oldVerNode + ". It can cause no checking of deactivation safety " + + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory" + + " data."); } + + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, force ? null : false)).get(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index ada7f56da1911..b2484a4ace78e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -25,8 +25,8 @@ import java.util.Set; import java.util.UUID; import javax.net.ssl.SSLContext; - import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.client.GridClientCacheFlag; import org.apache.ignite.internal.client.GridClientClosedException; import org.apache.ignite.internal.client.GridClientDataMetrics; @@ -309,51 +309,22 @@ public abstract GridClientFutureAdapter cachePrepend(String cach public abstract GridClientFutureAdapter execute(String taskName, Object arg, UUID destNodeId, boolean keepBinaries) throws GridClientConnectionResetException, GridClientClosedException; - /** - * Change grid global state. Fails if the operation is not safe and {@code force} is {@code False}. - *

- * NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. - * @see ClusterState#INACTIVE - * - * @param active Active. - * @param force If {@code True} then skips checking of operation safety. - * @param destNodeId Destination node id. - * @deprecated Use {@link #changeState(ClusterState, boolean, UUID)} instead. - */ - @Deprecated - public abstract GridClientFuture changeState(boolean active, boolean force, UUID destNodeId) - throws GridClientClosedException, GridClientConnectionResetException; - - /** - * Changes grid global state. Fails if the operation is not safe. - * Uses old version of change state request that guaranties comaptibility with old-version-servers. - * But cannot pass the force flag like {@link #changeState(ClusterState, boolean, UUID)}. - * - * @param state New cluster state. - * @param destNodeId Destination node id. - * @throws GridClientConnectionResetException In case of error. - * @throws GridClientClosedException If client was manually closed before request was sent over network. - * @deprecated Use {@link #changeState(ClusterState, boolean, UUID)} instead. - */ - @Deprecated - public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId) - throws GridClientClosedException, GridClientConnectionResetException; - /** * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param state New cluster state. - * @param force If {@code True} then skips checking of operation safety. * @param destNodeId Destination node id. + * @param force If not {@code null}, new version of state changing will be used. + * See {@link IgniteFeatures#FORCED_CHANGE_OF_CLUSTER_STATE}. + * If {@code True} then skips checking of operation safety. * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. */ - public abstract GridClientFuture changeState(ClusterState state, boolean force, UUID destNodeId) + public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, @Nullable Boolean force) throws GridClientClosedException, GridClientConnectionResetException; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 1f528b57a75a9..0f56346661d4a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -61,8 +61,8 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheBean; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; -import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientMessage; import org.apache.ignite.internal.processors.rest.client.message.GridClientNodeBean; @@ -85,8 +85,6 @@ import org.jetbrains.annotations.Nullable; import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.apache.ignite.cluster.ClusterState.ACTIVE; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.client.GridClientCacheFlag.KEEP_BINARIES; import static org.apache.ignite.internal.client.GridClientCacheFlag.encodeCacheFlags; import static org.apache.ignite.internal.client.impl.connection.GridClientConnectionCloseReason.CONN_IDLE; @@ -818,25 +816,12 @@ private GridClientAuthenticationRequest buildAuthRequest() { } /** {@inheritDoc} */ - @Override public GridClientFuture changeState(boolean active, boolean force, UUID destNodeId) - throws GridClientClosedException, GridClientConnectionResetException { - return changeState(active ? ACTIVE : INACTIVE, force, destNodeId); - } - - /** {@inheritDoc} */ - @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId) - throws GridClientClosedException, GridClientConnectionResetException { - assert state != null; - - return makeRequest(GridClientClusterStateRequest.state(state), destNodeId); - } - - /** {@inheritDoc} */ - @Override public GridClientFuture changeState(ClusterState state, boolean force, UUID destNodeId) + @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId, Boolean force) throws GridClientClosedException, GridClientConnectionResetException { assert state != null; - return makeRequest(GridClientClusterStateRequestV2.state(state, force), destNodeId); + return makeRequest(force == null ? GridClientClusterStateRequest.state(state) + : GridClientClusterStateRequestV2.state(state, force), destNodeId); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index d561817b5f2f4..e71b6145440db 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -385,7 +385,7 @@ public boolean pingNode( * Changes grid state to active or inactive. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param active Activate/DeActivate flag. @@ -666,7 +666,7 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * Be aware that cluster deactivation leads to loss of in-memory data. + * After cluster deactivation all data from in-memory cache will be lost. * @see ClusterState#INACTIVE * * @param state String representation of new cluster state. diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index 6dad8985bcb18..7fae06c40b6b4 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -56,8 +56,8 @@ import org.apache.ignite.internal.processors.rest.request.GridRestCacheRequest; import org.apache.ignite.internal.processors.rest.request.GridRestChangeStateRequest; import org.apache.ignite.internal.processors.rest.request.GridRestClusterNameRequest; -import org.apache.ignite.internal.processors.rest.request.GridRestLogRequest; import org.apache.ignite.internal.processors.rest.request.GridRestClusterStateRequest; +import org.apache.ignite.internal.processors.rest.request.GridRestLogRequest; import org.apache.ignite.internal.processors.rest.request.GridRestRequest; import org.apache.ignite.internal.processors.rest.request.GridRestTaskRequest; import org.apache.ignite.internal.processors.rest.request.GridRestTopologyRequest; @@ -219,20 +219,13 @@ public class GridJettyRestHandler extends AbstractHandler { * @param params Parameters map. * @param dfltVal Default value. * @return Boolean value from parameters map or {@code dfltVal} if null or not exists. - * @throws IgniteCheckedException If parsing failed. */ - private static boolean boolValue(String key, Map params, boolean dfltVal) - throws IgniteCheckedException { + private static boolean booleanValue(String key, Map params, boolean dfltVal) { assert key != null; String val = (String)params.get(key); - try { - return val == null ? dfltVal : Boolean.parseBoolean(val); - } - catch (NumberFormatException ignore) { - throw new IgniteCheckedException(format(FAILED_TO_PARSE_FORMAT, "Boolean", key, val)); - } + return val == null ? dfltVal : Boolean.parseBoolean(val); } /** @@ -813,7 +806,7 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) else restReq0.active(false); - restReq0.force(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq0.force(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); restReq = restReq0; @@ -831,7 +824,7 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) restReq0.state(newState); - restReq0.force(boolValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq0.force(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); } restReq = restReq0; From 4c71889614811ad7fda17e2455ad41129224dd6b Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Mon, 2 Mar 2020 18:34:35 +0300 Subject: [PATCH 48/82] IGNITE-12701 : fixes after review. --- modules/core/src/main/java/org/apache/ignite/Ignite.java | 2 +- .../core/src/main/java/org/apache/ignite/IgniteCluster.java | 4 ++-- .../src/main/java/org/apache/ignite/cluster/ClusterState.java | 2 +- .../apache/ignite/internal/client/GridClientClusterState.java | 2 +- .../internal/client/impl/connection/GridClientConnection.java | 2 +- .../src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 0626c5d26aaec..be96209f8af6f 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -666,7 +666,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig * Changes Ignite grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index b17ac9408b439..8ee46179dbbf2 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -457,7 +457,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. @@ -478,7 +478,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index e710c3479d960..1d45d2ec4192a 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -27,7 +27,7 @@ public enum ClusterState { * Cluster deactivated. Cache operations aren't allowed. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. */ INACTIVE, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index e0bb4c92cc475..fc38bae0069c6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -64,7 +64,7 @@ public interface GridClientClusterState { * is {@code False}. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index b2484a4ace78e..6560507f89e58 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -313,7 +313,7 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param state New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index e71b6145440db..8cf6ba8f46ca8 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -385,7 +385,7 @@ public boolean pingNode( * Changes grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param active Activate/DeActivate flag. @@ -666,7 +666,7 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * After cluster deactivation all data from in-memory cache will be lost. + * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. * @see ClusterState#INACTIVE * * @param state String representation of new cluster state. From e4bef99689e162ca5c12963176495fc0993f5777 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Mar 2020 19:16:58 +0300 Subject: [PATCH 49/82] IGNITE-12701 : fixes after review 2. --- .../src/main/java/org/apache/ignite/Ignite.java | 2 +- .../java/org/apache/ignite/IgniteCluster.java | 4 ++-- .../org/apache/ignite/cluster/ClusterState.java | 2 +- .../internal/client/GridClientClusterState.java | 16 ++-------------- .../client/impl/GridClientClusterStateImpl.java | 7 +------ .../impl/connection/GridClientConnection.java | 2 +- .../org/apache/ignite/mxbean/IgniteMXBean.java | 4 ++-- .../ClusterStateThinClientAbstractTest.java | 2 +- 8 files changed, 11 insertions(+), 28 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index be96209f8af6f..1528b2a2dc7dd 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -666,7 +666,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig * Changes Ignite grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 8ee46179dbbf2..8b5fbe63c4393 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -457,7 +457,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. @@ -478,7 +478,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index 1d45d2ec4192a..4af1da7fc6df6 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -27,7 +27,7 @@ public enum ClusterState { * Cluster deactivated. Cache operations aren't allowed. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. */ INACTIVE, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index fc38bae0069c6..054ab10ff16c9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -36,7 +36,7 @@ public interface GridClientClusterState { /** * @return {@code Boolean} - Current cluster state. {@code True} active, {@code False} inactive. - * @deprecated Use {@link #state(ClusterState)} instead. + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated public boolean active() throws GridClientException; @@ -47,24 +47,12 @@ public interface GridClientClusterState { */ public ClusterState state() throws GridClientException; - /** - * Changes cluster state to {@code newState}. - * Fails if the operation is not safe. - * @see ClusterState#INACTIVE - * - * @param newState New cluster state. - * @throws GridClientException If the request to change the cluster state failed. - * @deprecated Use {@link #state(ClusterState, boolean)} instead. - */ - @Deprecated - public void state(ClusterState newState) throws GridClientException; - /** * Changes cluster state to {@code newState}. Fails if the operation is not safe and {@code force} * is {@code False}. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param newState New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 06d22fadbc59f..d4e8197ac6c63 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -56,7 +56,7 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void active(final boolean active) throws GridClientException { - state(active ? ACTIVE : INACTIVE); + state(active ? ACTIVE : INACTIVE, true); } /** {@inheritDoc} */ @@ -69,11 +69,6 @@ public GridClientClusterStateImpl( return withReconnectHandling(GridClientConnection::state).get(); } - /** {@inheritDoc} */ - @Override public void state(ClusterState newState) throws GridClientException { - state(newState, true); - } - /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean force) throws GridClientException { // When 'force' is false, check compapability of new forced deactivation on all nodes. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 6560507f89e58..2c59e6719630e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -313,7 +313,7 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param state New cluster state. diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index 8cf6ba8f46ca8..fbc71258df340 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -385,7 +385,7 @@ public boolean pingNode( * Changes grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param active Activate/DeActivate flag. @@ -666,7 +666,7 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * After cluster deactivation all data from in-memory cache (including the system cache) will be lost. + * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. * @see ClusterState#INACTIVE * * @param state String representation of new cluster state. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java index 56e4ab22418db..49d8fcc8033f0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ClusterStateThinClientAbstractTest.java @@ -71,7 +71,7 @@ public abstract class ClusterStateThinClientAbstractTest extends ClusterStateAbs /** {@inheritDoc} */ @Override protected void changeState(ClusterState state) { try { - gridClient.state().state(state); + gridClient.state().state(state, true); } catch (GridClientException e) { throw new RuntimeException("Can't change state to " + state, e); From dead070be2947865ce134cfaecc26193fd0d7d8a Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Mon, 2 Mar 2020 20:27:24 +0300 Subject: [PATCH 50/82] IGNITE-12701 : fixes after review 3. --- .../java/org/apache/ignite/IgniteCluster.java | 2 +- .../impl/GridClientClusterStateImpl.java | 18 +++---- .../internal/cluster/IgniteClusterImpl.java | 12 +++-- .../cluster/GridClusterStateProcessor.java | 52 ++----------------- .../cluster/IGridClusterStateProcessor.java | 34 ++---------- .../GridChangeClusterStateCommandHandler.java | 2 +- .../GridChangeStateCommandHandler.java | 2 +- .../apache/ignite/mxbean/IgniteMXBean.java | 2 +- 8 files changed, 29 insertions(+), 95 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 8b5fbe63c4393..1f55bd5df8031 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -454,7 +454,7 @@ public IgniteFuture> startNodesAsync(Collecti public boolean active(); /** - * Changes grid state to active or inactive. + * Changes Ignite grid state to active or inactive. *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index d4e8197ac6c63..b942d4bd9364e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -71,19 +71,19 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean force) throws GridClientException { - // When 'force' is false, check compapability of new forced deactivation on all nodes. - UUID oldVerNode = force ? null : checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, + // Check compapability of new forced deactivation on all nodes. + UUID oldVerNode = checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, false, false); - if (oldVerNode != null) { - throw new GridClientException("Unable to change state of cluster on \"" - + newState.name() + "\". Found a node not supporting safe deactivation: " - + oldVerNode + ". It can cause no checking of deactivation safety " - + "will be performed. You can try with the flag 'force' Be aware that deactivation erases in-memory" - + " data."); + if (oldVerNode != null && !force) { + throw new GridClientException("Unable to change state of cluster on \"" + newState.name() + "\". " + + "Found a node not supporting safe deactivation: " + oldVerNode + ". It causes no checking of " + + "deactivation safety will be performed. You can try with the flag 'force'. After cluster " + + "deactivation all data from every in-memory cache (including the system caches) will be lost."); } - withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, force ? null : false)).get(); + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, oldVerNode != null ? null : force)) + .get(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 7fc666a2131f5..46b6754f0cc40 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -73,6 +73,8 @@ import org.apache.ignite.lang.IgniteProductVersion; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.cluster.ClusterState.ACTIVE; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; @@ -312,7 +314,8 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(active, serverNodes(), false).get(); + ctx.state().changeGlobalState(active ? ACTIVE : INACTIVE, true, serverNodes(), + false, false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -339,7 +342,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(newState, serverNodes(), false).get(); + ctx.state().changeGlobalState(newState, true, serverNodes(), false, false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -375,7 +378,7 @@ private Collection serverNodes() { try { validateBeforeBaselineChange(baselineTop); - ctx.state().changeGlobalState(true, baselineTop, true).get(); + ctx.state().changeGlobalState(ACTIVE, true, baselineTop, true, false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -526,7 +529,8 @@ private void setBaselineTopology(long topVer, boolean isBaselineAutoAdjust) { validateBeforeBaselineChange(target); - ctx.state().changeGlobalState(true, target, true, isBaselineAutoAdjust).get(); + ctx.state().changeGlobalState(ACTIVE, true, target, true, + isBaselineAutoAdjust).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); 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 8dd44f658561a..f1de611755c07 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 @@ -471,7 +471,8 @@ else if (stateOnStart == null) && !inMemoryMode && isBaselineSatisfied(state.baselineTopology(), discoCache.serverNodes()) ) - changeGlobalState(targetState, state.baselineTopology().currentBaseline(), false); + changeGlobalState(targetState, true, state.baselineTopology().currentBaseline(), + false, false); } return null; @@ -942,53 +943,8 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, } } - /** {@inheritDoc} */ - @Override public IgniteInternalFuture changeGlobalState( - final boolean activate, - Collection baselineNodes, - boolean forceChangeBaselineTopology - ) { - return changeGlobalState(activate, baselineNodes, forceChangeBaselineTopology, false); - } - /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( - ClusterState state, - boolean force, - Collection baselineNodes, - boolean forceChangeBaselineTopology - ) { - return changeGlobalState(state, force, baselineNodes, forceChangeBaselineTopology, false); - } - - /** - * @param activate New activate state. - * @param baselineNodes New BLT nodes. - * @param forceChangeBaselineTopology Force change BLT. - * @param isAutoAdjust Auto adjusting flag. - * @return Global change state future. - * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean, boolean)} instead. - */ - @Deprecated - public IgniteInternalFuture changeGlobalState( - final boolean activate, - Collection baselineNodes, - boolean forceChangeBaselineTopology, - boolean isAutoAdjust - ) { - return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, - isAutoAdjust); - } - - /** - * @param state New activate state. - * @param force If {@code True}, skips checking of the operation safety. - * @param baselineNodes New BLT nodes. - * @param forceChangeBaselineTopology Force change BLT. - * @param isAutoAdjust Auto adjusting flag. - * @return Global change state future. - */ - public IgniteInternalFuture changeGlobalState( ClusterState state, boolean force, Collection baselineNodes, @@ -2034,8 +1990,10 @@ private ClientSetGlobalStateComputeRequest( try { ig.context().state().changeGlobalState( state, + true, baselineTopology != null ? baselineTopology.currentBaseline() : null, - forceChangeBaselineTopology + forceChangeBaselineTopology, + false ).get(); } catch (IgniteCheckedException ex) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index 893e6328c15de..3262310bfd01f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -108,48 +108,20 @@ boolean onStateChangeMessage(AffinityTopologyVersion topVer, /** */ void cacheProcessorStarted(); - /** - * @param activate New cluster state. - * @param baselineNodes New baseline nodes. - * @param forceChangeBaselineTopology Force change baseline topology. - * @return State change future. - * @deprecated Use {@link #changeGlobalState(ClusterState, Collection, boolean)} instead. - */ - @Deprecated - IgniteInternalFuture changeGlobalState( - boolean activate, - Collection baselineNodes, - boolean forceChangeBaselineTopology - ); - - /** - * @param state New cluster state. - * @param baselineNodes New baseline nodes. - * @param forceChangeBaselineTopology Force change baseline topology. - * @return State change future. - * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean)} - */ - @Deprecated - default IgniteInternalFuture changeGlobalState( - ClusterState state, - Collection baselineNodes, - boolean forceChangeBaselineTopology - ) { - return changeGlobalState(state, true, baselineNodes, forceChangeBaselineTopology); - } - /** * @param state New cluster state. * @param force If {@code True} skips checking of the operation safety. * @param baselineNodes New baseline nodes. * @param forceChangeBaselineTopology Force change baseline topology. + * @param isAutoAdjust Auto adjusting flag. * @return State change future. */ IgniteInternalFuture changeGlobalState( ClusterState state, boolean force, Collection baselineNodes, - boolean forceChangeBaselineTopology + boolean forceChangeBaselineTopology, + boolean isAutoAdjust ); /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index 02d7d5198df5d..d85fea649b06a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -74,7 +74,7 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { " state from client node with ID: " + req.clientId()); ctx.state().changeGlobalState(req.state(), req.force(), ctx.cluster().get().forServers().nodes(), - false).get(); + false, false).get(); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index f01df213685a9..d5164755e761b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -76,7 +76,7 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { log.warning(req.command().key() + " is deprecated. Use newer commands."); default: ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.force(), - ctx.cluster().get().forServers().nodes(), false).get(); + ctx.cluster().get().forServers().nodes(), false, false).get(); res.setResponse(req.command().key() + " started"); break; diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index fbc71258df340..d0ab2617c84da 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -382,7 +382,7 @@ public boolean pingNode( ); /** - * Changes grid state to active or inactive. + * Changes Ignite grid state to active or inactive. *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. From af9505557b23cc45691da2dcb16b28ef0ab0d550 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 4 Mar 2020 10:51:38 +0300 Subject: [PATCH 51/82] Minor javadoc update. --- .../apache/ignite/internal/client/GridClientClusterState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 054ab10ff16c9..98c9806762eb8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -53,11 +53,11 @@ public interface GridClientClusterState { *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE * * @param newState New cluster state. * @param force New cluster state. * @throws GridClientException If the request to change the cluster state failed. + * @see ClusterState#INACTIVE */ public void state(ClusterState newState, boolean force) throws GridClientException; From 5b916b4f57e9798714c7f045e89af5a6dd1ec0f2 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 4 Mar 2020 10:52:06 +0300 Subject: [PATCH 52/82] Update GridClientClusterState.java --- .../apache/ignite/internal/client/GridClientClusterState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 98c9806762eb8..38a89a585482e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -26,10 +26,10 @@ public interface GridClientClusterState { /** * Changes Ignite grid state to active or inactive. * Fails if the operation is not safe. - * @see ClusterState#INACTIVE * * @param active {@code True} activate, {@code False} deactivate. * @deprecated Use {@link #state(ClusterState, boolean)} instead. + * @see ClusterState#INACTIVE */ @Deprecated public void active(boolean active) throws GridClientException; From 4cfa09cb64b4432b29ed82f1362fc22169ef15b1 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 4 Mar 2020 10:52:35 +0300 Subject: [PATCH 53/82] Update GridClientClusterState.java --- .../apache/ignite/internal/client/GridClientClusterState.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 38a89a585482e..71a5a75f2e060 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -28,8 +28,8 @@ public interface GridClientClusterState { * Fails if the operation is not safe. * * @param active {@code True} activate, {@code False} deactivate. - * @deprecated Use {@link #state(ClusterState, boolean)} instead. * @see ClusterState#INACTIVE + * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated public void active(boolean active) throws GridClientException; From 71eaa948138f9862b5f66d164462eb81d67ba3b3 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 4 Mar 2020 10:54:04 +0300 Subject: [PATCH 54/82] Update IgniteCluster.java --- .../core/src/main/java/org/apache/ignite/IgniteCluster.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index 1f55bd5df8031..b1bcb8d05493b 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -458,10 +458,10 @@ public IgniteFuture> startNodesAsync(Collecti *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. + * @see ClusterState#INACTIVE * @deprecated Use {@link #state(ClusterState)} instead. */ @Deprecated @@ -479,9 +479,9 @@ public IgniteFuture> startNodesAsync(Collecti *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE * * @param newState New cluster state. + * @see ClusterState#INACTIVE * @throws IgniteException If there is an already started transaction or lock in the same thread. */ public void state(ClusterState newState) throws IgniteException; From fe02d6fd61593375085ae1b2d1f812127cef3569 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Wed, 4 Mar 2020 10:55:43 +0300 Subject: [PATCH 55/82] Update GridClientConnection.java --- .../internal/client/impl/connection/GridClientConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 2c59e6719630e..7f618efe75785 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -314,7 +314,6 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE * * @param state New cluster state. * @param destNodeId Destination node id. @@ -323,6 +322,7 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * If {@code True} then skips checking of operation safety. * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. + * @see ClusterState#INACTIVE */ public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, @Nullable Boolean force) throws GridClientClosedException, GridClientConnectionResetException; From f273dd65e980a7361507f37f0114b781733aea72 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 14:22:14 +0300 Subject: [PATCH 56/82] IGNITE-12701 : fixes after review 4. --- .../main/java/org/apache/ignite/Ignite.java | 2 +- .../java/org/apache/ignite/IgniteCluster.java | 4 ++-- .../ignite/internal/IgniteFeatures.java | 2 +- .../client/GridClientClusterState.java | 8 +++---- .../impl/GridClientClusterStateImpl.java | 20 ++++++++--------- .../internal/cluster/IgniteClusterImpl.java | 6 ++--- .../ClusterStateChangeCommand.java | 10 ++++----- .../commandline/DeactivateCommand.java | 10 ++++----- .../cluster/ChangeGlobalStateMessage.java | 14 ++++++------ .../cluster/GridClusterStateProcessor.java | 22 +++++++++---------- .../cluster/IGridClusterStateProcessor.java | 4 ++-- .../GridClientClusterStateRequest.java | 2 +- .../GridClientClusterStateRequestV2.java | 22 +++++++++---------- .../GridChangeClusterStateCommandHandler.java | 4 ++-- .../GridChangeStateCommandHandler.java | 2 +- .../protocols/tcp/GridTcpRestNioListener.java | 8 +++---- .../request/GridRestChangeStateRequest.java | 16 +++++++------- .../request/GridRestClusterStateRequest.java | 16 +++++++------- .../http/jetty/GridJettyRestHandler.java | 4 ++-- 19 files changed, 85 insertions(+), 91 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 1528b2a2dc7dd..76e9ae6c3571e 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -667,7 +667,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE + * See {@link ClusterState#INACTIVE} * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index b1bcb8d05493b..f3a2761c5c559 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -458,10 +458,10 @@ public IgniteFuture> startNodesAsync(Collecti *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. + * See {@link ClusterState#INACTIVE} * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. - * @see ClusterState#INACTIVE * @deprecated Use {@link #state(ClusterState)} instead. */ @Deprecated @@ -479,9 +479,9 @@ public IgniteFuture> startNodesAsync(Collecti *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. + * See {@link ClusterState#INACTIVE} * * @param newState New cluster state. - * @see ClusterState#INACTIVE * @throws IgniteException If there is an already started transaction or lock in the same thread. */ public void state(ClusterState newState) throws IgniteException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java index 5dca6eca6dfe0..8989b7101cd88 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java @@ -88,7 +88,7 @@ public enum IgniteFeatures { CONT_QRY_SECURITY_AWARE(21), /** Preventing loss of in-memory data when deactivating the cluster. */ - FORCED_CHANGE_OF_CLUSTER_STATE(22), + SAFE_CLUSTER_DEACTIVATION(22), /** Long operations dump timeout. */ LONG_OPERATIONS_DUMP_TIMEOUT(30); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 71a5a75f2e060..5e4cd29716531 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -26,9 +26,9 @@ public interface GridClientClusterState { /** * Changes Ignite grid state to active or inactive. * Fails if the operation is not safe. + * @see ClusterState#INACTIVE * * @param active {@code True} activate, {@code False} deactivate. - * @see ClusterState#INACTIVE * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated @@ -53,13 +53,13 @@ public interface GridClientClusterState { *

* NOTE: * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. + * See {@link ClusterState#INACTIVE} * * @param newState New cluster state. - * @param force New cluster state. + * @param forceDeactivation If {@code True}, skips safety of deactivation. * @throws GridClientException If the request to change the cluster state failed. - * @see ClusterState#INACTIVE */ - public void state(ClusterState newState, boolean force) throws GridClientException; + public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException; /** * Get the cluster name. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index b942d4bd9364e..355c31e40da2e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.UUID; import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.internal.IgniteFeatures; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; @@ -29,7 +30,6 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE; import static org.apache.ignite.cluster.ClusterState.INACTIVE; -import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; import static org.apache.ignite.internal.client.util.GridClientUtils.checkFeatureSupportedByCluster; /** @@ -70,20 +70,18 @@ public GridClientClusterStateImpl( } /** {@inheritDoc} */ - @Override public void state(ClusterState newState, boolean force) throws GridClientException { + @Override public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException { // Check compapability of new forced deactivation on all nodes. - UUID oldVerNode = checkFeatureSupportedByCluster(client, FORCED_CHANGE_OF_CLUSTER_STATE, - false, false); + UUID oldVerNode = checkFeatureSupportedByCluster(client, IgniteFeatures.SAFE_CLUSTER_DEACTIVATION, false, false); - if (oldVerNode != null && !force) { - throw new GridClientException("Unable to change state of cluster on \"" + newState.name() + "\". " + - "Found a node not supporting safe deactivation: " + oldVerNode + ". It causes no checking of " + - "deactivation safety will be performed. You can try with the flag 'force'. After cluster " + - "deactivation all data from every in-memory cache (including the system caches) will be lost."); + if (newState == INACTIVE && oldVerNode != null && !forceDeactivation) { + throw new GridClientException("Deactivation stopped. Found node not supporting safe deactivation: " + + oldVerNode + ". It causes no checking of deactivation safety will be performed. You can try with " + + "flag 'force'. After deactivation very in-memory cache (including system caches) will be cleared!"); } - withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, oldVerNode != null ? null : force)) - .get(); + withReconnectHandling((con, nodeId) -> + con.changeState(newState, nodeId, oldVerNode != null ? null : forceDeactivation)).get(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 46b6754f0cc40..20bea406ee167 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -314,8 +314,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(active ? ACTIVE : INACTIVE, true, serverNodes(), - false, false).get(); + ctx.state().changeGlobalState(active ? ACTIVE : INACTIVE, true, serverNodes(), false, false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -529,8 +528,7 @@ private void setBaselineTopology(long topVer, boolean isBaselineAutoAdjust) { validateBeforeBaselineChange(target); - ctx.state().changeGlobalState(ACTIVE, true, target, true, - isBaselineAutoAdjust).get(); + ctx.state().changeGlobalState(ACTIVE, true, target, true, isBaselineAutoAdjust).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index b0c9f0377834a..b8196bca6d92b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -25,8 +25,8 @@ import org.apache.ignite.internal.client.GridClientConfiguration; import static org.apache.ignite.cluster.ClusterState.ACTIVE; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY; +import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; @@ -46,7 +46,7 @@ public class ClusterStateChangeCommand implements Command { private String clusterName; /** Force cluster deactivation even it might have in-memory caches. */ - private boolean force; + private boolean forceDeactivation; /** {@inheritDoc} */ @Override public void printUsage(Logger log) { @@ -75,7 +75,7 @@ public class ClusterStateChangeCommand implements Command { /** {@inheritDoc} */ @Override public Object execute(GridClientConfiguration clientCfg, Logger log) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { - client.state().state(state, force); + client.state().state(state, forceDeactivation); log.info("Cluster state changed to " + state); @@ -99,13 +99,13 @@ public class ClusterStateChangeCommand implements Command { throw new IllegalArgumentException("Can't parse new cluster state. State: " + s, e); } - force = false; + forceDeactivation = false; if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); if (FORCE_COMMAND.equalsIgnoreCase(arg)) { - force = true; + forceDeactivation = true; argIter.nextArg(""); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 5f7a9a7a6fde1..aac6581708007 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -22,11 +22,11 @@ import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; +import static org.apache.ignite.internal.commandline.ClusterStateChangeCommand.FORCE_COMMAND; import static org.apache.ignite.internal.commandline.CommandList.DEACTIVATE; import static org.apache.ignite.internal.commandline.CommandList.SET_STATE; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; -import static org.apache.ignite.internal.commandline.ClusterStateChangeCommand.FORCE_COMMAND; /** * Command to deactivate cluster. @@ -38,7 +38,7 @@ public class DeactivateCommand implements Command { private String clusterName; /** Force cluster deactivation even it might have in-memory caches. */ - private boolean force; + private boolean forceDeactivation; /** {@inheritDoc} */ @Override public void printUsage(Logger logger) { @@ -68,7 +68,7 @@ public class DeactivateCommand implements Command { logger.warning("Command deprecated. Use " + SET_STATE.toString() + " instead."); try (GridClient client = Command.startClient(clientCfg)) { - client.state().state(ClusterState.INACTIVE, force); + client.state().state(ClusterState.INACTIVE, forceDeactivation); logger.info("Cluster deactivated"); } @@ -83,13 +83,13 @@ public class DeactivateCommand implements Command { /** {@inheritDoc} */ @Override public void parseArguments(CommandArgIterator argIter) { - force = false; + forceDeactivation = false; if (argIter.hasNextArg()) { String arg = argIter.peekNextArg(); if (FORCE_COMMAND.equalsIgnoreCase(arg)) { - force = true; + forceDeactivation = true; argIter.nextArg(""); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index bdf1e7a37afa9..c61cd98693263 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -71,8 +71,8 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage { @GridToStringExclude @Nullable private transient ServiceDeploymentActions serviceDeploymentActions; - /** Forced change of cluster state. */ - private boolean force = true; + /** Forced deactivation. */ + private boolean forceDeactivation = true; /** * @param reqId State change request ID. @@ -208,15 +208,15 @@ public boolean forceChangeBaselineTopology() { } /** - * @return Whether state changing must not check safety of this operation. + * @return Whether deactivation must not check safety of this operation. */ - boolean force() { - return force; + boolean forceDeactivation() { + return forceDeactivation; } /** */ - void force(boolean force) { - this.force = force; + void force(boolean forceDeactivation) { + this.forceDeactivation = forceDeactivation; } /** 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 f1de611755c07..2f345f06c8b20 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 @@ -105,7 +105,7 @@ import static org.apache.ignite.events.EventType.EVT_NODE_LEFT; import static org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.STATE_PROC; import static org.apache.ignite.internal.IgniteFeatures.CLUSTER_READ_ONLY_MODE; -import static org.apache.ignite.internal.IgniteFeatures.FORCED_CHANGE_OF_CLUSTER_STATE; +import static org.apache.ignite.internal.IgniteFeatures.SAFE_CLUSTER_DEACTIVATION; import static org.apache.ignite.internal.IgniteFeatures.allNodesSupports; import static org.apache.ignite.internal.managers.communication.GridIoPolicy.SYSTEM_POOL; import static org.apache.ignite.internal.processors.cache.GridCacheUtils.extractDataStorage; @@ -119,9 +119,8 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; /** Warning of unsafe deactivation. */ - public static final String DATA_LOST_ON_DEACTIVATION_WARNING = - "Cluster has caches configured without persistence. " + - "During deactivation in-memory data and objects can be lost!"; + public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Deactivation stopped. Cluster has in-memory caches " + + "(without persistence). During deactivation, in-memory data will be lost!"; /** */ private boolean inMemoryMode; @@ -471,8 +470,7 @@ else if (stateOnStart == null) && !inMemoryMode && isBaselineSatisfied(state.baselineTopology(), discoCache.serverNodes()) ) - changeGlobalState(targetState, true, state.baselineTopology().currentBaseline(), - false, false); + changeGlobalState(targetState, true, state.baselineTopology().currentBaseline(), false, false); } return null; @@ -631,8 +629,8 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { - if (msg.state() == INACTIVE && !msg.force() && !isDeactivationSafe() && - allNodesSupports(ctx.discovery().serverNodes(topVer), FORCED_CHANGE_OF_CLUSTER_STATE)) { + if (msg.state() == INACTIVE && !msg.forceDeactivation() && !isDeactivationSafe() && + allNodesSupports(ctx.discovery().serverNodes(topVer), SAFE_CLUSTER_DEACTIVATION)) { GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); if (stateFut != null) { @@ -946,7 +944,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( ClusterState state, - boolean force, + boolean forceDeactivation, Collection baselineNodes, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -955,7 +953,7 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, null : calculateNewBaselineTopology(state, baselineNodes, forceChangeBaselineTopology); - return changeGlobalState0(state, force, newBlt, forceChangeBaselineTopology, isAutoAdjust); + return changeGlobalState0(state, forceDeactivation, newBlt, forceChangeBaselineTopology, isAutoAdjust); } /** */ @@ -1025,7 +1023,7 @@ private Collection baselineNodes() { /** */ private IgniteInternalFuture changeGlobalState0( ClusterState state, - boolean force, + boolean forceDeactivation, BaselineTopology blt, boolean forceChangeBaselineTopology, boolean isAutoAdjust @@ -1121,7 +1119,7 @@ private IgniteInternalFuture changeGlobalState0( System.currentTimeMillis() ); - msg.force(force); + msg.force(forceDeactivation); IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index 3262310bfd01f..7ae1bb9f5f317 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -110,7 +110,7 @@ boolean onStateChangeMessage(AffinityTopologyVersion topVer, /** * @param state New cluster state. - * @param force If {@code True} skips checking of the operation safety. + * @param forceDeactivation If {@code True}, skips checking of the deactivation safety. * @param baselineNodes New baseline nodes. * @param forceChangeBaselineTopology Force change baseline topology. * @param isAutoAdjust Auto adjusting flag. @@ -118,7 +118,7 @@ boolean onStateChangeMessage(AffinityTopologyVersion topVer, */ IgniteInternalFuture changeGlobalState( ClusterState state, - boolean force, + boolean forceDeactivation, Collection baselineNodes, boolean forceChangeBaselineTopology, boolean isAutoAdjust diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 84442a85f6760..8f5993c04a1ef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -70,7 +70,7 @@ public static GridClientClusterStateRequest state(ClusterState state) { return msg; } - /** Default constructor for the exernalization. */ + /** Default constructor for the externalization. */ public GridClientClusterStateRequest() { // No op. } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 551ee3c3b9763..119c00f23497b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -31,8 +31,8 @@ public class GridClientClusterStateRequestV2 extends GridClientClusterStateReque /** */ private static final long serialVersionUID = 0L; - /** Forced change of cluster state. */ - private boolean force; + /** If {@code True}, cluster deactivation will be forced. */ + private boolean forceDeactivation; /** * @param state New cluster state. @@ -43,7 +43,7 @@ public static GridClientClusterStateRequestV2 state(ClusterState state, boolean return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), force); } - /** Default constructor for the exernalization. */ + /** Default constructor for the externalization. */ public GridClientClusterStateRequestV2() { // No op. } @@ -52,32 +52,32 @@ public GridClientClusterStateRequestV2() { * Copying constructor. * * @param clusterStateReq Original request, of the previous version. - * @param force If {@code True}, indicates to skip checking of state change safety. + * @param forceDeactivation If {@code True}, indicates to skip checking of deactivation safety. */ - private GridClientClusterStateRequestV2(GridClientClusterStateRequest clusterStateReq, boolean force) { + private GridClientClusterStateRequestV2(GridClientClusterStateRequest clusterStateReq, boolean forceDeactivation) { super(clusterStateReq); - this.force = force; + this.forceDeactivation = forceDeactivation; } /** - * @return {@code True} if there is no need to check if state change is safe. + * @return {@code True} if there is no need to ensure deactivation is safe. */ - public boolean force() { - return force; + public boolean forceDeactivation() { + return forceDeactivation; } /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); - out.writeBoolean(force); + out.writeBoolean(forceDeactivation); } /** {@inheritDoc} */ @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); - force = in.readBoolean(); + forceDeactivation = in.readBoolean(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java index d85fea649b06a..eb38477153dd8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeClusterStateCommandHandler.java @@ -73,8 +73,8 @@ public GridChangeClusterStateCommandHandler(GridKernalContext ctx) { U.log(log, "Received cluster state change request to " + req.state() + " state from client node with ID: " + req.clientId()); - ctx.state().changeGlobalState(req.state(), req.force(), ctx.cluster().get().forServers().nodes(), - false, false).get(); + ctx.state().changeGlobalState(req.state(), req.forceDeactivation(), + ctx.cluster().get().forServers().nodes(), false, false).get(); res.setResponse(req.command().key() + " done"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java index d5164755e761b..d766ff737acdf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java @@ -75,7 +75,7 @@ public GridChangeStateCommandHandler(GridKernalContext ctx) { case CLUSTER_INACTIVE: log.warning(req.command().key() + " is deprecated. Use newer commands."); default: - ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.force(), + ctx.state().changeGlobalState(req.active() ? ACTIVE : INACTIVE, req.forceDeactivation(), ctx.cluster().get().forServers().nodes(), false, false).get(); res.setResponse(req.command().key() + " started"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java index 88423fda8dadc..6ad9431fd25d6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/protocols/tcp/GridTcpRestNioListener.java @@ -37,8 +37,8 @@ import org.apache.ignite.internal.processors.rest.client.message.GridClientAuthenticationRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientCacheRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterNameRequest; -import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequest; +import org.apache.ignite.internal.processors.rest.client.message.GridClientClusterStateRequestV2; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeRequest; import org.apache.ignite.internal.processors.rest.client.message.GridClientHandshakeResponse; import org.apache.ignite.internal.processors.rest.client.message.GridClientMessage; @@ -390,8 +390,8 @@ else if (msg instanceof GridClientStateRequest) { else if (msg instanceof GridClientClusterStateRequest) { GridClientClusterStateRequest req = (GridClientClusterStateRequest)msg; - boolean force = !(msg instanceof GridClientClusterStateRequestV2) || - ((GridClientClusterStateRequestV2)msg).force(); + boolean forceDeactivation = !(msg instanceof GridClientClusterStateRequestV2) || + ((GridClientClusterStateRequestV2)msg).forceDeactivation(); GridRestClusterStateRequest restChangeReq = new GridRestClusterStateRequest(); @@ -403,7 +403,7 @@ else if (msg instanceof GridClientClusterStateRequest) { restChangeReq.state(req.state()); restChangeReq.command(CLUSTER_SET_STATE); - restChangeReq.force(force); + restChangeReq.forceDeactivation(forceDeactivation); } restReq = restChangeReq; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index 454aa1033d862..a04c9632d2682 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -27,8 +27,8 @@ public class GridRestChangeStateRequest extends GridRestRequest { /** Request current state. */ private boolean reqCurrentState; - /** Forced chage state without checking of operation safety. */ - private boolean force; + /** Forced deactivation, without checking of operation safety. */ + private boolean forceDeactivation; /** * @@ -61,16 +61,16 @@ public void reqCurrentState() { /** * Sets forced state change witout checking of operation safety. * - * @param force If {@code True}, indicates to skip checking of state change safety. + * @param forceDeactivation If {@code True}, indicates not to ensure deactivation is safe. */ - public void force(boolean force) { - this.force = force; + public void forceDeactivation(boolean forceDeactivation) { + this.forceDeactivation = forceDeactivation; } /** - * @return {@code True} if there is no need to check if state change is safe. + * @return {@code True} if there is no need to ensure deactivation is safe. */ - public boolean force() { - return force; + public boolean forceDeactivation() { + return forceDeactivation; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index d0f9cb4f89033..4bfaa137c8d93 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -32,16 +32,16 @@ public class GridRestClusterStateRequest extends GridRestRequest { /** New state. */ private ClusterState state; - /** Forced change of the state. */ - private boolean force; + /** Forced deactivation. */ + private boolean forceDeactivation; /** * Sets forced state change witout checking of operation safety. * - * @param force If {@code True}, indicates to skip checking of state change safety. + * @param forceDeactivation If {@code True}, indicates not to ensure deactivation is safe. */ - public void force(boolean force) { - this.force = force; + public void forceDeactivation(boolean forceDeactivation) { + this.forceDeactivation = forceDeactivation; } /** */ @@ -55,10 +55,10 @@ public boolean isReqCurrentMode() { } /** - * @return {@code True} if there is no need to check if state change is safe. + * @return {@code True} if there is no need to ensure deactivation is safe. */ - public boolean force() { - return force; + public boolean forceDeactivation() { + return forceDeactivation; } /** */ diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index 7fae06c40b6b4..20ada42089031 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -806,7 +806,7 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) else restReq0.active(false); - restReq0.force(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq0.forceDeactivation(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); restReq = restReq0; @@ -824,7 +824,7 @@ else if (cmd == CLUSTER_ACTIVE || cmd == CLUSTER_ACTIVATE) restReq0.state(newState); - restReq0.force(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); + restReq0.forceDeactivation(booleanValue(GridRestClusterStateRequest.ARG_FORCE, params, false)); } restReq = restReq0; From ef2ab3b1da544a493620869ea06ecf833a51a621 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 15:52:00 +0300 Subject: [PATCH 57/82] IGNITE-12701 : fixes after review 5 --- .../JettyRestProcessorAbstractSelfTest.java | 3 +-- .../main/java/org/apache/ignite/Ignite.java | 3 +-- .../java/org/apache/ignite/IgniteCluster.java | 6 ++---- .../apache/ignite/cluster/ClusterState.java | 2 +- .../client/GridClientClusterState.java | 14 +++++--------- .../impl/GridClientClusterStateImpl.java | 4 ++-- .../impl/connection/GridClientConnection.java | 19 +++++++++---------- .../GridClientNioTcpConnection.java | 6 +++--- .../ClusterStateChangeCommand.java | 2 +- .../commandline/DeactivateCommand.java | 2 +- .../cluster/ChangeGlobalStateMessage.java | 8 ++++++-- .../cluster/GridClusterStateProcessor.java | 6 +++--- .../GridClientClusterStateRequestV2.java | 6 +++--- .../request/GridRestChangeStateRequest.java | 2 +- .../request/GridRestClusterStateRequest.java | 4 ++-- 15 files changed, 41 insertions(+), 46 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index b5093f547b262..3c798044b3629 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -270,7 +270,6 @@ protected JsonNode validateJsonResponse(String content) throws IOException { */ protected JsonNode validateJsonResponse(String content, boolean errorExpected) throws IOException { assertNotNull(content); - assertFalse(content.isEmpty()); JsonNode node = JSON_MAPPER.readTree(content); @@ -3214,7 +3213,7 @@ private void assertClusterState(boolean exp) throws Exception { * Change cluster state and test new state. * * @param cmd Command. - * @param params Aruments for the cmd. + * @param params Aruments for the {@code cmd}. * @throws Exception If failed. */ private void changeClusterState(GridRestCommand cmd, String... params) throws Exception { diff --git a/modules/core/src/main/java/org/apache/ignite/Ignite.java b/modules/core/src/main/java/org/apache/ignite/Ignite.java index 76e9ae6c3571e..a307d232db1ec 100644 --- a/modules/core/src/main/java/org/apache/ignite/Ignite.java +++ b/modules/core/src/main/java/org/apache/ignite/Ignite.java @@ -666,8 +666,7 @@ public IgniteQueue queue(String name, int cap, @Nullable CollectionConfig * Changes Ignite grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * See {@link ClusterState#INACTIVE} + * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index f3a2761c5c559..dd464c716dde9 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -457,8 +457,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes Ignite grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * See {@link ClusterState#INACTIVE} + * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. @@ -478,8 +477,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * See {@link ClusterState#INACTIVE} + * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. * * @param newState New cluster state. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index 4af1da7fc6df6..f2ac028ddb6c4 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -27,7 +27,7 @@ public enum ClusterState { * Cluster deactivated. Cache operations aren't allowed. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. + * Deactivation clears in-memory caches (without persistense) including the system caches. */ INACTIVE, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 5e4cd29716531..c332be5d63d64 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -25,8 +25,7 @@ public interface GridClientClusterState { /** * Changes Ignite grid state to active or inactive. - * Fails if the operation is not safe. - * @see ClusterState#INACTIVE + * When deactivating, fails if deactivation is not safe. See {@link ClusterState#INACTIVE}. * * @param active {@code True} activate, {@code False} deactivate. * @deprecated Use {@link #state(ClusterState, boolean)} instead. @@ -48,15 +47,12 @@ public interface GridClientClusterState { public ClusterState state() throws GridClientException; /** - * Changes cluster state to {@code newState}. Fails if the operation is not safe and {@code force} - * is {@code False}. - *

- * NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * See {@link ClusterState#INACTIVE} + * Changes cluster state to {@code newState}. + * When deactivating, fails if deactivation is not safe and {@code forceDeactivation} is {@code False}. + * See {@link ClusterState#INACTIVE}. * * @param newState New cluster state. - * @param forceDeactivation If {@code True}, skips safety of deactivation. + * @param forceDeactivation If {@code True}, won't ensure deactivation is safe. * @throws GridClientException If the request to change the cluster state failed. */ public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 355c31e40da2e..30813ba61c809 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -76,8 +76,8 @@ public GridClientClusterStateImpl( if (newState == INACTIVE && oldVerNode != null && !forceDeactivation) { throw new GridClientException("Deactivation stopped. Found node not supporting safe deactivation: " - + oldVerNode + ". It causes no checking of deactivation safety will be performed. You can try with " + - "flag 'force'. After deactivation very in-memory cache (including system caches) will be cleared!"); + + oldVerNode + ". It causes deactivation safety won't be ensured. You can try with flag 'force'. " + + "Deactivation clears in-memory caches (without persistence) including the system caches!"); } withReconnectHandling((con, nodeId) -> diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 7f618efe75785..ab020d1494777 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -310,22 +310,21 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a boolean keepBinaries) throws GridClientConnectionResetException, GridClientClosedException; /** - * Changes grid global state. Fails if the operation is not safe and {@code force} is {@code False}. - *

- * NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. + * Changes grid global state. + * When deactivating, fails if deactivation is not safe and {@code forceDeactivation} is {@code False}. + * See {@link ClusterState#INACTIVE}. * * @param state New cluster state. * @param destNodeId Destination node id. - * @param force If not {@code null}, new version of state changing will be used. - * See {@link IgniteFeatures#FORCED_CHANGE_OF_CLUSTER_STATE}. - * If {@code True} then skips checking of operation safety. + * @param forceDeactivation If not {@code null}, executes new version of cluster state changing. + * See {@link IgniteFeatures#SAFE_CLUSTER_DEACTIVATION}. + * If {@code True} then skips checking of deactivation safety. + * * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. - * @see ClusterState#INACTIVE */ - public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, @Nullable Boolean force) - throws GridClientClosedException, GridClientConnectionResetException; + public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, + @Nullable Boolean forceDeactivation) throws GridClientClosedException, GridClientConnectionResetException; /** * Get current grid state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 0f56346661d4a..443d83cc97944 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -816,12 +816,12 @@ private GridClientAuthenticationRequest buildAuthRequest() { } /** {@inheritDoc} */ - @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId, Boolean force) + @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId, Boolean forceDeactivation) throws GridClientClosedException, GridClientConnectionResetException { assert state != null; - return makeRequest(force == null ? GridClientClusterStateRequest.state(state) - : GridClientClusterStateRequestV2.state(state, force), destNodeId); + return makeRequest(forceDeactivation == null ? GridClientClusterStateRequest.state(state) + : GridClientClusterStateRequestV2.state(state, forceDeactivation), destNodeId); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index b8196bca6d92b..4b2a4567578b5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -45,7 +45,7 @@ public class ClusterStateChangeCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation even it might have in-memory caches. */ + /** Force deactivation of cluster even if it has in-memory data. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index aac6581708007..0c4201544b42a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -37,7 +37,7 @@ public class DeactivateCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation even it might have in-memory caches. */ + /** Force deactivation of cluster even if it has in-memory caches. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index c61cd98693263..daede3d2091fe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -208,13 +208,17 @@ public boolean forceChangeBaselineTopology() { } /** - * @return Whether deactivation must not check safety of this operation. + * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. */ boolean forceDeactivation() { return forceDeactivation; } - /** */ + /** + * Sets forced cluster deactivation. + * + * @param forceDeactivation Flag of forced cluster deactivation. + */ void force(boolean forceDeactivation) { this.forceDeactivation = forceDeactivation; } 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 2f345f06c8b20..33fa5886b18aa 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 @@ -118,9 +118,9 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I /** */ private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; - /** Warning of unsafe deactivation. */ - public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Deactivation stopped. Cluster has in-memory caches " + - "(without persistence). During deactivation, in-memory data will be lost!"; + /** Warning of unsafe cluster deactivation. */ + public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Deactivation stopped. Cluster has in-memory " + + "caches (without persistence). During deactivation, in-memory data will be lost!"; /** */ private boolean inMemoryMode; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 119c00f23497b..865bc4e21b726 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -36,11 +36,11 @@ public class GridClientClusterStateRequestV2 extends GridClientClusterStateReque /** * @param state New cluster state. - * @param force Forced change of cluster state. + * @param forceDeactivation Forced cluster deactivation. * @return Cluster state change request. */ - public static GridClientClusterStateRequestV2 state(ClusterState state, boolean force) { - return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), force); + public static GridClientClusterStateRequestV2 state(ClusterState state, boolean forceDeactivation) { + return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), forceDeactivation); } /** Default constructor for the externalization. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index a04c9632d2682..a1ff8f1ac1c1a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -59,7 +59,7 @@ public void reqCurrentState() { } /** - * Sets forced state change witout checking of operation safety. + * Sets forced deactivation, witout checking of operation safety. * * @param forceDeactivation If {@code True}, indicates not to ensure deactivation is safe. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 4bfaa137c8d93..493da40699158 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -36,7 +36,7 @@ public class GridRestClusterStateRequest extends GridRestRequest { private boolean forceDeactivation; /** - * Sets forced state change witout checking of operation safety. + * Sets forced deactivation witout checking of operation safety. * * @param forceDeactivation If {@code True}, indicates not to ensure deactivation is safe. */ @@ -55,7 +55,7 @@ public boolean isReqCurrentMode() { } /** - * @return {@code True} if there is no need to ensure deactivation is safe. + * @return {@code True} if there is no need to ensure the deactivation is safe. */ public boolean forceDeactivation() { return forceDeactivation; From ec3d67a59ea1c7ccca87c8d3acf0dcd81dedd0e6 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 16:07:50 +0300 Subject: [PATCH 58/82] IGNITE-12701 : ChangeGlobalStateMessage is now forced by default. --- .../cluster/ChangeGlobalStateMessage.java | 14 ++++---------- .../cluster/GridClusterStateProcessor.java | 5 +++-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index daede3d2091fe..db98be7e567f7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -72,13 +72,14 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage { @Nullable private transient ServiceDeploymentActions serviceDeploymentActions; /** Forced deactivation. */ - private boolean forceDeactivation = true; + private boolean forceDeactivation; /** * @param reqId State change request ID. * @param initiatingNodeId Node initiated state change. * @param storedCfgs Configurations read from persistent store. * @param state New cluster state. + * @param forceDeactivation Forced cluster deactivation even if unsafe. * @param baselineTopology Baseline topology. * @param forceChangeBaselineTopology Force change baseline topology flag. * @param timestamp Timestamp. @@ -88,6 +89,7 @@ public ChangeGlobalStateMessage( UUID initiatingNodeId, @Nullable List storedCfgs, ClusterState state, + boolean forceDeactivation, BaselineTopology baselineTopology, boolean forceChangeBaselineTopology, long timestamp @@ -99,6 +101,7 @@ public ChangeGlobalStateMessage( this.initiatingNodeId = initiatingNodeId; this.storedCfgs = storedCfgs; this.state = state; + this.forceDeactivation = forceDeactivation; this.baselineTopology = baselineTopology; this.forceChangeBaselineTopology = forceChangeBaselineTopology; this.timestamp = timestamp; @@ -214,15 +217,6 @@ boolean forceDeactivation() { return forceDeactivation; } - /** - * Sets forced cluster deactivation. - * - * @param forceDeactivation Flag of forced cluster deactivation. - */ - void force(boolean forceDeactivation) { - this.forceDeactivation = forceDeactivation; - } - /** * @return Timestamp. */ 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 33fa5886b18aa..8b98de758fa2c 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 @@ -1114,13 +1114,12 @@ private IgniteInternalFuture changeGlobalState0( ctx.localNodeId(), storedCfgs, state, + forceDeactivation, blt, forceChangeBaselineTopology, System.currentTimeMillis() ); - msg.force(forceDeactivation); - IgniteInternalFuture resFut = wrapStateChangeFuture(startedFut, msg); try { @@ -1558,6 +1557,7 @@ public boolean autoAdjustInMemoryClusterState( nodeId, null, oldState.state(), + true, newBlt, true, System.currentTimeMillis() @@ -1598,6 +1598,7 @@ public ExchangeActions autoAdjustExchangeActions(ExchangeActions exchActs) { ctx.localNodeId(), null, ClusterState.active(clusterState.state()) ? clusterState.state() : ACTIVE, + true, blt, true, System.currentTimeMillis() From d982a8b30e15ddc6bab172755ed5dbcdc41390ec Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 16:13:27 +0300 Subject: [PATCH 59/82] IGNITE-12701 : minor change of an error message. --- .../internal/processors/cluster/GridClusterStateProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8b98de758fa2c..64d76e5a4f11c 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 @@ -635,7 +635,7 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { if (stateFut != null) { stateFut.onDone(new IgniteException(DATA_LOST_ON_DEACTIVATION_WARNING - + " To change cluster state on '" + msg.state().name() + "' pass the force flag.")); + + " To deactivate cluster pass flag 'force'.")); } return false; From e476bd012d9e5707c71ebfe60164e5ce7d344a8f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 16:46:45 +0300 Subject: [PATCH 60/82] IGNITE-12701 : fixed after prereview 6 --- .../client/impl/connection/GridClientConnection.java | 8 ++++---- .../internal/commandline/ClusterStateChangeCommand.java | 2 +- .../ignite/internal/commandline/DeactivateCommand.java | 2 +- .../client/message/GridClientClusterStateRequest.java | 3 ++- .../client/message/GridClientClusterStateRequestV2.java | 3 ++- .../rest/request/GridRestChangeStateRequest.java | 2 +- .../main/java/org/apache/ignite/mxbean/IgniteMXBean.java | 7 ++----- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index ab020d1494777..19dd3489f9c7b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -312,13 +312,13 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a /** * Changes grid global state. * When deactivating, fails if deactivation is not safe and {@code forceDeactivation} is {@code False}. - * See {@link ClusterState#INACTIVE}. + * See {@link ClusterState#INACTIVE} and {@link IgniteFeatures#SAFE_CLUSTER_DEACTIVATION}. * * @param state New cluster state. * @param destNodeId Destination node id. - * @param forceDeactivation If not {@code null}, executes new version of cluster state changing. - * See {@link IgniteFeatures#SAFE_CLUSTER_DEACTIVATION}. - * If {@code True} then skips checking of deactivation safety. + * @param forceDeactivation If {@code True} then skips checking of deactivation safety. + * If {@code False}, checks if deactivation is safe. + * If {@code null}, executes old version of cluster state changing considering always forced * * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 4b2a4567578b5..0477771242f0d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -45,7 +45,7 @@ public class ClusterStateChangeCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force deactivation of cluster even if it has in-memory data. */ + /** Force cluster deactivation flag. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 0c4201544b42a..56a57914e7810 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -37,7 +37,7 @@ public class DeactivateCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force deactivation of cluster even if it has in-memory caches. */ + /** Force cluster deactivation flag. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 8f5993c04a1ef..630291abe896d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.rest.client.message; +import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; @@ -70,7 +71,7 @@ public static GridClientClusterStateRequest state(ClusterState state) { return msg; } - /** Default constructor for the externalization. */ + /** Empty constructor required by {@link Externalizable}. */ public GridClientClusterStateRequest() { // No op. } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 865bc4e21b726..ba9a45acb86e6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.rest.client.message; +import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; @@ -43,7 +44,7 @@ public static GridClientClusterStateRequestV2 state(ClusterState state, boolean return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), forceDeactivation); } - /** Default constructor for the externalization. */ + /** Empty constructor required by {@link Externalizable}. */ public GridClientClusterStateRequestV2() { // No op. } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index a1ff8f1ac1c1a..5c9e080677cbe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -59,7 +59,7 @@ public void reqCurrentState() { } /** - * Sets forced deactivation, witout checking of operation safety. + * Sets forced deactivation, without checking of operation safety. * * @param forceDeactivation If {@code True}, indicates not to ensure deactivation is safe. */ diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index d0ab2617c84da..bf0ac4b88bf7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -385,8 +385,7 @@ public boolean pingNode( * Changes Ignite grid state to active or inactive. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE + * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. * * @param active Activate/DeActivate flag. */ @@ -666,11 +665,9 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * After cluster deactivation all data from every in-memory cache (including the system caches) will be lost. - * @see ClusterState#INACTIVE + * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. * * @param state String representation of new cluster state. - * See {@link ClusterState} */ @MXBeanDescription("Changes current cluster state.") public void clusterState( From 280e9a73fc19891795f9755a303f05af468ed099 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 4 Mar 2020 17:07:19 +0300 Subject: [PATCH 61/82] IGNITE-12701 : reverted change global state methods. --- .idea/inspectionProfiles/Project_Default.xml | 1463 ++++++++--------- .../JettyRestProcessorAbstractSelfTest.java | 2 +- .../apache/ignite/cluster/ClusterState.java | 2 +- .../internal/cluster/IgniteClusterImpl.java | 10 +- .../cluster/GridClusterStateProcessor.java | 50 +- .../cluster/IGridClusterStateProcessor.java | 20 +- 6 files changed, 799 insertions(+), 748 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 23515edc761bf..d48972a7345ff 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,776 +1,773 @@ - - + \ No newline at end of file diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index 3c798044b3629..05fac6c3e7003 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -3213,7 +3213,7 @@ private void assertClusterState(boolean exp) throws Exception { * Change cluster state and test new state. * * @param cmd Command. - * @param params Aruments for the {@code cmd}. + * @param params Arguments for the {@code cmd}. * @throws Exception If failed. */ private void changeClusterState(GridRestCommand cmd, String... params) throws Exception { diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java index f2ac028ddb6c4..85d95d6cdd832 100644 --- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterState.java @@ -27,7 +27,7 @@ public enum ClusterState { * Cluster deactivated. Cache operations aren't allowed. *

* NOTE: - * Deactivation clears in-memory caches (without persistense) including the system caches. + * Deactivation clears in-memory caches (without persistence) including the system caches. */ INACTIVE, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java index 20bea406ee167..5e407cab83f3f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cluster/IgniteClusterImpl.java @@ -73,8 +73,6 @@ import org.apache.ignite.lang.IgniteProductVersion; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.cluster.ClusterState.ACTIVE; -import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IPS; import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS; import static org.apache.ignite.internal.util.nodestart.IgniteNodeStartUtils.parseFile; @@ -314,7 +312,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(active ? ACTIVE : INACTIVE, true, serverNodes(), false, false).get(); + ctx.state().changeGlobalState(active, serverNodes(), false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -341,7 +339,7 @@ public IgniteClusterImpl(GridKernalContext ctx) { guard(); try { - ctx.state().changeGlobalState(newState, true, serverNodes(), false, false).get(); + ctx.state().changeGlobalState(newState, true, serverNodes(), false).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -377,7 +375,7 @@ private Collection serverNodes() { try { validateBeforeBaselineChange(baselineTop); - ctx.state().changeGlobalState(ACTIVE, true, baselineTop, true, false).get(); + ctx.state().changeGlobalState(true, baselineTop, true).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); @@ -528,7 +526,7 @@ private void setBaselineTopology(long topVer, boolean isBaselineAutoAdjust) { validateBeforeBaselineChange(target); - ctx.state().changeGlobalState(ACTIVE, true, target, true, isBaselineAutoAdjust).get(); + ctx.state().changeGlobalState(true, target, true, isBaselineAutoAdjust).get(); } catch (IgniteCheckedException e) { throw U.convertException(e); 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 64d76e5a4f11c..15309c94bb160 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 @@ -470,7 +470,7 @@ else if (stateOnStart == null) && !inMemoryMode && isBaselineSatisfied(state.baselineTopology(), discoCache.serverNodes()) ) - changeGlobalState(targetState, true, state.baselineTopology().currentBaseline(), false, false); + changeGlobalState(targetState, true, state.baselineTopology().currentBaseline(), false); } return null; @@ -943,6 +943,51 @@ protected IgniteCheckedException concurrentStateChangeError(ClusterState state, /** {@inheritDoc} */ @Override public IgniteInternalFuture changeGlobalState( + final boolean activate, + Collection baselineNodes, + boolean forceChangeBaselineTopology + ) { + return changeGlobalState(activate, baselineNodes, forceChangeBaselineTopology, false); + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture changeGlobalState( + ClusterState state, + boolean forceDeactivation, + Collection baselineNodes, + boolean forceChangeBaselineTopology + ) { + return changeGlobalState(state, forceDeactivation, baselineNodes, forceChangeBaselineTopology, false); + } + + /** + * @param activate New activate state. + * @param baselineNodes New BLT nodes. + * @param forceChangeBaselineTopology Force change BLT. + * @param isAutoAdjust Auto adjusting flag. + * @return Global change state future. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean, boolean)} instead. + */ + @Deprecated + public IgniteInternalFuture changeGlobalState( + final boolean activate, + Collection baselineNodes, + boolean forceChangeBaselineTopology, + boolean isAutoAdjust + ) { + return changeGlobalState(activate ? ACTIVE : INACTIVE, true, baselineNodes, forceChangeBaselineTopology, + isAutoAdjust); + } + + /** + * @param state New activate state. + * @param forceDeactivation Forced cluster deactivation. + * @param baselineNodes New BLT nodes. + * @param forceChangeBaselineTopology Force change BLT. + * @param isAutoAdjust Auto adjusting flag. + * @return Global change state future. + */ + public IgniteInternalFuture changeGlobalState( ClusterState state, boolean forceDeactivation, Collection baselineNodes, @@ -1991,8 +2036,7 @@ private ClientSetGlobalStateComputeRequest( state, true, baselineTopology != null ? baselineTopology.currentBaseline() : null, - forceChangeBaselineTopology, - false + forceChangeBaselineTopology ).get(); } catch (IgniteCheckedException ex) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index 7ae1bb9f5f317..a8be2f868b1df 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -108,20 +108,32 @@ boolean onStateChangeMessage(AffinityTopologyVersion topVer, /** */ void cacheProcessorStarted(); + /** + * @param activate New cluster state. + * @param baselineNodes New baseline nodes. + * @param forceChangeBaselineTopology Force change baseline topology. + * @return State change future. + * @deprecated Use {@link #changeGlobalState(ClusterState, boolean, Collection, boolean)} instead. + */ + @Deprecated + IgniteInternalFuture changeGlobalState( + boolean activate, + Collection baselineNodes, + boolean forceChangeBaselineTopology + ); + /** * @param state New cluster state. - * @param forceDeactivation If {@code True}, skips checking of the deactivation safety. * @param baselineNodes New baseline nodes. + * @param forceDeactivation Forced cluster deactivation. * @param forceChangeBaselineTopology Force change baseline topology. - * @param isAutoAdjust Auto adjusting flag. * @return State change future. */ IgniteInternalFuture changeGlobalState( ClusterState state, boolean forceDeactivation, Collection baselineNodes, - boolean forceChangeBaselineTopology, - boolean isAutoAdjust + boolean forceChangeBaselineTopology ); /** From 63bd6a937c39d1f92411d8b31ed30867bc23d97e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 17:26:58 +0300 Subject: [PATCH 62/82] IGNITE-12701 : reverted proj settings. --- .idea/inspectionProfiles/Project_Default.xml | 1545 +++++++++--------- 1 file changed, 774 insertions(+), 771 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index d48972a7345ff..733db1449673d 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,773 +1,776 @@ - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2f751f5b69925796caa9fec0f96bd7c7c2b4ec1d Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 4 Mar 2020 17:36:14 +0300 Subject: [PATCH 63/82] IGNITE-12701 : reverted proj settings. --- .idea/inspectionProfiles/Project_Default.xml | 1550 +++++++++--------- 1 file changed, 775 insertions(+), 775 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 733db1449673d..23515edc761bf 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,776 +1,776 @@ - +

* NOTE: - * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. + * Deactivation clears in-memory caches (without persistence) including the system caches. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java index dd464c716dde9..2ba83c6f0583a 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteCluster.java @@ -457,7 +457,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes Ignite grid state to active or inactive. *

* NOTE: - * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. + * Deactivation clears in-memory caches (without persistence) including the system caches. * * @param active If {@code True} start activation process. If {@code False} start deactivation process. * @throws IgniteException If there is an already started transaction or lock in the same thread. @@ -477,7 +477,7 @@ public IgniteFuture> startNodesAsync(Collecti * Changes current cluster state to given {@code newState} cluster state. *

* NOTE: - * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. + * Deactivation clears in-memory caches (without persistence) including the system caches. * * @param newState New cluster state. * @throws IgniteException If there is an already started transaction or lock in the same thread. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index a8b9b0dc784be..3fe804be38053 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -28,7 +28,6 @@ public interface GridClientClusterState { * * @param active {@code True} activate, {@code False} deactivate. * @throws GridClientException If the request to change the cluster state failed. - * @see ClusterState#INACTIVE * @deprecated Use {@link #state(ClusterState, boolean)} instead. */ @Deprecated @@ -53,7 +52,6 @@ public interface GridClientClusterState { * @param newState New cluster state. * @param forceDeactivation If {@code true}, won't ensure deactivation is safe. * @throws GridClientException If the request to change the cluster state failed. - * @see ClusterState#INACTIVE */ public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 30813ba61c809..623a7492d0128 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -71,7 +71,7 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException { - // Check compapability of new forced deactivation on all nodes. + // Check compatibility of new forced deactivation on all nodes. UUID oldVerNode = checkFeatureSupportedByCluster(client, IgniteFeatures.SAFE_CLUSTER_DEACTIVATION, false, false); if (newState == INACTIVE && oldVerNode != null && !forceDeactivation) { 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 15309c94bb160..f957c18ea8eaa 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 @@ -1684,8 +1684,8 @@ public boolean isBaselineAutoAdjustEnabled() { } /** - * @return {@code False} if cluster deactivation would erase user's data and objects. - * {@code True} If deactivation is safe. + * @return {@code False} if cluster deactivation will erase user's data and objects. + * {@code True} otherwise. */ public boolean isDeactivationSafe() { return ctx.cache().cacheDescriptors().values().stream() diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java index bf0ac4b88bf7c..0fd25b74ece43 100644 --- a/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java +++ b/modules/core/src/main/java/org/apache/ignite/mxbean/IgniteMXBean.java @@ -385,7 +385,7 @@ public boolean pingNode( * Changes Ignite grid state to active or inactive. *

* NOTE: - * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. + * Deactivation clears in-memory caches (without persistence) including the system caches. * * @param active Activate/DeActivate flag. */ @@ -665,7 +665,7 @@ void runIoTest( * Changes current cluster state. *

* NOTE: - * Deactivation is not safe for in-memory data. See {@link ClusterState#INACTIVE}. + * Deactivation clears in-memory caches (without persistence) including the system caches. * * @param state String representation of new cluster state. */ From bdcb9977e46baeb2dab610bca250625eceff3f2f Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 10 Mar 2020 00:06:29 +0300 Subject: [PATCH 74/82] IGNITE-12703 : fixes after review. --- .../ignite/internal/IgniteFeatures.java | 7 +++- .../client/GridClientClusterState.java | 4 +- .../impl/GridClientClusterStateImpl.java | 20 ++++++---- .../impl/connection/GridClientConnection.java | 1 + .../ClusterStateChangeCommand.java | 2 +- .../commandline/DeactivateCommand.java | 2 +- .../cluster/ChangeGlobalStateMessage.java | 6 ++- .../cluster/GridClusterStateProcessor.java | 6 +-- .../cluster/IGridClusterStateProcessor.java | 2 +- .../GridClientClusterStateRequest.java | 18 +-------- .../GridClientClusterStateRequestV2.java | 38 +++++++------------ .../request/GridRestChangeStateRequest.java | 10 +++-- .../request/GridRestClusterStateRequest.java | 6 +-- 13 files changed, 54 insertions(+), 68 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java index 8989b7101cd88..a5f7b4f58e0f9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteFeatures.java @@ -19,6 +19,7 @@ import java.util.BitSet; import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.managers.encryption.GridEncryptionManager; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; import org.apache.ignite.spi.communication.tcp.messages.HandshakeWaitMessage; @@ -87,7 +88,11 @@ public enum IgniteFeatures { /** ContinuousQuery with security subject id support. */ CONT_QRY_SECURITY_AWARE(21), - /** Preventing loss of in-memory data when deactivating the cluster. */ + /** + * Preventing loss of in-memory data when deactivating the cluster. + * + * @see ClusterState#INACTIVE + */ SAFE_CLUSTER_DEACTIVATION(22), /** Long operations dump timeout. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 3fe804be38053..5d7b8d1fd9e20 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -24,8 +24,6 @@ */ public interface GridClientClusterState { /** - * Changes Ignite grid state to active or inactive. - * * @param active {@code True} activate, {@code False} deactivate. * @throws GridClientException If the request to change the cluster state failed. * @deprecated Use {@link #state(ClusterState, boolean)} instead. @@ -50,7 +48,7 @@ public interface GridClientClusterState { * Changes cluster state to {@code newState}. * * @param newState New cluster state. - * @param forceDeactivation If {@code true}, won't ensure deactivation is safe. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @throws GridClientException If the request to change the cluster state failed. */ public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 623a7492d0128..2f64bf16f0d8f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -72,16 +72,20 @@ public GridClientClusterStateImpl( /** {@inheritDoc} */ @Override public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException { // Check compatibility of new forced deactivation on all nodes. - UUID oldVerNode = checkFeatureSupportedByCluster(client, IgniteFeatures.SAFE_CLUSTER_DEACTIVATION, false, false); + UUID oldVerNode = checkFeatureSupportedByCluster(client, IgniteFeatures.SAFE_CLUSTER_DEACTIVATION, false, + false); - if (newState == INACTIVE && oldVerNode != null && !forceDeactivation) { - throw new GridClientException("Deactivation stopped. Found node not supporting safe deactivation: " - + oldVerNode + ". It causes deactivation safety won't be ensured. You can try with flag 'force'. " + - "Deactivation clears in-memory caches (without persistence) including the system caches!"); - } + if (oldVerNode == null) + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, forceDeactivation)).get(); + else { + if (newState == INACTIVE && !forceDeactivation) { + throw new GridClientException("Deactivation stopped. Found a node not supporting checking of " + + "safety of this operation: " + oldVerNode + ". Deactivation clears in-memory caches (without " + + "persistence) including the system caches. You can try with flag 'force'."); + } - withReconnectHandling((con, nodeId) -> - con.changeState(newState, nodeId, oldVerNode != null ? null : forceDeactivation)).get(); + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, null)).get(); + } } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index a6f0e344d6221..33397bfed6202 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -25,6 +25,7 @@ import java.util.Set; import java.util.UUID; import javax.net.ssl.SSLContext; + import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClientCacheFlag; import org.apache.ignite.internal.client.GridClientClosedException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 3e2936eabe74c..53887c50879ce 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -45,7 +45,7 @@ public class ClusterStateChangeCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation. */ + /** If {@code true}, cluster deactivation will be forced. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index 56a57914e7810..10d0fe56235d3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -37,7 +37,7 @@ public class DeactivateCommand implements Command { /** Cluster name. */ private String clusterName; - /** Force cluster deactivation flag. */ + /** If {@code true}, cluster deactivation will be forced. */ private boolean forceDeactivation; /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index 02b98ca9e43a9..d8a9a37378271 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -71,7 +71,7 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage { @GridToStringExclude @Nullable private transient ServiceDeploymentActions serviceDeploymentActions; - /** Force cluster deactivation. */ + /** If {@code true}, cluster deactivation will be forced. */ private boolean forceDeactivation; /** @@ -79,7 +79,7 @@ public class ChangeGlobalStateMessage implements DiscoveryCustomMessage { * @param initiatingNodeId Node initiated state change. * @param storedCfgs Configurations read from persistent store. * @param state New cluster state. - * @param forceDeactivation Forced cluster deactivation even if unsafe. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param baselineTopology Baseline topology. * @param forceChangeBaselineTopology Force change baseline topology flag. * @param timestamp Timestamp. @@ -212,6 +212,8 @@ public boolean forceChangeBaselineTopology() { /** * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. + * + * @see ClusterState#INACTIVE */ boolean forceDeactivation() { return forceDeactivation; 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 f957c18ea8eaa..4649a8dd348da 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 @@ -119,8 +119,8 @@ public class GridClusterStateProcessor extends GridProcessorAdapter implements I private static final String METASTORE_CURR_BLT_KEY = "metastoreBltKey"; /** Warning of unsafe cluster deactivation. */ - public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Deactivation stopped. Cluster has in-memory " + - "caches (without persistence). During deactivation, in-memory data will be lost!"; + public static final String DATA_LOST_ON_DEACTIVATION_WARNING = "Deactivation stopped. Deactivation clears " + + "in-memory caches (without persistence) including the system caches."; /** */ private boolean inMemoryMode; @@ -981,7 +981,7 @@ public IgniteInternalFuture changeGlobalState( /** * @param state New activate state. - * @param forceDeactivation Forced cluster deactivation. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param baselineNodes New BLT nodes. * @param forceChangeBaselineTopology Force change BLT. * @param isAutoAdjust Auto adjusting flag. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index a8be2f868b1df..888eba787ff7d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -125,7 +125,7 @@ IgniteInternalFuture changeGlobalState( /** * @param state New cluster state. * @param baselineNodes New baseline nodes. - * @param forceDeactivation Forced cluster deactivation. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param forceChangeBaselineTopology Force change baseline topology. * @return State change future. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java index 630291abe896d..122fdebd78e0b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequest.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.rest.client.message; -import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; @@ -36,7 +35,7 @@ public class GridClientClusterStateRequest extends GridClientAbstractMessage { private boolean reqCurrentState; /** New cluster state. */ - private ClusterState state; + protected ClusterState state; /** */ public boolean isReqCurrentState() { @@ -71,21 +70,6 @@ public static GridClientClusterStateRequest state(ClusterState state) { return msg; } - /** Empty constructor required by {@link Externalizable}. */ - public GridClientClusterStateRequest() { - // No op. - } - - /** - * Copying constructor. - * - * @param src The request to copy data from. - */ - protected GridClientClusterStateRequest(GridClientClusterStateRequest src) { - reqCurrentState = src.reqCurrentState; - state = src.state; - } - /** {@inheritDoc} */ @Override public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 33a161e05c081..02b41ca361d0e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.rest.client.message; -import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; @@ -36,36 +35,27 @@ public class GridClientClusterStateRequestV2 extends GridClientClusterStateReque private boolean forceDeactivation; /** - * @param state New cluster state. - * @param forceDeactivation Forced cluster deactivation. - * @return Cluster state change request. + * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. + * + * @see ClusterState#INACTIVE */ - public static GridClientClusterStateRequestV2 state(ClusterState state, boolean forceDeactivation) { - return new GridClientClusterStateRequestV2(GridClientClusterStateRequest.state(state), forceDeactivation); - } - - /** Empty constructor required by {@link Externalizable}. */ - public GridClientClusterStateRequestV2() { - // No op. + public boolean forceDeactivation() { + return forceDeactivation; } /** - * Copying constructor. - * - * @param clusterStateReq Original request, of the previous version. - * @param forceDeactivation If {@code true}, indicates to skip checking of deactivation safety. + * @param state New cluster state. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. + * @return Cluster state change request. */ - private GridClientClusterStateRequestV2(GridClientClusterStateRequest clusterStateReq, boolean forceDeactivation) { - super(clusterStateReq); + public static GridClientClusterStateRequestV2 state(ClusterState state, boolean forceDeactivation) { + GridClientClusterStateRequestV2 req = new GridClientClusterStateRequestV2(); - this.forceDeactivation = forceDeactivation; - } + req.state = state; - /** - * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. - */ - public boolean forceDeactivation() { - return forceDeactivation; + req.forceDeactivation = forceDeactivation; + + return req; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index 8ddea797c1c9e..69ed26e6b0e19 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.processors.rest.request; +import org.apache.ignite.cluster.ClusterState; + /** * */ @@ -27,7 +29,7 @@ public class GridRestChangeStateRequest extends GridRestRequest { /** Request current state. */ private boolean reqCurrentState; - /** Force deactivation flag. */ + /** If {@code true}, cluster deactivation will be forced. */ private boolean forceDeactivation; /** @@ -59,9 +61,7 @@ public void reqCurrentState() { } /** - * Sets forced deactivation, without checking of operation safety. - * - * @param forceDeactivation If {@code true}, indicates not to ensure deactivation is safe. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. */ public void forceDeactivation(boolean forceDeactivation) { this.forceDeactivation = forceDeactivation; @@ -69,6 +69,8 @@ public void forceDeactivation(boolean forceDeactivation) { /** * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. + * + * @see ClusterState#INACTIVE */ public boolean forceDeactivation() { return forceDeactivation; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index ef5229dd08a60..7633e0823045a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -32,12 +32,10 @@ public class GridRestClusterStateRequest extends GridRestRequest { /** New state. */ private ClusterState state; - /** Force deactivation flag. */ + /** If {@code true}, cluster deactivation will be forced. */ private boolean forceDeactivation; /** - * Sets forced deactivation without checking of operation safety. - * * @param forceDeactivation If {@code true}, indicates not to ensure deactivation is safe. */ public void forceDeactivation(boolean forceDeactivation) { @@ -56,6 +54,8 @@ public boolean isReqCurrentMode() { /** * @return {@code True} if there is no need to ensure the deactivation is safe. + * + * @see ClusterState#INACTIVE */ public boolean forceDeactivation() { return forceDeactivation; From d47374b62f6e35cec7c9fc7cb46dc0b69e72f07b Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Tue, 10 Mar 2020 00:39:11 +0300 Subject: [PATCH 75/82] IGNITE-12703: Same comments. --- .../client/impl/connection/GridClientConnection.java | 2 +- .../internal/commandline/ClusterStateChangeCommand.java | 4 ++-- .../processors/cluster/ChangeGlobalStateMessage.java | 5 ++--- .../processors/cluster/GridClusterStateProcessor.java | 4 ++-- .../client/message/GridClientClusterStateRequestV2.java | 3 +-- .../rest/request/GridRestChangeStateRequest.java | 3 +-- .../rest/request/GridRestClusterStateRequest.java | 7 +++---- 7 files changed, 12 insertions(+), 16 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 33397bfed6202..3382aa0dbd777 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -314,7 +314,7 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * * @param state New cluster state. * @param destNodeId Destination node id. - * @param forceDeactivation If {@code true} then skips checking of deactivation safety. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * If {@code false}, checks if deactivation is safe. * If {@code null}, executes old version of cluster state changing considering it is always * forced. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java index 53887c50879ce..c357597cb848c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ClusterStateChangeCommand.java @@ -36,7 +36,7 @@ * Command to change cluster state. */ public class ClusterStateChangeCommand implements Command { - /** Forces cluster deactivation flag. */ + /** Flag of forced cluster deactivation. */ static final String FORCE_COMMAND = "--force"; /** New cluster state */ @@ -82,7 +82,7 @@ public class ClusterStateChangeCommand implements Command { return null; } catch (Throwable e) { - log.info("Failed to change cluster state to " + state); + log.info("Failed to change cluster state to " + state); throw e; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java index d8a9a37378271..2f430e8e70a7f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java @@ -211,11 +211,10 @@ public boolean forceChangeBaselineTopology() { } /** - * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. - * + * @return {@code True} if cluster deactivation will be forced. {@code False} otherwise. * @see ClusterState#INACTIVE */ - boolean forceDeactivation() { + public boolean forceDeactivation() { return forceDeactivation; } 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 4649a8dd348da..078adcd4baf4d 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 @@ -1684,8 +1684,8 @@ public boolean isBaselineAutoAdjustEnabled() { } /** - * @return {@code False} if cluster deactivation will erase user's data and objects. - * {@code True} otherwise. + * @return {@code True} if cluster deactivation won't clear in-memory caches (without persistence) including the + * system caches. {@code False} otherwise. */ public boolean isDeactivationSafe() { return ctx.cache().cacheDescriptors().values().stream() diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java index 02b41ca361d0e..884b94bb7235f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/client/message/GridClientClusterStateRequestV2.java @@ -35,8 +35,7 @@ public class GridClientClusterStateRequestV2 extends GridClientClusterStateReque private boolean forceDeactivation; /** - * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. - * + * @return {@code True} if cluster deactivation will be forced. {@code False} otherwise. * @see ClusterState#INACTIVE */ public boolean forceDeactivation() { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java index 69ed26e6b0e19..a9ba95b15b1f3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestChangeStateRequest.java @@ -68,8 +68,7 @@ public void forceDeactivation(boolean forceDeactivation) { } /** - * @return {@code True} if deactivation must not check safety of this operation. {@code False} otherwise. - * + * @return {@code True} if cluster deactivation will be forced. {@code False} otherwise. * @see ClusterState#INACTIVE */ public boolean forceDeactivation() { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java index 7633e0823045a..caadfb83f3fdb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/request/GridRestClusterStateRequest.java @@ -23,7 +23,7 @@ * */ public class GridRestClusterStateRequest extends GridRestRequest { - /** Name of the request param 'force'. */ + /** Flag of forced cluster deactivation. */ public static final String ARG_FORCE = "force"; /** Request current state. */ @@ -36,7 +36,7 @@ public class GridRestClusterStateRequest extends GridRestRequest { private boolean forceDeactivation; /** - * @param forceDeactivation If {@code true}, indicates not to ensure deactivation is safe. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. */ public void forceDeactivation(boolean forceDeactivation) { this.forceDeactivation = forceDeactivation; @@ -53,8 +53,7 @@ public boolean isReqCurrentMode() { } /** - * @return {@code True} if there is no need to ensure the deactivation is safe. - * + * @return {@code True} if cluster deactivation will be forced. {@code False} otherwise. * @see ClusterState#INACTIVE */ public boolean forceDeactivation() { From 9d8061248b4bc6d3309767c11549a832d3e540f5 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 10 Mar 2020 12:12:55 +0300 Subject: [PATCH 76/82] IGNITE-12703 + comments --- .../apache/ignite/internal/client/GridClientClusterState.java | 3 ++- .../internal/client/impl/GridClientClusterStateImpl.java | 2 +- .../internal/client/impl/connection/GridClientConnection.java | 2 -- .../processors/cluster/IGridClusterStateProcessor.java | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java index 5d7b8d1fd9e20..177534eb179ab 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java @@ -33,7 +33,7 @@ public interface GridClientClusterState { /** * @return {@code Boolean} - Current cluster state. {@code True} active, {@code False} inactive. - * @deprecated Use {@link #state(ClusterState, boolean)} instead. + * @deprecated Use {@link #state()} instead. */ @Deprecated public boolean active() throws GridClientException; @@ -50,6 +50,7 @@ public interface GridClientClusterState { * @param newState New cluster state. * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @throws GridClientException If the request to change the cluster state failed. + * @see ClusterState#INACTIVE */ public void state(ClusterState newState, boolean forceDeactivation) throws GridClientException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index 2f64bf16f0d8f..c3c9f8f76851b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -81,7 +81,7 @@ public GridClientClusterStateImpl( if (newState == INACTIVE && !forceDeactivation) { throw new GridClientException("Deactivation stopped. Found a node not supporting checking of " + "safety of this operation: " + oldVerNode + ". Deactivation clears in-memory caches (without " + - "persistence) including the system caches. You can try with flag 'force'."); + "persistence) including the system caches. To deactivate cluster pass flag 'force'."); } withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, null)).get(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index 3382aa0dbd777..f858d4f4057e4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -25,7 +25,6 @@ import java.util.Set; import java.util.UUID; import javax.net.ssl.SSLContext; - import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.internal.client.GridClientCacheFlag; import org.apache.ignite.internal.client.GridClientClosedException; @@ -315,7 +314,6 @@ public abstract GridClientFutureAdapter execute(String taskName, Object a * @param state New cluster state. * @param destNodeId Destination node id. * @param forceDeactivation If {@code true}, cluster deactivation will be forced. - * If {@code false}, checks if deactivation is safe. * If {@code null}, executes old version of cluster state changing considering it is always * forced. * @throws GridClientConnectionResetException In case of error. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java index 888eba787ff7d..7118c281efd04 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/IGridClusterStateProcessor.java @@ -128,6 +128,7 @@ IgniteInternalFuture changeGlobalState( * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param forceChangeBaselineTopology Force change baseline topology. * @return State change future. + * @see ClusterState#INACTIVE */ IgniteInternalFuture changeGlobalState( ClusterState state, From 27f77f17443c3f6d29af2f233a656a4303e17285 Mon Sep 17 00:00:00 2001 From: Vladimir Steshin Date: Wed, 11 Mar 2020 12:49:10 +0300 Subject: [PATCH 77/82] IGNITE-12703 : renaming, refactoring. --- .../client/impl/GridClientClusterStateImpl.java | 2 +- .../impl/connection/GridClientConnection.java | 17 +++++++++++++---- .../connection/GridClientNioTcpConnection.java | 13 ++++++++++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java index c3c9f8f76851b..438972371abbc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java @@ -84,7 +84,7 @@ public GridClientClusterStateImpl( "persistence) including the system caches. To deactivate cluster pass flag 'force'."); } - withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId, null)).get(); + withReconnectHandling((con, nodeId) -> con.changeState(newState, nodeId)).get(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java index f858d4f4057e4..5240e707d29be 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientConnection.java @@ -308,19 +308,28 @@ public abstract GridClientFutureAdapter cachePrepend(String cach public abstract GridClientFutureAdapter execute(String taskName, Object arg, UUID destNodeId, boolean keepBinaries) throws GridClientConnectionResetException, GridClientClosedException; + /** + * Changes grid global state. + * + * @param state New cluster state. + * @param destNodeId Destination node id. + * @throws GridClientConnectionResetException In case of error. + * @throws GridClientClosedException If client was manually closed before request was sent over network. + */ + public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException; + /** * Changes grid global state. * * @param state New cluster state. * @param destNodeId Destination node id. * @param forceDeactivation If {@code true}, cluster deactivation will be forced. - * If {@code null}, executes old version of cluster state changing considering it is always - * forced. * @throws GridClientConnectionResetException In case of error. * @throws GridClientClosedException If client was manually closed before request was sent over network. */ - public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, - @Nullable Boolean forceDeactivation) throws GridClientClosedException, GridClientConnectionResetException; + public abstract GridClientFuture changeState(ClusterState state, UUID destNodeId, boolean forceDeactivation) + throws GridClientClosedException, GridClientConnectionResetException; /** * Get current grid state. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 443d83cc97944..1452b748e6b63 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -816,12 +816,19 @@ private GridClientAuthenticationRequest buildAuthRequest() { } /** {@inheritDoc} */ - @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId, Boolean forceDeactivation) + @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId, boolean forceDeactivation) throws GridClientClosedException, GridClientConnectionResetException { assert state != null; - return makeRequest(forceDeactivation == null ? GridClientClusterStateRequest.state(state) - : GridClientClusterStateRequestV2.state(state, forceDeactivation), destNodeId); + return makeRequest(GridClientClusterStateRequestV2.state(state, forceDeactivation), destNodeId); + } + + /** {@inheritDoc} */ + @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId) + throws GridClientClosedException, GridClientConnectionResetException { + assert state != null; + + return makeRequest(GridClientClusterStateRequest.state(state), destNodeId); } /** {@inheritDoc} */ From 6aad2027d7478087f6ba82dff82524cac875cc41 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 11 Mar 2020 12:58:30 +0300 Subject: [PATCH 78/82] IGNITE-12703 : reverted minority. --- .../client/impl/connection/GridClientNioTcpConnection.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java index 1452b748e6b63..45d47797a4811 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/connection/GridClientNioTcpConnection.java @@ -824,8 +824,10 @@ private GridClientAuthenticationRequest buildAuthRequest() { } /** {@inheritDoc} */ - @Override public GridClientFuture changeState(ClusterState state, UUID destNodeId) - throws GridClientClosedException, GridClientConnectionResetException { + @Override public GridClientFuture changeState( + ClusterState state, + UUID destNodeId + ) throws GridClientClosedException, GridClientConnectionResetException { assert state != null; return makeRequest(GridClientClusterStateRequest.state(state), destNodeId); From b07817dcf4946145b7e174ef24f6503857287ded Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 11 Mar 2020 15:57:54 +0300 Subject: [PATCH 79/82] IGNITE-12703 : major fix. --- .../cluster/GridClusterStateProcessor.java | 38 +++++++++++-------- .../IgniteClusterActivateDeactivateTest.java | 29 ++++++++++++++ 2 files changed, 52 insertions(+), 15 deletions(-) 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 078adcd4baf4d..3031e4b51ccb3 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 @@ -629,7 +629,7 @@ protected void afterStateChangeFinished(IgniteUuid msgId, boolean success) { } else { if (isApplicable(msg, state)) { - if (msg.state() == INACTIVE && !msg.forceDeactivation() && !isDeactivationSafe() && + if (msg.state() == INACTIVE && !msg.forceDeactivation() && hasInMemoryCache() && allNodesSupports(ctx.discovery().serverNodes(topVer), SAFE_CLUSTER_DEACTIVATION)) { GridChangeGlobalStateFuture stateFut = changeStateFuture(msg); @@ -1079,7 +1079,7 @@ private IgniteInternalFuture changeGlobalState0( throw new BaselineAdjustForbiddenException(isBaselineAutoAdjustEnabled); if (ctx.isDaemon() || ctx.clientNode()) - return sendComputeChangeGlobalState(state, blt, forceChangeBaselineTopology); + return sendComputeChangeGlobalState(state, forceDeactivation, blt, forceChangeBaselineTopology); if (cacheProc.transactions().tx() != null || sharedCtx.lockedTopologyVersion(null) != null) { return new GridFinishedFuture<>( @@ -1311,11 +1311,13 @@ protected IgniteInternalFuture wrapStateChangeFuture(IgniteInternalFuture fut /** * @param state New cluster state. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param blt New cluster state. * @param forceBlt New cluster state. */ private IgniteInternalFuture sendComputeChangeGlobalState( ClusterState state, + boolean forceDeactivation, BaselineTopology blt, boolean forceBlt ) { @@ -1332,7 +1334,8 @@ private IgniteInternalFuture sendComputeChangeGlobalState( IgniteCompute comp = ((ClusterGroupAdapter)ctx.cluster().get().forServers()).compute(); - IgniteFuture fut = comp.runAsync(new ClientSetGlobalStateComputeRequest(state, blt, forceBlt)); + IgniteFuture fut = comp.runAsync(new ClientSetGlobalStateComputeRequest(state, forceDeactivation, blt, + forceBlt)); return ((IgniteFutureImpl)fut).internalFuture(); } @@ -1683,17 +1686,6 @@ public boolean isBaselineAutoAdjustEnabled() { return distributedBaselineConfiguration.isBaselineAutoAdjustEnabled(); } - /** - * @return {@code True} if cluster deactivation won't clear in-memory caches (without persistence) including the - * system caches. {@code False} otherwise. - */ - public boolean isDeactivationSafe() { - return ctx.cache().cacheDescriptors().values().stream() - .allMatch(desc -> - isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration()) || - (desc.cacheConfiguration().isWriteBehindEnabled() && desc.cacheConfiguration().isReadThrough())); - } - /** * @param baselineAutoAdjustEnabled Value of manual baseline control or auto adjusting baseline. {@code True} If * cluster in auto-adjust. {@code False} If cluster in manuale. @@ -1838,6 +1830,16 @@ private boolean getBooleanFieldFromConfig(IgniteConfiguration cfg, String fieldN return defaultValue; } + /** + * @return {@code True} if cluster has in-memory caches (without persistence) including the system caches. + * {@code False} otherwise. + */ + private boolean hasInMemoryCache() { + return ctx.cache().cacheDescriptors().values().stream() + .anyMatch(desc -> !isPersistentCache(desc.cacheConfiguration(), ctx.config().getDataStorageConfiguration()) + && (!desc.cacheConfiguration().isWriteBehindEnabled() || !desc.cacheConfiguration().isReadThrough())); + } + /** {@inheritDoc} */ @Override public String toString() { return S.toString(GridClusterStateProcessor.class, this); @@ -2004,6 +2006,9 @@ private static class ClientSetGlobalStateComputeRequest implements IgniteRunnabl /** */ private final ClusterState state; + /** If {@code true}, cluster deactivation will be forced. */ + private final boolean forceDeactivation; + /** */ private final BaselineTopology baselineTopology; @@ -2016,17 +2021,20 @@ private static class ClientSetGlobalStateComputeRequest implements IgniteRunnabl /** * @param state New cluster state. + * @param forceDeactivation If {@code true}, cluster deactivation will be forced. * @param blt New baseline topology. * @param forceBlt Force change cluster state. */ private ClientSetGlobalStateComputeRequest( ClusterState state, + boolean forceDeactivation, BaselineTopology blt, boolean forceBlt ) { this.state = state; this.baselineTopology = blt; this.forceChangeBaselineTopology = forceBlt; + this.forceDeactivation = forceDeactivation; } /** {@inheritDoc} */ @@ -2034,7 +2042,7 @@ private ClientSetGlobalStateComputeRequest( try { ig.context().state().changeGlobalState( state, - true, + forceDeactivation, baselineTopology != null ? baselineTopology.currentBaseline() : null, forceChangeBaselineTopology ).get(); 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 4819936a7c51a..d98abd9818edd 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 @@ -66,8 +66,10 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.cluster.ClusterState.lesserOf; +import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.testframework.GridTestUtils.assertActive; import static org.apache.ignite.testframework.GridTestUtils.assertInactive; +import static org.apache.ignite.testframework.GridTestUtils.assertThrows; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.apache.ignite.testframework.GridTestUtils.runAsync; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -1563,6 +1565,33 @@ public void testReadOnlyClusterStateNotWaitForDeactivation() throws Exception { checkClusterStateNotWaitForDeactivation(ACTIVE_READ_ONLY); } + @Test + public void testInternalForcedDeactivation() throws Exception { + startGrid(0, false); + + startGrid(1, true); + + IgniteEx server = grid(0); + + IgniteEx client = grid(1); + + assertEquals(ACTIVE, server.cluster().state()); + + assertThrows(null, () -> { + client.context().state().changeGlobalState(INACTIVE, false, server.cluster().currentBaselineTopology(), false) + .get(); + + return null; + }, IgniteCheckedException.class, DATA_LOST_ON_DEACTIVATION_WARNING); + + assertEquals(ACTIVE, server.cluster().state()); + + client.context().state().changeGlobalState(INACTIVE, true, server.cluster().currentBaselineTopology(), false) + .get(); + + assertEquals(INACTIVE, server.cluster().state()); + } + /** */ private void checkClusterStateNotWaitForDeactivation(ClusterState initialState) throws Exception { assertActive(initialState); From c9078caca771bbcf2a5989f6d1e8261f0c8d4858 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 11 Mar 2020 15:59:15 +0300 Subject: [PATCH 80/82] IGNITE-12703 : + comment. --- .../processors/cache/IgniteClusterActivateDeactivateTest.java | 3 +++ 1 file changed, 3 insertions(+) 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 d98abd9818edd..8136dae00d463 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 @@ -1565,6 +1565,9 @@ public void testReadOnlyClusterStateNotWaitForDeactivation() throws Exception { checkClusterStateNotWaitForDeactivation(ACTIVE_READ_ONLY); } + /** + * @throws Exception If failed. + */ @Test public void testInternalForcedDeactivation() throws Exception { startGrid(0, false); From 8eea0b3ebd57a597487a993f9534ec983b2b3fc6 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 11 Mar 2020 16:01:56 +0300 Subject: [PATCH 81/82] IGNITE-12703 : + breakline. --- .../processors/cache/IgniteClusterActivateDeactivateTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8136dae00d463..9fd8c69a4b5f2 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 @@ -1581,8 +1581,8 @@ public void testInternalForcedDeactivation() throws Exception { assertEquals(ACTIVE, server.cluster().state()); assertThrows(null, () -> { - client.context().state().changeGlobalState(INACTIVE, false, server.cluster().currentBaselineTopology(), false) - .get(); + client.context().state().changeGlobalState(INACTIVE, false, server.cluster().currentBaselineTopology(), + false).get(); return null; }, IgniteCheckedException.class, DATA_LOST_ON_DEACTIVATION_WARNING); From 861b5ec3e53463241ab38c2afc83dd87f24f4789 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 11 Mar 2020 18:48:12 +0300 Subject: [PATCH 82/82] IGNITE-12703 : removed testInternalForcedDeactivation() --- .../IgniteClusterActivateDeactivateTest.java | 32 ------------------- 1 file changed, 32 deletions(-) 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 9fd8c69a4b5f2..4819936a7c51a 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 @@ -66,10 +66,8 @@ import static org.apache.ignite.cluster.ClusterState.ACTIVE_READ_ONLY; import static org.apache.ignite.cluster.ClusterState.INACTIVE; import static org.apache.ignite.cluster.ClusterState.lesserOf; -import static org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor.DATA_LOST_ON_DEACTIVATION_WARNING; import static org.apache.ignite.testframework.GridTestUtils.assertActive; import static org.apache.ignite.testframework.GridTestUtils.assertInactive; -import static org.apache.ignite.testframework.GridTestUtils.assertThrows; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.apache.ignite.testframework.GridTestUtils.runAsync; import static org.apache.ignite.testframework.GridTestUtils.waitForCondition; @@ -1565,36 +1563,6 @@ public void testReadOnlyClusterStateNotWaitForDeactivation() throws Exception { checkClusterStateNotWaitForDeactivation(ACTIVE_READ_ONLY); } - /** - * @throws Exception If failed. - */ - @Test - public void testInternalForcedDeactivation() throws Exception { - startGrid(0, false); - - startGrid(1, true); - - IgniteEx server = grid(0); - - IgniteEx client = grid(1); - - assertEquals(ACTIVE, server.cluster().state()); - - assertThrows(null, () -> { - client.context().state().changeGlobalState(INACTIVE, false, server.cluster().currentBaselineTopology(), - false).get(); - - return null; - }, IgniteCheckedException.class, DATA_LOST_ON_DEACTIVATION_WARNING); - - assertEquals(ACTIVE, server.cluster().state()); - - client.context().state().changeGlobalState(INACTIVE, true, server.cluster().currentBaselineTopology(), false) - .get(); - - assertEquals(INACTIVE, server.cluster().state()); - } - /** */ private void checkClusterStateNotWaitForDeactivation(ClusterState initialState) throws Exception { assertActive(initialState);