diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java index 56191e68d9ebd..e3358e5a934b2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java @@ -1029,9 +1029,15 @@ public void start( if (mntcProc.isMaintenanceMode()) { if (log.isInfoEnabled()) { - log.info( - "Node is being started in maintenance mode. " + - "Starting IsolatedDiscoverySpi instead of configured discovery SPI." + log.info(NL + + ">>> __ _____ _____ _____________ ____ _ ___________ __ ______ ___ ____" + NL + + ">>> / |/ / | / _/ |/ /_ __/ __/ |/ / | / |/ / ___/ __/ / |/ / _ \\/ _ \\/ __/" + NL + + ">>> / /|_/ / Δ |_/ // / / / / _// / Δ |/ / /__/ _/ / /|_/ / // / // / _/" + NL + + ">>> /_/ /_/_/|_/___/_/|_/ /_/ /___/_/|_/_/|_/_/|_/\\___/___/ /_/ /_/\\___/____/___/" + NL + + ">>> " + NL + + ">>> Node is being started in maintenance mode." + NL + + ">>> Starting IsolatedDiscoverySpi instead of configured discovery SPI." + NL + + ">>> " ); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/maintenance/MaintenanceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/maintenance/MaintenanceProcessor.java index f12876c7ad175..819feda56e061 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/maintenance/MaintenanceProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/maintenance/MaintenanceProcessor.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.maintenance; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; @@ -260,6 +261,11 @@ private void proceedWithMaintenance() { return activeTasks.get(maitenanceTaskName); } + /** {@inheritDoc} */ + @Override public @Nullable Map activeMaintenanceTasks() { + return activeTasks.isEmpty() ? null : Collections.unmodifiableMap(activeTasks); + } + /** {@inheritDoc} */ @Override public boolean isMaintenanceMode() { return maintenanceMode; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java index 5eb870e2e8bff..3a4b717c50cf0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java @@ -62,6 +62,8 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.maintenance.MaintenanceRegistry; +import org.apache.ignite.maintenance.MaintenanceTask; import org.apache.ignite.spi.communication.tcp.TcpCommunicationSpi; import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode; @@ -677,6 +679,7 @@ void ackNodeBasicMetrics(IgniteLogger log, IgniteEx ignite, DecimalFormat dblFmt GridKernalContext ctx = ignite.context(); IgniteConfiguration cfg = ignite.configuration(); + MaintenanceRegistry mntcProc = ctx.maintenanceRegistry(); ExecutorService execSvc = ctx.pools().getExecutorService(); ExecutorService sysExecSvc = ctx.pools().getSystemExecutorService(); @@ -736,6 +739,28 @@ void ackNodeBasicMetrics(IgniteLogger log, IgniteEx ignite, DecimalFormat dblFmt if (cfg.getCommunicationSpi() instanceof TcpCommunicationSpi) netDetails += ", commPort=" + ((TcpCommunicationSpi)cfg.getCommunicationSpi()).boundPort(); + SB maintModeInfo = new SB(""); + + if (mntcProc.isMaintenanceMode()) { + Map activeTasks = mntcProc.activeMaintenanceTasks(); + + maintModeInfo.a("ATTENTION! Node is in Maintenance Mode").nl(); + + if (activeTasks != null) { + int i = 1; + maintModeInfo.a("Active tasks:").nl(); + for (MaintenanceTask task : activeTasks.values()) { + maintModeInfo.a(i == 1 ? " - - - - - - - - - - - - - - -\n" : ""); + maintModeInfo.a(" ").a(i++).a(" Task name: ").a(task.name()).nl(); + maintModeInfo.a(" Description: ").a(task.description()).nl(); + maintModeInfo.a(" Task params: ").a(task.parameters()).nl(); + maintModeInfo.a(" - - - - - - - - - - - - - - -").nl(); + } + } + + log.info(maintModeInfo.toString()); + } + SB msg = new SB(); msg.nl() diff --git a/modules/core/src/main/java/org/apache/ignite/maintenance/MaintenanceRegistry.java b/modules/core/src/main/java/org/apache/ignite/maintenance/MaintenanceRegistry.java index e1f84246974d5..c16319f6ab879 100644 --- a/modules/core/src/main/java/org/apache/ignite/maintenance/MaintenanceRegistry.java +++ b/modules/core/src/main/java/org/apache/ignite/maintenance/MaintenanceRegistry.java @@ -18,6 +18,7 @@ package org.apache.ignite.maintenance; import java.util.List; +import java.util.Map; import java.util.function.UnaryOperator; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; @@ -139,6 +140,17 @@ public void registerMaintenanceTask( */ @Nullable public MaintenanceTask activeMaintenanceTask(String maintenanceTaskName); + /** + * Returns all active {@link MaintenanceTask}s. + * Active tasks exist only when the node has entered Maintenance Mode. + *

+ * A {@link MaintenanceTask} becomes active when node enters Maintenance Mode but doesn't complete its preparation + * phase within the maintenance window. + * + * @return a Map containing all {@link MaintenanceTask}s objects or null if no maintenance tasks were present. + */ + @Nullable public Map activeMaintenanceTasks(); + /** * Registers {@link MaintenanceWorkflowCallback} for a {@link MaintenanceTask} with a given name. *