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)