This is an automated email from the ASF dual-hosted git repository.

timoninmaxim pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 38ab8cf8736 IGNITE-27457 Add output for enable/disable WAL commands 
(#12711)
38ab8cf8736 is described below

commit 38ab8cf87368ae3632f2c177b4b37196bc2a919f
Author: Maksim Timonin <[email protected]>
AuthorDate: Thu Feb 12 11:46:54 2026 +0300

    IGNITE-27457 Add output for enable/disable WAL commands (#12711)
---
 .../ignite/util/GridCommandHandlerWalTest.java     | 80 +++++++++++++++++----
 .../internal/management/wal/WalDisableCommand.java |  8 ++-
 .../internal/management/wal/WalEnableCommand.java  |  8 ++-
 .../internal/management/wal/WalSetStateTask.java   | 52 ++++++++------
 .../management/wal/WalSetStateTaskResult.java      | 81 ++++++++++++++++++++++
 5 files changed, 195 insertions(+), 34 deletions(-)

diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWalTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWalTest.java
index 4417847b18d..615d0bde022 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWalTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerWalTest.java
@@ -184,22 +184,78 @@ public class GridCommandHandlerWalTest extends 
GridCommandHandlerAbstractTest {
         srv.cluster().state(ClusterState.ACTIVE);
 
         srv.createCache(new CacheConfiguration<>("cache1")
-            .setGroupName("testGroup"));
+            .setGroupName("group1"));
         srv.createCache(new CacheConfiguration<>("cache2")
-            .setGroupName("testGroup"));
+            .setGroupName("group1"));
+        srv.createCache(new CacheConfiguration<>("cache3")
+            .setGroupName("group2"));
+        srv.createCache("cache4");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"group1,group2,cache4"));
+        outputContains(".*group1.*true.*true.*true.*true.*false");
+        outputContains(".*group2.*true.*true.*true.*true.*false");
+        outputContains(".*cache4.*true.*true.*true.*true.*false");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "disable", "--groups", 
"group1"));
+        outputContains("Successfully disabled WAL for groups:");
+        outputContains("group1");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"group1"));
+        outputContains(".*group1.*true.*false.*true.*true.*false");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "disable", "--groups", 
"group1,group2"));
+        outputContains("Successfully disabled WAL for groups:");
+        outputContains("group1");
+        outputContains("group2");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"group1,group2"));
+        outputContains(".*group1.*true.*false.*true.*true.*false");
+        outputContains(".*group2.*true.*false.*true.*true.*false");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "disable", "--groups", 
"cache4,nonExistentGroup"));
+        outputContains("Successfully disabled WAL for groups:");
+        outputContains("cache4");
+        outputContains("Failed to disable WAL for groups:");
+        outputContains("nonExistentGroup - Cache group not found");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"cache4"));
+        outputContains(".*cache4.*true.*false.*true.*true.*false");
+
+        // Error when using cache name instead of group name.
+        assertEquals(EXIT_CODE_OK, execute("--wal", "enable", "--groups", 
"cache3"));
+        outputContains("Failed to enable WAL for groups:");
+        outputContains("cache3 - Cache group not found");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "enable", "--groups", 
"group2,cache4"));
+        outputContains("Successfully enabled WAL for groups:");
+        outputContains("group2");
+        outputContains("cache4");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"group2,cache4"));
+        outputContains(".*group2.*true.*true.*true.*true.*false");
+        outputContains(".*cache4.*true.*true.*true.*true.*false");
+
+        assertEquals(EXIT_CODE_OK, execute("--wal", "disable"));
+        outputContains("Successfully disabled WAL for groups:");
+        outputContains("group1");
+        outputContains("group2");
+        outputContains("cache4");
 
-        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"testGroup"));
-        outputContains(".*testGroup.*true.*true.*true.*true.*false");
-
-        assertEquals(EXIT_CODE_OK, execute("--wal", "disable", "--groups", 
"testGroup"));
-
-        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"testGroup"));
-        outputContains(".*testGroup.*true.*false.*true.*true.*false");
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state"));
+        outputContains(".*group1.*true.*false.*true.*true.*false");
+        outputContains(".*group2.*true.*false.*true.*true.*false");
+        outputContains(".*cache4.*true.*false.*true.*true.*false");
 
-        assertEquals(EXIT_CODE_OK, execute("--wal", "enable", "--groups", 
"testGroup"));
+        assertEquals(EXIT_CODE_OK, execute("--wal", "enable"));
+        outputContains("Successfully enabled WAL for groups:");
+        outputContains("group1");
+        outputContains("group2");
+        outputContains("cache4");
 
-        assertEquals(EXIT_CODE_OK, execute("--wal", "state", "--groups", 
"testGroup"));
-        outputContains(".*testGroup.*true.*true.*true.*true.*false");
+        assertEquals(EXIT_CODE_OK, execute("--wal", "state"));
+        outputContains(".*group1.*true.*true.*true.*true.*false");
+        outputContains(".*group2.*true.*true.*true.*true.*false");
+        outputContains(".*cache4.*true.*true.*true.*true.*false");
     }
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalDisableCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalDisableCommand.java
index 9802dc31864..3e3208d93bb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalDisableCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalDisableCommand.java
@@ -17,10 +17,11 @@
 
 package org.apache.ignite.internal.management.wal;
 
+import java.util.function.Consumer;
 import org.apache.ignite.internal.management.api.ComputeCommand;
 
 /** */
-public class WalDisableCommand implements 
ComputeCommand<WalDisableCommand.WalDisableCommandArg, Void> {
+public class WalDisableCommand implements 
ComputeCommand<WalDisableCommand.WalDisableCommandArg, WalSetStateTaskResult> {
     /** {@inheritDoc} */
     @Override public Class<WalSetStateTask> taskClass() {
         return WalSetStateTask.class;
@@ -41,6 +42,11 @@ public class WalDisableCommand implements 
ComputeCommand<WalDisableCommand.WalDi
         return "Are you sure? Any node failure without WAL can lead to the 
loss of all PDS data. CDC events will be lost without WAL.";
     }
 
+    /** {@inheritDoc} */
+    @Override public void printResult(WalDisableCommandArg arg, 
WalSetStateTaskResult res, Consumer<String> printer) {
+        res.print(false, printer);
+    }
+
     /** */
     public static class WalDisableCommandArg extends WalStateCommandArg {
         /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalEnableCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalEnableCommand.java
index 950f416e54a..96f8284c72e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalEnableCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalEnableCommand.java
@@ -17,11 +17,12 @@
 
 package org.apache.ignite.internal.management.wal;
 
+import java.util.function.Consumer;
 import org.apache.ignite.internal.management.api.ComputeCommand;
 import 
org.apache.ignite.internal.management.wal.WalDisableCommand.WalDisableCommandArg;
 
 /** */
-public class WalEnableCommand implements ComputeCommand<WalDisableCommandArg, 
Void> {
+public class WalEnableCommand implements ComputeCommand<WalDisableCommandArg, 
WalSetStateTaskResult> {
     /** {@inheritDoc} */
     @Override public Class<WalSetStateTask> taskClass() {
         return WalSetStateTask.class;
@@ -37,6 +38,11 @@ public class WalEnableCommand implements 
ComputeCommand<WalDisableCommandArg, Vo
         return WalEnableCommandArg.class;
     }
 
+    /** {@inheritDoc} */
+    @Override public void printResult(WalDisableCommandArg arg, 
WalSetStateTaskResult res, Consumer<String> printer) {
+        res.print(true, printer);
+    }
+
     /** */
     public static class WalEnableCommandArg extends WalDisableCommandArg {
         /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTask.java
index 017dd729bb5..af71cb07e78 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTask.java
@@ -17,37 +17,34 @@
 
 package org.apache.ignite.internal.management.wal;
 
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import org.apache.ignite.IgniteException;
-import org.apache.ignite.compute.ComputeJobResult;
 import 
org.apache.ignite.internal.management.wal.WalDisableCommand.WalDisableCommandArg;
 import 
org.apache.ignite.internal.management.wal.WalEnableCommand.WalEnableCommandArg;
 import org.apache.ignite.internal.processors.cache.CacheGroupContext;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.visor.VisorJob;
-import org.apache.ignite.internal.visor.VisorMultiNodeTask;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class WalSetStateTask extends VisorMultiNodeTask<WalDisableCommandArg, 
Void, Void> {
+public class WalSetStateTask extends VisorOneNodeTask<WalDisableCommandArg, 
WalSetStateTaskResult> {
     /** */
     private static final long serialVersionUID = 0;
 
     /** {@inheritDoc} */
-    @Override protected VisorJob<WalDisableCommandArg, Void> 
job(WalDisableCommandArg arg) {
-        return new WalDisableJob(arg, false);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected @Nullable Void reduce0(List<ComputeJobResult> res) 
throws IgniteException {
-        return null;
+    @Override protected VisorJob<WalDisableCommandArg, WalSetStateTaskResult> 
job(WalDisableCommandArg arg) {
+        return new WalDisableJob(arg, debug);
     }
 
     /** */
-    private static class WalDisableJob extends VisorJob<WalDisableCommandArg, 
Void> {
+    private static class WalDisableJob extends VisorJob<WalDisableCommandArg, 
WalSetStateTaskResult> {
         /** */
         private static final long serialVersionUID = 0;
 
@@ -57,22 +54,37 @@ public class WalSetStateTask extends 
VisorMultiNodeTask<WalDisableCommandArg, Vo
         }
 
         /** {@inheritDoc} */
-        @Override protected Void run(@Nullable WalDisableCommandArg arg) 
throws IgniteException {
-            Set<String> grps = F.isEmpty(arg.groups()) ? null : new 
HashSet<>(Arrays.asList(arg.groups()));
+        @Override protected WalSetStateTaskResult run(@Nullable 
WalDisableCommandArg arg) throws IgniteException {
+            Set<String> grps = arg.groups == null ? null : 
Arrays.stream(arg.groups).collect(Collectors.toSet());
+
+            List<String> successGrps = new ArrayList<>();
+            Map<String, String> failedGrps = new HashMap<>();
 
             for (CacheGroupContext gctx : 
ignite.context().cache().cacheGroups()) {
                 String grpName = gctx.cacheOrGroupName();
 
-                if (grps != null && !grps.contains(grpName))
+                if (grps != null && !grps.remove(grpName))
                     continue;
 
-                if (arg instanceof WalEnableCommandArg)
-                    ignite.cluster().enableWal(grpName);
-                else
-                    ignite.cluster().disableWal(grpName);
+                try {
+                    if (arg instanceof WalEnableCommandArg)
+                        ignite.cluster().enableWal(grpName);
+                    else
+                        ignite.cluster().disableWal(grpName);
+
+                    successGrps.add(grpName);
+                }
+                catch (IgniteException e) {
+                    failedGrps.put(grpName, e.getMessage());
+                }
+            }
+
+            if (!F.isEmpty(grps)) {
+                for (String grp: grps)
+                    failedGrps.put(grp, "Cache group not found");
             }
 
-            return null;
+            return new WalSetStateTaskResult(successGrps, failedGrps);
         }
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTaskResult.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTaskResult.java
new file mode 100644
index 00000000000..53e0f8baad9
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/wal/WalSetStateTaskResult.java
@@ -0,0 +1,81 @@
+/*
+ * 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.wal;
+
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+import org.apache.ignite.internal.util.typedef.F;
+
+/**
+ * Result of WAL enable/disable operation.
+ */
+public class WalSetStateTaskResult extends IgniteDataTransferObject {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** Successfully processed groups. */
+    @Order(0)
+    List<String> successGrps;
+
+    /** Errors by group name. */
+    @Order(1)
+    Map<String, String> errorsByGrp;
+
+    /** Default constructor. */
+    public WalSetStateTaskResult() {
+        // No-op.
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param successGrps Successfully processed groups.
+     * @param errorsByGrp Error messages.
+     */
+    public WalSetStateTaskResult(List<String> successGrps, Map<String, String> 
errorsByGrp) {
+        this.successGrps = successGrps;
+        this.errorsByGrp = errorsByGrp;
+    }
+
+    /**
+     * Print WAL disable/enable command result.
+     *
+     * @param enable If {@code true} then "enable" operation, otherwise 
"disable".
+     * @param printer Output consumer.
+     */
+    void print(boolean enable, Consumer<String> printer) {
+        String op = enable ? "enable" : "disable";
+
+        if (!successGrps.isEmpty()) {
+            printer.accept("Successfully " + op + "d WAL for groups:");
+
+            for (String grp : successGrps)
+                printer.accept("  " + grp);
+        }
+
+        if (!F.isEmpty(errorsByGrp)) {
+            printer.accept("Failed to " + op + " WAL for groups:");
+
+            for (Map.Entry<String, String> entry : errorsByGrp.entrySet())
+                printer.accept("  " + entry.getKey() + " - " + 
entry.getValue());
+        }
+    }
+}

Reply via email to