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

nizhikov 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 e014d440323 IGNITE-28720 Remove Message interface from 
IgniteProductVersion (#13180)
e014d440323 is described below

commit e014d4403232eb5c0e632bf8e88a393756500a8d
Author: Nikolay <[email protected]>
AuthorDate: Wed May 27 15:34:49 2026 +0300

    IGNITE-28720 Remove Message interface from IgniteProductVersion (#13180)
---
 .../internal/MessageSerializerGenerator.java       |   6 ++
 .../ignite/internal/CoreMessagesProvider.java      |   2 -
 .../internal/direct/DirectMessageReader.java       |  12 +++
 .../internal/direct/DirectMessageWriter.java       |  10 ++
 .../direct/stream/DirectByteBufferStream.java      | 104 +++++++++++++++++++++
 .../direct/stream/IgniteProductVersionEx.java      |  47 ++++++++++
 .../apache/ignite/lang/IgniteProductVersion.java   |  22 ++---
 .../extensions/communication/MessageReader.java    |   4 +
 .../extensions/communication/MessageWriter.java    |   9 ++
 ...irectByteBufferStreamImplByteOrderSelfTest.java |  73 +++++++++++++++
 .../managers/AbstractMessageSerializationTest.java |  13 +++
 11 files changed, 285 insertions(+), 17 deletions(-)

diff --git 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
index 6ee0585699b..052db3afcdf 100644
--- 
a/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
+++ 
b/modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
@@ -459,6 +459,9 @@ public class MessageSerializerGenerator {
             else if (assignableFrom(type, 
type("org.apache.ignite.internal.util.GridLongList")))
                 returnFalseIfWriteFailed(write, field, 
"writer.writeGridLongList", getExpr);
 
+            else if (assignableFrom(type, 
type("org.apache.ignite.lang.IgniteProductVersion")))
+                returnFalseIfWriteFailed(write, field, 
"writer.writeIgniteProductVersion", getExpr);
+
             else if (assignableFrom(type, type(MESSAGE_INTERFACE))) {
                 if (sameType(type, COMPRESSED_MESSAGE_CLASS))
                     throw new IllegalArgumentException(COMPRESSED_MSG_ERROR);
@@ -685,6 +688,9 @@ public class MessageSerializerGenerator {
             else if (assignableFrom(type, 
type("org.apache.ignite.internal.util.GridLongList")))
                 returnFalseIfReadFailed(field, "reader.readGridLongList");
 
+            else if (assignableFrom(type, 
type("org.apache.ignite.lang.IgniteProductVersion")))
+                returnFalseIfReadFailed(field, 
"reader.readIgniteProductVersion");
+
             else if (assignableFrom(type, type(MESSAGE_INTERFACE))) {
                 if (sameType(type, COMPRESSED_MESSAGE_CLASS))
                     throw new IllegalArgumentException(COMPRESSED_MSG_ERROR);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
index f4076df94f6..9da592635d2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
@@ -242,7 +242,6 @@ import 
org.apache.ignite.internal.util.GridPartitionStateMap;
 import org.apache.ignite.internal.util.distributed.FullMessage;
 import org.apache.ignite.internal.util.distributed.InitMessage;
 import org.apache.ignite.internal.util.distributed.SingleNodeMessage;
-import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.marshaller.Marshaller;
 import org.apache.ignite.marshaller.jdk.JdkMarshaller;
 import org.apache.ignite.plugin.extensions.communication.Message;
@@ -348,7 +347,6 @@ public class CoreMessagesProvider extends 
AbstractMarshallableMessageFactoryProv
         withNoSchema(InetSocketAddressMessage.class);
         withNoSchema(InetAddressMessage.class);
         withNoSchema(TcpDiscoveryNode.class);
-        withNoSchema(IgniteProductVersion.class);
         withNoSchema(DiscoveryDataPacket.class);
         withNoSchema(GridByteArrayList.class);
         withNoSchema(CacheVersionedValue.class);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java
index d32d179ae55..c5b2f3474fb 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageReader.java
@@ -35,6 +35,7 @@ import org.apache.ignite.internal.util.GridLongList;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteOutClosure;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageArrayType;
@@ -421,6 +422,17 @@ public class DirectMessageReader implements MessageReader {
         return map;
     }
 
+    /** {@inheritDoc} */
+    @Override public IgniteProductVersion readIgniteProductVersion() {
+        DirectByteBufferStream stream = state.item().stream;
+
+        IgniteProductVersion v = stream.readIgniteProductVersion();
+
+        lastRead = stream.lastFinished();
+
+        return v;
+    }
+
     /** {@inheritDoc} */
     @Override public boolean isLastRead() {
         return lastRead;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java
index c88e2f5cb26..ba4846b64a3 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/DirectMessageWriter.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.util.GridLongList;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteOutClosure;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageArrayType;
@@ -394,6 +395,15 @@ public class DirectMessageWriter implements MessageWriter {
         return stream.lastFinished();
     }
 
+    /** {@inheritDoc} */
+    @Override public boolean writeIgniteProductVersion(IgniteProductVersion 
ver) {
+        DirectByteBufferStream stream = state.item().stream;
+
+        stream.writeIgniteProductVersion(ver);
+
+        return stream.lastFinished();
+    }
+
     /** {@inheritDoc} */
     @Override public boolean isHeaderWritten() {
         return state.item().hdrWritten;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java
index 053732880b6..2192272747c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStream.java
@@ -42,6 +42,7 @@ import org.apache.ignite.internal.util.GridUnsafe;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageArrayType;
@@ -2303,6 +2304,109 @@ public class DirectByteBufferStream {
         }
     }
 
+    /** */
+    public void writeIgniteProductVersion(IgniteProductVersion ver) {
+        if (ver == null) {
+            lastFinished = buf.remaining() >= 1;
+
+            if (!lastFinished)
+                return;
+
+            buf.put((byte)0);
+
+            return;
+        }
+
+        if (!msgTypeDone) {
+            if (buf.remaining() < 4) {
+                lastFinished = false;
+
+                return;
+            }
+
+            buf.put((byte)1);
+            buf.put(ver.major());
+            buf.put(ver.minor());
+            buf.put(ver.maintenance());
+
+            msgTypeDone = true;
+        }
+
+        if (!keyDone) {
+            writeLong(ver.revisionTimestamp());
+
+            if (!lastFinished)
+                return;
+
+            keyDone = true;
+        }
+
+        writeByteArray(ver.revisionHash());
+
+        if (!lastFinished)
+            return;
+
+        msgTypeDone = false;
+        keyDone = false;
+    }
+
+    /** */
+    public IgniteProductVersion readIgniteProductVersion() {
+        if (buf.remaining() < 1) {
+            lastFinished = false;
+
+            return null;
+        }
+
+        if (cur == NULL || cur == null) {
+            if (buf.get() == (byte)0) {
+                lastFinished = true;
+
+                return null;
+            }
+
+            cur = new IgniteProductVersionEx();
+        }
+
+        if (!msgTypeDone) {
+            if (buf.remaining() < 3) {
+                lastFinished = false;
+
+                return null;
+            }
+
+            ((IgniteProductVersionEx)cur).version(buf.get(), buf.get(), 
buf.get());
+
+            msgTypeDone = true;
+        }
+
+        if (!keyDone) {
+            long revTs = readLong();
+
+            if (!lastFinished)
+                return null;
+
+            keyDone = true;
+
+            ((IgniteProductVersionEx)cur).revisionTimestamp(revTs);
+        }
+
+        byte[] revHash = readByteArray();
+
+        if (!lastFinished)
+            return null;
+
+        IgniteProductVersionEx res = (IgniteProductVersionEx)cur;
+
+        res.revisionHash(revHash);
+
+        cur = NULL;
+        msgTypeDone = false;
+        keyDone = false;
+
+        return res;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(DirectByteBufferStream.class, this);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java
new file mode 100644
index 00000000000..5037ce51dd7
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/direct/stream/IgniteProductVersionEx.java
@@ -0,0 +1,47 @@
+/*
+ * 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.internal.direct.stream;
+
+import org.apache.ignite.lang.IgniteProductVersion;
+
+/**
+ * Trivial extension of {@link IgniteProductVersion} to provide setters during 
read in {@link DirectByteBufferStream}.
+ * Don't want to expose setters directly in {@link IgniteProductVersion}, 
because it parts of public API.
+ * Don't want to create some kind of builder to save some bytes in heap.
+ */
+public class IgniteProductVersionEx extends IgniteProductVersion {
+    /** */
+    private static final long serialVersionUID = 0L;
+
+    /** */
+    public void version(byte major, byte minor, byte maintenance) {
+        this.major = major;
+        this.minor = minor;
+        this.maintenance = maintenance;
+    }
+
+    /** */
+    public void revisionTimestamp(long revTs) {
+        this.revTs = revTs;
+    }
+
+    /** */
+    public void revisionHash(byte[] revHash) {
+        this.revHash = revHash;
+    }
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
index b4177fcfd78..8feac017ab8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
@@ -27,9 +27,7 @@ import java.util.regex.Pattern;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.CoreMessagesProvider;
 import org.apache.ignite.internal.IgniteVersionUtils;
-import org.apache.ignite.internal.Order;
 import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.plugin.extensions.communication.Message;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -40,7 +38,7 @@ import org.jetbrains.annotations.NotNull;
  * Two versions are compared in the following order: major number,
  * minor number, maintenance number, revision timestamp.
  */
-public class IgniteProductVersion implements Comparable<IgniteProductVersion>, 
Externalizable, Message {
+public class IgniteProductVersion implements Comparable<IgniteProductVersion>, 
Externalizable {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -55,28 +53,22 @@ public class IgniteProductVersion implements 
Comparable<IgniteProductVersion>, E
         
Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)([-.]([^0123456789][^-]+)(-SNAPSHOT)?)?(-(\\d+))?(-([\\da-f]+))?");
 
     /** Major version number. */
-    @Order(0)
-    byte major;
+    protected byte major;
 
     /** Minor version number. */
-    @Order(1)
-    byte minor;
+    protected byte minor;
 
     /** Maintenance version number. */
-    @Order(2)
-    byte maintenance;
+    protected byte maintenance;
 
     /** Stage of development. */
-    @Order(3)
-    String stage;
+    private transient String stage;
 
     /** Revision timestamp. */
-    @Order(4)
-    long revTs;
+    protected long revTs;
 
     /** Revision hash. */
-    @Order(5)
-    byte[] revHash;
+    protected byte[] revHash;
 
     /**
      * Empty constructor required by {@link Externalizable} and {@link 
CoreMessagesProvider}.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java
 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java
index f2190a1e86a..05390bc5fb7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageReader.java
@@ -26,6 +26,7 @@ import 
org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.util.GridLongList;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 
 /**
@@ -270,6 +271,9 @@ public interface MessageReader {
      */
     public <M extends Map<?, ?>> M readMap(MessageMapType type, boolean 
compress);
 
+    /** @return Ignite product version. */
+    IgniteProductVersion readIgniteProductVersion();
+
     /**
      * Tells whether last invocation of any of {@code readXXX(...)}
      * methods has fully written the value. {@code False} is returned
diff --git 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java
 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java
index c29e3ac093d..4386c8f8dcf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MessageWriter.java
@@ -26,6 +26,7 @@ import 
org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.util.GridLongList;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
 
@@ -328,6 +329,14 @@ public interface MessageWriter {
      */
     public <K, V> boolean writeMap(Map<K, V> map, MessageMapType type, boolean 
compress);
 
+    /**
+     * Writes ignite product version.
+     *
+     * @param ver Version.
+     * @return Whether value was fully written.
+     */
+    public boolean writeIgniteProductVersion(IgniteProductVersion ver);
+
     /**
      * @return Whether header of current message is already written.
      */
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
index 44f44be77f7..4c5a786c7e8 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
@@ -26,6 +26,7 @@ import java.util.function.Supplier;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.util.GridUnsafe;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageFactory;
 import org.apache.ignite.plugin.extensions.communication.MessageSerializer;
@@ -39,6 +40,7 @@ import static 
org.apache.ignite.GridTestIoUtils.getFloatByByteLE;
 import static org.apache.ignite.GridTestIoUtils.getIntByByteLE;
 import static org.apache.ignite.GridTestIoUtils.getLongByByteLE;
 import static org.apache.ignite.GridTestIoUtils.getShortByByteLE;
+import static org.apache.ignite.lang.IgniteProductVersion.REV_HASH_SIZE;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -515,6 +517,77 @@ public class DirectByteBufferStreamImplByteOrderSelfTest {
         assertEquals(toList(srcArr), toList(resArr));
     }
 
+    /** */
+    @Test
+    public void testIgniteProductVersion() {
+        try {
+            IgniteProductVersion ver = new IgniteProductVersion((byte)0, 
(byte)22, (byte)8, 1984, new byte[REV_HASH_SIZE]);
+
+            readWriteIgniteProductVersion(ver);
+            readWriteIgniteProductVersion(null);
+
+            buff.limit(1);
+
+            readWriteIgniteProductVersion(ver);
+            readWriteIgniteProductVersion(null);
+
+            buff.limit(0);
+
+            readWriteIgniteProductVersion(ver);
+            readWriteIgniteProductVersion(null);
+        }
+        finally {
+            buff.limit(buff.capacity());
+        }
+    }
+
+    /** */
+    private void readWriteIgniteProductVersion(IgniteProductVersion ver) {
+        DirectByteBufferStream writeStream = createStream(buff);
+        DirectByteBufferStream readStream = createStream(buff);
+
+        int startLimit = buff.limit();
+        int iter = 0;
+
+        do {
+            writeStream.writeIgniteProductVersion(ver);
+
+            if (iter == 0 && buff.limit() < buff.capacity())
+                buff.limit(buff.limit() + 4);
+            else if (iter == 1 && buff.limit() < buff.capacity())
+                buff.limit(buff.limit() + 10);
+            else
+                buff.limit(buff.capacity());
+
+            assertTrue("Must be done earlier", iter++ < 10);
+        } while (!writeStream.lastFinished());
+
+        buff.rewind();
+        buff.limit(startLimit);
+
+        IgniteProductVersion ver1;
+
+        iter = 0;
+
+        do {
+            ver1 = readStream.readIgniteProductVersion();
+
+            if (iter == 0 && buff.limit() < buff.capacity())
+                buff.limit(buff.limit() + 4);
+            else if (iter == 1 && buff.limit() < buff.capacity())
+                buff.limit(buff.limit() + 10);
+            else
+                buff.limit(buff.capacity());
+
+            assertTrue("Must be done earlier", iter++ < 10);
+        } while (!readStream.lastFinished());
+
+        assertEquals(ver, ver1);
+
+        buff.rewind();
+        buff.limit(startLimit);
+    }
+
     /**
      * Convert provided array into a list.
      *
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java
index 60566df984e..82d3d96ba0f 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/managers/AbstractMessageSerializationTest.java
@@ -30,6 +30,7 @@ import 
org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.util.GridLongList;
+import org.apache.ignite.lang.IgniteProductVersion;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.plugin.extensions.communication.MessageArrayType;
@@ -310,6 +311,11 @@ public abstract class AbstractMessageSerializationTest {
             return writeField(type.linked() ? LinkedHashMap.class : 
HashMap.class);
         }
 
+        /** {@inheritDoc} */
+        @Override public boolean 
writeIgniteProductVersion(IgniteProductVersion ver) {
+            return writeField(IgniteProductVersion.class);
+        }
+
         /** {@inheritDoc} */
         @Override public boolean isHeaderWritten() {
             return true;
@@ -571,6 +577,13 @@ public abstract class AbstractMessageSerializationTest {
             return null;
         }
 
+        /** {@inheritDoc} */
+        @Override public IgniteProductVersion readIgniteProductVersion() {
+            readField(IgniteProductVersion.class);
+
+            return null;
+        }
+
         /** {@inheritDoc} */
         @Override public boolean isLastRead() {
             if (position <= capacity)

Reply via email to