From a9ff4315fd977ca936715a9ed582dbd6431279a6 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 1 Dec 2025 18:59:02 +0300 Subject: [PATCH 01/26] IGNITE-27033: checkpoint control.sh command --- .../IgniteControlUtilityTestSuite.java | 4 +- .../GridCommandHandlerCheckpointTest.java | 54 ++++++++++++++ .../management/IgniteCommandRegistry.java | 2 + .../checkpoint/CheckpointCommand.java | 12 +++ .../checkpoint/CheckpointForceCommand.java | 39 ++++++++++ .../checkpoint/CheckpointForceCommandArg.java | 70 ++++++++++++++++++ .../checkpoint/CheckpointForceTask.java | 74 +++++++++++++++++++ 7 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java diff --git a/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite.java b/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite.java index 175540df381aa..ae32372c0b2fc 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/testsuites/IgniteControlUtilityTestSuite.java @@ -24,6 +24,7 @@ import org.apache.ignite.util.GridCommandHandlerBrokenIndexTest; import org.apache.ignite.util.GridCommandHandlerCheckIncrementalSnapshotTest; import org.apache.ignite.util.GridCommandHandlerCheckIndexesInlineSizeTest; +import org.apache.ignite.util.GridCommandHandlerCheckpointTest; import org.apache.ignite.util.GridCommandHandlerClusterByClassTest; import org.apache.ignite.util.GridCommandHandlerClusterByClassWithSSLTest; import org.apache.ignite.util.GridCommandHandlerConsistencyRepairCorrectnessTransactionalTest; @@ -80,7 +81,8 @@ BaselineEventsRemoteTest.class, GridCommandHandlerConsistencyRepairCorrectnessTransactionalTest.class, - GridCommandHandlerWalTest.class + GridCommandHandlerWalTest.class, + GridCommandHandlerCheckpointTest.class }) public class IgniteControlUtilityTestSuite { } diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java new file mode 100644 index 0000000000000..ca18c9254d146 --- /dev/null +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -0,0 +1,54 @@ +package org.apache.ignite.util; + +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.junit.Test; + +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; + +/** Test for checkpoint in control.sh command. */ +public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return super.getConfiguration(igniteInstanceName); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + stopAllGrids(); + cleanPersistenceDir(); + injectTestSystemOut(); + super.beforeTest(); + } + + /** */ + @Test + public void testCheckpointForce() throws Exception { + IgniteEx srv = startGrids(2); + srv.cluster().state(ClusterState.ACTIVE); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + + testOut.reset(); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--reason", "test_reason")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + + testOut.reset(); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--wait-for-finish")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + + testOut.reset(); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--wait-for-finish", "--timeout", "10000")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + + testOut.reset(); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java b/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java index 4388486148aa7..1f28f1cfbd24c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/IgniteCommandRegistry.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.management.baseline.BaselineCommand; import org.apache.ignite.internal.management.cache.CacheCommand; import org.apache.ignite.internal.management.cdc.CdcCommand; +import org.apache.ignite.internal.management.checkpoint.CheckpointCommand; import org.apache.ignite.internal.management.consistency.ConsistencyCommand; import org.apache.ignite.internal.management.defragmentation.DefragmentationCommand; import org.apache.ignite.internal.management.diagnostic.DiagnosticCommand; @@ -58,6 +59,7 @@ public IgniteCommandRegistry() { new TxCommand(), new CacheCommand(), new WalCommand(), + new CheckpointCommand(), new DiagnosticCommand(), new EncryptionCommand(), new KillCommand(), diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java new file mode 100644 index 0000000000000..16a1fe37a64e5 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -0,0 +1,12 @@ +package org.apache.ignite.internal.management.checkpoint; + +import org.apache.ignite.internal.management.api.CommandRegistryImpl; + +public class CheckpointCommand extends CommandRegistryImpl { + /** */ + public CheckpointCommand() { + super( + new CheckpointForceCommand() + ); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java new file mode 100644 index 0000000000000..4f4cf1e17adc2 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java @@ -0,0 +1,39 @@ +package org.apache.ignite.internal.management.checkpoint; + +import java.util.Collection; +import java.util.function.Consumer; + +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.management.api.CommandUtils; +import org.apache.ignite.internal.management.api.ComputeCommand; +import org.jetbrains.annotations.Nullable; + +public class CheckpointForceCommand implements ComputeCommand { + /** {@inheritDoc} */ + @Override public Class taskClass() { + return CheckpointForceTask.class; + } + + /** {@inheritDoc} */ + @Override public String description() { + return "Force checkpoint with optional parameters"; + } + + /** {@inheritDoc} */ + @Override public Class argClass() { + return CheckpointForceCommandArg.class; + } + + /** {@inheritDoc} */ + @Override public @Nullable Collection nodes( + Collection nodes, + CheckpointForceCommandArg arg + ) { + return CommandUtils.servers(nodes); + } + + /** {@inheritDoc} */ + @Override public void printResult(CheckpointForceCommandArg arg, String res, Consumer printer) { + printer.accept(res); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java new file mode 100644 index 0000000000000..500a1a38cc7bd --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java @@ -0,0 +1,70 @@ +package org.apache.ignite.internal.management.checkpoint; + +import java.io.IOException; +import java.io.ObjectInput; +import java.io.ObjectOutput; +import org.apache.ignite.internal.dto.IgniteDataTransferObject; +import org.apache.ignite.internal.management.api.Argument; +import org.apache.ignite.internal.util.typedef.internal.U; + +/** Checkpoint force command arguments. */ +public class CheckpointForceCommandArg extends IgniteDataTransferObject { + /** */ + private static final long serialVersionUID = 0; + + /** */ + @Argument(description = "Reason for checkpoint", optional = true) + private String reason; + + /** */ + @Argument(description = "Wait for checkpoint to finish", optional = true) + private boolean waitForFinish; + + /** */ + @Argument(description = "Timeout in milliseconds", optional = true) + private Long timeout; + + /** {@inheritDoc} */ + @Override protected void writeExternalData(ObjectOutput out) throws IOException { + U.writeString(out, reason); + out.writeBoolean(waitForFinish); + out.writeObject(timeout); + } + + /** {@inheritDoc} */ + @Override protected void readExternalData(ObjectInput in) throws IOException, ClassNotFoundException { + reason = U.readString(in); + waitForFinish = in.readBoolean(); + timeout = (Long)in.readObject(); + } + + /** */ + public String reason() { + return reason; + } + + /** */ + public void reason(String reason) { + this.reason = reason; + } + + /** */ + public boolean waitForFinish() { + return waitForFinish; + } + + /** */ + public void waitForFinish(boolean waitForFinish) { + this.waitForFinish = waitForFinish; + } + + /** */ + public Long timeout() { + return timeout; + } + + /** */ + public void timeout(Long timeout) { + this.timeout = timeout; + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java new file mode 100644 index 0000000000000..d88616484273c --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java @@ -0,0 +1,74 @@ +package org.apache.ignite.internal.management.checkpoint; + +import java.util.List; +import java.util.concurrent.TimeUnit; +import org.apache.ignite.IgniteException; +import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.processors.cache.persistence.CheckpointState; +import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; +import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointProgress; +import org.apache.ignite.internal.visor.VisorJob; +import org.apache.ignite.internal.visor.VisorMultiNodeTask; +import org.jetbrains.annotations.Nullable; + +/** Checkpoint force task. */ +public class CheckpointForceTask extends VisorMultiNodeTask { + /** */ + private static final long serialVersionUID = 0; + + /** {@inheritDoc} */ + @Override protected VisorJob job(CheckpointForceCommandArg arg) { + return new CheckpointForceJob(arg, false); + } + + /** {@inheritDoc} */ + @Override protected @Nullable String reduce0(List results) throws IgniteException { + for (ComputeJobResult res : results) { + if (res.getException() != null) + throw res.getException(); + } + + return "Checkpoint triggered on all nodes"; + } + + /** Checkpoint force job. */ + private static class CheckpointForceJob extends VisorJob { + /** */ + private static final long serialVersionUID = 0; + + /** */ + protected CheckpointForceJob(@Nullable CheckpointForceCommandArg arg, boolean debug) { + super(arg, debug); + } + + /** {@inheritDoc} */ + @Override protected String run(@Nullable CheckpointForceCommandArg arg) throws IgniteException { + String reason = arg != null && arg.reason() != null ? arg.reason() : "control.sh"; + boolean waitForFinish = arg != null && arg.waitForFinish(); + Long timeout = arg != null ? arg.timeout() : null; + + try { + GridKernalContext cctx = ignite.context(); + + GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)cctx.cache().context().database(); + + //GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context().database(); + CheckpointProgress checkpointFuture = dbMgr.forceCheckpoint(reason); + + if (waitForFinish) { + if (timeout != null && timeout > 0) { + checkpointFuture.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + } else { + checkpointFuture.futureFor(CheckpointState.FINISHED).get(); + } + return "Checkpoint completed on node: " + ignite.localNode().id(); + } else { + return "Checkpoint triggered on node: " + ignite.localNode().id(); + } + } catch (Exception e) { + throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); + } + } + } +} \ No newline at end of file From b641670ac1a725b8b5bd7de41bb04c002a9e6c29 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Wed, 3 Dec 2025 10:27:41 +0300 Subject: [PATCH 02/26] fix --checkpoint [params] and check for persistence --- .../GridCommandHandlerCheckpointTest.java | 12 +++--- .../checkpoint/CheckpointCommand.java | 42 +++++++++++++++---- ...mandArg.java => CheckpointCommandArg.java} | 4 +- .../checkpoint/CheckpointForceCommand.java | 39 ----------------- ...ointForceTask.java => CheckpointTask.java} | 23 +++++----- 5 files changed, 55 insertions(+), 65 deletions(-) rename modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/{CheckpointForceCommandArg.java => CheckpointCommandArg.java} (93%) delete mode 100644 modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java rename modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/{CheckpointForceTask.java => CheckpointTask.java} (76%) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index ca18c9254d146..235f87e7b028e 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -24,31 +24,31 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract /** */ @Test - public void testCheckpointForce() throws Exception { + public void testCheckpoint() throws Exception { IgniteEx srv = startGrids(2); srv.cluster().state(ClusterState.ACTIVE); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); testOut.reset(); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--reason", "test_reason")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); testOut.reset(); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--wait-for-finish")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); testOut.reset(); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--wait-for-finish", "--timeout", "10000")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "10000")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); testOut.reset(); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "force", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); } } \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java index 16a1fe37a64e5..655c00c4edbb1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -1,12 +1,38 @@ package org.apache.ignite.internal.management.checkpoint; -import org.apache.ignite.internal.management.api.CommandRegistryImpl; - -public class CheckpointCommand extends CommandRegistryImpl { - /** */ - public CheckpointCommand() { - super( - new CheckpointForceCommand() - ); +import java.util.Collection; +import java.util.function.Consumer; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.management.api.CommandUtils; +import org.apache.ignite.internal.management.api.ComputeCommand; +import org.jetbrains.annotations.Nullable; + +public class CheckpointCommand implements ComputeCommand { + /** {@inheritDoc} */ + @Override public Class taskClass() { + return CheckpointTask.class; + } + + /** {@inheritDoc} */ + @Override public String description() { + return "Trigger checkpoint with optional parameters"; + } + + /** {@inheritDoc} */ + @Override public Class argClass() { + return CheckpointCommandArg.class; + } + + /** {@inheritDoc} */ + @Override public @Nullable Collection nodes( + Collection nodes, + CheckpointCommandArg arg + ) { + return CommandUtils.servers(nodes); + } + + /** {@inheritDoc} */ + @Override public void printResult(CheckpointCommandArg arg, String res, Consumer printer) { + printer.accept(res); } } \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java similarity index 93% rename from modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java rename to modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java index 500a1a38cc7bd..a5cd9b383610f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java @@ -7,8 +7,8 @@ import org.apache.ignite.internal.management.api.Argument; import org.apache.ignite.internal.util.typedef.internal.U; -/** Checkpoint force command arguments. */ -public class CheckpointForceCommandArg extends IgniteDataTransferObject { +/** Checkpoint command arguments. */ +public class CheckpointCommandArg extends IgniteDataTransferObject { /** */ private static final long serialVersionUID = 0; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java deleted file mode 100644 index 4f4cf1e17adc2..0000000000000 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceCommand.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.apache.ignite.internal.management.checkpoint; - -import java.util.Collection; -import java.util.function.Consumer; - -import org.apache.ignite.cluster.ClusterNode; -import org.apache.ignite.internal.management.api.CommandUtils; -import org.apache.ignite.internal.management.api.ComputeCommand; -import org.jetbrains.annotations.Nullable; - -public class CheckpointForceCommand implements ComputeCommand { - /** {@inheritDoc} */ - @Override public Class taskClass() { - return CheckpointForceTask.class; - } - - /** {@inheritDoc} */ - @Override public String description() { - return "Force checkpoint with optional parameters"; - } - - /** {@inheritDoc} */ - @Override public Class argClass() { - return CheckpointForceCommandArg.class; - } - - /** {@inheritDoc} */ - @Override public @Nullable Collection nodes( - Collection nodes, - CheckpointForceCommandArg arg - ) { - return CommandUtils.servers(nodes); - } - - /** {@inheritDoc} */ - @Override public void printResult(CheckpointForceCommandArg arg, String res, Consumer printer) { - printer.accept(res); - } -} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java similarity index 76% rename from modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java rename to modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index d88616484273c..ed2408ab84cb7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointForceTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -8,18 +8,19 @@ import org.apache.ignite.internal.processors.cache.persistence.CheckpointState; import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointProgress; +import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.visor.VisorJob; import org.apache.ignite.internal.visor.VisorMultiNodeTask; import org.jetbrains.annotations.Nullable; -/** Checkpoint force task. */ -public class CheckpointForceTask extends VisorMultiNodeTask { +/** Checkpoint task. */ +public class CheckpointTask extends VisorMultiNodeTask { /** */ private static final long serialVersionUID = 0; /** {@inheritDoc} */ - @Override protected VisorJob job(CheckpointForceCommandArg arg) { - return new CheckpointForceJob(arg, false); + @Override protected VisorJob job(CheckpointCommandArg arg) { + return new CheckpointJob(arg, false); } /** {@inheritDoc} */ @@ -32,28 +33,30 @@ public class CheckpointForceTask extends VisorMultiNodeTask { + /** Checkpoint job. */ + private static class CheckpointJob extends VisorJob { /** */ private static final long serialVersionUID = 0; /** */ - protected CheckpointForceJob(@Nullable CheckpointForceCommandArg arg, boolean debug) { + protected CheckpointJob(@Nullable CheckpointCommandArg arg, boolean debug) { super(arg, debug); } /** {@inheritDoc} */ - @Override protected String run(@Nullable CheckpointForceCommandArg arg) throws IgniteException { + @Override protected String run(@Nullable CheckpointCommandArg arg) throws IgniteException { + if (!CU.isPersistenceEnabled(ignite.configuration())) { + throw new IgniteException("Can't checkpoint on in-memory node"); + } + String reason = arg != null && arg.reason() != null ? arg.reason() : "control.sh"; boolean waitForFinish = arg != null && arg.waitForFinish(); Long timeout = arg != null ? arg.timeout() : null; try { GridKernalContext cctx = ignite.context(); - GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)cctx.cache().context().database(); - //GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context().database(); CheckpointProgress checkpointFuture = dbMgr.forceCheckpoint(reason); if (waitForFinish) { From 3b587c829e720d24b2c8a1466682cf15fdfa0fb7 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Wed, 3 Dec 2025 16:04:26 +0300 Subject: [PATCH 03/26] checkstyle --- .../GridCommandHandlerCheckpointTest.java | 2 +- .../checkpoint/CheckpointCommand.java | 20 ++++++++++- .../checkpoint/CheckpointCommandArg.java | 19 ++++++++++- .../management/checkpoint/CheckpointTask.java | 34 +++++++++++++++---- 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 235f87e7b028e..fa81ba47bddd2 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -51,4 +51,4 @@ public void testCheckpoint() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java index 655c00c4edbb1..3fbd2b07602e4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -1,3 +1,20 @@ +/* + * 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.management.checkpoint; import java.util.Collection; @@ -7,6 +24,7 @@ import org.apache.ignite.internal.management.api.ComputeCommand; import org.jetbrains.annotations.Nullable; +/** Checkpoint command class*/ public class CheckpointCommand implements ComputeCommand { /** {@inheritDoc} */ @Override public Class taskClass() { @@ -35,4 +53,4 @@ public class CheckpointCommand implements ComputeCommand printer) { printer.accept(res); } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java index a5cd9b383610f..675dd85e7a9cc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java @@ -1,3 +1,20 @@ +/* + * 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.management.checkpoint; import java.io.IOException; @@ -67,4 +84,4 @@ public Long timeout() { public void timeout(Long timeout) { this.timeout = timeout; } -} \ No newline at end of file +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index ed2408ab84cb7..df5a5208da704 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -1,3 +1,20 @@ +/* + * 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.management.checkpoint; import java.util.List; @@ -57,21 +74,24 @@ protected CheckpointJob(@Nullable CheckpointCommandArg arg, boolean debug) { GridKernalContext cctx = ignite.context(); GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)cctx.cache().context().database(); - CheckpointProgress checkpointFuture = dbMgr.forceCheckpoint(reason); + CheckpointProgress checkpointfut = dbMgr.forceCheckpoint(reason); if (waitForFinish) { if (timeout != null && timeout > 0) { - checkpointFuture.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - } else { - checkpointFuture.futureFor(CheckpointState.FINISHED).get(); + checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + } + else { + checkpointfut.futureFor(CheckpointState.FINISHED).get(); } return "Checkpoint completed on node: " + ignite.localNode().id(); - } else { + } + else { return "Checkpoint triggered on node: " + ignite.localNode().id(); } - } catch (Exception e) { + } + catch (Exception e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); } } } -} \ No newline at end of file +} From 67f7e216bc3e7848b52eef67cf35472509b75a3d Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Wed, 3 Dec 2025 16:19:59 +0300 Subject: [PATCH 04/26] checkstyle 2 --- .../util/GridCommandHandlerCheckpointTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index fa81ba47bddd2..729fc34e354b1 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -1,3 +1,20 @@ +/* + * 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.util; import org.apache.ignite.cluster.ClusterState; From 42fe06ef74b3018fbb05206f7ba520bd70fa4408 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Thu, 4 Dec 2025 08:09:22 +0300 Subject: [PATCH 05/26] add new tests --- .../GridCommandHandlerCheckpointTest.java | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 729fc34e354b1..6293eedfd095b 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -17,18 +17,34 @@ package org.apache.ignite.util; +import java.util.Objects; +import java.util.regex.Pattern; import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; import org.junit.Test; -import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; +import static org.apache.ignite.internal.commandline.CommandHandler.*; /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { + /** */ + private int clusterState; + /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { - return super.getConfiguration(igniteInstanceName); + IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); + + if (clusterState == 1) + cfg.setDataStorageConfiguration(null); + else { + cfg.setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration(new DataRegionConfiguration() + .setPersistenceEnabled(true))); + } + return cfg; } /** {@inheritDoc} */ @@ -39,14 +55,24 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract super.beforeTest(); } - /** */ + /** Test checkpoint command with persistence enabled. */ @Test - public void testCheckpoint() throws Exception { + public void testCheckpointPersistenceCluster() throws Exception { + clusterState = 0; // PDS cluster. + IgniteEx srv = startGrids(2); + IgniteEx cli = startClientGrid("client"); + srv.cluster().state(ClusterState.ACTIVE); assertEquals(EXIT_CODE_OK, execute("--checkpoint")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + + String out = testOut.toString(); + assertFalse(out.contains(cli.localNode().id().toString())); + assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); + assertTrue(out.contains("Checkpoint triggered on all nodes")); + + outputContains("Checkpoint finished"); testOut.reset(); @@ -57,15 +83,56 @@ public void testCheckpoint() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + outputContains("Checkpoint finished"); testOut.reset(); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "10000")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "30000")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + outputContains("Checkpoint finished"); testOut.reset(); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + outputContains("Checkpoint finished"); + } + + /** Test checkpoint command with in-memory cluster. */ + @Test + public void testCheckpointInMemoryCluster() throws Exception { + clusterState = 1; // In-memory cluster. + + IgniteEx srv = startGrids(2); + IgniteEx cli = startClientGrid("client"); + + srv.cluster().state(ClusterState.ACTIVE); + + srv.createCache("testCache"); + assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--checkpoint")); + + String out = testOut.toString(); + assertTrue(out.contains("Can't checkpoint on in-memory node")); + + assertFalse(out.contains(cli.localNode().id().toString())); + assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); + } + + /** */ + @Test + public void testCheckpointTimeout() throws Exception { + clusterState = 0; // PDS cluster. + + IgniteEx srv = startGrids(1); + srv.cluster().state(ClusterState.ACTIVE); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "1000")); + assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + outputContains("Checkpoint finished"); + } + + /** */ + private void outputContains(String regexp) { + assertTrue(Pattern.compile(regexp).matcher(testOut.toString()).find()); } } From 5743032b3d0b76e05a8d7659d0641e74b904f803 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Thu, 4 Dec 2025 08:15:30 +0300 Subject: [PATCH 06/26] * fix --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 6293eedfd095b..ba15598575f3c 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -26,7 +26,9 @@ import org.apache.ignite.internal.IgniteEx; import org.junit.Test; -import static org.apache.ignite.internal.commandline.CommandHandler.*; +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; +import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; + /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { From 936dce15fb82c804c0cb36dfd35982882374a5c5 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Thu, 4 Dec 2025 11:16:16 +0300 Subject: [PATCH 07/26] * fix 2 --- .../org/apache/ignite/util/GridCommandHandlerCheckpointTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index ba15598575f3c..2b30b370e1b3f 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -29,7 +29,6 @@ import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; - /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { /** */ From d51ada4742eb6d7e44604b36895f881561114f67 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 8 Dec 2025 10:47:04 +0300 Subject: [PATCH 08/26] log listener --- .../GridCommandHandlerCheckpointTest.java | 66 +++++++++---------- .../checkpoint/CheckpointCommand.java | 2 +- .../management/checkpoint/CheckpointTask.java | 3 +- ...mmandHandlerClusterByClassTest_help.output | 8 +++ ...ndlerClusterByClassWithSSLTest_help.output | 8 +++ 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 2b30b370e1b3f..23926e593e1b1 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -20,10 +20,10 @@ import java.util.Objects; import java.util.regex.Pattern; import org.apache.ignite.cluster.ClusterState; -import org.apache.ignite.configuration.DataRegionConfiguration; -import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; import org.junit.Test; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; @@ -32,34 +32,35 @@ /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { /** */ - private int clusterState; + protected final ListeningTestLogger listeningLog = new ListeningTestLogger(log); - /** {@inheritDoc} */ + /** */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - if (clusterState == 1) + if (!persistenceEnable()) cfg.setDataStorageConfiguration(null); - else { - cfg.setDataStorageConfiguration(new DataStorageConfiguration() - .setDefaultDataRegionConfiguration(new DataRegionConfiguration() - .setPersistenceEnabled(true))); - } + + cfg.setGridLogger(listeningLog); + return cfg; } /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { + super.beforeTest(); stopAllGrids(); cleanPersistenceDir(); injectTestSystemOut(); - super.beforeTest(); } /** Test checkpoint command with persistence enabled. */ @Test public void testCheckpointPersistenceCluster() throws Exception { - clusterState = 0; // PDS cluster. + persistenceEnable(true); + + LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").atLeast(3).build(); + listeningLog.registerListener(checkpointFinishedLsnr); IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); @@ -71,38 +72,29 @@ public void testCheckpointPersistenceCluster() throws Exception { String out = testOut.toString(); assertFalse(out.contains(cli.localNode().id().toString())); assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); - assertTrue(out.contains("Checkpoint triggered on all nodes")); - outputContains("Checkpoint finished"); + outputContains("Checkpoint triggered on all nodes"); testOut.reset(); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); + outputContains("Checkpoint triggered on all nodes"); testOut.reset(); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); - outputContains("Checkpoint finished"); - - testOut.reset(); + outputContains("Checkpoint triggered on all nodes"); - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "30000")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); - outputContains("Checkpoint finished"); - - testOut.reset(); - - assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "planned", "--wait-for-finish", "--timeout", "5000")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); - outputContains("Checkpoint finished"); + assertTrue(checkpointFinishedLsnr.check()); } /** Test checkpoint command with in-memory cluster. */ @Test public void testCheckpointInMemoryCluster() throws Exception { - clusterState = 1; // In-memory cluster. + persistenceEnable(false); + + LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); + listeningLog.registerListener(checkpointFinishedLsnr); IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); @@ -113,23 +105,29 @@ public void testCheckpointInMemoryCluster() throws Exception { assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--checkpoint")); String out = testOut.toString(); - assertTrue(out.contains("Can't checkpoint on in-memory node")); + outputContains("Can't checkpoint on in-memory node"); assertFalse(out.contains(cli.localNode().id().toString())); assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); + + assertFalse(checkpointFinishedLsnr.check()); } - /** */ + /** Test checkpoint with timeout. */ @Test public void testCheckpointTimeout() throws Exception { - clusterState = 0; // PDS cluster. + persistenceEnable(true); + + LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); + listeningLog.registerListener(checkpointFinishedLsnr); IgniteEx srv = startGrids(1); srv.cluster().state(ClusterState.ACTIVE); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "1000")); - assertTrue(testOut.toString().contains("Checkpoint triggered on all nodes")); - outputContains("Checkpoint finished"); + outputContains("Checkpoint triggered on all nodes"); + + assertTrue(checkpointFinishedLsnr.check()); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java index 3fbd2b07602e4..036c315cace36 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -24,7 +24,7 @@ import org.apache.ignite.internal.management.api.ComputeCommand; import org.jetbrains.annotations.Nullable; -/** Checkpoint command class*/ +/** Checkpoint command. */ public class CheckpointCommand implements ComputeCommand { /** {@inheritDoc} */ @Override public Class taskClass() { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index df5a5208da704..20fa064872b84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -80,9 +80,8 @@ protected CheckpointJob(@Nullable CheckpointCommandArg arg, boolean debug) { if (timeout != null && timeout > 0) { checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); } - else { + else checkpointfut.futureFor(CheckpointState.FINISHED).get(); - } return "Checkpoint completed on node: " + ignite.localNode().id(); } else { diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output index 9bf90f38eac7a..ea2e559504a71 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output @@ -109,6 +109,14 @@ This utility can do the following commands: Parameters: --groups group1[,group2,....,groupN] - Comma-separated list of cache groups. If not set action applied to all groups. + Trigger checkpoint with optional parameters: + control.(sh|bat) --checkpoint [--reason reason] [--wait-for-finish] [--timeout timeout] + + Parameters: + --reason reason - Reason for checkpoint. + --wait-for-finish - Wait for checkpoint to finish. + --timeout timeout - Timeout in milliseconds. + Print diagnostic command help: control.(sh|bat) --diagnostic diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output index 21cef2d908e38..41b18bb08828d 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output @@ -109,6 +109,14 @@ This utility can do the following commands: Parameters: --groups group1[,group2,....,groupN] - Comma-separated list of cache groups. If not set action applied to all groups. + Trigger checkpoint with optional parameters: + control.(sh|bat) --checkpoint [--reason reason] [--wait-for-finish] [--timeout timeout] + + Parameters: + --reason reason - Reason for checkpoint. + --wait-for-finish - Wait for checkpoint to finish. + --timeout timeout - Timeout in milliseconds. + Print diagnostic command help: control.(sh|bat) --diagnostic From ecfbe6043adb28cfa89a6cab84ff80d485db933f Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Tue, 9 Dec 2025 12:42:13 +0300 Subject: [PATCH 09/26] not working test --- .../GridCommandHandlerCheckpointTest.java | 14 +++++++++++--- .../management/checkpoint/CheckpointTask.java | 19 ++++++++----------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 23926e593e1b1..ebe31534e9777 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -59,12 +59,12 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract public void testCheckpointPersistenceCluster() throws Exception { persistenceEnable(true); - LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").atLeast(3).build(); - listeningLog.registerListener(checkpointFinishedLsnr); - IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); + LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); + listeningLog.registerListener(checkpointFinishedLsnr); + srv.cluster().state(ClusterState.ACTIVE); assertEquals(EXIT_CODE_OK, execute("--checkpoint")); @@ -74,18 +74,23 @@ public void testCheckpointPersistenceCluster() throws Exception { assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); outputContains("Checkpoint triggered on all nodes"); + assertTrue(checkpointFinishedLsnr.check()); testOut.reset(); + checkpointFinishedLsnr.reset(); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); outputContains("Checkpoint triggered on all nodes"); + assertTrue(checkpointFinishedLsnr.check()); testOut.reset(); + checkpointFinishedLsnr.reset(); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); + checkpointFinishedLsnr.reset(); } /** Test checkpoint command with in-memory cluster. */ @@ -111,6 +116,7 @@ public void testCheckpointInMemoryCluster() throws Exception { assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); assertFalse(checkpointFinishedLsnr.check()); + checkpointFinishedLsnr.reset(); } /** Test checkpoint with timeout. */ @@ -128,6 +134,8 @@ public void testCheckpointTimeout() throws Exception { outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); + + checkpointFinishedLsnr.reset(); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 20fa064872b84..cb7a58b94f185 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -56,19 +56,18 @@ private static class CheckpointJob extends VisorJob 0) { + if (timeout != null && timeout > 0) checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - } else checkpointfut.futureFor(CheckpointState.FINISHED).get(); return "Checkpoint completed on node: " + ignite.localNode().id(); } - else { + else return "Checkpoint triggered on node: " + ignite.localNode().id(); - } } catch (Exception e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); From ccf2aca9b6f5927bd3aeea411d674199371bb50c Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Thu, 11 Dec 2025 12:17:15 +0300 Subject: [PATCH 10/26] fix test --- .../GridCommandHandlerCheckpointTest.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index ebe31534e9777..82eb2363768ac 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -19,9 +19,12 @@ import java.util.Objects; import java.util.regex.Pattern; + +import org.apache.ignite.IgniteCache; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; import org.junit.Test; @@ -67,6 +70,12 @@ public void testCheckpointPersistenceCluster() throws Exception { srv.cluster().state(ClusterState.ACTIVE); + IgniteCache cacheSrv = srv.getOrCreateCache(DEFAULT_CACHE_NAME); + IgniteCache cacheCli = cli.getOrCreateCache(DEFAULT_CACHE_NAME); + + cacheSrv.put(1, 1); + cacheCli.put(1, 1); + assertEquals(EXIT_CODE_OK, execute("--checkpoint")); String out = testOut.toString(); @@ -74,22 +83,28 @@ public void testCheckpointPersistenceCluster() throws Exception { assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); outputContains("Checkpoint triggered on all nodes"); - assertTrue(checkpointFinishedLsnr.check()); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); testOut.reset(); checkpointFinishedLsnr.reset(); + cacheSrv.put(2, 2); + cacheCli.put(2, 2); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); outputContains("Checkpoint triggered on all nodes"); - assertTrue(checkpointFinishedLsnr.check()); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); testOut.reset(); checkpointFinishedLsnr.reset(); + cacheSrv.put(3, 3); + cacheCli.put(3, 3); + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); outputContains("Checkpoint triggered on all nodes"); - assertTrue(checkpointFinishedLsnr.check()); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); checkpointFinishedLsnr.reset(); } From 4b5b778c8a73cc8a90fdc5e1c2d0e4fdb959c26e Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Thu, 11 Dec 2025 16:15:36 +0300 Subject: [PATCH 11/26] review fixes --- .../GridCommandHandlerCheckpointTest.java | 37 ++++++++----------- .../checkpoint/CheckpointCommand.java | 5 +-- .../checkpoint/CheckpointCommandArg.java | 8 ++-- .../management/checkpoint/CheckpointTask.java | 28 ++++++-------- 4 files changed, 33 insertions(+), 45 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 82eb2363768ac..94b7205d6e878 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -19,7 +19,6 @@ import java.util.Objects; import java.util.regex.Pattern; - import org.apache.ignite.IgniteCache; import org.apache.ignite.cluster.ClusterState; import org.apache.ignite.configuration.IgniteConfiguration; @@ -35,7 +34,10 @@ /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { /** */ - protected final ListeningTestLogger listeningLog = new ListeningTestLogger(log); + private final ListeningTestLogger listeningLog = new ListeningTestLogger(log); + + /** */ + private final LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); /** */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { @@ -44,6 +46,8 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract if (!persistenceEnable()) cfg.setDataStorageConfiguration(null); + listeningLog.registerListener(checkpointFinishedLsnr); + cfg.setGridLogger(listeningLog); return cfg; @@ -64,10 +68,6 @@ public void testCheckpointPersistenceCluster() throws Exception { IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); - - LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); - listeningLog.registerListener(checkpointFinishedLsnr); - srv.cluster().state(ClusterState.ACTIVE); IgniteCache cacheSrv = srv.getOrCreateCache(DEFAULT_CACHE_NAME); @@ -78,13 +78,13 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint")); + outputContains("Checkpoint triggered on all nodes"); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + String out = testOut.toString(); assertFalse(out.contains(cli.localNode().id().toString())); assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); - outputContains("Checkpoint triggered on all nodes"); - assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); - testOut.reset(); checkpointFinishedLsnr.reset(); @@ -92,9 +92,10 @@ public void testCheckpointPersistenceCluster() throws Exception { cacheCli.put(2, 2); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); - outputContains("Checkpoint triggered on all nodes"); + outputContains("Checkpoint triggered on all nodes"); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + testOut.reset(); checkpointFinishedLsnr.reset(); @@ -102,9 +103,10 @@ public void testCheckpointPersistenceCluster() throws Exception { cacheCli.put(3, 3); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); - outputContains("Checkpoint triggered on all nodes"); + outputContains("Checkpoint triggered on all nodes"); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + checkpointFinishedLsnr.reset(); } @@ -113,24 +115,20 @@ public void testCheckpointPersistenceCluster() throws Exception { public void testCheckpointInMemoryCluster() throws Exception { persistenceEnable(false); - LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); - listeningLog.registerListener(checkpointFinishedLsnr); - IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); - srv.cluster().state(ClusterState.ACTIVE); srv.createCache("testCache"); assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--checkpoint")); - String out = testOut.toString(); outputContains("Can't checkpoint on in-memory node"); + assertFalse(checkpointFinishedLsnr.check()); + String out = testOut.toString(); assertFalse(out.contains(cli.localNode().id().toString())); assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); - assertFalse(checkpointFinishedLsnr.check()); checkpointFinishedLsnr.reset(); } @@ -139,15 +137,12 @@ public void testCheckpointInMemoryCluster() throws Exception { public void testCheckpointTimeout() throws Exception { persistenceEnable(true); - LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); - listeningLog.registerListener(checkpointFinishedLsnr); - IgniteEx srv = startGrids(1); srv.cluster().state(ClusterState.ACTIVE); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "1000")); - outputContains("Checkpoint triggered on all nodes"); + outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); checkpointFinishedLsnr.reset(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java index 036c315cace36..8ec6746c4ff52 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -42,10 +42,7 @@ public class CheckpointCommand implements ComputeCommand nodes( - Collection nodes, - CheckpointCommandArg arg - ) { + @Override public @Nullable Collection nodes(Collection nodes, CheckpointCommandArg arg) { return CommandUtils.servers(nodes); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java index 675dd85e7a9cc..540f17f0d59c5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java @@ -39,7 +39,7 @@ public class CheckpointCommandArg extends IgniteDataTransferObject { /** */ @Argument(description = "Timeout in milliseconds", optional = true) - private Long timeout; + private long timeout = -1; /** {@inheritDoc} */ @Override protected void writeExternalData(ObjectOutput out) throws IOException { @@ -52,7 +52,7 @@ public class CheckpointCommandArg extends IgniteDataTransferObject { @Override protected void readExternalData(ObjectInput in) throws IOException, ClassNotFoundException { reason = U.readString(in); waitForFinish = in.readBoolean(); - timeout = (Long)in.readObject(); + timeout = (long)in.readObject(); } /** */ @@ -76,12 +76,12 @@ public void waitForFinish(boolean waitForFinish) { } /** */ - public Long timeout() { + public long timeout() { return timeout; } /** */ - public void timeout(Long timeout) { + public void timeout(long timeout) { this.timeout = timeout; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index cb7a58b94f185..721f7313b93cb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -21,7 +21,6 @@ import java.util.concurrent.TimeUnit; import org.apache.ignite.IgniteException; import org.apache.ignite.compute.ComputeJobResult; -import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.persistence.CheckpointState; import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointProgress; @@ -65,25 +64,22 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { if (!CU.isPersistenceEnabled(ignite.configuration())) throw new IgniteException("Can't checkpoint on in-memory node"); - String reason = arg.reason(); - boolean waitForFinish = arg.waitForFinish(); - Long timeout = arg.timeout(); - try { - GridKernalContext cctx = ignite.context(); - GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)cctx.cache().context().database(); + GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context().database(); - CheckpointProgress checkpointfut = dbMgr.forceCheckpoint(reason); + CheckpointProgress checkpointfut = dbMgr.forceCheckpoint(arg.reason()); - if (waitForFinish) { - if (timeout != null && timeout > 0) - checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - else - checkpointfut.futureFor(CheckpointState.FINISHED).get(); - return "Checkpoint completed on node: " + ignite.localNode().id(); - } - else + if (!arg.waitForFinish()) return "Checkpoint triggered on node: " + ignite.localNode().id(); + + long timeout = arg.timeout(); + + if (timeout > 0) + checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + else + checkpointfut.futureFor(CheckpointState.FINISHED).get(); + + return "Checkpoint completed on node: " + ignite.localNode().id(); } catch (Exception e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); From 369382027d4f08d386db915abc53c3c64d1d5b53 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Fri, 12 Dec 2025 16:02:09 +0300 Subject: [PATCH 12/26] review fixes --- .../GridCommandHandlerCheckpointTest.java | 7 +---- .../checkpoint/CheckpointCommandArg.java | 4 +-- .../management/checkpoint/CheckpointTask.java | 27 +++++++++---------- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 94b7205d6e878..4b9eaca362525 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -59,6 +59,7 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract stopAllGrids(); cleanPersistenceDir(); injectTestSystemOut(); + checkpointFinishedLsnr.reset(); } /** Test checkpoint command with persistence enabled. */ @@ -106,8 +107,6 @@ public void testCheckpointPersistenceCluster() throws Exception { outputContains("Checkpoint triggered on all nodes"); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); - - checkpointFinishedLsnr.reset(); } /** Test checkpoint command with in-memory cluster. */ @@ -128,8 +127,6 @@ public void testCheckpointInMemoryCluster() throws Exception { String out = testOut.toString(); assertFalse(out.contains(cli.localNode().id().toString())); assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); - - checkpointFinishedLsnr.reset(); } /** Test checkpoint with timeout. */ @@ -144,8 +141,6 @@ public void testCheckpointTimeout() throws Exception { outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); - - checkpointFinishedLsnr.reset(); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java index 540f17f0d59c5..2617c039346a3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommandArg.java @@ -45,14 +45,14 @@ public class CheckpointCommandArg extends IgniteDataTransferObject { @Override protected void writeExternalData(ObjectOutput out) throws IOException { U.writeString(out, reason); out.writeBoolean(waitForFinish); - out.writeObject(timeout); + out.writeLong(timeout); } /** {@inheritDoc} */ @Override protected void readExternalData(ObjectInput in) throws IOException, ClassNotFoundException { reason = U.readString(in); waitForFinish = in.readBoolean(); - timeout = (long)in.readObject(); + timeout = in.readLong(); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 721f7313b93cb..fd9368f2c21a1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -30,12 +30,12 @@ import org.jetbrains.annotations.Nullable; /** Checkpoint task. */ -public class CheckpointTask extends VisorMultiNodeTask { +public class CheckpointTask extends VisorMultiNodeTask { /** */ private static final long serialVersionUID = 0; /** {@inheritDoc} */ - @Override protected VisorJob job(CheckpointCommandArg arg) { + @Override protected VisorJob job(CheckpointCommandArg arg) { return new CheckpointJob(arg, false); } @@ -50,7 +50,7 @@ public class CheckpointTask extends VisorMultiNodeTask { + private static class CheckpointJob extends VisorJob { /** */ private static final long serialVersionUID = 0; @@ -60,7 +60,7 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { } /** {@inheritDoc} */ - @Override protected String run(CheckpointCommandArg arg) throws IgniteException { + @Override protected Void run(CheckpointCommandArg arg) throws IgniteException { if (!CU.isPersistenceEnabled(ignite.configuration())) throw new IgniteException("Can't checkpoint on in-memory node"); @@ -69,21 +69,20 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { CheckpointProgress checkpointfut = dbMgr.forceCheckpoint(arg.reason()); - if (!arg.waitForFinish()) - return "Checkpoint triggered on node: " + ignite.localNode().id(); + if (arg.waitForFinish()) { + long timeout = arg.timeout(); - long timeout = arg.timeout(); - - if (timeout > 0) - checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - else - checkpointfut.futureFor(CheckpointState.FINISHED).get(); - - return "Checkpoint completed on node: " + ignite.localNode().id(); + if (timeout > 0) + checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + else + checkpointfut.futureFor(CheckpointState.FINISHED).get(); + } } catch (Exception e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); } + + return null; } } } From d0c71429d361d58d237f7a2fe2e3b2b6b08cff6e Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 15 Dec 2025 14:09:30 +0300 Subject: [PATCH 13/26] review fixes 2 --- .../ignite/util/GridCommandHandlerCheckpointTest.java | 9 ++++++++- .../internal/management/checkpoint/CheckpointTask.java | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 4b9eaca362525..35fc8531765b3 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -56,9 +56,11 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { super.beforeTest(); + stopAllGrids(); cleanPersistenceDir(); injectTestSystemOut(); + checkpointFinishedLsnr.reset(); } @@ -95,7 +97,12 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); outputContains("Checkpoint triggered on all nodes"); + + LogListener checkpointReasonLsnr = LogListener.matches("test_reason").build(); + listeningLog.registerListener(checkpointReasonLsnr); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + assertTrue(GridTestUtils.waitForCondition(checkpointReasonLsnr::check, 10_000)); testOut.reset(); checkpointFinishedLsnr.reset(); @@ -106,7 +113,7 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); outputContains("Checkpoint triggered on all nodes"); - assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + assertTrue(checkpointFinishedLsnr.check()); } /** Test checkpoint command with in-memory cluster. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index fd9368f2c21a1..66bab56569b5a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.concurrent.TimeUnit; + +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.compute.ComputeJobResult; import org.apache.ignite.internal.processors.cache.persistence.CheckpointState; @@ -78,7 +80,7 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { checkpointfut.futureFor(CheckpointState.FINISHED).get(); } } - catch (Exception e) { + catch (IgniteCheckedException e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); } From 63bc9740b5cd4eda57285d276345a8689b2ef639 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 15 Dec 2025 14:26:46 +0300 Subject: [PATCH 14/26] review fixes 3 --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 2 +- .../ignite/internal/management/checkpoint/CheckpointTask.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 35fc8531765b3..28826f4cd8e3d 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -98,7 +98,7 @@ public void testCheckpointPersistenceCluster() throws Exception { outputContains("Checkpoint triggered on all nodes"); - LogListener checkpointReasonLsnr = LogListener.matches("test_reason").build(); + LogListener checkpointReasonLsnr = LogListener.matches("reason='test_reason'").build(); listeningLog.registerListener(checkpointReasonLsnr); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 66bab56569b5a..916ad94e07cc9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.concurrent.TimeUnit; - import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.compute.ComputeJobResult; From 9c5b679a2843ef7fc4c3c4ae648f7d7ba73aa4e6 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 22 Dec 2025 15:26:02 +0300 Subject: [PATCH 15/26] mixed cluster test --- .../GridCommandHandlerCheckpointTest.java | 100 +++++++++++++++--- .../management/checkpoint/CheckpointTask.java | 18 ++-- 2 files changed, 93 insertions(+), 25 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 28826f4cd8e3d..457cd3dd0b466 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -17,10 +17,11 @@ package org.apache.ignite.util; -import java.util.Objects; import java.util.regex.Pattern; import org.apache.ignite.IgniteCache; import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.testframework.GridTestUtils; @@ -29,7 +30,6 @@ import org.junit.Test; import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_OK; -import static org.apache.ignite.internal.commandline.CommandHandler.EXIT_CODE_UNEXPECTED_ERROR; /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { @@ -39,6 +39,12 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract /** */ private final LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); + /** */ + private boolean mixedConfig = false; + + /** */ + private static final String persistentRegionName = "pds-reg"; + /** */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); @@ -50,6 +56,26 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract cfg.setGridLogger(listeningLog); + if (mixedConfig) { + DataStorageConfiguration storageCfg = new DataStorageConfiguration(); + + DataRegionConfiguration dfltRegionCfg = new DataRegionConfiguration(); + dfltRegionCfg.setName("default_in_memory_region"); + dfltRegionCfg.setPersistenceEnabled(false); + + storageCfg.setDefaultDataRegionConfiguration(dfltRegionCfg); + + if (igniteInstanceName.contains("persistent_instance")) { + DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); + persistentRegionCfg.setName(persistentRegionName); + persistentRegionCfg.setPersistenceEnabled(true); + + storageCfg.setDataRegionConfigurations(persistentRegionCfg); + } + + cfg.setDataStorageConfiguration(storageCfg); + } + return cfg; } @@ -64,6 +90,14 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract checkpointFinishedLsnr.reset(); } + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + cleanPersistenceDir(); + + super.afterTest(); + } + /** Test checkpoint command with persistence enabled. */ @Test public void testCheckpointPersistenceCluster() throws Exception { @@ -81,12 +115,9 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint")); - outputContains("Checkpoint triggered on all nodes"); - assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + assertTrue(testOut.toString(), GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); - String out = testOut.toString(); - assertFalse(out.contains(cli.localNode().id().toString())); - assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); + assertFalse(testOut.toString().contains("PDS disabled")); testOut.reset(); checkpointFinishedLsnr.reset(); @@ -96,13 +127,12 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); - outputContains("Checkpoint triggered on all nodes"); - LogListener checkpointReasonLsnr = LogListener.matches("reason='test_reason'").build(); listeningLog.registerListener(checkpointReasonLsnr); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); assertTrue(GridTestUtils.waitForCondition(checkpointReasonLsnr::check, 10_000)); + assertFalse(testOut.toString().contains("PDS disabled")); testOut.reset(); checkpointFinishedLsnr.reset(); @@ -112,8 +142,8 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); - outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); + assertFalse(testOut.toString().contains("PDS disabled")); } /** Test checkpoint command with in-memory cluster. */ @@ -122,18 +152,15 @@ public void testCheckpointInMemoryCluster() throws Exception { persistenceEnable(false); IgniteEx srv = startGrids(2); - IgniteEx cli = startClientGrid("client"); + startClientGrid("client"); srv.cluster().state(ClusterState.ACTIVE); srv.createCache("testCache"); - assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--checkpoint")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint")); - outputContains("Can't checkpoint on in-memory node"); assertFalse(checkpointFinishedLsnr.check()); - String out = testOut.toString(); - assertFalse(out.contains(cli.localNode().id().toString())); - assertFalse(out.contains(Objects.toString(cli.localNode().consistentId()))); + outputContains("PDS disabled"); } /** Test checkpoint with timeout. */ @@ -146,8 +173,47 @@ public void testCheckpointTimeout() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "1000")); - outputContains("Checkpoint triggered on all nodes"); assertTrue(checkpointFinishedLsnr.check()); + + assertFalse(testOut.toString().contains("PDS disabled")); + } + + /** Mixed cluster test. */ + @Test + public void testMixedCluster() throws Exception { + mixedConfig = true; + + IgniteEx node0 = startGrid("in-memory_instance"); + node0.cluster().baselineAutoAdjustEnabled(false); + + IgniteEx node1 = startGrid("persistent_instance"); + + node0.cluster().state(ClusterState.ACTIVE); + + assertEquals(2, node0.cluster().nodes().size()); + + DataStorageConfiguration node0Storage = node0.configuration().getDataStorageConfiguration(); + DataStorageConfiguration node1Storage = node1.configuration().getDataStorageConfiguration(); + + DataRegionConfiguration node0Dflt = node0Storage.getDefaultDataRegionConfiguration(); + DataRegionConfiguration node1Dflt = node1Storage.getDefaultDataRegionConfiguration(); + + assertEquals(node0Dflt.getName(), node1Dflt.getName()); + assertEquals(node0Dflt.isPersistenceEnabled(), node1Dflt.isPersistenceEnabled()); + assertEquals(node0Dflt.getMaxSize(), node1Dflt.getMaxSize()); + + DataRegionConfiguration[] node1Regions = node1Storage.getDataRegionConfigurations(); + assertEquals(1, node1Regions.length); + + DataRegionConfiguration persistentRegion = node1Regions[0]; + assertEquals(persistentRegionName, persistentRegion.getName()); + assertEquals(true, persistentRegion.isPersistenceEnabled()); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); + + assertTrue(checkpointFinishedLsnr.check()); + outputContains("PDS disabled"); + outputContains("Checkpoint finished"); } /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 916ad94e07cc9..668088dc51781 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -31,27 +31,29 @@ import org.jetbrains.annotations.Nullable; /** Checkpoint task. */ -public class CheckpointTask extends VisorMultiNodeTask { +public class CheckpointTask extends VisorMultiNodeTask { /** */ private static final long serialVersionUID = 0; /** {@inheritDoc} */ - @Override protected VisorJob job(CheckpointCommandArg arg) { + @Override protected VisorJob job(CheckpointCommandArg arg) { return new CheckpointJob(arg, false); } /** {@inheritDoc} */ @Override protected @Nullable String reduce0(List results) throws IgniteException { + StringBuilder result = new StringBuilder(); for (ComputeJobResult res : results) { if (res.getException() != null) throw res.getException(); + result.append(res.getData().toString()).append('\n'); } - return "Checkpoint triggered on all nodes"; + return result.toString(); } /** Checkpoint job. */ - private static class CheckpointJob extends VisorJob { + private static class CheckpointJob extends VisorJob { /** */ private static final long serialVersionUID = 0; @@ -61,9 +63,9 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { } /** {@inheritDoc} */ - @Override protected Void run(CheckpointCommandArg arg) throws IgniteException { + @Override protected String run(CheckpointCommandArg arg) throws IgniteException { if (!CU.isPersistenceEnabled(ignite.configuration())) - throw new IgniteException("Can't checkpoint on in-memory node"); + return ignite.localNode().id() + ": PDS disabled, checkpoint skipped"; try { GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context().database(); @@ -77,13 +79,13 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); else checkpointfut.futureFor(CheckpointState.FINISHED).get(); + return ignite.localNode().id() + ": Checkpoint finished"; } + return ignite.localNode().id() + ": Checkpoint started"; } catch (IgniteCheckedException e) { throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); } - - return null; } } } From 101b0935b2323d71f8cec1120ecfb94ab95eff42 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 22 Dec 2025 15:42:25 +0300 Subject: [PATCH 16/26] small fix --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 457cd3dd0b466..f7588ac422fde 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -115,7 +115,7 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint")); - assertTrue(testOut.toString(), GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); assertFalse(testOut.toString().contains("PDS disabled")); From f112a29d95563eb603483ea236f5793db89a108e Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 22 Dec 2025 15:45:38 +0300 Subject: [PATCH 17/26] small fix 2 --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index f7588ac422fde..120e037f0068a 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -118,6 +118,7 @@ public void testCheckpointPersistenceCluster() throws Exception { assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); assertFalse(testOut.toString().contains("PDS disabled")); + outputContains(": Checkpoint started"); testOut.reset(); checkpointFinishedLsnr.reset(); @@ -133,6 +134,7 @@ public void testCheckpointPersistenceCluster() throws Exception { assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); assertTrue(GridTestUtils.waitForCondition(checkpointReasonLsnr::check, 10_000)); assertFalse(testOut.toString().contains("PDS disabled")); + outputContains(": Checkpoint started"); testOut.reset(); checkpointFinishedLsnr.reset(); From a814c948db4ba74f279714382b62861761530e7b Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Fri, 26 Dec 2025 13:43:57 +0300 Subject: [PATCH 18/26] newlines and nibor fixes --- .../GridCommandHandlerCheckpointTest.java | 42 ++++++++++--------- .../checkpoint/CheckpointCommand.java | 2 +- .../checkpoint/CheckpointCommandArg.java | 2 +- .../management/checkpoint/CheckpointTask.java | 16 +++++-- ...mmandHandlerClusterByClassTest_help.output | 4 +- ...ndlerClusterByClassWithSSLTest_help.output | 4 +- 6 files changed, 41 insertions(+), 29 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 120e037f0068a..8916c888c0af2 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -49,28 +49,23 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); - if (!persistenceEnable()) - cfg.setDataStorageConfiguration(null); - listeningLog.registerListener(checkpointFinishedLsnr); cfg.setGridLogger(listeningLog); + if (!persistenceEnable()) + cfg.setDataStorageConfiguration(null); + if (mixedConfig) { DataStorageConfiguration storageCfg = new DataStorageConfiguration(); - DataRegionConfiguration dfltRegionCfg = new DataRegionConfiguration(); - dfltRegionCfg.setName("default_in_memory_region"); - dfltRegionCfg.setPersistenceEnabled(false); - storageCfg.setDefaultDataRegionConfiguration(dfltRegionCfg); + storageCfg.setDefaultDataRegionConfiguration(dfltRegionCfg.setName("default_in_memory_region").setPersistenceEnabled(false)); if (igniteInstanceName.contains("persistent_instance")) { DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); - persistentRegionCfg.setName(persistentRegionName); - persistentRegionCfg.setPersistenceEnabled(true); - storageCfg.setDataRegionConfigurations(persistentRegionCfg); + storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(persistentRegionName).setPersistenceEnabled(true)); } cfg.setDataStorageConfiguration(storageCfg); @@ -105,6 +100,7 @@ public void testCheckpointPersistenceCluster() throws Exception { IgniteEx srv = startGrids(2); IgniteEx cli = startClientGrid("client"); + srv.cluster().state(ClusterState.ACTIVE); IgniteCache cacheSrv = srv.getOrCreateCache(DEFAULT_CACHE_NAME); @@ -114,13 +110,13 @@ public void testCheckpointPersistenceCluster() throws Exception { cacheCli.put(1, 1); assertEquals(EXIT_CODE_OK, execute("--checkpoint")); - assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + assertFalse(testOut.toString().contains("persistence disabled")); - assertFalse(testOut.toString().contains("PDS disabled")); outputContains(": Checkpoint started"); testOut.reset(); + checkpointFinishedLsnr.reset(); cacheSrv.put(2, 2); @@ -129,23 +125,25 @@ public void testCheckpointPersistenceCluster() throws Exception { assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); LogListener checkpointReasonLsnr = LogListener.matches("reason='test_reason'").build(); + listeningLog.registerListener(checkpointReasonLsnr); assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); assertTrue(GridTestUtils.waitForCondition(checkpointReasonLsnr::check, 10_000)); - assertFalse(testOut.toString().contains("PDS disabled")); + assertFalse(testOut.toString().contains("persistence disabled")); + outputContains(": Checkpoint started"); testOut.reset(); + checkpointFinishedLsnr.reset(); cacheSrv.put(3, 3); cacheCli.put(3, 3); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); - assertTrue(checkpointFinishedLsnr.check()); - assertFalse(testOut.toString().contains("PDS disabled")); + assertFalse(testOut.toString().contains("persistence disabled")); } /** Test checkpoint command with in-memory cluster. */ @@ -154,15 +152,17 @@ public void testCheckpointInMemoryCluster() throws Exception { persistenceEnable(false); IgniteEx srv = startGrids(2); + startClientGrid("client"); + srv.cluster().state(ClusterState.ACTIVE); srv.createCache("testCache"); - assertEquals(EXIT_CODE_OK, execute("--checkpoint")); + assertEquals(EXIT_CODE_OK, execute("--checkpoint")); assertFalse(checkpointFinishedLsnr.check()); - outputContains("PDS disabled"); + outputContains("persistence disabled"); } /** Test checkpoint with timeout. */ @@ -171,13 +171,14 @@ public void testCheckpointTimeout() throws Exception { persistenceEnable(true); IgniteEx srv = startGrids(1); + srv.cluster().state(ClusterState.ACTIVE); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "1000")); assertTrue(checkpointFinishedLsnr.check()); - assertFalse(testOut.toString().contains("PDS disabled")); + assertFalse(testOut.toString().contains("persistence disabled")); } /** Mixed cluster test. */ @@ -186,6 +187,7 @@ public void testMixedCluster() throws Exception { mixedConfig = true; IgniteEx node0 = startGrid("in-memory_instance"); + node0.cluster().baselineAutoAdjustEnabled(false); IgniteEx node1 = startGrid("persistent_instance"); @@ -208,13 +210,15 @@ public void testMixedCluster() throws Exception { assertEquals(1, node1Regions.length); DataRegionConfiguration persistentRegion = node1Regions[0]; + assertEquals(persistentRegionName, persistentRegion.getName()); assertEquals(true, persistentRegion.isPersistenceEnabled()); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); assertTrue(checkpointFinishedLsnr.check()); - outputContains("PDS disabled"); + + outputContains("persistence disabled"); outputContains("Checkpoint finished"); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java index 8ec6746c4ff52..9129c8e082075 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointCommand.java @@ -33,7 +33,7 @@ public class CheckpointCommand implements ComputeCommand results) throws IgniteException { StringBuilder result = new StringBuilder(); + for (ComputeJobResult res : results) { if (res.getException() != null) throw res.getException(); + result.append(res.getData().toString()).append('\n'); } @@ -65,7 +67,7 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { /** {@inheritDoc} */ @Override protected String run(CheckpointCommandArg arg) throws IgniteException { if (!CU.isPersistenceEnabled(ignite.configuration())) - return ignite.localNode().id() + ": PDS disabled, checkpoint skipped"; + return result("persistence disabled, checkpoint skipped"); try { GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite.context().cache().context().database(); @@ -79,13 +81,19 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); else checkpointfut.futureFor(CheckpointState.FINISHED).get(); - return ignite.localNode().id() + ": Checkpoint finished"; + + return result("Checkpoint finished"); } - return ignite.localNode().id() + ": Checkpoint started"; + + return result("Checkpoint started"); } catch (IgniteCheckedException e) { - throw new IgniteException("Failed to force checkpoint on node: " + ignite.localNode().id(), e); + throw new IgniteException(result("Failed to force checkpoint on node"), e); } } + + private String result(String desc) { + return ignite.localNode().id() + ": " + desc; + } } } diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output index ea2e559504a71..855d95bd09cca 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassTest_help.output @@ -109,11 +109,11 @@ This utility can do the following commands: Parameters: --groups group1[,group2,....,groupN] - Comma-separated list of cache groups. If not set action applied to all groups. - Trigger checkpoint with optional parameters: + Trigger checkpoint: control.(sh|bat) --checkpoint [--reason reason] [--wait-for-finish] [--timeout timeout] Parameters: - --reason reason - Reason for checkpoint. + --reason reason - Reason (visible in logs). --wait-for-finish - Wait for checkpoint to finish. --timeout timeout - Timeout in milliseconds. diff --git a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output index 41b18bb08828d..3c6121c860860 100644 --- a/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output +++ b/modules/core/src/test/resources/org.apache.ignite.util/GridCommandHandlerClusterByClassWithSSLTest_help.output @@ -109,11 +109,11 @@ This utility can do the following commands: Parameters: --groups group1[,group2,....,groupN] - Comma-separated list of cache groups. If not set action applied to all groups. - Trigger checkpoint with optional parameters: + Trigger checkpoint: control.(sh|bat) --checkpoint [--reason reason] [--wait-for-finish] [--timeout timeout] Parameters: - --reason reason - Reason for checkpoint. + --reason reason - Reason (visible in logs). --wait-for-finish - Wait for checkpoint to finish. --timeout timeout - Timeout in milliseconds. From e93f9fbf7c8b03f68900b14bd26ddf9ed6be16b1 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Fri, 26 Dec 2025 14:07:05 +0300 Subject: [PATCH 19/26] fix --- .../internal/management/checkpoint/CheckpointTask.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 05c835eca2d67..930fa0a00eefc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -92,6 +92,11 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { } } + /** + * Create result string with node id and given description + * + * @param desc info about node to be put in result. + */ private String result(String desc) { return ignite.localNode().id() + ": " + desc; } From 7cc73a12051dbcf3c5e3e362b1015e93d17970da Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Fri, 26 Dec 2025 20:37:35 +0300 Subject: [PATCH 20/26] fix 2 --- .../GridCommandHandlerCheckpointTest.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 8916c888c0af2..083222ed107f7 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -34,16 +34,16 @@ /** Test for checkpoint in control.sh command. */ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstractTest { /** */ - private final ListeningTestLogger listeningLog = new ListeningTestLogger(log); + private static final String PERSISTENT_REGION_NAME = "pds-reg"; /** */ - private final LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); + private final ListeningTestLogger listeningLog = new ListeningTestLogger(log); /** */ - private boolean mixedConfig = false; + private final LogListener checkpointFinishedLsnr = LogListener.matches("Checkpoint finished").build(); /** */ - private static final String persistentRegionName = "pds-reg"; + private boolean mixedConfig; /** */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { @@ -53,23 +53,23 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract cfg.setGridLogger(listeningLog); - if (!persistenceEnable()) - cfg.setDataStorageConfiguration(null); - if (mixedConfig) { DataStorageConfiguration storageCfg = new DataStorageConfiguration(); - DataRegionConfiguration dfltRegionCfg = new DataRegionConfiguration(); - storageCfg.setDefaultDataRegionConfiguration(dfltRegionCfg.setName("default_in_memory_region").setPersistenceEnabled(false)); + storageCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration().setName("default_in_memory_region").setPersistenceEnabled(false)); if (igniteInstanceName.contains("persistent_instance")) { DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); - storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(persistentRegionName).setPersistenceEnabled(true)); + storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(PERSISTENT_REGION_NAME).setPersistenceEnabled(true)); } cfg.setDataStorageConfiguration(storageCfg); } + else { + if (!persistenceEnable()) + cfg.setDataStorageConfiguration(null); + } return cfg; } @@ -211,7 +211,7 @@ public void testMixedCluster() throws Exception { DataRegionConfiguration persistentRegion = node1Regions[0]; - assertEquals(persistentRegionName, persistentRegion.getName()); + assertEquals(PERSISTENT_REGION_NAME, persistentRegion.getName()); assertEquals(true, persistentRegion.isPersistenceEnabled()); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); From bfa8d1750320904876a7d7fb9dbe45809450408e Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 29 Dec 2025 00:25:41 +0300 Subject: [PATCH 21/26] fix line length --- .../ignite/util/GridCommandHandlerCheckpointTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 083222ed107f7..2332f308f3079 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -56,12 +56,14 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract if (mixedConfig) { DataStorageConfiguration storageCfg = new DataStorageConfiguration(); - storageCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration().setName("default_in_memory_region").setPersistenceEnabled(false)); + storageCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration().setName("default_in_memory_region") + .setPersistenceEnabled(false)); if (igniteInstanceName.contains("persistent_instance")) { DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); - storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(PERSISTENT_REGION_NAME).setPersistenceEnabled(true)); + storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(PERSISTENT_REGION_NAME) + .setPersistenceEnabled(true)); } cfg.setDataStorageConfiguration(storageCfg); From 95f42b5cff0a03981a565d7d57a0078be7de3331 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 29 Dec 2025 13:33:40 +0300 Subject: [PATCH 22/26] formatting --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 2332f308f3079..90507274c75da 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -68,9 +68,8 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract cfg.setDataStorageConfiguration(storageCfg); } - else { - if (!persistenceEnable()) - cfg.setDataStorageConfiguration(null); + else if (!persistenceEnable()) { + cfg.setDataStorageConfiguration(null); } return cfg; From 0c7a20fc6f565504d02350c94a50f1bc89fd8bcd Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Mon, 29 Dec 2025 15:57:33 +0300 Subject: [PATCH 23/26] remove server cache --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 90507274c75da..6ad3528ed6553 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -107,7 +107,6 @@ public void testCheckpointPersistenceCluster() throws Exception { IgniteCache cacheSrv = srv.getOrCreateCache(DEFAULT_CACHE_NAME); IgniteCache cacheCli = cli.getOrCreateCache(DEFAULT_CACHE_NAME); - cacheSrv.put(1, 1); cacheCli.put(1, 1); assertEquals(EXIT_CODE_OK, execute("--checkpoint")); @@ -120,7 +119,6 @@ public void testCheckpointPersistenceCluster() throws Exception { checkpointFinishedLsnr.reset(); - cacheSrv.put(2, 2); cacheCli.put(2, 2); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--reason", "test_reason")); @@ -139,7 +137,6 @@ public void testCheckpointPersistenceCluster() throws Exception { checkpointFinishedLsnr.reset(); - cacheSrv.put(3, 3); cacheCli.put(3, 3); assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish")); From 7bfd7f4d5bd43fe9d1533699670d6c582fd01a17 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Tue, 30 Dec 2025 14:10:17 +0300 Subject: [PATCH 24/26] checkpoint timeout --- .../GridCommandHandlerCheckpointTest.java | 60 +++++++++++++++++-- .../management/checkpoint/CheckpointTask.java | 23 +++++-- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 6ad3528ed6553..0dc746b8cf8e2 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -17,6 +17,7 @@ package org.apache.ignite.util; +import java.util.concurrent.CountDownLatch; import java.util.regex.Pattern; import org.apache.ignite.IgniteCache; import org.apache.ignite.cluster.ClusterState; @@ -24,6 +25,8 @@ import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; +import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointListener; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.ListeningTestLogger; import org.apache.ignite.testframework.LogListener; @@ -45,6 +48,9 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract /** */ private boolean mixedConfig; + /** Latch for blocking checkpoint in timeout test. */ + private CountDownLatch blockCheckpointLatch; + /** */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName); @@ -57,13 +63,13 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract DataStorageConfiguration storageCfg = new DataStorageConfiguration(); storageCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration().setName("default_in_memory_region") - .setPersistenceEnabled(false)); + .setPersistenceEnabled(false)); if (igniteInstanceName.contains("persistent_instance")) { DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(PERSISTENT_REGION_NAME) - .setPersistenceEnabled(true)); + .setPersistenceEnabled(true)); } cfg.setDataStorageConfiguration(storageCfg); @@ -84,10 +90,16 @@ else if (!persistenceEnable()) { injectTestSystemOut(); checkpointFinishedLsnr.reset(); + blockCheckpointLatch = null; } /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { + // Release latch if test was interrupted + if (blockCheckpointLatch != null) { + blockCheckpointLatch.countDown(); + } + stopAllGrids(); cleanPersistenceDir(); @@ -104,7 +116,6 @@ public void testCheckpointPersistenceCluster() throws Exception { srv.cluster().state(ClusterState.ACTIVE); - IgniteCache cacheSrv = srv.getOrCreateCache(DEFAULT_CACHE_NAME); IgniteCache cacheCli = cli.getOrCreateCache(DEFAULT_CACHE_NAME); cacheCli.put(1, 1); @@ -163,7 +174,7 @@ public void testCheckpointInMemoryCluster() throws Exception { outputContains("persistence disabled"); } - /** Test checkpoint with timeout. */ + /** Test checkpoint with timeout when checkpoint completes within timeout. */ @Test public void testCheckpointTimeout() throws Exception { persistenceEnable(true); @@ -179,6 +190,47 @@ public void testCheckpointTimeout() throws Exception { assertFalse(testOut.toString().contains("persistence disabled")); } + /** Test checkpoint timeout when checkpoint doesn't complete within timeout. */ + @Test + public void testCheckpointTimeoutExceeded() throws Exception { + persistenceEnable(true); + + IgniteEx srv = startGrids(1); + + srv.cluster().state(ClusterState.ACTIVE); + + blockCheckpointLatch = new CountDownLatch(1); + + GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)srv.context().cache().context().database(); + + dbMgr.addCheckpointListener(new CheckpointListener() { + @Override public void onMarkCheckpointBegin(Context ctx) { + try { + blockCheckpointLatch.await(); + } + catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + @Override public void onCheckpointBegin(Context ctx) { + // No-op + } + + @Override public void beforeCheckpointBegin(Context ctx) { + // No-op + } + }); + + assertEquals(EXIT_CODE_OK, execute("--checkpoint", "--wait-for-finish", "--timeout", "500")); + + outputContains("Checkpoint started but not finished within timeout 500 ms"); + + blockCheckpointLatch.countDown(); + + assertTrue(GridTestUtils.waitForCondition(checkpointFinishedLsnr::check, 10_000)); + } + /** Mixed cluster test. */ @Test public void testMixedCluster() throws Exception { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index 930fa0a00eefc..fa83266fb8fa6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -22,6 +22,7 @@ import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.internal.IgniteFutureTimeoutCheckedException; import org.apache.ignite.internal.processors.cache.persistence.CheckpointState; import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; import org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointProgress; @@ -77,12 +78,24 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { if (arg.waitForFinish()) { long timeout = arg.timeout(); - if (timeout > 0) - checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - else - checkpointfut.futureFor(CheckpointState.FINISHED).get(); + try { + if (timeout > 0) { + try { + checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + } + catch (IgniteFutureTimeoutCheckedException e) { + return result("Checkpoint started but not finished within timeout " + timeout + " ms"); + } + } + else + checkpointfut.futureFor(CheckpointState.FINISHED).get(); + + return result("Checkpoint finished"); + } + catch (IgniteFutureTimeoutCheckedException e) { + return result("Checkpoint started, but not finished within timeout (" + timeout + " ms)"); + } - return result("Checkpoint finished"); } return result("Checkpoint started"); From 4b8e534c93e56e575a9250954960a340604e1ef6 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Tue, 30 Dec 2025 14:15:12 +0300 Subject: [PATCH 25/26] formatting --- .../apache/ignite/util/GridCommandHandlerCheckpointTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java index 0dc746b8cf8e2..57d384afe7977 100644 --- a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java +++ b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerCheckpointTest.java @@ -63,13 +63,13 @@ public class GridCommandHandlerCheckpointTest extends GridCommandHandlerAbstract DataStorageConfiguration storageCfg = new DataStorageConfiguration(); storageCfg.setDefaultDataRegionConfiguration(new DataRegionConfiguration().setName("default_in_memory_region") - .setPersistenceEnabled(false)); + .setPersistenceEnabled(false)); if (igniteInstanceName.contains("persistent_instance")) { DataRegionConfiguration persistentRegionCfg = new DataRegionConfiguration(); storageCfg.setDataRegionConfigurations(persistentRegionCfg.setName(PERSISTENT_REGION_NAME) - .setPersistenceEnabled(true)); + .setPersistenceEnabled(true)); } cfg.setDataStorageConfiguration(storageCfg); @@ -95,7 +95,6 @@ else if (!persistenceEnable()) { /** {@inheritDoc} */ @Override protected void afterTest() throws Exception { - // Release latch if test was interrupted if (blockCheckpointLatch != null) { blockCheckpointLatch.countDown(); } From cdaddb8c6791811e8360df00eee2b00cd4e41bb9 Mon Sep 17 00:00:00 2001 From: Maxim Pankovich Date: Tue, 30 Dec 2025 14:21:30 +0300 Subject: [PATCH 26/26] formatting 2 --- .../management/checkpoint/CheckpointTask.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java index fa83266fb8fa6..1b5f95b13fadf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/management/checkpoint/CheckpointTask.java @@ -78,24 +78,18 @@ protected CheckpointJob(CheckpointCommandArg arg, boolean debug) { if (arg.waitForFinish()) { long timeout = arg.timeout(); - try { - if (timeout > 0) { - try { - checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); - } - catch (IgniteFutureTimeoutCheckedException e) { - return result("Checkpoint started but not finished within timeout " + timeout + " ms"); - } + if (timeout > 0) { + try { + checkpointfut.futureFor(CheckpointState.FINISHED).get(timeout, TimeUnit.MILLISECONDS); + } + catch (IgniteFutureTimeoutCheckedException e) { + return result("Checkpoint started but not finished within timeout " + timeout + " ms"); } - else - checkpointfut.futureFor(CheckpointState.FINISHED).get(); - - return result("Checkpoint finished"); - } - catch (IgniteFutureTimeoutCheckedException e) { - return result("Checkpoint started, but not finished within timeout (" + timeout + " ms)"); } + else + checkpointfut.futureFor(CheckpointState.FINISHED).get(); + return result("Checkpoint finished"); } return result("Checkpoint started");