diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java index a6e7a2db23b29..10bd7b1fb869e 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/DataStorageConfiguration.java @@ -23,6 +23,7 @@ import org.apache.ignite.internal.processors.cache.persistence.file.AsyncFileIOFactory; import org.apache.ignite.internal.processors.cache.persistence.file.FileIOFactory; import org.apache.ignite.internal.processors.cache.persistence.file.RandomAccessFileIOFactory; +import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; @@ -301,6 +302,7 @@ public class DataStorageConfiguration implements Serializable { private boolean alwaysWriteFullPages = DFLT_WAL_ALWAYS_WRITE_FULL_PAGES; /** Factory to provide I/O interface for data storage files */ + @GridToStringExclude private FileIOFactory fileIOFactory = IgniteSystemProperties.getBoolean(IGNITE_USE_ASYNC_FILE_IO_FACTORY, DFLT_USE_ASYNC_FILE_IO_FACTORY) ? new AsyncFileIOFactory() : new RandomAccessFileIOFactory(); diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/EncryptionConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/EncryptionConfiguration.java index 6b9345d4c7550..320795026ec2e 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/EncryptionConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/EncryptionConfiguration.java @@ -18,11 +18,14 @@ package org.apache.ignite.configuration; import java.io.Serializable; + +import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.A; /** * Encryption configuration. */ +@GridToStringExclude public class EncryptionConfiguration implements Serializable { /** */ private static final long serialVersionUID = 0L; diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java index 16d0bac76cf53..6033892fe37ee 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/IgniteConfiguration.java @@ -49,6 +49,7 @@ import org.apache.ignite.failure.FailureHandler; import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager; import org.apache.ignite.internal.processors.odbc.ClientListenerProcessor; +import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.A; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; @@ -326,6 +327,7 @@ public class IgniteConfiguration { private String igniteWorkDir; /** MBean server. */ + @GridToStringExclude private MBeanServer mbeanSrv; /** Local node ID. */ @@ -389,42 +391,54 @@ public class IgniteConfiguration { private long segChkFreq = DFLT_SEG_CHK_FREQ; /** Communication SPI. */ + @GridToStringExclude private CommunicationSpi commSpi; /** Event storage SPI. */ + @GridToStringExclude private EventStorageSpi evtSpi; /** Collision SPI. */ + @GridToStringExclude private CollisionSpi colSpi; /** Deployment SPI. */ + @GridToStringExclude private DeploymentSpi deploySpi; /** Checkpoint SPI. */ + @GridToStringExclude private CheckpointSpi[] cpSpi; /** Failover SPI. */ + @GridToStringExclude private FailoverSpi[] failSpi; /** Load balancing SPI. */ + @GridToStringExclude private LoadBalancingSpi[] loadBalancingSpi; /** Indexing SPI. */ + @GridToStringExclude private IndexingSpi indexingSpi; /** Address resolver. */ private AddressResolver addrRslvr; /** Encryption SPI. */ + @GridToStringExclude private EncryptionSpi encryptionSpi; /** Metric exporter SPI. */ + @GridToStringExclude private MetricExporterSpi[] metricExporterSpi; /** System view exporter SPI. */ + @GridToStringExclude private SystemViewExporterSpi[] sysViewExporterSpi; /** Tracing SPI. */ + @GridToStringExclude private TracingSpi tracingSpi; /** Cache configurations. */ diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/SystemDataRegionConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/SystemDataRegionConfiguration.java index bfa20048a7d6e..76b2b1e3a0a59 100644 --- a/modules/core/src/main/java/org/apache/ignite/configuration/SystemDataRegionConfiguration.java +++ b/modules/core/src/main/java/org/apache/ignite/configuration/SystemDataRegionConfiguration.java @@ -18,6 +18,7 @@ import java.io.Serializable; import org.apache.ignite.internal.util.typedef.internal.A; +import org.apache.ignite.internal.util.typedef.internal.S; /** * This class allows defining system data region configuration with various parameters for Apache Ignite @@ -90,4 +91,9 @@ public SystemDataRegionConfiguration setMaxSize(long maxSize) { return this; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(SystemDataRegionConfiguration.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java index 6e14dfa8f272f..0bd41ea160826 100644 --- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java +++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/TcpDiscoverySpi.java @@ -383,6 +383,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter implements IgniteDiscovery private Marshaller marsh; /** Statistics. */ + @GridToStringExclude protected final TcpDiscoveryStatistics stats = new TcpDiscoveryStatistics(); /** Local port which node uses. */ diff --git a/modules/core/src/test/java/org/apache/ignite/configuration/IgniteConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/configuration/IgniteConfigurationTest.java new file mode 100644 index 0000000000000..098a8e0e70e85 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/configuration/IgniteConfigurationTest.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.configuration; + +import java.util.regex.Pattern; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.testframework.ListeningTestLogger; +import org.apache.ignite.testframework.LogListener; +import org.apache.ignite.testframework.junits.WithSystemProperty; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Assert; +import org.junit.Test; + +import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET; + +/** + * Test covers cases where Ignite configuration, + * or it's nested objects has default implementation of {@link Object#toString()} + */ +@WithSystemProperty(key = IGNITE_QUIET, value = "false") +public class IgniteConfigurationTest extends GridCommonAbstractTest { + /** Error message to be prompted */ + private static final String ASSERTION_ERROR_MESSAGE = + "Ignite configuration log message contains objects with default toString implementation!"; + + /** Pattern to check any object has default {@link Object#toString()} implementation */ + private static final Pattern ERROR_PATTERN = Pattern.compile("^(?=.*IgniteConfiguration \\[)(?!.*@\\d+).*$"); + + /** */ + private final ListeningTestLogger listeningLog = new ListeningTestLogger(log); + + /** + * Check ignite configuration log message contains no @ letters + * It's a common way to ensure all objects in prompt has {@link Object#toString()} overriden + */ + @Test + public void testIgniteConfigurationPrompt() throws Exception { + LogListener igniteConfigurationLogListener = LogListener + .matches(ERROR_PATTERN) + .atLeast(1) + .build(); + listeningLog.registerListener(igniteConfigurationLogListener); + try (IgniteEx ignored = startGrid(0)) { + Assert.assertTrue(ASSERTION_ERROR_MESSAGE, igniteConfigurationLogListener.check()); + } + } + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + return super.getConfiguration(igniteInstanceName) + .setGridLogger(listeningLog); + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite2.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite2.java index def9e319d2310..9b5ca62ce8523 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite2.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite2.java @@ -19,6 +19,7 @@ import org.apache.ignite.ClassPathContentLoggingTest; import org.apache.ignite.cache.RemoveAllDeadlockTest; +import org.apache.ignite.configuration.IgniteConfigurationTest; import org.apache.ignite.events.ClusterActivationStartedEventTest; import org.apache.ignite.failure.ExchangeTaskHandlerWaitingForTasksTest; import org.apache.ignite.failure.FailureHandlerTriggeredTest; @@ -227,6 +228,8 @@ FreeListCutTailDifferentGcTest.class, MdcCacheReadRequestsRoutingTest.class, + + IgniteConfigurationTest.class, }) public class IgniteBasicTestSuite2 { }