This is an automated email from the ASF dual-hosted git repository.
zstan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 79e1e405f99 IGNITE-15735 Ingite configuration log message improvements
(#13191)
79e1e405f99 is described below
commit 79e1e405f99a52dce1e30dbc7a2c1c6820dfc9d9
Author: Egor Baranov <[email protected]>
AuthorDate: Fri Jun 5 09:15:08 2026 +0300
IGNITE-15735 Ingite configuration log message improvements (#13191)
---
.../configuration/DataStorageConfiguration.java | 2 +
.../configuration/EncryptionConfiguration.java | 3 +
.../ignite/configuration/IgniteConfiguration.java | 3 +
.../SystemDataRegionConfiguration.java | 6 ++
.../marshaller/IgniteMarshallerClassFilter.java | 5 ++
.../spi/collision/noop/NoopCollisionSpi.java | 3 +-
.../spi/communication/tcp/TcpCommunicationSpi.java | 8 +-
.../ignite/spi/discovery/tcp/ServerImpl.java | 3 +
.../ignite/spi/discovery/tcp/TcpDiscoverySpi.java | 5 ++
.../encryption/keystore/KeystoreEncryptionSpi.java | 5 ++
.../spi/encryption/noop/NoopEncryptionSpi.java | 5 ++
.../apache/ignite/spi/tracing/NoopTracingSpi.java | 5 ++
.../configuration/IgniteConfigurationTest.java | 86 ++++++++++++++++++++++
.../testframework/junits/GridAbstractTest.java | 10 ++-
.../ignite/testsuites/IgniteBasicTestSuite2.java | 3 +
.../tracing/opencensus/OpenCensusTracingSpi.java | 5 ++
16 files changed, 149 insertions(+), 8 deletions(-)
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 a6e7a2db23b..10bd7b1fb86 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.IgniteSystemProperties;
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 6b9345d4c75..320795026ec 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 481bbdeae11..47082a6688f 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.events.EventType;
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;
@@ -314,6 +315,7 @@ public class IgniteConfiguration implements
IgniteConfigurationDefaults {
private String igniteWorkDir;
/** MBean server. */
+ @GridToStringExclude
private MBeanServer mbeanSrv;
/** Local node ID. */
@@ -398,6 +400,7 @@ public class IgniteConfiguration implements
IgniteConfigurationDefaults {
private LoadBalancingSpi[] loadBalancingSpi;
/** Indexing SPI. */
+ @GridToStringExclude
private IndexingSpi indexingSpi;
/** Address resolver. */
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 bfa20048a7d..76b2b1e3a0a 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 @@ package org.apache.ignite.configuration;
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 class SystemDataRegionConfiguration implements
Serializable {
return this;
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(SystemDataRegionConfiguration.class, this);
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java
b/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java
index 2c215465f9b..bc6c20b1a90 100644
---
a/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java
+++
b/modules/core/src/main/java/org/apache/ignite/marshaller/IgniteMarshallerClassFilter.java
@@ -67,4 +67,9 @@ public class IgniteMarshallerClassFilter implements
IgnitePredicate<String> {
@Override public int hashCode() {
return Objects.hash(whiteList, blackList);
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "IgniteMarshallerClassFilter";
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/collision/noop/NoopCollisionSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/collision/noop/NoopCollisionSpi.java
index a7c7feef2b3..1400a417777 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/collision/noop/NoopCollisionSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/collision/noop/NoopCollisionSpi.java
@@ -17,7 +17,6 @@
package org.apache.ignite.spi.collision.noop;
-import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.spi.IgniteSpiAdapter;
import org.apache.ignite.spi.IgniteSpiException;
import org.apache.ignite.spi.IgniteSpiMultipleInstancesSupport;
@@ -67,6 +66,6 @@ public class NoopCollisionSpi extends IgniteSpiAdapter
implements CollisionSpi {
/** {@inheritDoc} */
@Override public String toString() {
- return S.toString(NoopCollisionSpi.class, this);
+ return "NoopCollisionSpi";
}
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index cf1a42cf840..3078e20a0e9 100755
---
a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -54,7 +54,7 @@ import
org.apache.ignite.internal.util.nio.GridNioRecoveryDescriptor;
import org.apache.ignite.internal.util.nio.GridNioServer;
import org.apache.ignite.internal.util.nio.GridNioSession;
import org.apache.ignite.internal.util.nio.GridNioSessionMetaKey;
-import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.worker.WorkersRegistry;
import org.apache.ignite.lang.IgniteFuture;
@@ -194,6 +194,7 @@ import static
org.apache.ignite.spi.communication.tcp.internal.TcpConnectionInde
*/
@IgniteSpiMultipleInstancesSupport(true)
@IgniteSpiConsistencyChecked(optional = false)
+@GridToStringInclude
public class TcpCommunicationSpi extends TcpCommunicationConfigInitializer {
/** Node attribute that is mapped to node IP addresses (value is
<tt>comm.tcp.addrs</tt>). */
public static final String ATTR_ADDRS = "comm.tcp.addrs";
@@ -1153,7 +1154,10 @@ public class TcpCommunicationSpi extends
TcpCommunicationConfigInitializer {
/** {@inheritDoc} */
@Override public String toString() {
- return S.toString(TcpCommunicationSpi.class, this);
+ return "TcpCommunicationSpi [" +
+ "ctxInitLatch=" + ctxInitLatch.getCount() +
+ ", stopping=" + stopping +
+ "]";
}
/**
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index d16d5994878..0b25f0a2386 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -255,6 +255,7 @@ class ServerImpl extends TcpDiscoveryImpl {
private long connCheckTick;
/** */
+ @GridToStringExclude
private final IgniteThreadPoolExecutor utilityPool;
/** Pool size to ping remote DC if a corner node loses the ring
connection. */
@@ -292,6 +293,7 @@ class ServerImpl extends TcpDiscoveryImpl {
private StatisticsPrinter statsPrinter;
/** Metric for max message queue size. */
+ @GridToStringExclude
private MaxValueMetric maxMsgQueueSizeMetric;
/** Failed nodes (but still in topology). */
@@ -310,6 +312,7 @@ class ServerImpl extends TcpDiscoveryImpl {
private Queue<TcpDiscoveryCustomEventMessage> pendingCustomMsgs = new
ArrayDeque<>();
/** Messages history used for client reconnect. */
+ @GridToStringExclude
private final EnsuredMessageHistory msgHist = new EnsuredMessageHistory();
/** If non-shared IP finder is used this flag shows whether IP finder
contains local address. */
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 0ccf594f1f6..f634b44f173 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
@@ -350,9 +350,11 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter
implements IgniteDiscovery
protected long connRecoveryTimeout = DFLT_CONNECTION_RECOVERY_TIMEOUT;
/** Grid discovery listener. */
+ @GridToStringExclude
protected volatile DiscoverySpiListener lsnr;
/** Data exchange. */
+ @GridToStringExclude
protected DiscoverySpiDataExchange exchange;
/** Metrics provider. */
@@ -383,6 +385,7 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter
implements IgniteDiscovery
private Marshaller marsh;
/** Statistics. */
+ @GridToStringExclude
protected final TcpDiscoveryStatistics stats = new
TcpDiscoveryStatistics();
/** Local port which node uses. */
@@ -455,9 +458,11 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter
implements IgniteDiscovery
private IgniteBiTuple<Collection<String>, Collection<String>> addrs;
/** */
+ @GridToStringExclude
protected IgniteSpiContext spiCtx;
/** Discovery messages factory. */
+ @GridToStringExclude
private MessageFactory msgFactory;
/** For test purposes. */
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/encryption/keystore/KeystoreEncryptionSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/encryption/keystore/KeystoreEncryptionSpi.java
index 7613c5bccc6..1f2e1b244e9 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/encryption/keystore/KeystoreEncryptionSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/encryption/keystore/KeystoreEncryptionSpi.java
@@ -546,4 +546,9 @@ public class KeystoreEncryptionSpi extends IgniteSpiAdapter
implements Encryptio
throw new IgniteSpiException(e);
}
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "KeystoreEncryptionSpi";
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/encryption/noop/NoopEncryptionSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/encryption/noop/NoopEncryptionSpi.java
index 31e52498b32..13e6d51aca5 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/encryption/noop/NoopEncryptionSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/encryption/noop/NoopEncryptionSpi.java
@@ -124,4 +124,9 @@ public class NoopEncryptionSpi extends IgniteSpiAdapter
implements EncryptionSpi
@Override public void spiStop() throws IgniteSpiException {
// No-op.
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "NoopEncryptionSpi";
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
b/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
index c12714bc5e6..23a51c01204 100644
---
a/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
+++
b/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
@@ -67,4 +67,9 @@ public class NoopTracingSpi extends IgniteSpiAdapter
implements TracingSpi<NoopS
@Override public byte type() {
return TracingSpiType.NOOP_TRACING_SPI.index();
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "NoopTracingSpi";
+ }
}
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 00000000000..d910110b3ea
--- /dev/null
+++
b/modules/core/src/test/java/org/apache/ignite/configuration/IgniteConfigurationTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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 have default implementation of {@link
Object#toString()}
+ */
+@WithSystemProperty(key = IGNITE_QUIET, value = "false")
+public class IgniteConfigurationTest extends GridCommonAbstractTest {
+ /** Error message to be prompted for ignite configuration */
+ private static final String ASSERTION_ERROR_MESSAGE =
+ "Ignite configuration log message contains objects with default
#toString() implementation";
+
+ /** Error message to be prompted for node start log message */
+ private static final String NODE_START_ASSERTION_ERROR_MESSAGE =
+ "Node start log message contains objects with default #toString()
implementation";
+
+ /** Contains not identity hash fragments ("@...") */
+ public static final String CONTAINS_NOT_DEFAULT_TO_STRING =
"(?!.*@[a-fA-F0-9]+).*";
+
+ /** Pattern to check any object has default {@link Object#toString()}
implementation */
+ private static final Pattern ERROR_PATTERN =
+ Pattern.compile("^(?=.*IgniteConfiguration \\[)"
+ + CONTAINS_NOT_DEFAULT_TO_STRING + "$");
+
+ /** Pattern to check any object has default {@link Object#toString()}
implementation */
+ private static final Pattern NODE_START_ERROR_PATTERN =
+ Pattern.compile("^(?=.*Node started with the following
configuration \\[id=)"
+ + CONTAINS_NOT_DEFAULT_TO_STRING + "$");
+
+ /** */
+ private final ListeningTestLogger listeningLog = new
ListeningTestLogger(log);
+
+ /**
+ * Checks that Ignite configuration log message contains no identity hash
fragments ("@...").
+ * This is a common heuristic to ensure all logged objects override {@link
Object#toString()}.
+ */
+ @Test
+ public void testIgniteConfigurationPrompt() throws Exception {
+ LogListener igniteConfigurationLogListener = LogListener
+ .matches(ERROR_PATTERN)
+ .build();
+ LogListener nodeStartIgniteConfigurationLogListener = LogListener
+ .matches(NODE_START_ERROR_PATTERN)
+ .build();
+ listeningLog.registerListener(igniteConfigurationLogListener);
+ listeningLog.registerListener(nodeStartIgniteConfigurationLogListener);
+ try (IgniteEx ignored = startGrid(0)) {
+ Assert.assertTrue(ASSERTION_ERROR_MESSAGE,
igniteConfigurationLogListener.check());
+ Assert.assertTrue(NODE_START_ASSERTION_ERROR_MESSAGE,
nodeStartIgniteConfigurationLogListener.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/testframework/junits/GridAbstractTest.java
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
index 039309f8663..5029cb64a89 100755
---
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java
@@ -1324,10 +1324,12 @@ public abstract class GridAbstractTest extends
JUnitAssertAware {
IgniteConfiguration nodeCfg = node.configuration();
- log.info("Node started with the following configuration [id="
+ node.cluster().localNode().id()
- + ", discovery=" + nodeCfg.getDiscoverySpi()
- + ", binaryCfg=" + nodeCfg.getBinaryConfiguration()
- + ", lateAff=" + nodeCfg.isLateAffinityAssignment() + "]");
+ nodeCfg.getGridLogger().getLogger(getClass().getName())
+ .info("Node started with the following configuration ["
+ + "id=" + node.cluster().localNode().id()
+ + ", discovery=" + nodeCfg.getDiscoverySpi()
+ + ", binaryCfg=" +
nodeCfg.getBinaryConfiguration()
+ + ", lateAff=" +
nodeCfg.isLateAffinityAssignment() + "]");
return node;
}
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 def9e319d23..9b5ca62ce85 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 @@ package org.apache.ignite.testsuites;
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 @@ import org.junit.runners.Suite;
FreeListCutTailDifferentGcTest.class,
MdcCacheReadRequestsRoutingTest.class,
+
+ IgniteConfigurationTest.class,
})
public class IgniteBasicTestSuite2 {
}
diff --git
a/modules/opencensus/src/main/java/org/apache/ignite/spi/tracing/opencensus/OpenCensusTracingSpi.java
b/modules/opencensus/src/main/java/org/apache/ignite/spi/tracing/opencensus/OpenCensusTracingSpi.java
index 1e3a8611483..85f0c0ca5ec 100644
---
a/modules/opencensus/src/main/java/org/apache/ignite/spi/tracing/opencensus/OpenCensusTracingSpi.java
+++
b/modules/opencensus/src/main/java/org/apache/ignite/spi/tracing/opencensus/OpenCensusTracingSpi.java
@@ -151,4 +151,9 @@ public class OpenCensusTracingSpi extends IgniteSpiAdapter
implements TracingSpi
@Override public byte type() {
return TracingSpiType.OPEN_CENSUS_TRACING_SPI.index();
}
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return "OpenCensusTracingSpi";
+ }
}