This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch gg-19225 in repository https://gitbox.apache.org/repos/asf/ignite.git
commit b1f748b68cebc4fd8571c2e7115e28ada30fd81c Author: vmalin <[email protected]> AuthorDate: Tue Jun 4 11:37:30 2019 +0300 GG-13964 control.sh should log actions performed --- .../internal/commandline/ActivateCommand.java | 16 ++- .../internal/commandline/BaselineCommand.java | 57 +++++---- .../ignite/internal/commandline/Command.java | 19 ++- .../internal/commandline/CommandHandler.java | 141 ++++++++++++++------- .../ignite/internal/commandline/CommandList.java | 7 + .../ignite/internal/commandline/CommandLogger.java | 61 ++++++--- .../internal/commandline/DeactivateCommand.java | 16 ++- .../ignite/internal/commandline/StateCommand.java | 16 ++- .../ignite/internal/commandline/TxCommands.java | 103 ++++++++------- .../ignite/internal/commandline/WalCommands.java | 55 ++++---- .../internal/commandline/cache/CacheCommands.java | 65 +++++----- .../commandline/cache/CacheContention.java | 14 +- .../commandline/cache/CacheDistribution.java | 14 +- .../commandline/cache/CacheValidateIndexes.java | 33 +++-- .../internal/commandline/cache/CacheViewer.java | 29 +++-- .../commandline/cache/FindAndDeleteGarbage.java | 23 ++-- .../internal/commandline/cache/IdleVerify.java | 31 +++-- .../commandline/cache/ResetLostPartitions.java | 13 +- .../ignite/logger/java/JavaLoggerFileHandler.java | 2 +- .../util/GridCommandHandlerAbstractTest.java | 13 +- .../apache/ignite/util/GridCommandHandlerTest.java | 32 +++-- 21 files changed, 471 insertions(+), 289 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java index 2bdac5f..998360a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/ActivateCommand.java @@ -16,6 +16,7 @@ package org.apache.ignite.internal.commandline; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; @@ -28,8 +29,8 @@ import static org.apache.ignite.internal.commandline.CommandList.ACTIVATE; */ public class ActivateCommand implements Command<Void> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { - Command.usage(logger, "Activate cluster:", ACTIVATE); + @Override public void printUsage() { + Command.usage("Activate cluster:", ACTIVATE); } /** @@ -38,16 +39,16 @@ public class ActivateCommand implements Command<Void> { * @param cfg Client configuration. * @throws GridClientException If failed to activate. */ - @Override public Object execute(GridClientConfiguration cfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration cfg, Logger logger) throws Exception { try (GridClient client = Command.startClient(cfg)) { GridClientClusterState state = client.state(); state.active(true); - logger.log("Cluster activated"); + logger.info("Cluster activated"); } catch (Throwable e) { - logger.log("Failed to activate cluster."); + logger.severe("Failed to activate cluster."); throw e; } @@ -59,4 +60,9 @@ public class ActivateCommand implements Command<Void> { @Override public Void arg() { return null; } + + /** {@inheritDoc} */ + @Override public String name() { + return ACTIVATE.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java index e5940cb..3ba6e2c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/BaselineCommand.java @@ -22,6 +22,7 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.baseline.BaselineArguments; @@ -47,17 +48,17 @@ public class BaselineCommand implements Command<BaselineArguments> { private BaselineArguments baselineArgs; /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { final String constistIds = "consistentId1[,consistentId2,....,consistentIdN]"; - Command.usage(logger, "Print cluster baseline topology:", BASELINE); - Command.usage(logger, "Add nodes into baseline topology:", BASELINE, BaselineSubcommands.ADD.text(), + Command.usage("Print cluster baseline topology:", BASELINE); + Command.usage("Add nodes into baseline topology:", BASELINE, BaselineSubcommands.ADD.text(), constistIds, optional(CMD_AUTO_CONFIRMATION)); - Command.usage(logger, "Remove nodes from baseline topology:", BASELINE, BaselineSubcommands.REMOVE.text(), + Command.usage("Remove nodes from baseline topology:", BASELINE, BaselineSubcommands.REMOVE.text(), constistIds, optional(CMD_AUTO_CONFIRMATION)); - Command.usage(logger, "Set baseline topology:", BASELINE, BaselineSubcommands.SET.text(), constistIds, + Command.usage("Set baseline topology:", BASELINE, BaselineSubcommands.SET.text(), constistIds, optional(CMD_AUTO_CONFIRMATION)); - Command.usage(logger, "Set baseline topology based on version:", BASELINE, + Command.usage("Set baseline topology based on version:", BASELINE, BaselineSubcommands.VERSION.text() + " topologyVersion", optional(CMD_AUTO_CONFIRMATION)); } @@ -76,14 +77,15 @@ public class BaselineCommand implements Command<BaselineArguments> { * @param clientCfg Client configuration. * @throws Exception If failed to execute baseline action. */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { VisorBaselineTaskResult res = executeTask(client, VisorBaselineTask.class, toVisorArguments(baselineArgs), clientCfg); - baselinePrint0(res, logger); + baselinePrint0(res); } catch (Throwable e) { - logger.error("Failed to execute baseline command='" + baselineArgs.getCmd().text() + "'", e); + logger.severe("Failed to execute baseline command='" + baselineArgs.getCmd().text() + "'"); + logger.severe(CommandLogger.errorMessage(e)); throw e; } @@ -111,11 +113,11 @@ public class BaselineCommand implements Command<BaselineArguments> { * * @param res Task result with baseline topology. */ - private void baselinePrint0(VisorBaselineTaskResult res, CommandLogger logger) { - logger.log("Cluster state: " + (res.isActive() ? "active" : "inactive")); - logger.log("Current topology version: " + res.getTopologyVersion()); + private void baselinePrint0(VisorBaselineTaskResult res) { + CommandLogger.log("Cluster state: " + (res.isActive() ? "active" : "inactive")); + CommandLogger.log("Current topology version: " + res.getTopologyVersion()); - logger.nl(); + CommandLogger.nl(); Map<String, VisorBaselineNode> baseline = res.getBaseline(); @@ -131,13 +133,13 @@ public class BaselineCommand implements Command<BaselineArguments> { .map(crd -> " (Coordinator: ConsistentId=" + crd.getConsistentId() + ", Order=" + crd.getOrder() + ")") .orElse(""); - logger.log("Current topology version: " + res.getTopologyVersion() + crdStr); - logger.nl(); + CommandLogger.log("Current topology version: " + res.getTopologyVersion() + crdStr); + CommandLogger.nl(); if (F.isEmpty(baseline)) - logger.log("Baseline nodes not found."); + CommandLogger.log("Baseline nodes not found."); else { - logger.log("Baseline nodes:"); + CommandLogger.log("Baseline nodes:"); for (VisorBaselineNode node : baseline.values()) { VisorBaselineNode srvNode = srvs.get(node.getConsistentId()); @@ -146,13 +148,13 @@ public class BaselineCommand implements Command<BaselineArguments> { String order = srvNode != null ? ", Order=" + srvNode.getOrder() : ""; - logger.logWithIndent("ConsistentId=" + node.getConsistentId() + state + order, 2); + CommandLogger.logWithIndent("ConsistentId=" + node.getConsistentId() + state + order, 2); } - logger.log(DELIM); - logger.log("Number of baseline nodes: " + baseline.size()); + CommandLogger.log(DELIM); + CommandLogger.log("Number of baseline nodes: " + baseline.size()); - logger.nl(); + CommandLogger.nl(); List<VisorBaselineNode> others = new ArrayList<>(); @@ -162,14 +164,14 @@ public class BaselineCommand implements Command<BaselineArguments> { } if (F.isEmpty(others)) - logger.log("Other nodes not found."); + CommandLogger.log("Other nodes not found."); else { - logger.log("Other nodes:"); + CommandLogger.log("Other nodes:"); for (VisorBaselineNode node : others) - logger.logWithIndent("ConsistentId=" + node.getConsistentId() + ", Order=" + node.getOrder(), 2); + CommandLogger.logWithIndent("ConsistentId=" + node.getConsistentId() + ", Order=" + node.getOrder(), 2); - logger.log("Number of other nodes: " + others.size()); + CommandLogger.log("Number of other nodes: " + others.size()); } } } @@ -210,4 +212,9 @@ public class BaselineCommand implements Command<BaselineArguments> { this.baselineArgs = baselineArgs.build(); } + + /** {@inheritDoc} */ + @Override public String name() { + return BASELINE.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java index 34b130d..a7cdcfe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Command.java @@ -16,6 +16,7 @@ package org.apache.ignite.internal.commandline; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientFactory; @@ -52,10 +53,10 @@ public interface Command<T> { * @param desc Command description. * @param args Arguments. */ - public static void usage(CommandLogger logger, String desc, CommandList cmd, String... args) { - logger.logWithIndent(desc); - logger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, cmd, CommandLogger.join(" ", args)), 2); - logger.nl(); + public static void usage(String desc, CommandList cmd, String... args) { + CommandLogger.logWithIndent(desc); + CommandLogger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, cmd, CommandLogger.join(" ", args)), 2); + CommandLogger.nl(); } /** @@ -66,7 +67,7 @@ public interface Command<T> { * @return Result of operation (mostly usable for tests). * @throws Exception If error occur. */ - public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception; + public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception; /** * @return Message text to show user for. If null it means that confirmantion is not needed. @@ -92,7 +93,11 @@ public interface Command<T> { /** * Print info for user about command (parameters, use cases and so on). * - * @param logger Would be used as output. */ - public void printUsage(CommandLogger logger); + public void printUsage(); + + /** + * @return command name. + */ + String name(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java index 98a8ddc..d3c7e34 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java @@ -16,11 +16,16 @@ package org.apache.ignite.internal.commandline; +import java.io.File; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Scanner; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.StreamHandler; import java.util.stream.Collectors; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.client.GridClientAuthenticationException; @@ -33,6 +38,9 @@ import org.apache.ignite.internal.client.impl.connection.GridClientConnectionRes import org.apache.ignite.internal.client.ssl.GridSslBasicContextFactory; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.X; +import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.logger.java.JavaLoggerFileHandler; +import org.apache.ignite.logger.java.JavaLoggerFormatter; import org.apache.ignite.plugin.security.SecurityCredentials; import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider; import org.apache.ignite.plugin.security.SecurityCredentialsProvider; @@ -52,8 +60,37 @@ import static org.apache.ignite.ssl.SslContextFactory.DFLT_SSL_PROTOCOL; * Class that execute several commands passed via command line. */ public class CommandHandler { - /** Logger. */ - private final CommandLogger logger = new CommandLogger(); + /** Command logger. */ + private final CommandLogger commandLogger= new CommandLogger(); + + /** JULs logger. */ + private final Logger logger = setupJavaLogger(); + + private Logger setupJavaLogger() { + Logger result; + + result = Logger.getLogger(getClass().getName()); + result.setLevel(Level.INFO); + + // Adding logging to file. + try { + String namePattern = "control-utility-%g.log"; + String absPathPattern; + absPathPattern = new File(JavaLoggerFileHandler.logDirectory(U.defaultWorkDirectory()), namePattern).getAbsolutePath(); + FileHandler fileHandler = new FileHandler(absPathPattern, 1024 * 1024 * 1024, 5); + fileHandler.setFormatter(new JavaLoggerFormatter()); + result.addHandler(fileHandler); + } + catch (Exception e) { + System.out.println("Failed to configure logging to file"); + } + + // Adding logging to console. + StreamHandler streamHandler = new StreamHandler(System.out, new JavaLoggerFormatter()); + result.addHandler(streamHandler); + + return result; + } /** */ static final String CMD_HELP = "--help"; @@ -116,11 +153,13 @@ public class CommandHandler { * @return Exit code. */ public int execute(List<String> rawArgs) { - logger.log("Control utility [ver. " + ACK_VER_STR + "]"); - logger.log(COPYRIGHT); - logger.log("User: " + System.getProperty("user.name")); - logger.log("Time: " + LocalDateTime.now()); - logger.log(DELIM); + logger.info("Control utility [ver. " + ACK_VER_STR + "]"); + logger.info(COPYRIGHT); + logger.info("User: " + System.getProperty("user.name")); + logger.info("Time: " + LocalDateTime.now()); + logger.info(DELIM); + + String commandName = ""; try { if (F.isEmpty(rawArgs) || (rawArgs.size() == 1 && CMD_HELP.equalsIgnoreCase(rawArgs.get(0)))) { @@ -129,12 +168,13 @@ public class CommandHandler { return EXIT_CODE_OK; } - ConnectionAndSslParameters args = new CommonArgParser(logger).parseAndValidate(rawArgs.iterator()); + ConnectionAndSslParameters args = new CommonArgParser(commandLogger).parseAndValidate(rawArgs.iterator()); Command command = args.command(); + commandName = command.name(); if (!args.autoConfirmation() && !confirm(command.confirmationPrompt())) { - logger.log("Operation cancelled."); + logger.info("Operation cancelled."); return EXIT_CODE_OK; } @@ -151,11 +191,13 @@ public class CommandHandler { tryConnectAgain = false; try { + logger.info("Command [" + commandName + "] started"); + logger.info("Arguments: " + String.join(" ", rawArgs)); lastOperationRes = command.execute(clientCfg, logger); } catch (Throwable e) { if (tryConnectMaxCount > 0 && isAuthError(e)) { - logger.log(suppliedAuth ? + logger.info(suppliedAuth ? "Authentication error, please try again." : "This cluster requires authentication."); @@ -181,27 +223,32 @@ public class CommandHandler { } } + logger.info("Command [" + commandName + "] finished with code: " + EXIT_CODE_OK); return EXIT_CODE_OK; } catch (IllegalArgumentException e) { - logger.error("Check arguments.", e); + logger.severe("Check arguments. " + CommandLogger.errorMessage(e)); + logger.info("Command [" + commandName + "] finished with code: " + EXIT_CODE_INVALID_ARGUMENTS); return EXIT_CODE_INVALID_ARGUMENTS; } catch (Throwable e) { if (isAuthError(e)) { - logger.error("Authentication error.", e); + logger.severe("Authentication error. " + CommandLogger.errorMessage(e)); + logger.info("Command [" + commandName + "] finished with code: " + ERR_AUTHENTICATION_FAILED); return ERR_AUTHENTICATION_FAILED; } if (isConnectionError(e)) { - logger.error("Connection to cluster failed.", e); + logger.severe("Connection to cluster failed. " + CommandLogger.errorMessage(e)); + logger.info("Command [" + commandName + "] finished with code: " + EXIT_CODE_CONNECTION_FAILED); return EXIT_CODE_CONNECTION_FAILED; } - logger.error("", e); + logger.severe(CommandLogger.errorMessage(e)); + logger.info("Command [" + commandName + "] finished with code: " + EXIT_CODE_UNEXPECTED_ERROR); return EXIT_CODE_UNEXPECTED_ERROR; } @@ -396,7 +443,7 @@ public class CommandHandler { else { Scanner scanner = new Scanner(System.in); - logger.log(msg); + commandLogger.log(msg); return scanner.nextLine(); } @@ -421,40 +468,40 @@ public class CommandHandler { /** */ private void printHelp() { - logger.log("Control.sh is used to execute admin commands on cluster or get common cluster info. " + + commandLogger.log("Control.sh is used to execute admin commands on cluster or get common cluster info. " + "The command has the following syntax:"); - logger.nl(); + commandLogger.nl(); - logger.logWithIndent(CommandLogger.join(" ", CommandLogger.join(" ", UTILITY_NAME, CommandLogger.join(" ", getCommonOptions())), + commandLogger.logWithIndent(CommandLogger.join(" ", CommandLogger.join(" ", UTILITY_NAME, CommandLogger.join(" ", getCommonOptions())), optional("command"), "<command_parameters>")); - logger.nl(); - logger.nl(); - - logger.log("This utility can do the following commands:"); - - Arrays.stream(CommandList.values()).forEach(c -> c.command().printUsage(logger)); - - logger.log("By default commands affecting the cluster require interactive confirmation."); - logger.log("Use " + CMD_AUTO_CONFIRMATION + " option to disable it."); - logger.nl(); - - logger.log("Default values:"); - logger.logWithIndent("HOST_OR_IP=" + DFLT_HOST, 2); - logger.logWithIndent("PORT=" + DFLT_PORT, 2); - logger.logWithIndent("PING_INTERVAL=" + DFLT_PING_INTERVAL, 2); - logger.logWithIndent("PING_TIMEOUT=" + DFLT_PING_TIMEOUT, 2); - logger.logWithIndent("SSL_PROTOCOL=" + SslContextFactory.DFLT_SSL_PROTOCOL, 2); - logger.logWithIndent("SSL_KEY_ALGORITHM=" + SslContextFactory.DFLT_KEY_ALGORITHM, 2); - logger.logWithIndent("KEYSTORE_TYPE=" + SslContextFactory.DFLT_STORE_TYPE, 2); - logger.logWithIndent("TRUSTSTORE_TYPE=" + SslContextFactory.DFLT_STORE_TYPE, 2); - - logger.nl(); - - logger.log("Exit codes:"); - logger.logWithIndent(EXIT_CODE_OK + " - successful execution.", 2); - logger.logWithIndent(EXIT_CODE_INVALID_ARGUMENTS + " - invalid arguments.", 2); - logger.logWithIndent(EXIT_CODE_CONNECTION_FAILED + " - connection failed.", 2); - logger.logWithIndent(ERR_AUTHENTICATION_FAILED + " - authentication failed.", 2); - logger.logWithIndent(EXIT_CODE_UNEXPECTED_ERROR + " - unexpected error.", 2); + commandLogger.nl(); + commandLogger.nl(); + + commandLogger.log("This utility can do the following commands:"); + + Arrays.stream(CommandList.values()).forEach(c -> c.command().printUsage()); + + commandLogger.log("By default commands affecting the cluster require interactive confirmation."); + commandLogger.log("Use " + CMD_AUTO_CONFIRMATION + " option to disable it."); + commandLogger.nl(); + + commandLogger.log("Default values:"); + commandLogger.logWithIndent("HOST_OR_IP=" + DFLT_HOST, 2); + commandLogger.logWithIndent("PORT=" + DFLT_PORT, 2); + commandLogger.logWithIndent("PING_INTERVAL=" + DFLT_PING_INTERVAL, 2); + commandLogger.logWithIndent("PING_TIMEOUT=" + DFLT_PING_TIMEOUT, 2); + commandLogger.logWithIndent("SSL_PROTOCOL=" + SslContextFactory.DFLT_SSL_PROTOCOL, 2); + commandLogger.logWithIndent("SSL_KEY_ALGORITHM=" + SslContextFactory.DFLT_KEY_ALGORITHM, 2); + commandLogger.logWithIndent("KEYSTORE_TYPE=" + SslContextFactory.DFLT_STORE_TYPE, 2); + commandLogger.logWithIndent("TRUSTSTORE_TYPE=" + SslContextFactory.DFLT_STORE_TYPE, 2); + + commandLogger.nl(); + + commandLogger.log("Exit codes:"); + commandLogger.logWithIndent(EXIT_CODE_OK + " - successful execution.", 2); + commandLogger.logWithIndent(EXIT_CODE_INVALID_ARGUMENTS + " - invalid arguments.", 2); + commandLogger.logWithIndent(EXIT_CODE_CONNECTION_FAILED + " - connection failed.", 2); + commandLogger.logWithIndent(ERR_AUTHENTICATION_FAILED + " - authentication failed.", 2); + commandLogger.logWithIndent(EXIT_CODE_UNEXPECTED_ERROR + " - unexpected error.", 2); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandList.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandList.java index 280a40b..d595e05 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandList.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandList.java @@ -92,4 +92,11 @@ public enum CommandList { @Override public String toString() { return text; } + + /** + * @return command name + */ + public String toCommandName() { + return text.substring(2).toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java index b19ad24..3bf6a92 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.commandline; import java.util.Map; import java.util.UUID; +import java.util.logging.Logger; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.SB; @@ -93,11 +94,30 @@ public class CommandLogger { } /** + * Generates readable error message from exception + * @param e Exctption + * @return error message + */ + public static String errorMessage(Throwable e) { + String msg = e.getMessage(); + + if (F.isEmpty(msg)) + msg = e.getClass().getName(); + else if (msg.startsWith("Failed to handle request")) { + int p = msg.indexOf("err="); + + msg = msg.substring(p + 4, msg.length() - 1); + } + + return msg; + } + + /** * Output specified string to console. * * @param s String to output. */ - public void log(String s) { + public static void log(String s) { System.out.println(s); } @@ -107,7 +127,7 @@ public class CommandLogger { * * @param s String to output. */ - public void logWithIndent(Object s) { + public static void logWithIndent(Object s) { log(indent(s)); } @@ -117,7 +137,7 @@ public class CommandLogger { * * @param s String to output. */ - public void logWithIndent(Object s, int indentCnt) { + public static void logWithIndent(Object s, int indentCnt) { log(indent(s), indentCnt); } @@ -169,14 +189,14 @@ public class CommandLogger { * @param format A format string as described in Format string syntax. * @param args Arguments referenced by the format specifiers in the format string. */ - public void log(String format, Object... args) { + public static void log(String format, Object... args) { System.out.printf(format, args); } /** * Output empty line. */ - public void nl() { + public static void nl() { System.out.println(); } @@ -191,18 +211,7 @@ public class CommandLogger { if (!F.isEmpty(s)) log(s); - String msg = e.getMessage(); - - if (F.isEmpty(msg)) - msg = e.getClass().getName(); - - if (msg.startsWith("Failed to handle request")) { - int p = msg.indexOf("err="); - - msg = msg.substring(p + 4, msg.length() - 1); - } - - log("Error: " + msg); + log("Error: " + errorMessage(e)); } @@ -224,4 +233,22 @@ public class CommandLogger { return false; } + + public static boolean printErrors(Map<UUID, Exception> exceptions, String s, Logger logger) { + if (!F.isEmpty(exceptions)) { + logger.info(s); + + for (Map.Entry<UUID, Exception> e : exceptions.entrySet()) { + logger.info(INDENT + "Node ID: " + e.getKey()); + + logger.info(INDENT + "Exception message:"); + logger.info(INDENT + INDENT + e.getValue().getMessage()); + logger.info(""); + } + + return true; + } + + return false; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java index ad5e551..961e0ef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/DeactivateCommand.java @@ -16,6 +16,7 @@ package org.apache.ignite.internal.commandline; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; @@ -29,8 +30,8 @@ import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CO */ public class DeactivateCommand implements Command<Void> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { - Command.usage(logger, "Deactivate cluster:", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION)); + @Override public void printUsage() { + Command.usage("Deactivate cluster:", DEACTIVATE, optional(CMD_AUTO_CONFIRMATION)); } /** {@inheritDoc} */ @@ -44,16 +45,16 @@ public class DeactivateCommand implements Command<Void> { * @param clientCfg Client configuration. * @throws Exception If failed to deactivate. */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { GridClientClusterState state = client.state(); state.active(false); - logger.log("Cluster deactivated"); + logger.info("Cluster deactivated"); } catch (Exception e) { - logger.log("Failed to deactivate cluster."); + logger.severe("Failed to deactivate cluster."); throw e; } @@ -65,4 +66,9 @@ public class DeactivateCommand implements Command<Void> { @Override public Void arg() { return null; } + + /** {@inheritDoc} */ + @Override public String name() { + return DEACTIVATE.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java index a2a3afd..69aa3ec 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/StateCommand.java @@ -16,6 +16,7 @@ package org.apache.ignite.internal.commandline; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientClusterState; import org.apache.ignite.internal.client.GridClientConfiguration; @@ -27,8 +28,8 @@ import static org.apache.ignite.internal.commandline.CommandList.STATE; */ public class StateCommand implements Command<Void> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { - Command.usage(logger, "Print current cluster state:", STATE); + @Override public void printUsage() { + Command.usage("Print current cluster state:", STATE); } /** @@ -37,14 +38,14 @@ public class StateCommand implements Command<Void> { * @param clientCfg Client configuration. * @throws Exception If failed to print state. */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { try (GridClient client = Command.startClient(clientCfg)){ GridClientClusterState state = client.state(); - logger.log("Cluster is " + (state.active() ? "active" : "inactive")); + logger.info("Cluster is " + (state.active() ? "active" : "inactive")); } catch (Throwable e) { - logger.log("Failed to get cluster state."); + logger.severe("Failed to get cluster state."); throw e; } @@ -56,4 +57,9 @@ public class StateCommand implements Command<Void> { @Override public Void arg() { return null; } + + /** {@inheritDoc} */ + @Override public String name() { + return STATE.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java index 1063d13..b9674d7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/TxCommands.java @@ -23,6 +23,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.apache.ignite.cluster.ClusterNode; @@ -69,12 +70,12 @@ public class TxCommands implements Command<VisorTxTaskArg> { private VisorTxTaskArg args; /** Logger. */ - private CommandLogger logger; + private Logger logger; /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { - Command.usage(logger, "List or kill transactions:", TX, getTxOptions()); - Command.usage(logger, "Print detailed information (topology and key lock ownership) about specific transaction:", + @Override public void printUsage() { + Command.usage("List or kill transactions:", TX, getTxOptions()); + Command.usage("Print detailed information (topology and key lock ownership) about specific transaction:", TX, TX_INFO.argName(), or("<TX identifier as GridCacheVersion [topVer=..., order=..., nodeOrder=...] " + "(can be found in logs)>", "<TX identifier as UUID (can be retrieved via --tx command)>")); @@ -111,7 +112,7 @@ public class TxCommands implements Command<VisorTxTaskArg> { * * @param clientCfg Client configuration. */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { this.logger = logger; try (GridClient client = Command.startClient(clientCfg)) { @@ -121,11 +122,11 @@ public class TxCommands implements Command<VisorTxTaskArg> { Map<ClusterNode, VisorTxTaskResult> res = executeTask(client, VisorTxTask.class, args, clientCfg); if (res.isEmpty()) - logger.log("Nothing found."); + logger.info("Nothing found."); else if (args.getOperation() == VisorTxOperation.KILL) - logger.log("Killed transactions:"); + logger.info("Killed transactions:"); else - logger.log("Matching transactions:"); + logger.info("Matching transactions:"); for (Map.Entry<ClusterNode, VisorTxTaskResult> entry : res.entrySet()) { if (entry.getValue().getInfos().isEmpty()) @@ -133,7 +134,7 @@ public class TxCommands implements Command<VisorTxTaskArg> { ClusterNode key = entry.getKey(); - logger.log(key.getClass().getSimpleName() + " [id=" + key.id() + + logger.info(key.getClass().getSimpleName() + " [id=" + key.id() + ", addrs=" + key.addresses() + ", order=" + key.order() + ", ver=" + key.version() + @@ -142,13 +143,14 @@ public class TxCommands implements Command<VisorTxTaskArg> { "]"); for (VisorTxInfo info : entry.getValue().getInfos()) - logger.log(info.toUserString()); + logger.info(info.toUserString()); } return res; } catch (Throwable e) { - logger.error("Failed to perform operation.", e); + logger.severe("Failed to perform operation."); + logger.severe(CommandLogger.errorMessage(e)); throw e; } @@ -175,14 +177,14 @@ public class TxCommands implements Command<VisorTxTaskArg> { ClusterNode key = entry.getKey(); - logger.log(nodeDescription(key)); + logger.info(nodeDescription(key)); for (VisorTxInfo info : entry.getValue().getInfos()) - logger.log(info.toUserString()); + logger.info(info.toUserString()); } } catch (Throwable e) { - logger.log("Failed to perform operation."); + logger.severe("Failed to perform operation."); throw e; } @@ -357,20 +359,20 @@ public class TxCommands implements Command<VisorTxTaskArg> { boolean histMode = false; if (nearXidVer != null) { - logger.log("Resolved transaction near XID version: " + nearXidVer); + logger.info("Resolved transaction near XID version: " + nearXidVer); args.txInfoArgument(new TxVerboseId(null, nearXidVer)); } else { - logger.log("Active transactions not found."); + logger.info("Active transactions not found."); if (args.txInfoArgument().gridCacheVersion() != null) { - logger.log("Will try to peek history to find out whether transaction was committed / rolled back."); + logger.info("Will try to peek history to find out whether transaction was committed / rolled back."); histMode = true; } else { - logger.log("You can specify transaction in GridCacheVersion format in order to peek history " + + logger.info("You can specify transaction in GridCacheVersion format in order to peek history " + "to find out whether transaction was committed / rolled back."); return null; @@ -421,8 +423,8 @@ public class TxCommands implements Command<VisorTxTaskArg> { String indent = ""; - logger.nl(); - logger.log(indent + "Transaction detailed info:"); + logger.info(""); + logger.info(indent + "Transaction detailed info:"); printTransactionDetailedInfo( res, usedCaches, usedCacheGroups, firstInfo, firstVerboseInfo, states, indent + DOUBLE_INDENT); @@ -442,19 +444,19 @@ public class TxCommands implements Command<VisorTxTaskArg> { private void printTransactionDetailedInfo(Map<ClusterNode, VisorTxTaskResult> res, Map<Integer, String> usedCaches, Map<Integer, String> usedCacheGroups, VisorTxInfo firstInfo, TxVerboseInfo firstVerboseInfo, Set<TransactionState> states, String indent) { - logger.log(indent + "Near XID version: " + firstVerboseInfo.nearXidVersion()); - logger.log(indent + "Near XID version (UUID): " + firstInfo.getNearXid()); - logger.log(indent + "Isolation: " + firstInfo.getIsolation()); - logger.log(indent + "Concurrency: " + firstInfo.getConcurrency()); - logger.log(indent + "Timeout: " + firstInfo.getTimeout()); - logger.log(indent + "Initiator node: " + firstVerboseInfo.nearNodeId()); - logger.log(indent + "Initiator node (consistent ID): " + firstVerboseInfo.nearNodeConsistentId()); - logger.log(indent + "Label: " + firstInfo.getLabel()); - logger.log(indent + "Topology version: " + firstInfo.getTopologyVersion()); - logger.log(indent + "Used caches (ID to name): " + usedCaches); - logger.log(indent + "Used cache groups (ID to name): " + usedCacheGroups); - logger.log(indent + "States across the cluster: " + states); - logger.log(indent + "Transaction topology: "); + logger.info(indent + "Near XID version: " + firstVerboseInfo.nearXidVersion()); + logger.info(indent + "Near XID version (UUID): " + firstInfo.getNearXid()); + logger.info(indent + "Isolation: " + firstInfo.getIsolation()); + logger.info(indent + "Concurrency: " + firstInfo.getConcurrency()); + logger.info(indent + "Timeout: " + firstInfo.getTimeout()); + logger.info(indent + "Initiator node: " + firstVerboseInfo.nearNodeId()); + logger.info(indent + "Initiator node (consistent ID): " + firstVerboseInfo.nearNodeConsistentId()); + logger.info(indent + "Label: " + firstInfo.getLabel()); + logger.info(indent + "Topology version: " + firstInfo.getTopologyVersion()); + logger.info(indent + "Used caches (ID to name): " + usedCaches); + logger.info(indent + "Used cache groups (ID to name): " + usedCacheGroups); + logger.info(indent + "States across the cluster: " + states); + logger.info(indent + "Transaction topology: "); printTransactionTopology(res, indent + DOUBLE_INDENT); } @@ -467,7 +469,7 @@ public class TxCommands implements Command<VisorTxTaskArg> { */ private void printTransactionTopology(Map<ClusterNode, VisorTxTaskResult> res, String indent) { for (Map.Entry<ClusterNode, VisorTxTaskResult> entry : res.entrySet()) { - logger.log(indent + nodeDescription(entry.getKey()) + ':'); + logger.info(indent + nodeDescription(entry.getKey()) + ':'); printTransactionMappings(indent + DOUBLE_INDENT, entry); } @@ -484,14 +486,14 @@ public class TxCommands implements Command<VisorTxTaskArg> { TxVerboseInfo verboseInfo = info.getTxVerboseInfo(); if (verboseInfo != null) { - logger.log(indent + "Mapping [type=" + verboseInfo.txMappingType() + "]:"); + logger.info(indent + "Mapping [type=" + verboseInfo.txMappingType() + "]:"); printTransactionMapping(indent + DOUBLE_INDENT, info, verboseInfo); } else { - logger.log(indent + "Mapping [type=HISTORICAL]:"); + logger.info(indent + "Mapping [type=HISTORICAL]:"); - logger.log(indent + DOUBLE_INDENT + "State: " + info.getState()); + logger.info(indent + DOUBLE_INDENT + "State: " + info.getState()); } } } @@ -504,16 +506,16 @@ public class TxCommands implements Command<VisorTxTaskArg> { * @param verboseInfo Verbose info. */ private void printTransactionMapping(String indent, VisorTxInfo info, TxVerboseInfo verboseInfo) { - logger.log(indent + "XID version (UUID): " + info.getXid()); - logger.log(indent + "State: " + info.getState()); + logger.info(indent + "XID version (UUID): " + info.getXid()); + logger.info(indent + "State: " + info.getState()); if (verboseInfo.txMappingType() == TxMappingType.REMOTE) { - logger.log(indent + "Primary node: " + verboseInfo.dhtNodeId()); - logger.log(indent + "Primary node (consistent ID): " + verboseInfo.dhtNodeConsistentId()); + logger.info(indent + "Primary node: " + verboseInfo.dhtNodeId()); + logger.info(indent + "Primary node (consistent ID): " + verboseInfo.dhtNodeConsistentId()); } if (!F.isEmpty(verboseInfo.localTxKeys())) { - logger.log(indent + "Mapped keys:"); + logger.info(indent + "Mapped keys:"); printTransactionKeys(indent + DOUBLE_INDENT, verboseInfo); } @@ -527,11 +529,11 @@ public class TxCommands implements Command<VisorTxTaskArg> { */ private void printTransactionKeys(String indent, TxVerboseInfo verboseInfo) { for (TxVerboseKey txVerboseKey : verboseInfo.localTxKeys()) { - logger.log(indent + (txVerboseKey.read() ? "Read" : "Write") + + logger.info(indent + (txVerboseKey.read() ? "Read" : "Write") + " [lock=" + txVerboseKey.lockType() + "]: " + txVerboseKey.txKey()); if (txVerboseKey.lockType() == TxKeyLockType.AWAITS_LOCK) - logger.log(indent + DOUBLE_INDENT + "Lock owner XID: " + txVerboseKey.ownerVersion()); + logger.info(indent + DOUBLE_INDENT + "Lock owner XID: " + txVerboseKey.ownerVersion()); } } @@ -542,13 +544,13 @@ public class TxCommands implements Command<VisorTxTaskArg> { */ private void printTxInfoHistoricalResult(Map<ClusterNode, VisorTxTaskResult> res) { if (F.isEmpty(res)) - logger.log("Transaction was not found in history across the cluster."); + logger.info("Transaction was not found in history across the cluster."); else { - logger.log("Transaction was found in completed versions history of the following nodes:"); + logger.info("Transaction was found in completed versions history of the following nodes:"); for (Map.Entry<ClusterNode, VisorTxTaskResult> entry : res.entrySet()) { - logger.log(DOUBLE_INDENT + nodeDescription(entry.getKey()) + ':'); - logger.log(DOUBLE_INDENT + DOUBLE_INDENT + "State: " + entry.getValue().getInfos().get(0).getState()); + logger.info(DOUBLE_INDENT + nodeDescription(entry.getKey()) + ':'); + logger.info(DOUBLE_INDENT + DOUBLE_INDENT + "State: " + entry.getValue().getInfos().get(0).getState()); } } } @@ -578,4 +580,9 @@ public class TxCommands implements Command<VisorTxTaskArg> { } } } + + /** {@inheritDoc} */ + @Override public String name() { + return TX.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java index 872d732..5a5a59f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/WalCommands.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.logging.Logger; import org.apache.ignite.IgniteSystemProperties; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; @@ -35,6 +36,7 @@ import org.apache.ignite.internal.visor.misc.VisorWalTaskResult; import static org.apache.ignite.IgniteSystemProperties.IGNITE_ENABLE_EXPERIMENTAL_COMMAND; import static org.apache.ignite.internal.commandline.CommandArgIterator.isCommandOrOption; import static org.apache.ignite.internal.commandline.CommandList.WAL; +import static org.apache.ignite.internal.commandline.CommandLogger.INDENT; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommonArgParser.CMD_AUTO_CONFIRMATION; import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; @@ -50,7 +52,7 @@ public class WalCommands implements Command<T2<String, String>> { static final String WAL_DELETE = "delete"; /** */ - private CommandLogger logger; + private Logger logger; /** * Wal action. @@ -62,11 +64,11 @@ public class WalCommands implements Command<T2<String, String>> { */ private String walArgs; - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { if (IgniteSystemProperties.getBoolean(IGNITE_ENABLE_EXPERIMENTAL_COMMAND, false)) { - Command.usage(logger, "Print absolute paths of unused archived wal segments on each node:", WAL, + Command.usage("Print absolute paths of unused archived wal segments on each node:", WAL, WAL_PRINT, "[consistentId1,consistentId2,....,consistentIdN]"); - Command.usage(logger,"Delete unused archived wal segments on each node:", WAL, WAL_DELETE, + Command.usage("Delete unused archived wal segments on each node:", WAL, WAL_DELETE, "[consistentId1,consistentId2,....,consistentIdN]", optional(CMD_AUTO_CONFIRMATION)); } } @@ -77,7 +79,7 @@ public class WalCommands implements Command<T2<String, String>> { * @param clientCfg Client configuration. * @throws Exception If failed to execute wal action. */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { this.logger = logger; try (GridClient client = Command.startClient(clientCfg)) { @@ -197,8 +199,8 @@ public class WalCommands implements Command<T2<String, String>> { * @param taskRes Task result with baseline topology. */ private void printUnusedWalSegments0(VisorWalTaskResult taskRes) { - logger.log("Unused wal segments per node:"); - logger.nl(); + logger.info("Unused wal segments per node:"); + logger.info(""); Map<String, Collection<String>> res = taskRes.results(); Map<String, Exception> failRes = taskRes.exceptions(); @@ -207,22 +209,22 @@ public class WalCommands implements Command<T2<String, String>> { for (Map.Entry<String, Collection<String>> entry : res.entrySet()) { VisorClusterNode node = nodesInfo.get(entry.getKey()); - logger.log("Node=" + node.getConsistentId()); - logger.logWithIndent("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()), 2); + logger.info("Node=" + node.getConsistentId()); + logger.info(INDENT + INDENT +"addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())); for (String fileName : entry.getValue()) - logger.logWithIndent(fileName); + logger.info(INDENT + fileName); - logger.nl(); + logger.info(""); } for (Map.Entry<String, Exception> entry : failRes.entrySet()) { VisorClusterNode node = nodesInfo.get(entry.getKey()); - logger.log("Node=" + node.getConsistentId()); - logger.logWithIndent("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()), 2); - logger.logWithIndent("failed with error: " + entry.getValue().getMessage()); - logger.nl(); + logger.info("Node=" + node.getConsistentId()); + logger.info(INDENT + INDENT + "addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())); + logger.info(INDENT + "failed with error: " + entry.getValue().getMessage()); + logger.info(""); } } @@ -232,8 +234,8 @@ public class WalCommands implements Command<T2<String, String>> { * @param taskRes Task result with baseline topology. */ private void printDeleteWalSegments0(VisorWalTaskResult taskRes) { - logger.log("WAL segments deleted for nodes:"); - logger.nl(); + logger.info("WAL segments deleted for nodes:"); + logger.info(""); Map<String, Collection<String>> res = taskRes.results(); Map<String, Exception> errors = taskRes.exceptions(); @@ -242,18 +244,23 @@ public class WalCommands implements Command<T2<String, String>> { for (Map.Entry<String, Collection<String>> entry : res.entrySet()) { VisorClusterNode node = nodesInfo.get(entry.getKey()); - logger.log("Node=" + node.getConsistentId()); - logger.logWithIndent("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()), 2); - logger.nl(); + logger.info("Node=" + node.getConsistentId()); + logger.info(INDENT + INDENT + "addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())); + logger.info(""); } for (Map.Entry<String, Exception> entry : errors.entrySet()) { VisorClusterNode node = nodesInfo.get(entry.getKey()); - logger.log("Node=" + node.getConsistentId()); - logger.logWithIndent("addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames()), 2); - logger.logWithIndent("failed with error: " + entry.getValue().getMessage()); - logger.nl(); + logger.info("Node=" + node.getConsistentId()); + logger.info(INDENT + INDENT + "addresses " + U.addressesAsString(node.getAddresses(), node.getHostNames())); + logger.info(INDENT + "failed with error: " + entry.getValue().getMessage()); + logger.info(""); } } + + /** {@inheritDoc} */ + @Override public String name() { + return WAL.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java index aa9a774..3d8bc0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheCommands.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.commandline.cache; import java.util.Arrays; import java.util.Comparator; import java.util.Map; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; @@ -48,22 +49,17 @@ public class CacheCommands implements Command<CacheSubcommands> { protected static final String OP_NODE_ID = optional(NODE_ID); /** */ - private CommandLogger logger; - - /** */ private CacheSubcommands subcommand; /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { - logger.logWithIndent("View caches information in a cluster. For more details type:"); - logger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, CACHE, HELP), 2); - logger.nl(); + @Override public void printUsage() { + CommandLogger.logWithIndent("View caches information in a cluster. For more details type:"); + CommandLogger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, CACHE, HELP), 2); + CommandLogger.nl(); } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { - this.logger = logger; - + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { if (subcommand == CacheSubcommands.HELP) { printCacheHelp(); @@ -120,25 +116,25 @@ public class CacheCommands implements Command<CacheSubcommands> { /** */ private void printCacheHelp() { - logger.logWithIndent("The '" + CACHE + " subcommand' is used to get information about and perform actions" + + CommandLogger.logWithIndent("The '" + CACHE + " subcommand' is used to get information about and perform actions" + " with caches. The command has the following syntax:"); - logger.nl(); - logger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, CommandLogger.join(" ", getCommonOptions())) + " " + + CommandLogger.nl(); + CommandLogger.logWithIndent(CommandLogger.join(" ", UTILITY_NAME, CommandLogger.join(" ", getCommonOptions())) + " " + CACHE + " [subcommand] <subcommand_parameters>"); - logger.nl(); - logger.logWithIndent("The subcommands that take " + OP_NODE_ID + " as an argument ('" + LIST + "', '" + CommandLogger.nl(); + CommandLogger.logWithIndent("The subcommands that take " + OP_NODE_ID + " as an argument ('" + LIST + "', '" + FIND_AND_DELETE_GARBAGE+ "', '" + CONTENTION + "' and '" + VALIDATE_INDEXES + "') will be executed on the given node or on all server nodes" + " if the option is not specified. Other commands will run on a random server node."); - logger.nl(); - logger.nl(); - logger.logWithIndent("Subcommands:"); + CommandLogger.nl(); + CommandLogger.nl(); + CommandLogger.logWithIndent("Subcommands:"); Arrays.stream(CacheCommandList.values()).forEach(c -> { - if (c.subcommand() != null) c.subcommand().printUsage(logger); + if (c.subcommand() != null) c.subcommand().printUsage(); }); - logger.nl(); + CommandLogger.nl(); } @@ -151,7 +147,6 @@ public class CacheCommands implements Command<CacheSubcommands> { * @param args Cache command arguments. */ protected static void usageCache( - CommandLogger logger, CacheSubcommands cmd, String description, Map<String, String> paramsDesc, @@ -159,34 +154,33 @@ public class CacheCommands implements Command<CacheSubcommands> { ) { int indentsNum = 1; - logger.logWithIndent(DELIM, indentsNum); - logger.nl(); - logger.logWithIndent(CommandLogger.join(" ", CACHE, cmd, CommandLogger.join(" ", args)), indentsNum++); - logger.nl(); - logger.logWithIndent(description, indentsNum); - logger.nl(); + CommandLogger.logWithIndent(DELIM, indentsNum); + CommandLogger.nl(); + CommandLogger.logWithIndent(CommandLogger.join(" ", CACHE, cmd, CommandLogger.join(" ", args)), indentsNum++); + CommandLogger.nl(); + CommandLogger.logWithIndent(description, indentsNum); + CommandLogger.nl(); if (!F.isEmpty(paramsDesc)) { - logger.logWithIndent("Parameters:", indentsNum); + CommandLogger.logWithIndent("Parameters:", indentsNum); - usageCacheParams(logger, paramsDesc, indentsNum + 1); + usageCacheParams(paramsDesc, indentsNum + 1); - logger.nl(); + CommandLogger.nl(); } } /** * Print cache command arguments usage. * - * @param logger Command logger. * @param paramsDesc Cache command arguments description. * @param indentsNum Number of indents. */ - private static void usageCacheParams(CommandLogger logger, Map<String, String> paramsDesc, int indentsNum) { + private static void usageCacheParams(Map<String, String> paramsDesc, int indentsNum) { int maxParamLen = paramsDesc.keySet().stream().max(Comparator.comparingInt(String::length)).get().length(); for (Map.Entry<String, String> param : paramsDesc.entrySet()) - logger.logWithIndent(extendToLen(param.getKey(), maxParamLen) + " " + "- " + param.getValue(), indentsNum); + CommandLogger.logWithIndent(extendToLen(param.getKey(), maxParamLen) + " " + "- " + param.getValue(), indentsNum); } /** @@ -217,4 +211,9 @@ public class CacheCommands implements Command<CacheSubcommands> { @Override public CacheSubcommands arg() { return subcommand; } + + /** {@inheritDoc} */ + @Override public String name() { + return CACHE.toCommandName(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java index b09e30a..ac46a4e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheContention.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.commandline.cache; import java.util.UUID; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; @@ -39,10 +40,10 @@ import static org.apache.ignite.internal.commandline.cache.CacheSubcommands.CONT */ public class CacheContention implements Command<CacheContention.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String description = "Show the keys that are point of contention for multiple transactions."; - usageCache(logger, CONTENTION, description, null, "minQueueSize", + usageCache(CONTENTION, description, null, "minQueueSize", OP_NODE_ID, optional("maxPrint")); } @@ -100,7 +101,7 @@ public class CacheContention implements Command<CacheContention.Arguments> { } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { VisorContentionTaskArg taskArg = new VisorContentionTaskArg(args.minQueueSize(), args.maxPrint()); UUID nodeId = args.nodeId() == null ? BROADCAST_UUID : args.nodeId(); @@ -111,7 +112,7 @@ public class CacheContention implements Command<CacheContention.Arguments> { res = executeTaskByNameOnNode(client, VisorContentionTask.class.getName(), taskArg, nodeId, clientCfg); } - logger.printErrors(res.exceptions(), "Contention check failed on nodes:"); + CommandLogger.printErrors(res.exceptions(), "Contention check failed on nodes:", logger); for (ContentionInfo info : res.getInfos()) info.print(); @@ -135,4 +136,9 @@ public class CacheContention implements Command<CacheContention.Arguments> { args = new Arguments(nodeId, minQueueSize, maxPrint); } + + /** {@inheritDoc} */ + @Override public String name() { + return CONTENTION.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java index bf37ffd..449f576 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheDistribution.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.commandline.cache; import java.util.HashSet; import java.util.Set; import java.util.UUID; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; @@ -46,11 +47,11 @@ import static org.apache.ignite.internal.commandline.cache.argument.Distribution */ public class CacheDistribution implements Command<CacheDistribution.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String CACHES = "cacheName1,...,cacheNameN"; String description = "Prints the information about partition distribution."; - usageCache(logger, DISTRIBUTION, description, null, + usageCache(DISTRIBUTION, description, null, or(NODE_ID, CommandHandler.NULL), optional(CACHES), optional(USER_ATTRIBUTES, "attrName1,...,attrNameN")); } @@ -107,7 +108,7 @@ public class CacheDistribution implements Command<CacheDistribution.Arguments> { } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { CacheDistributionTaskArg taskArg = new CacheDistributionTaskArg(args.caches(), args.getUserAttributes()); UUID nodeId = args.nodeId() == null ? BROADCAST_UUID : args.nodeId(); @@ -118,7 +119,7 @@ public class CacheDistribution implements Command<CacheDistribution.Arguments> { res = executeTaskByNameOnNode(client, CacheDistributionTask.class.getName(), taskArg, nodeId, clientCfg); } - logger.printErrors(res.exceptions(), "Cache distrubution task failed on nodes:"); + CommandLogger.printErrors(res.exceptions(), "Cache distrubution task failed on nodes:", logger); res.print(System.out); @@ -159,4 +160,9 @@ public class CacheDistribution implements Command<CacheDistribution.Arguments> { args = new Arguments(caches, nodeId, userAttributes); } + + /** {@inheritDoc} */ + @Override public String name() { + return DISTRIBUTION.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java index 7789fde..4666eb7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheValidateIndexes.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; @@ -39,6 +40,7 @@ import org.apache.ignite.internal.visor.verify.VisorValidateIndexesJobResult; import org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskArg; import org.apache.ignite.internal.visor.verify.VisorValidateIndexesTaskResult; +import static org.apache.ignite.internal.commandline.CommandLogger.INDENT; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.CommandLogger.or; import static org.apache.ignite.internal.commandline.TaskExecutor.executeTaskByNameOnNode; @@ -57,7 +59,7 @@ import static org.apache.ignite.internal.processors.cache.GridCacheUtils.UTILITY */ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String CACHES = "cacheName1,...,cacheNameN"; String description = "Verify counters and hash sums of primary and backup partitions for the specified " + "caches/cache groups on an idle cluster and print out the differences, if any. " + @@ -72,7 +74,7 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume map.put(CHECK_FIRST + " N", "validate only the first N keys"); map.put(CHECK_THROUGH + " K", "validate every Kth key"); - usageCache(logger, VALIDATE_INDEXES, description, map, + usageCache(VALIDATE_INDEXES, description, map, optional(CACHES), OP_NODE_ID, optional(or(CHECK_FIRST + " N", CHECK_THROUGH + " K"))); } @@ -141,7 +143,7 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { VisorValidateIndexesTaskArg taskArg = new VisorValidateIndexesTaskArg( args.caches(), args.nodeId() != null ? Collections.singleton(args.nodeId()) : null, @@ -153,7 +155,7 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume VisorValidateIndexesTaskResult taskRes = executeTaskByNameOnNode( client, "org.apache.ignite.internal.visor.verify.VisorValidateIndexesTask", taskArg, null, clientCfg); - boolean errors = logger.printErrors(taskRes.exceptions(), "Index validation failed on nodes:"); + boolean errors = CommandLogger.printErrors(taskRes.exceptions(), "Index validation failed on nodes:", logger); for (Map.Entry<UUID, VisorValidateIndexesJobResult> nodeEntry : taskRes.results().entrySet()) { if (!nodeEntry.getValue().hasIssues()) @@ -161,13 +163,13 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume errors = true; - logger.log("Index issues found on node " + nodeEntry.getKey() + ":"); + logger.info("Index issues found on node " + nodeEntry.getKey() + ":"); Collection<IndexIntegrityCheckIssue> integrityCheckFailures = nodeEntry.getValue().integrityCheckFailures(); if (!integrityCheckFailures.isEmpty()) { for (IndexIntegrityCheckIssue is : integrityCheckFailures) - logger.logWithIndent(is); + logger.info(INDENT + is); } Map<PartitionKey, ValidateIndexesPartitionResult> partRes = nodeEntry.getValue().partitionResult(); @@ -176,10 +178,10 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume ValidateIndexesPartitionResult res = e.getValue(); if (!res.issues().isEmpty()) { - logger.logWithIndent(CommandLogger.join(" ", e.getKey(), e.getValue())); + logger.info(INDENT + CommandLogger.join(" ", e.getKey(), e.getValue())); for (IndexValidationIssue is : res.issues()) - logger.logWithIndent(is, 2); + logger.info(INDENT + INDENT + is); } } @@ -189,20 +191,20 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume ValidateIndexesPartitionResult res = e.getValue(); if (!res.issues().isEmpty()) { - logger.logWithIndent(CommandLogger.join(" ", "SQL Index", e.getKey(), e.getValue())); + logger.info(INDENT + CommandLogger.join(" ", "SQL Index", e.getKey(), e.getValue())); for (IndexValidationIssue is : res.issues()) - logger.logWithIndent(is, 2); + logger.info(INDENT + INDENT + is); } } } if (!errors) - logger.log("no issues found."); + logger.severe("no issues found."); else - logger.log("issues found (listed above)."); + logger.severe("issues found (listed above)."); - logger.nl(); + logger.info(""); return taskRes; } @@ -270,4 +272,9 @@ public class CacheValidateIndexes implements Command<CacheValidateIndexes.Argume args = new Arguments(caches, nodeId, checkFirst, checkThrough); } + + /** {@inheritDoc} */ + @Override public String name() { + return VALIDATE_INDEXES.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java index b5d0f14..94bf95c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/CacheViewer.java @@ -20,13 +20,13 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; +import java.util.logging.Logger; import java.util.stream.Collectors; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; -import org.apache.ignite.internal.commandline.CommandLogger; import org.apache.ignite.internal.commandline.OutputFormat; import org.apache.ignite.internal.commandline.TaskExecutor; import org.apache.ignite.internal.commandline.argument.CommandArgUtils; @@ -69,7 +69,7 @@ import static org.apache.ignite.internal.visor.verify.VisorViewCacheCmd.SEQ; */ public class CacheViewer implements Command<CacheViewer.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String description = "Show information about caches, groups or sequences that match a regular expression. " + "When executed without parameters, this subcommand prints the list of caches."; @@ -81,7 +81,7 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { map.put(GROUP.toString(), "print information about groups."); map.put(SEQUENCE.toString(), "print information about sequences."); - usageCache(logger, LIST, description, map, "regexPattern", + usageCache(LIST, description, map, "regexPattern", optional(or(GROUP, SEQUENCE)), OP_NODE_ID, optional(CONFIG), optional(OUTPUT_FORMAT, MULTI_LINE)); } @@ -156,7 +156,7 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { VisorViewCacheTaskArg taskArg = new VisorViewCacheTaskArg(args.regex(), args.cacheCommand()); VisorViewCacheTaskResult res; @@ -337,7 +337,7 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { Map<String, VisorCacheConfiguration> caches, OutputFormat outputFormat, Map<String, Integer> cacheToMapped, - CommandLogger logger + Logger logger ) { for (Map.Entry<String, VisorCacheConfiguration> entry : caches.entrySet()) { @@ -349,19 +349,19 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { params.put("Mapped", cacheToMapped.get(cacheName)); - logger.log("[cache = '%s']%n", cacheName); + logger.info(String.format("[cache = '%s']%n", cacheName)); for (Map.Entry<String, Object> innerEntry : params.entrySet()) - logger.log("%s: %s%n", innerEntry.getKey(), innerEntry.getValue()); + logger.info(String.format("%s: %s%n", innerEntry.getKey(), innerEntry.getValue())); - logger.nl(); + logger.info(""); break; default: int mapped = cacheToMapped.get(cacheName); - logger.log("%s: %s %s=%s%n", entry.getKey(), toString(entry.getValue()), "mapped", mapped); + logger.info(String.format("%s: %s %s=%s%n", entry.getKey(), toString(entry.getValue()), "mapped", mapped)); break; } @@ -389,7 +389,7 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { Arguments cacheArgs, VisorViewCacheTaskResult viewRes, GridClientConfiguration clientCfg, - CommandLogger logger + Logger logger ) throws GridClientException { VisorCacheConfigurationCollectorTaskArg taskArg = new VisorCacheConfigurationCollectorTaskArg(cacheArgs.regex()); @@ -410,7 +410,7 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { * @param infos Caches info. * @param cmd Command. */ - private void printCacheInfos(Collection<CacheInfo> infos, VisorViewCacheCmd cmd, CommandLogger logger) { + private void printCacheInfos(Collection<CacheInfo> infos, VisorViewCacheCmd cmd, Logger logger) { for (CacheInfo info : infos) { Map<String, Object> map = info.toMap(cmd); @@ -423,7 +423,12 @@ public class CacheViewer implements Command<CacheViewer.Arguments> { sb.a("]"); - logger.log(sb.toString()); + logger.info(sb.toString()); } } + + /** {@inheritDoc} */ + @Override public String name() { + return LIST.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java index 3dfe6c8..91f9d9d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/FindAndDeleteGarbage.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; @@ -32,6 +33,7 @@ import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersist import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskArg; import org.apache.ignite.internal.visor.cache.VisorFindAndDeleteGarbageInPersistenceTaskResult; +import static org.apache.ignite.internal.commandline.CommandLogger.INDENT; import static org.apache.ignite.internal.commandline.CommandLogger.optional; import static org.apache.ignite.internal.commandline.TaskExecutor.executeTask; import static org.apache.ignite.internal.commandline.cache.CacheCommands.OP_NODE_ID; @@ -43,12 +45,12 @@ import static org.apache.ignite.internal.commandline.cache.CacheSubcommands.FIND */ public class FindAndDeleteGarbage implements Command<FindAndDeleteGarbage.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String GROUPS = "groupName1,...,groupNameN"; String description = "Find and optionally delete garbage from shared cache groups which could be left " + "after cache destroy."; - usageCache(logger, FIND_AND_DELETE_GARBAGE, description, null, + usageCache(FIND_AND_DELETE_GARBAGE, description, null, optional(GROUPS), OP_NODE_ID, optional(FindAndDeleteGarbageArg.DELETE)); } @@ -105,7 +107,7 @@ public class FindAndDeleteGarbage implements Command<FindAndDeleteGarbage.Argume } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { VisorFindAndDeleteGarbageInPersistenceTaskArg taskArg = new VisorFindAndDeleteGarbageInPersistenceTaskArg( args.groups(), args.delete(), @@ -116,16 +118,16 @@ public class FindAndDeleteGarbage implements Command<FindAndDeleteGarbage.Argume VisorFindAndDeleteGarbageInPersistenceTaskResult taskRes = executeTask( client, VisorFindAndDeleteGarbageInPersistenceTask.class, taskArg, clientCfg); - logger.printErrors(taskRes.exceptions(), "Scanning for garbage failed on nodes:"); + CommandLogger.printErrors(taskRes.exceptions(), "Scanning for garbage failed on nodes:", logger); for (Map.Entry<UUID, VisorFindAndDeleteGarbageInPersistenceJobResult> nodeEntry : taskRes.result().entrySet()) { if (!nodeEntry.getValue().hasGarbage()) { - logger.log("Node " + nodeEntry.getKey() + " - garbage not found."); + logger.info("Node " + nodeEntry.getKey() + " - garbage not found."); continue; } - logger.log("Garbage found on node " + nodeEntry.getKey() + ":"); + logger.info("Garbage found on node " + nodeEntry.getKey() + ":"); VisorFindAndDeleteGarbageInPersistenceJobResult value = nodeEntry.getValue(); @@ -134,14 +136,14 @@ public class FindAndDeleteGarbage implements Command<FindAndDeleteGarbage.Argume if (!grpPartErrorsCount.isEmpty()) { for (Map.Entry<Integer, Map<Integer, Long>> entry : grpPartErrorsCount.entrySet()) { for (Map.Entry<Integer, Long> e : entry.getValue().entrySet()) { - logger.logWithIndent("Group=" + entry.getKey() + + logger.info(INDENT + "Group=" + entry.getKey() + ", partition=" + e.getKey() + ", count of keys=" + e.getValue()); } } } - logger.nl(); + logger.info(""); } return taskRes; @@ -181,4 +183,9 @@ public class FindAndDeleteGarbage implements Command<FindAndDeleteGarbage.Argume args = new Arguments(groups, nodeId, delete); } + + /** {@inheritDoc} */ + @Override public String name() { + return FIND_AND_DELETE_GARBAGE.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java index 036bce4..b62f6fc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/IdleVerify.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.apache.ignite.IgniteException; @@ -32,7 +33,6 @@ import org.apache.ignite.internal.client.GridClientException; import org.apache.ignite.internal.client.GridClientNode; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; -import org.apache.ignite.internal.commandline.CommandLogger; import org.apache.ignite.internal.commandline.argument.CommandArgUtils; import org.apache.ignite.internal.commandline.cache.argument.IdleVerifyCommandArg; import org.apache.ignite.internal.processors.cache.verify.IdleVerifyResultV2; @@ -72,7 +72,7 @@ import static org.apache.ignite.internal.visor.verify.CacheFilterEnum.USER; */ public class IdleVerify implements Command<IdleVerify.Arguments> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String CACHES = "cacheName1,...,cacheNameN"; String description = "Verify counters and hash sums of primary and backup partitions for the specified caches/cache " + "groups on an idle cluster and print out the differences, if any. When no parameters are specified, " + @@ -83,7 +83,7 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { " you can verify: only " + USER + " caches, only user " + PERSISTENT + " caches, only user " + NOT_PERSISTENT + " caches, only " + SYSTEM + " caches, or " + ALL + " of the above."; - usageCache(logger, + usageCache( IDLE_VERIFY, description, Collections.singletonMap(CHECK_CRC.toString(), @@ -182,7 +182,7 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { try (GridClient client = Command.startClient(clientCfg)) { Collection<GridClientNode> nodes = client.compute().nodes(GridClientNode::connectable); @@ -306,7 +306,7 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { private void cacheIdleVerifyDump( GridClient client, GridClientConfiguration clientCfg, - CommandLogger logger + Logger logger ) throws GridClientException { VisorIdleVerifyDumpTaskArg arg = new VisorIdleVerifyDumpTaskArg( args.caches(), @@ -318,7 +318,7 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { String path = executeTask(client, VisorIdleVerifyDumpTask.class, arg, clientCfg); - logger.log("VisorIdleVerifyDumpTask successfully written output to '" + path + "'"); + logger.info("VisorIdleVerifyDumpTask successfully written output to '" + path + "'"); } @@ -347,7 +347,7 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { private void legacyCacheIdleVerify( GridClient client, GridClientConfiguration clientCfg, - CommandLogger logger + Logger logger ) throws GridClientException { VisorIdleVerifyTaskResult res = executeTask( client, @@ -358,18 +358,23 @@ public class IdleVerify implements Command<IdleVerify.Arguments> { Map<PartitionKey, List<PartitionHashRecord>> conflicts = res.getConflicts(); if (conflicts.isEmpty()) { - logger.log("idle_verify check has finished, no conflicts have been found."); - logger.nl(); + logger.info("idle_verify check has finished, no conflicts have been found."); + logger.info(""); } else { - logger.log("idle_verify check has finished, found " + conflicts.size() + " conflict partitions."); - logger.nl(); + logger.info("idle_verify check has finished, found " + conflicts.size() + " conflict partitions."); + logger.info(""); for (Map.Entry<PartitionKey, List<PartitionHashRecord>> entry : conflicts.entrySet()) { - logger.log("Conflict partition: " + entry.getKey()); + logger.info("Conflict partition: " + entry.getKey()); - logger.log("Partition instances: " + entry.getValue()); + logger.info("Partition instances: " + entry.getValue()); } } } + + /** {@inheritDoc} */ + @Override public String name() { + return IDLE_VERIFY.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java index 68f2ca7..c8b21a7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/cache/ResetLostPartitions.java @@ -17,11 +17,11 @@ package org.apache.ignite.internal.commandline.cache; import java.util.Set; +import java.util.logging.Logger; import org.apache.ignite.internal.client.GridClient; import org.apache.ignite.internal.client.GridClientConfiguration; import org.apache.ignite.internal.commandline.Command; import org.apache.ignite.internal.commandline.CommandArgIterator; -import org.apache.ignite.internal.commandline.CommandLogger; import org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTask; import org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskArg; import org.apache.ignite.internal.commandline.cache.reset_lost_partitions.CacheResetLostPartitionsTaskResult; @@ -35,11 +35,11 @@ import static org.apache.ignite.internal.commandline.cache.CacheSubcommands.RESE */ public class ResetLostPartitions implements Command<Set<String>> { /** {@inheritDoc} */ - @Override public void printUsage(CommandLogger logger) { + @Override public void printUsage() { String CACHES = "cacheName1,...,cacheNameN"; String description = "Reset the state of lost partitions for the specified caches."; - usageCache(logger, RESET_LOST_PARTITIONS, description, null, CACHES); + usageCache(RESET_LOST_PARTITIONS, description, null, CACHES); } /** @@ -53,7 +53,7 @@ public class ResetLostPartitions implements Command<Set<String>> { } /** {@inheritDoc} */ - @Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception { + @Override public Object execute(GridClientConfiguration clientCfg, Logger logger) throws Exception { CacheResetLostPartitionsTaskArg taskArg = new CacheResetLostPartitionsTaskArg(caches); try (GridClient client = Command.startClient(clientCfg)) { @@ -70,4 +70,9 @@ public class ResetLostPartitions implements Command<Set<String>> { @Override public void parseArguments(CommandArgIterator argIter) { caches = argIter.nextStringSet("Cache names"); } + + /** {@inheritDoc} */ + @Override public String name() { + return RESET_LOST_PARTITIONS.text().toUpperCase(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/logger/java/JavaLoggerFileHandler.java b/modules/core/src/main/java/org/apache/ignite/logger/java/JavaLoggerFileHandler.java index f37350a..e758d34 100644 --- a/modules/core/src/main/java/org/apache/ignite/logger/java/JavaLoggerFileHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/logger/java/JavaLoggerFileHandler.java @@ -135,7 +135,7 @@ public final class JavaLoggerFileHandler extends StreamHandler { * @param workDir Work directory. * @return Logging directory. */ - private static File logDirectory(String workDir) throws IgniteCheckedException { + public static File logDirectory(String workDir) throws IgniteCheckedException { return !F.isEmpty(U.IGNITE_LOG_DIR) ? new File(U.IGNITE_LOG_DIR) : U.resolveWorkDirectory(workDir, "log", false); } diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerAbstractTest.java index ccfa7f8..edb77e4 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerAbstractTest.java @@ -22,8 +22,11 @@ import java.nio.file.DirectoryStream; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.logging.Handler; +import java.util.logging.Logger; import java.util.stream.Collectors; import org.apache.ignite.Ignite; import org.apache.ignite.configuration.AtomicConfiguration; @@ -90,7 +93,7 @@ public class GridCommandHandlerAbstractTest extends GridCommonAbstractTest { sysOut = System.out; - testOut = new ByteArrayOutputStream(20 * 1024 * 1024); + testOut = new ByteArrayOutputStream(40 * 1024 * 1024); checkpointFreq = DataStorageConfiguration.DFLT_CHECKPOINT_FREQ; } @@ -182,7 +185,13 @@ public class GridCommandHandlerAbstractTest extends GridCommonAbstractTest { if (!F.isEmpty(args) && !"--help".equalsIgnoreCase(args.get(0))) addExtraArguments(args); - return hnd.execute(args); + int exitCode = hnd.execute(args); + + // Flush all Logger handlers to make log data available to test. + Logger logger = U.field(hnd, "logger"); + Arrays.stream(logger.getHandlers()).forEach(Handler::flush); + + return exitCode; } /** diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java index 99f1fa6..1778498 100644 --- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java @@ -1022,8 +1022,15 @@ public class GridCommandHandlerTest extends GridCommandHandlerAbstractTest { assertEquals(EXIT_CODE_UNEXPECTED_ERROR, execute("--baseline", "add", consistentIDs)); - assertTrue(testOut.toString(), testOut.toString().contains("Node not found for consistent ID:")); - assertFalse(testOut.toString(), testOut.toString().contains(getTestIgniteInstanceName() + "1")); + String testOutStr = testOut.toString(); + + // Ignite instase 1 can be logged only in arguments list. + boolean isInstanse1Found = Arrays.stream(testOutStr.split("\n")) + .filter(s -> s.contains("Arguments:")) + .noneMatch(s -> s.contains(getTestIgniteInstanceName() + "1")); + + assertTrue(testOutStr, testOutStr.contains("Node not found for consistent ID:")); + assertFalse(testOutStr, isInstanse1Found); } /** @@ -2306,20 +2313,21 @@ public class GridCommandHandlerTest extends GridCommandHandlerAbstractTest { out = testOut.toString(); - // Find last row - int lastRowIndex = out.lastIndexOf('\n'); - - assertTrue(lastRowIndex > 0); + List<String> outLines = Arrays.stream(out.split("\n")) + .map(String::trim) + .collect(Collectors.toList()); - // Last row is empty, but the previous line contains data - lastRowIndex = out.lastIndexOf('\n', lastRowIndex - 1); + int firstIndex = outLines.indexOf("[next group: id=1544803905, name=default]"); + int lastIndex = outLines.lastIndexOf("[next group: id=1544803905, name=default]"); - assertTrue(lastRowIndex > 0); + String dataLine = outLines.get(firstIndex + 1); + String userArrtDataLine = outLines.get(lastIndex + 1); - String lastRow = out.substring(lastRowIndex); + long commaNum = dataLine.chars().filter(i -> i == ',').count(); + long userArrtCommaNum = userArrtDataLine.chars().filter(i -> i == ',').count(); - // Since 3 user attributes have been added, the total number of columns in response should be 12 (separators 11) - assertEquals(11, lastRow.split(",").length); + // Check that number of columns increased by 3 + assertEquals(3, userArrtCommaNum - commaNum); } /**
