Only log yaml config once, at startup patch by jasobrown, reviewed by Paulo Motta for CASSANDRA-11217
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/621f446c Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/621f446c Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/621f446c Branch: refs/heads/trunk Commit: 621f446ca4a319adcb50d2479e3fa7121eac6ebd Parents: 49a33e4 Author: Jason Brown <jasedbr...@gmail.com> Authored: Fri Feb 12 14:55:27 2016 -0800 Committer: Jason Brown <jasedbr...@gmail.com> Committed: Wed Mar 2 12:59:37 2016 -0800 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/config/Config.java | 48 ++++++++++++++++++++ .../cassandra/config/DatabaseDescriptor.java | 12 ++++- .../config/YamlConfigurationLoader.java | 18 -------- 4 files changed, 59 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/621f446c/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index b77d811..819fa22 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -21,6 +21,7 @@ properly (CASSANDRA-11050) * Fix NPE when using forceRepairRangeAsync without DC (CASSANDRA-11239) Merged from 2.2: + * Only log yaml config once, at startup (CASSANDRA-11217) * Reference leak with parallel repairs on the same table (CASSANDRA-11215) * Range.compareTo() violates the contract of Comparable (CASSANDRA-11216) * Avoid NPE when serializing ErrorMessage with null message (CASSANDRA-11167) http://git-wip-us.apache.org/repos/asf/cassandra/blob/621f446c/src/java/org/apache/cassandra/config/Config.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index ca5bcea..32c0bfa 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -17,11 +17,21 @@ */ package org.apache.cassandra.config; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.TimeUnit; +import com.google.common.base.Joiner; import com.google.common.collect.Sets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.apache.cassandra.config.EncryptionOptions.ClientEncryptionOptions; import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions; @@ -32,6 +42,8 @@ import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions; */ public class Config { + private static final Logger logger = LoggerFactory.getLogger(Config.class); + /* * Prefix for Java properties for internal Cassandra configuration options */ @@ -383,4 +395,40 @@ public class Config ssd, spinning } + + private static final List<String> SENSITIVE_KEYS = new ArrayList<String>() {{ + add("client_encryption_options"); + add("server_encryption_options"); + }}; + public void log() + { + Map<String, String> configMap = new TreeMap<>(); + for (Field field : getClass().getFields()) + { + // ignore the constants + if (Modifier.isFinal(field.getModifiers())) + continue; + + String name = field.getName(); + if (SENSITIVE_KEYS.contains(name)) + { + configMap.put(name, "<REDACTED>"); + continue; + } + + String value; + try + { + // Field.get() can throw NPE if the value of the field is null + value = field.get(this).toString(); + } + catch (NullPointerException | IllegalAccessException npe) + { + value = "null"; + } + configMap.put(name, value); + } + + logger.info("Node configuration:[" + Joiner.on("; ").join(configMap.entrySet()) + "]"); + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/621f446c/src/java/org/apache/cassandra/config/DatabaseDescriptor.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index c903775..7bcfb97 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -53,7 +53,6 @@ import org.apache.cassandra.scheduler.IRequestScheduler; import org.apache.cassandra.scheduler.NoScheduler; import org.apache.cassandra.service.CacheService; import org.apache.cassandra.thrift.ThriftServer; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.memory.*; @@ -101,6 +100,7 @@ public class DatabaseDescriptor private static String localDC; private static Comparator<InetAddress> localComparator; + private static boolean hasLoggedConfig; public static void forceStaticInitialization() {} static @@ -132,7 +132,15 @@ public class DatabaseDescriptor ConfigurationLoader loader = loaderClass == null ? new YamlConfigurationLoader() : FBUtilities.<ConfigurationLoader>construct(loaderClass, "configuration loading"); - return loader.loadConfig(); + Config config = loader.loadConfig(); + + if (!hasLoggedConfig) + { + hasLoggedConfig = true; + config.log(); + } + + return config; } private static InetAddress getNetworkInterfaceAddress(String intf, String configName, boolean preferIPv6) throws ConfigurationException http://git-wip-us.apache.org/repos/asf/cassandra/blob/621f446c/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java index 917eaeb..435377c 100644 --- a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java +++ b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java @@ -27,9 +27,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.TreeMap; -import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -113,8 +111,6 @@ public class YamlConfigurationLoader implements ConfigurationLoader throw new AssertionError(e); } - logConfig(configBytes); - Constructor constructor = new CustomConstructor(Config.class); MissingPropertiesChecker propertiesChecker = new MissingPropertiesChecker(); constructor.setPropertyUtils(propertiesChecker); @@ -165,20 +161,6 @@ public class YamlConfigurationLoader implements ConfigurationLoader } } - private void logConfig(byte[] configBytes) - { - Map<Object, Object> configMap = new TreeMap<>((Map<?, ?>) new Yaml().load(new ByteArrayInputStream(configBytes))); - // these keys contain passwords, don't log them - for (String sensitiveKey : new String[] { "client_encryption_options", "server_encryption_options" }) - { - if (configMap.containsKey(sensitiveKey)) - { - configMap.put(sensitiveKey, "<REDACTED>"); - } - } - logger.info("Node configuration:[{}]", Joiner.on("; ").join(configMap.entrySet())); - } - private static class MissingPropertiesChecker extends PropertyUtils { private final Set<String> missingProperties = new HashSet<>();