This is an automated email from the ASF dual-hosted git repository.

petrov-mg 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 23a92230b00 IGNITE-28740 Refactored Ignite product version 
initialization and usages (#13199)
23a92230b00 is described below

commit 23a92230b001a4912ff2c666906e2a2c86f47351
Author: Mikhail Petrov <[email protected]>
AuthorDate: Thu Jun 4 10:44:11 2026 +0300

    IGNITE-28740 Refactored Ignite product version initialization and usages 
(#13199)
---
 .../apache/ignite/internal/IgniteVersionUtils.java | 73 +++-------------------
 .../apache/ignite/lang/IgniteProductVersion.java   | 36 ++++++++++-
 .../internal/commandline/CommandHandler.java       |  4 +-
 modules/core/pom.xml                               |  9 ---
 .../java/org/apache/ignite/dump/DumpReader.java    |  4 +-
 .../org/apache/ignite/internal/IgniteKernal.java   | 11 +---
 .../apache/ignite/internal/IgniteMXBeanImpl.java   |  3 +-
 .../org/apache/ignite/internal/cdc/CdcMain.java    |  4 +-
 .../internal/plugin/IgniteLogInfoProviderImpl.java | 15 ++---
 .../ignite/spi/discovery/tcp/ClientImpl.java       |  5 +-
 .../ignite/spi/discovery/tcp/ServerImpl.java       |  5 +-
 .../ignite/spi/discovery/tcp/TcpDiscoverySpi.java  |  9 +++
 .../startup/cmdline/CdcCommandLineStartup.java     |  4 +-
 .../ignite/startup/cmdline/CommandLineStartup.java | 14 +++--
 modules/core/src/main/resources/ignite.properties  |  1 -
 .../internal/IgniteVersionUtilsSelfTest.java       | 15 +++--
 .../product/GridProductVersionSelfTest.java        |  5 --
 .../plugin/IgniteExtLogInfoProviderImpl.java       |  4 +-
 18 files changed, 93 insertions(+), 128 deletions(-)

diff --git 
a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
 
b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
index 58f0887b0d5..f72e339c2b2 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
@@ -17,91 +17,36 @@
 
 package org.apache.ignite.internal;
 
-import java.time.Instant;
 import java.time.LocalDate;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
-import java.util.Locale;
 import org.apache.ignite.lang.IgniteProductVersion;
 
+import static java.time.ZoneOffset.UTC;
+
 /**
  * Ignite version utils.
  */
 public class IgniteVersionUtils {
-    /** Ignite version in String form. */
+    /** Ignite artifact version. See {@link IgniteProperties} file generation 
by Maven build scripts. */
     public static final String VER_STR;
 
     /** Ignite version. */
     public static final IgniteProductVersion VER;
 
-    /** UTC build date formatter. */
-    private static final DateTimeFormatter BUILD_TSTAMP_DATE_FORMATTER;
-
-    /** Formatted build date. */
-    public static final String BUILD_TSTAMP_STR;
-
-    /** Build timestamp in seconds. */
-    public static final long BUILD_TSTAMP;
-
-    /** Build timestamp string property value. */
-    private static final String BUILD_TSTAMP_FROM_PROPERTY;
-
-    /** Revision hash. */
-    public static final String REV_HASH_STR;
-
-    /** Release date. */
-    public static final LocalDate RELEASE_DATE;
-
-    /** Compound version. */
-    public static final String ACK_VER_STR;
-
     /** Copyright blurb. */
     public static final String COPYRIGHT;
 
-    /**
-     * Static initializer.
-     */
     static {
-        VER_STR = IgniteProperties.get("ignite.version")
-            .replace(".a", "-a") // Backward compatibility fix.
-            .replace(".b", "-b")
-            .replace(".final", "-final");
-
-        BUILD_TSTAMP_FROM_PROPERTY = IgniteProperties.get("ignite.build");
+        VER_STR = IgniteProperties.get("ignite.version");
 
-        //Development ignite.properties file contains ignite.build = 0, so we 
will add the check for it.
-        BUILD_TSTAMP = !BUILD_TSTAMP_FROM_PROPERTY.isEmpty() && 
Long.parseLong(BUILD_TSTAMP_FROM_PROPERTY) != 0
-            ? Long.parseLong(BUILD_TSTAMP_FROM_PROPERTY) : 
System.currentTimeMillis() / 1000;
+        long revTs = Long.parseLong(IgniteProperties.get("ignite.build"));
 
-        BUILD_TSTAMP_DATE_FORMATTER = 
DateTimeFormatter.ofPattern("yyyyMMdd").withZone(ZoneId.of("UTC"));
+        String revHash = IgniteProperties.get("ignite.revision");
 
-        BUILD_TSTAMP_STR = formatBuildTimeStamp(BUILD_TSTAMP * 1000);
+        VER = IgniteProductVersion.fromString(VER_STR + '-' + revTs + '-' + 
revHash);
 
-        COPYRIGHT = BUILD_TSTAMP_STR.substring(0, 4) + " Copyright(C) Apache 
Software Foundation";
+        int year = revTs == 0 ? LocalDate.now(UTC).getYear() : 
VER.buildTime().atZone(UTC).getYear();
 
-        REV_HASH_STR = IgniteProperties.get("ignite.revision");
-
-        String releaseDateStr = IgniteProperties.get("ignite.rel.date");
-
-        DateTimeFormatter releaseDateFormatter = 
DateTimeFormatter.ofPattern("ddMMyyyy", Locale.US);
-
-        RELEASE_DATE = LocalDate.parse(releaseDateStr, releaseDateFormatter);
-
-        String rev = REV_HASH_STR.length() > 8 ? REV_HASH_STR.substring(0, 8) 
: REV_HASH_STR;
-
-        ACK_VER_STR = VER_STR + '#' + BUILD_TSTAMP_STR + "-sha1:" + rev;
-
-        VER = IgniteProductVersion.fromString(VER_STR + '-' + BUILD_TSTAMP + 
'-' + REV_HASH_STR);
-    }
-
-    /**
-     * Builds string date representation in "yyyyMMdd" format.
-     *
-     * @param ts Timestamp.
-     * @return Timestamp date in UTC timezone.
-     */
-    public static String formatBuildTimeStamp(long ts) {
-        return BUILD_TSTAMP_DATE_FORMATTER.format(Instant.ofEpochMilli(ts));
+        COPYRIGHT = year + " Copyright(C) Apache Software Foundation";
     }
 
     /**
diff --git 
a/modules/commons/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
 
b/modules/commons/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
index 3bd6a109805..4e84d0f3e08 100644
--- 
a/modules/commons/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
+++ 
b/modules/commons/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
@@ -21,14 +21,18 @@ import java.io.Externalizable;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.IgniteVersionUtils;
 import org.apache.ignite.internal.util.CommonUtils;
+import org.apache.ignite.internal.util.typedef.F;
 import org.jetbrains.annotations.NotNull;
 
+import static java.time.ZoneOffset.UTC;
+
 /**
  * Represents node version.
  * <p>
@@ -41,6 +45,9 @@ public class IgniteProductVersion implements 
Comparable<IgniteProductVersion>, E
     /** */
     private static final long serialVersionUID = 0L;
 
+    /** Ignite version build time format.  */
+    public static final DateTimeFormatter BUILD_TIME_FORMAT = 
DateTimeFormatter.ofPattern("yyyyMMdd").withZone(UTC);
+
     /** Size of the {@link #revHash }*/
     public static final int REV_HASH_SIZE = 20;
 
@@ -161,11 +168,22 @@ public class IgniteProductVersion implements 
Comparable<IgniteProductVersion>, E
         return revHash;
     }
 
+    /**
+     * Gets build time.
+     *
+     * @return Build time.
+     */
+    public Instant buildTime() {
+        return Instant.ofEpochSecond(revTs);
+    }
+
     /**
      * Gets release date.
      *
      * @return Release date.
+     * @deprecated Use {@link #buildTime()} instead.
      */
+    @Deprecated
     public Date releaseDate() {
         return new Date(revTs * 1000);
     }
@@ -267,13 +285,25 @@ public class IgniteProductVersion implements 
Comparable<IgniteProductVersion>, E
 
     /** {@inheritDoc} */
     @Override public String toString() {
-        String revTsStr = IgniteVersionUtils.formatBuildTimeStamp(revTs * 
1000);
+        String ts = BUILD_TIME_FORMAT.format(buildTime());
 
         String hash = CommonUtils.byteArray2HexString(revHash).toLowerCase();
 
         hash = hash.length() > 8 ? hash.substring(0, 8) : hash;
 
-        return major + "." + minor + "." + maintenance + "#" + revTsStr + 
"-sha1:" + hash;
+        StringBuilder sb = new StringBuilder();
+
+        sb.append(major)
+            .append(".").append(minor)
+            .append(".").append(maintenance);
+
+        if (!F.isEmpty(stage))
+            sb.append("-").append(stage);
+
+        sb.append("#").append(ts)
+            .append("-sha1:").append(hash);
+
+        return sb.toString();
     }
 
     /**
diff --git 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index bd987ad52dd..4d7230eb0a6 100644
--- 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -71,8 +71,8 @@ import static java.lang.System.lineSeparator;
 import static java.util.Objects.nonNull;
 import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_ENABLE_EXPERIMENTAL_COMMAND;
 import static org.apache.ignite.IgniteSystemProperties.getBoolean;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static 
org.apache.ignite.internal.commandline.ArgumentParser.CMD_AUTO_CONFIRMATION;
 import static 
org.apache.ignite.internal.commandline.ArgumentParser.CMD_ENABLE_EXPERIMENTAL;
 import static 
org.apache.ignite.internal.commandline.ArgumentParser.CMD_VERBOSE;
@@ -207,7 +207,7 @@ public class CommandHandler {
 
         Thread.currentThread().setName("session=" + ses);
 
-        logger.info("Control utility [ver. " + ACK_VER_STR + "]");
+        logger.info("Control utility [ver. " + VER + "]");
         logger.info(COPYRIGHT);
         logger.info("User: " + System.getProperty("user.name"));
         logger.info("Time: " + startTime.format(formatter));
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index 959a706488e..aebc94795a5 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -463,10 +463,6 @@
                                 <configuration>
                                     <failOnError>false</failOnError>
                                     <target>
-                                        <tstamp>
-                                            <format property="ignite.rel.date" 
pattern="ddMMyyyy" locale="en" />
-                                        </tstamp>
-
                                         <property name="props.file" 
value="../../modules/core/target/classes/ignite.properties" />
 
                                         <replaceregexp file="${props.file}" 
byline="true">
@@ -474,11 +470,6 @@
                                             <substitution 
expression="ignite.update.notifier.enabled.by.default=${update.notifier.enabled.by.default}"
 />
                                         </replaceregexp>
 
-                                        <replaceregexp file="${props.file}" 
byline="true">
-                                            <regexp 
pattern="ignite.rel.date=.*" />
-                                            <substitution 
expression="ignite.rel.date=${ignite.rel.date}" />
-                                        </replaceregexp>
-
                                         <replaceregexp file="${props.file}" 
byline="true">
                                             <regexp 
pattern="ignite.update.status.params=.*" />
                                             <substitution 
expression="ignite.update.status.params=ver=${project.version}&amp;product=${ignite.update.notifier.product}"
 />
diff --git a/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java 
b/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
index d720c7b66f0..039b7941fd3 100644
--- a/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
+++ b/modules/core/src/main/java/org/apache/ignite/dump/DumpReader.java
@@ -64,8 +64,8 @@ import org.apache.ignite.spi.encryption.EncryptionSpi;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.ignite.internal.IgniteKernal.NL;
 import static org.apache.ignite.internal.IgniteKernal.SITE;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static 
org.apache.ignite.internal.processors.cache.persistence.wal.reader.StandaloneGridKernalContext.closeAllComponents;
 import static 
org.apache.ignite.internal.processors.cache.persistence.wal.reader.StandaloneGridKernalContext.startAllComponents;
 
@@ -206,7 +206,7 @@ public class DumpReader implements Runnable {
 
     /** */
     private void ackAsciiLogo() {
-        String ver = "ver. " + ACK_VER_STR;
+        String ver = "ver. " + VER;
 
         if (log.isInfoEnabled()) {
             log.info(NL + NL +
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index d62afb99c95..303b0355960 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -269,11 +269,11 @@ import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SPI_CLASS;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_AWARE_QUERIES_ENABLED;
 import static 
org.apache.ignite.internal.IgniteNodeAttributes.ATTR_TX_SERIALIZABLE_ENABLED;
 import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_USER_NAME;
-import static org.apache.ignite.internal.IgniteVersionUtils.BUILD_TSTAMP_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
 import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR;
 import static org.apache.ignite.internal.util.IgniteUtils.validateRamUsage;
+import static org.apache.ignite.lang.IgniteProductVersion.BUILD_TIME_FORMAT;
 import static org.apache.ignite.lifecycle.LifecycleEventType.AFTER_NODE_START;
 import static org.apache.ignite.lifecycle.LifecycleEventType.BEFORE_NODE_START;
 import static org.apache.ignite.mxbean.IgniteMXBean.ACTIVE_DESC;
@@ -577,11 +577,6 @@ public class IgniteKernal implements IgniteEx, 
Externalizable {
         return X.timeSpan2DHMSM(upTime());
     }
 
-    /** @return String representation of version of current Ignite instance. */
-    String fullVersion() {
-        return VER_STR + '-' + BUILD_TSTAMP_STR;
-    }
-
     /** @return String representation of the checkpoint SPI. */
     String checkpointSpiFormatted() {
         assert cfg != null;
@@ -1560,7 +1555,7 @@ public class IgniteKernal implements IgniteEx, 
Externalizable {
         // Stick in some system level attributes
         add(ATTR_JIT_NAME, U.getCompilerMx() == null ? "" : 
U.getCompilerMx().getName());
         add(ATTR_BUILD_VER, VER_STR);
-        add(ATTR_BUILD_DATE, BUILD_TSTAMP_STR);
+        add(ATTR_BUILD_DATE, BUILD_TIME_FORMAT.format(VER.buildTime()));
         add(ATTR_MARSHALLER, ctx.marshaller().getClass().getName());
         add(ATTR_MARSHALLER_USE_DFLT_SUID,
             getBoolean(IGNITE_OPTIMIZED_MARSHALLER_USE_DEFAULT_SUID, 
Marshallers.USE_DFLT_SUID));
@@ -3413,7 +3408,7 @@ public class IgniteKernal implements IgniteEx, 
Externalizable {
 
         MetricRegistry reg = 
ctx.metric().registry(GridMetricManager.IGNITE_METRICS);
 
-        reg.register("fullVersion", this::fullVersion, String.class, 
FULL_VER_DESC);
+        reg.register("fullVersion", VER::toString, String.class, 
FULL_VER_DESC);
         reg.register("copyright", () -> COPYRIGHT, String.class, 
COPYRIGHT_DESC);
 
         reg.register("startTimestampFormatted", this::startTimeFormatted, 
String.class,
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteMXBeanImpl.java 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteMXBeanImpl.java
index 286f05f4216..fc4749be1d3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteMXBeanImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteMXBeanImpl.java
@@ -33,6 +33,7 @@ import org.apache.ignite.mxbean.IgniteMXBean;
 import static org.apache.ignite.cluster.ClusterState.ACTIVE;
 import static org.apache.ignite.cluster.ClusterState.INACTIVE;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 
 /** Implementation of {@link IgniteMXBean}. */
 public class IgniteMXBeanImpl implements IgniteMXBean {
@@ -103,7 +104,7 @@ public class IgniteMXBeanImpl implements IgniteMXBean {
 
     /** {@inheritDoc} */
     @Override public String getFullVersion() {
-        return kernal.fullVersion();
+        return VER.toString();
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/cdc/CdcMain.java 
b/modules/core/src/main/java/org/apache/ignite/internal/cdc/CdcMain.java
index d7f22658fdd..b874a1c9665 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/cdc/CdcMain.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/cdc/CdcMain.java
@@ -78,8 +78,8 @@ import 
org.apache.ignite.startup.cmdline.CdcCommandLineStartup;
 
 import static org.apache.ignite.internal.IgniteKernal.NL;
 import static org.apache.ignite.internal.IgniteKernal.SITE;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static 
org.apache.ignite.internal.IgnitionEx.initializeDefaultMBeanServer;
 import static 
org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.CDC_DATA_RECORD;
 import static 
org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.CDC_MANAGER_RECORD;
@@ -916,7 +916,7 @@ public class CdcMain implements Runnable {
 
     /** */
     private void ackAsciiLogo() {
-        String ver = "ver. " + ACK_VER_STR;
+        String ver = "ver. " + VER;
 
         if (log.isInfoEnabled()) {
             log.info(NL + NL +
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java
index b39e391f551..8678793f624 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/plugin/IgniteLogInfoProviderImpl.java
@@ -71,11 +71,8 @@ import static 
org.apache.ignite.IgniteSystemProperties.IGNITE_NO_ASCII;
 import static 
org.apache.ignite.internal.IgniteKernal.DFLT_LOG_CLASSPATH_CONTENT_ON_STARTUP;
 import static org.apache.ignite.internal.IgniteKernal.NL;
 import static org.apache.ignite.internal.IgniteKernal.SITE;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
-import static org.apache.ignite.internal.IgniteVersionUtils.BUILD_TSTAMP_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
-import static org.apache.ignite.internal.IgniteVersionUtils.REV_HASH_STR;
-import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static 
org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager.INTERNAL_DATA_REGION_NAMES;
 import static org.apache.ignite.internal.util.IgniteUtils.MB;
 
@@ -158,7 +155,7 @@ public class IgniteLogInfoProviderImpl implements 
IgniteLogInfoProvider {
         if (System.getProperty(IGNITE_NO_ASCII) != null)
             return;
 
-        String ver = "ver. " + ACK_VER_STR;
+        String ver = "ver. " + VER;
 
         // Big thanks to: http://patorjk.com/software/taag
         // Font name "Small Slant"
@@ -632,7 +629,7 @@ public class IgniteLogInfoProviderImpl implements 
IgniteLogInfoProvider {
         }
 
         if (log.isInfoEnabled()) {
-            String ack = "Ignite ver. " + VER_STR + '#' + BUILD_TSTAMP_STR + 
"-sha1:" + REV_HASH_STR;
+            String ack = "Ignite ver. " + VER;
 
             String dash = U.dash(ack.length());
 
@@ -943,8 +940,7 @@ public class IgniteLogInfoProviderImpl implements 
IgniteLogInfoProvider {
             return;
 
         if (!err) {
-            String ack = "Ignite ver. " + VER_STR + '#' + BUILD_TSTAMP_STR + 
"-sha1:" + REV_HASH_STR +
-                " stopped OK";
+            String ack = "Ignite ver. " + VER + " stopped OK";
 
             String dash = U.dash(ack.length());
 
@@ -958,8 +954,7 @@ public class IgniteLogInfoProviderImpl implements 
IgniteLogInfoProvider {
                 NL);
         }
         else {
-            String ack = "Ignite ver. " + VER_STR + '#' + BUILD_TSTAMP_STR + 
"-sha1:" + REV_HASH_STR +
-                " stopped with ERRORS";
+            String ack = "Ignite ver. " + VER + " stopped with ERRORS";
 
             String dash = U.dash(ack.length());
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
index 0d424a7a9dc..d3a5f13fe23 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ClientImpl.java
@@ -2220,6 +2220,8 @@ class ClientImpl extends TcpDiscoveryImpl {
                             rmtNodes.clear();
 
                         for (TcpDiscoveryNode n : top) {
+                            spi.restoreRemoteNodeVersion(n);
+
                             if (n.order() > 0)
                                 n.visible(true);
 
@@ -2363,8 +2365,7 @@ class ClientImpl extends TcpDiscoveryImpl {
                         node.order(topVer);
                         node.visible(true);
 
-                        if (spi.locNodeVer.equals(node.version()))
-                            node.version(spi.locNodeVer);
+                        spi.restoreRemoteNodeVersion(node);
 
                         evt = true;
                     }
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 f11ab667db0..d16d5994878 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
@@ -5263,6 +5263,8 @@ class ServerImpl extends TcpDiscoveryImpl {
                                 assert n.internalOrder() < 
node.internalOrder() :
                                     "Invalid node [topNode=" + n + ", added=" 
+ node + ']';
 
+                                spi.restoreRemoteNodeVersion(n);
+
                                 // Make all preceding nodes and local node 
visible.
                                 n.visible(true);
                             }
@@ -5405,8 +5407,7 @@ class ServerImpl extends TcpDiscoveryImpl {
                 assert node.internalOrder() > locNode.internalOrder() : 
"Invalid order [node=" + node +
                     ", locNode=" + locNode + ", msg=" + msg + ", ring=" + ring 
+ ']';
 
-                if (spi.locNodeVer.equals(node.version()))
-                    node.version(spi.locNodeVer);
+                spi.restoreRemoteNodeVersion(node);
 
                 if (!locNodeCoord) {
                     boolean b = ring.topologyVersion(topVer);
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 6e14dfa8f27..0ccf594f1f6 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
@@ -2482,6 +2482,15 @@ public class TcpDiscoverySpi extends IgniteSpiAdapter 
implements IgniteDiscovery
         }
     }
 
+    /**
+     * Tries to restore the node's {@link IgniteProductVersion#stage()} field, 
since it is transient and is not
+     * automatically restored after Cluster Node deserialization.
+     */
+    protected void restoreRemoteNodeVersion(TcpDiscoveryNode rmtNode) {
+        if (locNodeVer.equals(rmtNode.version()))
+            rmtNode.version(locNodeVer);
+    }
+
     /**
      * Socket timeout object.
      */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CdcCommandLineStartup.java
 
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CdcCommandLineStartup.java
index 63d645122ad..3e434309b6a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CdcCommandLineStartup.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CdcCommandLineStartup.java
@@ -26,8 +26,8 @@ import org.jetbrains.annotations.Nullable;
 
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_NO_SHUTDOWN_HOOK;
 import static org.apache.ignite.internal.IgniteKernal.NL;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static org.apache.ignite.startup.cmdline.CommandLineStartup.isHelp;
 
 /**
@@ -57,7 +57,7 @@ public class CdcCommandLineStartup {
                       "   /  _/ ___/ |/ /  _/_  __/ __/   / ___/ _ \\/ ___/" + 
NL +
                       "  _/ // (7 7    // /  / / / _/    / /__/ // / /__  " + 
NL +
                       " /___/\\___/_/|_/___/ /_/ /___/    \\___/____/\\___/");
-            X.println("Ignite Change Data Capture Command Line Startup, ver. " 
+ ACK_VER_STR);
+            X.println("Ignite Change Data Capture Command Line Startup, ver. " 
+ VER);
             X.println(COPYRIGHT);
             X.println();
         }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineStartup.java
 
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineStartup.java
index 59fe4a22035..f1e5f928512 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineStartup.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineStartup.java
@@ -58,12 +58,12 @@ import 
org.apache.ignite.spi.deployment.local.LocalDeploymentSpi;
 import org.jetbrains.annotations.Nullable;
 
 import static java.lang.String.format;
+import static java.time.ZoneOffset.UTC;
 import static org.apache.ignite.IgniteState.STARTED;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_PROG_NAME;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_RESTART_CODE;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
-import static org.apache.ignite.internal.IgniteVersionUtils.RELEASE_DATE;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR;
 
 /**
@@ -177,8 +177,12 @@ public final class CommandLineStartup {
                 new Class<?>[] {aboutHndCls},
                 new InvocationHandler() {
                     @Override public Object invoke(Object proxy, Method mtd, 
Object[] args) throws Throwable {
-                        AboutDialog.centerShow("Ignite Node", 
bannerUrl.toExternalForm(), VER_STR,
-                            RELEASE_DATE, COPYRIGHT);
+                        AboutDialog.centerShow(
+                            "Ignite Node",
+                            bannerUrl.toExternalForm(),
+                            VER_STR,
+                            VER.buildTime().atZone(UTC).toLocalDate(),
+                            COPYRIGHT);
 
                         return null;
                     }
@@ -315,7 +319,7 @@ public final class CommandLineStartup {
      */
     public static void main(String[] args) {
         if (!QUITE) {
-            X.println("Ignite Command Line Startup, ver. " + ACK_VER_STR);
+            X.println("Ignite Command Line Startup, ver. " + VER);
             X.println(COPYRIGHT);
             X.println();
         }
diff --git a/modules/core/src/main/resources/ignite.properties 
b/modules/core/src/main/resources/ignite.properties
index cb91ffada9d..ec6fa7dd30f 100644
--- a/modules/core/src/main/resources/ignite.properties
+++ b/modules/core/src/main/resources/ignite.properties
@@ -18,6 +18,5 @@
 ignite.version=2.19.0-SNAPSHOT
 ignite.build=0
 ignite.revision=DEV
-ignite.rel.date=01011970
 ignite.update.status.params=test=vfvfvskfkeievskjv
 ignite.update.notifier.enabled.by.default=false
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/IgniteVersionUtilsSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/IgniteVersionUtilsSelfTest.java
index 5ec6ef5203b..cdf83796c14 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/IgniteVersionUtilsSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/IgniteVersionUtilsSelfTest.java
@@ -17,19 +17,18 @@
 
 package org.apache.ignite.internal;
 
-import java.util.Calendar;
+import java.time.LocalDate;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
-/**
- */
+import static java.time.ZoneOffset.UTC;
+
+/** */
 public class IgniteVersionUtilsSelfTest extends GridCommonAbstractTest {
-    /**
-     * @throws Exception If failed.
-     */
+    /** */
     @Test
-    public void testIgniteCopyrights() throws Exception {
-        final String COPYRIGHT = 
String.valueOf(Calendar.getInstance().get(Calendar.YEAR)) + " Copyright(C) 
Apache Software Foundation";
+    public void testIgniteCopyrights() {
+        final String COPYRIGHT = LocalDate.now(UTC).getYear() + " Copyright(C) 
Apache Software Foundation";
 
         assertNotNull(IgniteVersionUtils.COPYRIGHT);
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/product/GridProductVersionSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/product/GridProductVersionSelfTest.java
index 79a47b625fd..51c734667e9 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/product/GridProductVersionSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/product/GridProductVersionSelfTest.java
@@ -21,9 +21,6 @@ import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.junit.Test;
 
-import static org.apache.ignite.internal.IgniteVersionUtils.BUILD_TSTAMP;
-import static org.apache.ignite.internal.IgniteVersionUtils.REV_HASH_STR;
-import static org.apache.ignite.internal.IgniteVersionUtils.VER_STR;
 import static org.junit.Assert.assertArrayEquals;
 
 /**
@@ -137,7 +134,5 @@ public class GridProductVersionSelfTest extends 
GridCommonAbstractTest {
         assertEquals(4, ver.revisionTimestamp());
         assertArrayEquals(new byte[]{24, -27, -89, -20, -98, 50, 2, 18, 106, 
105, -68, 35, 26, 107, -106, 91, -63, -41, 61, -18},
             ver.revisionHash());
-
-        IgniteProductVersion.fromString(VER_STR + '-' + BUILD_TSTAMP + '-' + 
REV_HASH_STR);
     }
 }
diff --git 
a/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/plugin/IgniteExtLogInfoProviderImpl.java
 
b/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/plugin/IgniteExtLogInfoProviderImpl.java
index 826c7e333a1..525b9c4ba5b 100644
--- 
a/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/plugin/IgniteExtLogInfoProviderImpl.java
+++ 
b/modules/extdata/pluggable/src/test/java/org/apache/ignite/internal/plugin/IgniteExtLogInfoProviderImpl.java
@@ -23,8 +23,8 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
 import static org.apache.ignite.internal.IgniteKernal.NL;
-import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR;
 import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
+import static org.apache.ignite.internal.IgniteVersionUtils.VER;
 
 /**
  * Change the message output for metrics log.
@@ -32,7 +32,7 @@ import static 
org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT;
 public class IgniteExtLogInfoProviderImpl extends IgniteLogInfoProviderImpl {
     /** {@inheritDoc} */
     @Override void ackAsciiLogo(IgniteLogger log, IgniteConfiguration cfg, 
RuntimeMXBean rtBean) {
-        String ver = "ver. " + ACK_VER_STR;
+        String ver = "ver. " + VER;
 
         U.quietAndInfo(log,
             NL + NL +

Reply via email to