From 32fc49ca56acbb7ac924376e4ae4246a189d2f6e Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 13 Mar 2026 22:57:32 +0300 Subject: [PATCH 1/5] WIP --- .../calcite/metadata/ColocationGroup.java | 72 +++++---- .../query/index/IndexKeyTypeMessage.java | 24 ++- .../communication/GridIoMessageFactory.java | 30 ++-- .../discovery/DiscoveryMessageFactory.java | 25 ++-- .../SecurityAwareCustomMessageWrapper.java | 46 ++---- .../eventstorage/GridEventStorageMessage.java | 9 +- .../cache/CacheEntryPredicateAdapter.java | 75 +++++++--- .../processors/cache/GridCacheMessage.java | 2 +- .../dht/PartitionUpdateCountersMessage.java | 33 ++-- .../communication/MarshallableMessage.java | 8 +- ...CacheEntryPredicateAdapterMessageTest.java | 58 +++++-- .../IndexKeyTypeMessageTest.java | 141 ++++++++++++++---- 12 files changed, 325 insertions(+), 198 deletions(-) diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java index 21223643e8a2b..77d71b8af34ad 100644 --- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java +++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java @@ -29,19 +29,20 @@ import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.LongStream; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.Order; +import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState; -import org.apache.ignite.internal.processors.query.calcite.message.CalciteMessage; +import org.apache.ignite.internal.processors.query.calcite.message.CalciteMarshalableMessage; import org.apache.ignite.internal.processors.query.calcite.message.MessageType; import org.apache.ignite.internal.processors.query.calcite.util.Commons; import org.apache.ignite.internal.util.GridIntIterator; import org.apache.ignite.internal.util.GridIntList; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; -import org.jetbrains.annotations.Nullable; /** */ -public class ColocationGroup implements CalciteMessage { +public class ColocationGroup implements CalciteMarshalableMessage { /** */ @Order(0) long[] srcIds; @@ -60,7 +61,7 @@ public class ColocationGroup implements CalciteMessage { private boolean primaryAssignment; /** Marshalled assignments serialization call holder. */ - @Order(value = 2, method = "marshalledAssignments") + @Order(2) int[] marshalledAssignments; /** */ @@ -317,54 +318,49 @@ public int[] partitions(UUID nodeId) { return MessageType.COLOCATION_GROUP; } - /** Significantly compacts and fastens UUIDs marshalling. */ - public @Nullable int[] marshalledAssignments() { - if (assignments == null || primaryAssignment) - return null; - - Map nodeIdxs = new HashMap<>(); + /** {@inheritDoc} */ + @Override public void prepareMarshal(GridCacheSharedContext ctx) throws IgniteCheckedException { + if (assignments == null && !primaryAssignment) { + Map nodeIdxs = new HashMap<>(); - for (int i = 0; i < nodeIds.size(); i++) - nodeIdxs.put(nodeIds.get(i), i); + for (int i = 0; i < nodeIds.size(); i++) + nodeIdxs.put(nodeIds.get(i), i); - int bitsPerPart = Integer.SIZE - Integer.numberOfLeadingZeros(nodeIds.size()); + int bitsPerPart = Integer.SIZE - Integer.numberOfLeadingZeros(nodeIds.size()); - CompactedIntArray.Builder builder = CompactedIntArray.builder(bitsPerPart, assignments.size()); + CompactedIntArray.Builder builder = CompactedIntArray.builder(bitsPerPart, assignments.size()); - for (List assignment : assignments) { - assert F.isEmpty(assignment) || assignment.size() == 1; + for (List assignment : assignments) { + assert F.isEmpty(assignment) || assignment.size() == 1; - if (F.isEmpty(assignment)) - builder.add(nodeIds.size()); - else { - Integer nodeIdx = nodeIdxs.get(assignment.get(0)); + if (F.isEmpty(assignment)) + builder.add(nodeIds.size()); + else { + Integer nodeIdx = nodeIdxs.get(assignment.get(0)); - builder.add(nodeIdx); + builder.add(nodeIdx); + } } - } - return builder.build().buffer(); - } - - /** Significantly compacts and fastens UUIDs unmarshalling. */ - public void marshalledAssignments(@Nullable int[] marshalledAssignments) { - if (F.isEmpty(marshalledAssignments)) { - assignments = null; - - return; + marshalledAssignments = builder.build().buffer(); } + } - int bitsPerPart = Integer.SIZE - Integer.numberOfLeadingZeros(nodeIds.size()); + /** {@inheritDoc} */ + @Override public void prepareUnmarshal(GridCacheSharedContext ctx) throws IgniteCheckedException { + if (!F.isEmpty(marshalledAssignments)) { + int bitsPerPart = Integer.SIZE - Integer.numberOfLeadingZeros(nodeIds.size()); - CompactedIntArray compactedArr = CompactedIntArray.of(bitsPerPart, marshalledAssignments); + CompactedIntArray compactedArr = CompactedIntArray.of(bitsPerPart, marshalledAssignments); - assignments = new ArrayList<>(compactedArr.size()); + assignments = new ArrayList<>(compactedArr.size()); - for (GridIntIterator iter = compactedArr.iterator(); iter.hasNext(); ) { - int nodeIdx = iter.next(); + for (GridIntIterator iter = compactedArr.iterator(); iter.hasNext(); ) { + int nodeIdx = iter.next(); - assignments.add(nodeIdx >= nodeIds.size() ? Collections.emptyList() : - Collections.singletonList(nodeIds.get(nodeIdx))); + assignments.add(nodeIdx >= nodeIds.size() ? Collections.emptyList() : + Collections.singletonList(nodeIds.get(nodeIdx))); + } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java index c5394ad3d413d..ba6e55b3db0c2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java @@ -17,14 +17,16 @@ package org.apache.ignite.internal.cache.query.index; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyType; import org.apache.ignite.internal.managers.communication.GridIoMessageFactory; -import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.plugin.extensions.communication.MarshallableMessage; import org.jetbrains.annotations.Nullable; /** Message wrapper for {@link IndexKeyType}. */ -public class IndexKeyTypeMessage implements Message { +public class IndexKeyTypeMessage implements MarshallableMessage { /** Type code. */ public static final short TYPE_CODE = 516; @@ -35,8 +37,8 @@ public class IndexKeyTypeMessage implements Message { private @Nullable IndexKeyType val; /** Code. */ - @Order(value = 0, method = "code") - byte code = NULL_VALUE_CODE; + @Order(0) + byte code; /** Empty constructor for {@link GridIoMessageFactory}. */ public IndexKeyTypeMessage() { @@ -46,12 +48,11 @@ public IndexKeyTypeMessage() { /** Constructor. */ public IndexKeyTypeMessage(@Nullable IndexKeyType keyType) { val = keyType; - code = encode(keyType); } /** Constructor. */ public IndexKeyTypeMessage(int keyTypeCode) { - code((byte)keyTypeCode); + code = (byte)keyTypeCode; } /** @return Code. */ @@ -64,7 +65,6 @@ public byte code() { */ public void code(byte code) { this.code = code; - val = decode(code); } /** @return Index key type. */ @@ -94,4 +94,14 @@ private static byte encode(@Nullable IndexKeyType keyType) { @Override public short directType() { return TYPE_CODE; } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { + code = encode(val); + } + + /** {@inheritDoc} */ + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { + val = decode(code); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java index eb022f0edb1bd..7f4db0d46986f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessageFactory.java @@ -42,7 +42,7 @@ import org.apache.ignite.internal.TxInfo; import org.apache.ignite.internal.TxInfoSerializer; import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessage; -import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessageSerializer; +import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessageMarshallableSerializer; import org.apache.ignite.internal.cache.query.index.IndexQueryResultMeta; import org.apache.ignite.internal.cache.query.index.IndexQueryResultMetaSerializer; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyDefinition; @@ -72,7 +72,7 @@ import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection; import org.apache.ignite.internal.processors.cache.CacheEntryInfoCollectionSerializer; import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapter; -import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapterSerializer; +import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapterMarshallableSerializer; import org.apache.ignite.internal.processors.cache.CacheEvictionEntry; import org.apache.ignite.internal.processors.cache.CacheEvictionEntrySerializer; import org.apache.ignite.internal.processors.cache.CacheInvokeDirectResult; @@ -132,7 +132,7 @@ import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnlockRequestSerializer; import org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessage; -import org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessageSerializer; +import org.apache.ignite.internal.processors.cache.distributed.dht.PartitionUpdateCountersMessageMarshallableSerializer; import org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequest; import org.apache.ignite.internal.processors.cache.distributed.dht.TransactionAttributesAwareRequestSerializer; import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.AtomicApplicationAttributesAwareRequest; @@ -352,18 +352,18 @@ */ public class GridIoMessageFactory implements MessageFactoryProvider { /** Custom data marshaller. */ - private final Marshaller cstDataMarshall; + private final Marshaller marsh; /** Class loader for the custom data marshalling. */ - private final ClassLoader cstDataMarshallClsLdr; + private final ClassLoader clsLdr; /** - * @param cstDataMarshall Custom data marshaller. - * @param cstDataMarshallClsLdr Class loader for the custom data marshalling. + * @param marsh Custom data marshaller. + * @param clsLdr Class loader for the custom data marshalling. */ - public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarshallClsLdr) { - this.cstDataMarshall = cstDataMarshall; - this.cstDataMarshallClsLdr = cstDataMarshallClsLdr; + public GridIoMessageFactory(Marshaller marsh, ClassLoader clsLdr) { + this.marsh = marsh; + this.clsLdr = clsLdr; } /** {@inheritDoc} */ @@ -371,7 +371,7 @@ public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarsh // -54 is reserved for SQL. // We don't use the code‑generated serializer for CompressedMessage - serialization is highly customized. factory.register(CompressedMessage.TYPE_CODE, CompressedMessage::new); - factory.register((short)-66, ErrorMessage::new, new ErrorMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr)); + factory.register((short)-66, ErrorMessage::new, new ErrorMessageMarshallableSerializer(marsh, clsLdr)); factory.register((short)-65, TxInfo::new, new TxInfoSerializer()); factory.register((short)-64, TxEntriesInfo::new, new TxEntriesInfoSerializer()); factory.register((short)-63, ExchangeInfo::new, new ExchangeInfoSerializer()); @@ -473,7 +473,7 @@ public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarsh factory.register((short)95, DataStreamerEntry::new); factory.register((short)96, CacheContinuousQueryEntry::new, new CacheContinuousQueryEntrySerializer()); factory.register((short)97, CacheEvictionEntry::new, new CacheEvictionEntrySerializer()); - factory.register((short)98, CacheEntryPredicateAdapter::new, new CacheEntryPredicateAdapterSerializer()); + factory.register((short)98, CacheEntryPredicateAdapter::new, new CacheEntryPredicateAdapterMarshallableSerializer(marsh, clsLdr)); factory.register((short)100, IgniteTxEntry::new, new IgniteTxEntrySerializer()); factory.register((short)101, TxEntryValueHolder::new, new TxEntryValueHolderSerializer()); factory.register((short)102, CacheVersionedValue::new, new CacheVersionedValueSerializer()); @@ -507,7 +507,8 @@ public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarsh factory.register(CacheMetricsMessage.TYPE_CODE, CacheMetricsMessage::new, new CacheMetricsMessageSerializer()); factory.register(NodeMetricsMessage.TYPE_CODE, NodeMetricsMessage::new, new NodeMetricsMessageSerializer()); factory.register(NodeFullMetricsMessage.TYPE_CODE, NodeFullMetricsMessage::new, new NodeFullMetricsMessageSerializer()); - factory.register((short)157, PartitionUpdateCountersMessage::new, new PartitionUpdateCountersMessageSerializer()); + factory.register((short)157, PartitionUpdateCountersMessage::new, + new PartitionUpdateCountersMessageMarshallableSerializer(marsh, clsLdr)); factory.register((short)162, GenerateEncryptionKeyRequest::new, new GenerateEncryptionKeyRequestSerializer()); factory.register((short)163, GenerateEncryptionKeyResponse::new, new GenerateEncryptionKeyResponseSerializer()); factory.register((short)167, ServiceDeploymentProcessId::new, new ServiceDeploymentProcessIdSerializer()); @@ -557,7 +558,8 @@ public GridIoMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarsh factory.register(IgniteDhtPartitionsToReloadMap.TYPE_CODE, IgniteDhtPartitionsToReloadMap::new, new IgniteDhtPartitionsToReloadMapSerializer()); factory.register(IntLongMap.TYPE_CODE, IntLongMap::new, new IntLongMapSerializer()); - factory.register(IndexKeyTypeMessage.TYPE_CODE, IndexKeyTypeMessage::new, new IndexKeyTypeMessageSerializer()); + factory.register(IndexKeyTypeMessage.TYPE_CODE, IndexKeyTypeMessage::new, + new IndexKeyTypeMessageMarshallableSerializer(marsh, clsLdr)); factory.register(GridPartitionStateMap.TYPE_CODE, GridPartitionStateMap::new, new GridPartitionStateMapSerializer()); factory.register(GridDhtPartitionMap.TYPE_CODE, GridDhtPartitionMap::new, new GridDhtPartitionMapSerializer()); factory.register(GridDhtPartitionFullMap.TYPE_CODE, GridDhtPartitionFullMap::new, new GridDhtPartitionFullMapSerializer()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java index 3969c9dd31776..b3e0cd0c08fbd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/DiscoveryMessageFactory.java @@ -136,18 +136,18 @@ /** Message factory for discovery messages. */ public class DiscoveryMessageFactory implements MessageFactoryProvider { /** Custom data marshaller. */ - private final Marshaller cstDataMarshall; + private final Marshaller marsh; /** Class loader for the custom data marshalling. */ - private final ClassLoader cstDataMarshallClsLdr; + private final ClassLoader clsLdr; /** - * @param cstDataMarshall Custom data marshaller. - * @param cstDataMarshallClsLdr Class loader for the custom data marshalling. + * @param marsh Custom data marshaller. + * @param clsLdr Class loader for the custom data marshalling. */ - public DiscoveryMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMarshallClsLdr) { - this.cstDataMarshall = cstDataMarshall; - this.cstDataMarshallClsLdr = cstDataMarshallClsLdr; + public DiscoveryMessageFactory(Marshaller marsh, ClassLoader clsLdr) { + this.marsh = marsh; + this.clsLdr = clsLdr; } /** {@inheritDoc} */ @@ -163,7 +163,7 @@ public DiscoveryMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMa factory.register((short)-102, TcpDiscoveryNodeMetricsMessage::new, new TcpDiscoveryNodeMetricsMessageSerializer()); factory.register((short)-101, InetSocketAddressMessage::new, new InetSocketAddressMessageSerializer()); factory.register((short)-100, InetAddressMessage::new, new InetAddressMessageSerializer()); - factory.register((short)-66, ErrorMessage::new, new ErrorMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr)); + factory.register((short)-66, ErrorMessage::new, new ErrorMessageMarshallableSerializer(marsh, clsLdr)); // TcpDiscoveryAbstractMessage factory.register((short)0, TcpDiscoveryCheckFailedMessage::new, new TcpDiscoveryCheckFailedMessageSerializer()); @@ -186,9 +186,9 @@ public DiscoveryMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMa factory.register((short)17, TcpDiscoveryNodeFailedMessage::new, new TcpDiscoveryNodeFailedMessageSerializer()); factory.register((short)18, TcpDiscoveryStatusCheckMessage::new, new TcpDiscoveryStatusCheckMessageSerializer()); factory.register((short)19, TcpDiscoveryNodeAddFinishedMessage::new, - new TcpDiscoveryNodeAddFinishedMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr)); + new TcpDiscoveryNodeAddFinishedMessageMarshallableSerializer(marsh, clsLdr)); factory.register((short)20, TcpDiscoveryJoinRequestMessage::new, - new TcpDiscoveryJoinRequestMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr)); + new TcpDiscoveryJoinRequestMessageMarshallableSerializer(marsh, clsLdr)); factory.register((short)21, TcpDiscoveryCustomEventMessage::new, new TcpDiscoveryCustomEventMessageSerializer()); factory.register((short)22, TcpDiscoveryServerOnlyCustomEventMessage::new, new TcpDiscoveryServerOnlyCustomEventMessageSerializer()); @@ -198,11 +198,12 @@ public DiscoveryMessageFactory(Marshaller cstDataMarshall, ClassLoader cstDataMa factory.register((short)26, DistributedMetaStorageCasMessage::new, new DistributedMetaStorageCasMessageSerializer()); factory.register((short)27, DistributedMetaStorageCasAckMessage::new, new DistributedMetaStorageCasAckMessageSerializer()); factory.register((short)28, TcpDiscoveryClientReconnectMessage::new, - new TcpDiscoveryClientReconnectMessageMarshallableSerializer(cstDataMarshall, cstDataMarshallClsLdr)); + new TcpDiscoveryClientReconnectMessageMarshallableSerializer(marsh, clsLdr)); // DiscoveryCustomMessage factory.register((short)500, CacheStatisticsModeChangeMessage::new, new CacheStatisticsModeChangeMessageSerializer()); - factory.register((short)501, SecurityAwareCustomMessageWrapper::new, new SecurityAwareCustomMessageWrapperSerializer()); + factory.register((short)501, SecurityAwareCustomMessageWrapper::new, + new SecurityAwareCustomMessageWrapperMarshallableSerializer(marsh, clsLdr)); factory.register((short)502, MetadataRemoveAcceptedMessage::new, new MetadataRemoveAcceptedMessageSerializer()); factory.register((short)503, MetadataRemoveProposedMessage::new, new MetadataRemoveProposedMessageSerializer()); factory.register((short)504, SchemaProposeDiscoveryMessage::new, new SchemaProposeDiscoveryMessageSerializer()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java index c186fe02a1a70..90e09e1cccdd3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/SecurityAwareCustomMessageWrapper.java @@ -19,10 +19,10 @@ import java.util.UUID; import org.apache.ignite.IgniteCheckedException; -import org.apache.ignite.IgniteException; import org.apache.ignite.internal.Order; -import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.plugin.extensions.communication.MarshallableMessage; import org.apache.ignite.plugin.extensions.communication.Message; import org.apache.ignite.plugin.extensions.communication.MessageFactory; import org.apache.ignite.spi.discovery.DiscoverySpiCustomMessage; @@ -31,7 +31,7 @@ import static org.apache.ignite.marshaller.Marshallers.jdk; /** Custom message wrapper with ID of security subject that initiated the current message. */ -public class SecurityAwareCustomMessageWrapper extends DiscoverySpiCustomMessage implements Message { +public class SecurityAwareCustomMessageWrapper extends DiscoverySpiCustomMessage implements MarshallableMessage { /** */ private static final long serialVersionUID = 0L; @@ -43,13 +43,12 @@ public class SecurityAwareCustomMessageWrapper extends DiscoverySpiCustomMessage private DiscoveryCustomMessage delegate; /** */ - @Order(1) // TODO: Should be removed in https://issues.apache.org/jira/browse/IGNITE-27627 Message msg; /** Serialized message bytes. */ // TODO: Should be removed in https://issues.apache.org/jira/browse/IGNITE-27627 - @Order(value = 2, method = "messageBytes") + @Order(1) byte[] msgBytes; /** Default constructor for {@link MessageFactory}. */ @@ -95,37 +94,20 @@ public DiscoveryCustomMessage delegate() { return ack == null ? null : new SecurityAwareCustomMessageWrapper(ack, secSubjId); } - /** */ - public byte[] messageBytes() { - if (delegate instanceof Message) - return null; - - if (msgBytes != null) - return msgBytes; - - try { - return msgBytes = U.marshal(jdk(), delegate); - } - catch (IgniteCheckedException e) { - throw new IgniteException(e); - } + /** {@inheritDoc} */ + @Override public short directType() { + return 501; } - /** */ - public void messageBytes(byte[] msgBytes) { - if (F.isEmpty(msgBytes)) - return; - - try { - delegate = U.unmarshal(jdk(), msgBytes, U.gridClassLoader()); - } - catch (IgniteCheckedException e) { - throw new RuntimeException(e); - } + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { + if (delegate instanceof Message) + msgBytes = U.marshal(jdk(), delegate); } /** {@inheritDoc} */ - @Override public short directType() { - return 501; + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { + if (msgBytes != null) + delegate = U.unmarshal(jdk(), msgBytes, U.gridClassLoader()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java index dade283bc0d1f..60b9d239ecff1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java @@ -82,7 +82,7 @@ public class GridEventStorageMessage implements Message { /** Node class loader participants. */ @GridToStringInclude - @Order(value = 8, method = "loaderParticipants") + @Order(8) Map ldrParties; /** */ @@ -191,13 +191,6 @@ public String userVersion() { return ldrParties != null ? Collections.unmodifiableMap(ldrParties) : null; } - /** - * @param ldrParties Node class loader participant map. - */ - public void loaderParticipants(@Nullable Map ldrParties) { - this.ldrParties = ldrParties; - } - /** * @return Exception. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java index 0eaa1fa7a779c..180d09aa93b8c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java @@ -23,10 +23,12 @@ import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.tostring.GridToStringInclude; import org.apache.ignite.internal.util.typedef.internal.CU; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.plugin.extensions.communication.MarshallableMessage; import org.jetbrains.annotations.Nullable; /** A unified container for common, typical cache entry predicates. */ -public class CacheEntryPredicateAdapter implements CacheEntryPredicate { +public class CacheEntryPredicateAdapter implements CacheEntryPredicate, MarshallableMessage { /** */ private static final long serialVersionUID = 4647110502545358709L; @@ -41,7 +43,7 @@ public class CacheEntryPredicateAdapter implements CacheEntryPredicate { private PredicateType type; /** Type value serialization holder. */ - @Order(value = 0, method = "code") + @Order(0) protected transient byte code; /** */ @@ -64,6 +66,7 @@ public CacheEntryPredicateAdapter(PredicateType type) { /** */ public CacheEntryPredicateAdapter(@Nullable CacheObject val) { type = PredicateType.VALUE; + code = 1; this.val = val; } @@ -144,27 +147,65 @@ public PredicateType type() { /** */ public byte code() { - assert type != null; + return code; + } + /** */ + public void code(byte code) { + this.code = code; + } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { switch (type) { - case OTHER: return 0; - case VALUE: return 1; - case HAS_VALUE: return 2; - case HAS_NO_VALUE: return 3; - case ALWAYS_FALSE: return 4; - } + case OTHER: + code = 0; + break; + + case VALUE: + code = 1; + break; + + case HAS_VALUE: + code = 2; + break; + + case HAS_NO_VALUE: + code = 3; + break; - throw new IllegalArgumentException("Unknown cache entry predicate type: " + type); + case ALWAYS_FALSE: + code = 4; + break; + + default: + throw new IllegalArgumentException("Unknown cache entry predicate type: " + type); + } } - /** */ - public void code(byte code) { + /** {@inheritDoc} */ + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { switch (code) { - case 0: type = PredicateType.OTHER; break; - case 1: type = PredicateType.VALUE; break; - case 2: type = PredicateType.HAS_VALUE; break; - case 3: type = PredicateType.HAS_NO_VALUE; break; - case 4: type = PredicateType.ALWAYS_FALSE; break; + case 0: + type = PredicateType.OTHER; + break; + + case 1: + type = PredicateType.VALUE; + break; + + case 2: + type = PredicateType.HAS_VALUE; + break; + + case 3: + type = PredicateType.HAS_NO_VALUE; + break; + + case 4: + type = PredicateType.ALWAYS_FALSE; + break; + default: throw new IllegalArgumentException("Unknown cache entry predicate type code: " + code); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java index 9b7e2e4943b7b..285e4d392d94c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java @@ -69,7 +69,7 @@ public abstract class GridCacheMessage implements Message { /** */ @GridToStringInclude - @Order(value = 2, method = "lastAffinityChangedTopologyVersion") + @Order(2) @Nullable public AffinityTopologyVersion lastAffChangedTopVer; /** */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java index b6e7743b880e8..f5b35d1364e28 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/PartitionUpdateCountersMessage.java @@ -19,20 +19,22 @@ import java.util.Arrays; import java.util.Map; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.Order; import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.internal.U; -import org.apache.ignite.plugin.extensions.communication.Message; +import org.apache.ignite.marshaller.Marshaller; +import org.apache.ignite.plugin.extensions.communication.MarshallableMessage; /** * Partition update counters message. */ -public class PartitionUpdateCountersMessage implements Message { +public class PartitionUpdateCountersMessage implements MarshallableMessage { /** */ private static final int ITEM_SIZE = 4 /* partition */ + 8 /* initial counter */ + 8 /* updates count */; /** Byte representation of partition counters. */ - @Order(value = 0, method = "data") + @Order(0) byte[] data; /** */ @@ -61,21 +63,6 @@ public PartitionUpdateCountersMessage(int cacheId, int initSize) { data = new byte[initSize * ITEM_SIZE]; } - /** - * @return Data. - */ - public byte[] data() { - return Arrays.copyOf(data, size * ITEM_SIZE); - } - - /** - * @param data New data. - */ - public void data(byte[] data) { - this.data = data; - size = data == null ? 0 : data.length / ITEM_SIZE; - } - /** * @return Cache id. */ @@ -199,4 +186,14 @@ private void ensureSpace(int newSize) { ", cntrs=" + sb + '}'; } + + /** {@inheritDoc} */ + @Override public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { + data = Arrays.copyOf(data, size * ITEM_SIZE); + } + + /** {@inheritDoc} */ + @Override public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { + size = data == null ? 0 : data.length / ITEM_SIZE; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java index f3cc81dd68e26..5f2f8c4196608 100644 --- a/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/plugin/extensions/communication/MarshallableMessage.java @@ -23,15 +23,11 @@ /** A {@link Message} which still requires external custom pre-marshalling and post-unmarshalling. */ public interface MarshallableMessage extends Message { /** @param marsh External custom marshaller. */ - public default void prepareMarshal(Marshaller marsh) throws IgniteCheckedException { - throw new UnsupportedOperationException(); - } + public void prepareMarshal(Marshaller marsh) throws IgniteCheckedException; /** * @param marsh External custom marshaller. * @param clsLdr External class loader to post-unmarshall. */ - public default void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException { - throw new UnsupportedOperationException(); - } + public void finishUnmarshal(Marshaller marsh, ClassLoader clsLdr) throws IgniteCheckedException; } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java index 6697942a1dc63..b69cd202dde7f 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java @@ -17,11 +17,14 @@ package org.apache.ignite.internal.managers.communication; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.processors.cache.CacheEntryPredicateAdapter; import org.apache.ignite.internal.processors.cache.CacheObject; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; import org.junit.Test; +import static org.apache.ignite.marshaller.Marshallers.jdk; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; @@ -32,56 +35,87 @@ public class CacheEntryPredicateAdapterMessageTest { /** */ @Test public void testCacheEntryPredicateAdapterCode() { - assertEquals(0, new CacheEntryPredicateAdapter().code()); - assertEquals(0, new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.OTHER).code()); - assertEquals(1, new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.VALUE).code()); - assertEquals(1, new CacheEntryPredicateAdapter((CacheObject)null).code()); - assertEquals(2, new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE).code()); - assertEquals(3, new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE).code()); - assertEquals(4, new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE).code()); + assertEquals(0, prepare(new CacheEntryPredicateAdapter())); + assertEquals(0, prepare(new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.OTHER))); + assertEquals(1, prepare(new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.VALUE))); + assertEquals(1, prepare(new CacheEntryPredicateAdapter((CacheObject)null))); + assertEquals(2, prepare(new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE))); + assertEquals(3, prepare(new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE))); + assertEquals(4, prepare(new CacheEntryPredicateAdapter(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE))); for (CacheEntryPredicateAdapter.PredicateType t : CacheEntryPredicateAdapter.PredicateType.values()) { - assertTrue(new CacheEntryPredicateAdapter(t).code() >= 0); - assertTrue(new CacheEntryPredicateAdapter(t).code() < 5); + assertTrue(prepare(new CacheEntryPredicateAdapter(t)) >= 0); + assertTrue(prepare(new CacheEntryPredicateAdapter(t)) < 5); } } + byte prepare(CacheEntryPredicateAdapter msg){ + try { + msg.prepareMarshal(jdk()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + + return msg.code(); + } + /** */ @Test - public void testCacheEntryPredicateAdapterFromCode() { + public void testCacheEntryPredicateAdapterFromCode() throws IgniteCheckedException { CacheEntryPredicateAdapter msg = new CacheEntryPredicateAdapter((CacheObject)null); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.VALUE, msg.type()); msg.code((byte)0); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.OTHER, msg.type()); msg.code((byte)1); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.VALUE, msg.type()); msg.code((byte)2); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.HAS_VALUE, msg.type()); msg.code((byte)3); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.HAS_NO_VALUE, msg.type()); msg.code((byte)4); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(CacheEntryPredicateAdapter.PredicateType.ALWAYS_FALSE, msg.type()); - Throwable t = assertThrowsWithCause(() -> msg.code((byte)5), IllegalArgumentException.class); + Throwable t = assertThrowsWithCause(() -> { + msg.code((byte)5); + + try { + msg.finishUnmarshal(jdk(), U.gridClassLoader()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + }, IllegalArgumentException.class); assertEquals("Unknown cache entry predicate type code: 5", t.getMessage()); } /** */ @Test - public void testConversionConsistency() { + public void testConversionConsistency() throws IgniteCheckedException { for (CacheEntryPredicateAdapter.PredicateType t : F.concat(CacheEntryPredicateAdapter.PredicateType.values())) { CacheEntryPredicateAdapter msg = new CacheEntryPredicateAdapter(t); assertEquals(t, msg.type()); CacheEntryPredicateAdapter newMsg = new CacheEntryPredicateAdapter(); + + msg.prepareMarshal(jdk()); + newMsg.code(msg.code()); + newMsg.finishUnmarshal(jdk(), U.gridClassLoader()); + assertEquals(msg.type(), newMsg.type()); } } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java index 642615c06d3ee..ca76df0d2002e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java @@ -17,11 +17,14 @@ package org.apache.ignite.internal.managers.communication; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.cache.query.index.IndexKeyTypeMessage; import org.apache.ignite.internal.cache.query.index.sorted.IndexKeyType; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.U; import org.junit.Test; +import static org.apache.ignite.marshaller.Marshallers.jdk; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -33,132 +36,190 @@ public class IndexKeyTypeMessageTest { /** */ @Test public void testIndexKeyTypeCode() { - assertEquals(Byte.MIN_VALUE, new IndexKeyTypeMessage(null).code()); - assertEquals(-1, new IndexKeyTypeMessage(IndexKeyType.UNKNOWN).code()); - assertEquals(0, new IndexKeyTypeMessage(IndexKeyType.NULL).code()); - assertEquals(1, new IndexKeyTypeMessage(IndexKeyType.BOOLEAN).code()); - assertEquals(2, new IndexKeyTypeMessage(IndexKeyType.BYTE).code()); - assertEquals(3, new IndexKeyTypeMessage(IndexKeyType.SHORT).code()); - assertEquals(4, new IndexKeyTypeMessage(IndexKeyType.INT).code()); - assertEquals(5, new IndexKeyTypeMessage(IndexKeyType.LONG).code()); - assertEquals(6, new IndexKeyTypeMessage(IndexKeyType.DECIMAL).code()); - assertEquals(7, new IndexKeyTypeMessage(IndexKeyType.DOUBLE).code()); - assertEquals(8, new IndexKeyTypeMessage(IndexKeyType.FLOAT).code()); - assertEquals(9, new IndexKeyTypeMessage(IndexKeyType.TIME).code()); - assertEquals(10, new IndexKeyTypeMessage(IndexKeyType.DATE).code()); - assertEquals(11, new IndexKeyTypeMessage(IndexKeyType.TIMESTAMP).code()); - assertEquals(12, new IndexKeyTypeMessage(IndexKeyType.BYTES).code()); - assertEquals(13, new IndexKeyTypeMessage(IndexKeyType.STRING).code()); - assertEquals(14, new IndexKeyTypeMessage(IndexKeyType.STRING_IGNORECASE).code()); - assertEquals(15, new IndexKeyTypeMessage(IndexKeyType.BLOB).code()); - assertEquals(16, new IndexKeyTypeMessage(IndexKeyType.CLOB).code()); - assertEquals(17, new IndexKeyTypeMessage(IndexKeyType.ARRAY).code()); - assertEquals(18, new IndexKeyTypeMessage(IndexKeyType.RESULT_SET).code()); - assertEquals(19, new IndexKeyTypeMessage(IndexKeyType.JAVA_OBJECT).code()); - assertEquals(20, new IndexKeyTypeMessage(IndexKeyType.UUID).code()); - assertEquals(21, new IndexKeyTypeMessage(IndexKeyType.STRING_FIXED).code()); - assertEquals(22, new IndexKeyTypeMessage(IndexKeyType.GEOMETRY).code()); - assertEquals(24, new IndexKeyTypeMessage(IndexKeyType.TIMESTAMP_TZ).code()); - assertEquals(25, new IndexKeyTypeMessage(IndexKeyType.ENUM).code()); + assertEquals(Byte.MIN_VALUE, prepare(new IndexKeyTypeMessage(null))); + assertEquals(-1, prepare(new IndexKeyTypeMessage(IndexKeyType.UNKNOWN))); + assertEquals(0, prepare(new IndexKeyTypeMessage(IndexKeyType.NULL))); + assertEquals(1, prepare(new IndexKeyTypeMessage(IndexKeyType.BOOLEAN))); + assertEquals(2, prepare(new IndexKeyTypeMessage(IndexKeyType.BYTE))); + assertEquals(3, prepare(new IndexKeyTypeMessage(IndexKeyType.SHORT))); + assertEquals(4, prepare(new IndexKeyTypeMessage(IndexKeyType.INT))); + assertEquals(5, prepare(new IndexKeyTypeMessage(IndexKeyType.LONG))); + assertEquals(6, prepare(new IndexKeyTypeMessage(IndexKeyType.DECIMAL))); + assertEquals(7, prepare(new IndexKeyTypeMessage(IndexKeyType.DOUBLE))); + assertEquals(8, prepare(new IndexKeyTypeMessage(IndexKeyType.FLOAT))); + assertEquals(9, prepare(new IndexKeyTypeMessage(IndexKeyType.TIME))); + assertEquals(10, prepare(new IndexKeyTypeMessage(IndexKeyType.DATE))); + assertEquals(11, prepare(new IndexKeyTypeMessage(IndexKeyType.TIMESTAMP))); + assertEquals(12, prepare(new IndexKeyTypeMessage(IndexKeyType.BYTES))); + assertEquals(13, prepare(new IndexKeyTypeMessage(IndexKeyType.STRING))); + assertEquals(14, prepare(new IndexKeyTypeMessage(IndexKeyType.STRING_IGNORECASE))); + assertEquals(15, prepare(new IndexKeyTypeMessage(IndexKeyType.BLOB))); + assertEquals(16, prepare(new IndexKeyTypeMessage(IndexKeyType.CLOB))); + assertEquals(17, prepare(new IndexKeyTypeMessage(IndexKeyType.ARRAY))); + assertEquals(18, prepare(new IndexKeyTypeMessage(IndexKeyType.RESULT_SET))); + assertEquals(19, prepare(new IndexKeyTypeMessage(IndexKeyType.JAVA_OBJECT))); + assertEquals(20, prepare(new IndexKeyTypeMessage(IndexKeyType.UUID))); + assertEquals(21, prepare(new IndexKeyTypeMessage(IndexKeyType.STRING_FIXED))); + assertEquals(22, prepare(new IndexKeyTypeMessage(IndexKeyType.GEOMETRY))); + assertEquals(24, prepare(new IndexKeyTypeMessage(IndexKeyType.TIMESTAMP_TZ))); + assertEquals(25, prepare(new IndexKeyTypeMessage(IndexKeyType.ENUM))); for (IndexKeyType keyType : IndexKeyType.values()) - assertTrue(new IndexKeyTypeMessage(keyType).code() != IndexKeyTypeMessage.NULL_VALUE_CODE); + assertTrue(prepare(new IndexKeyTypeMessage(keyType)) != IndexKeyTypeMessage.NULL_VALUE_CODE); + } + + byte prepare(IndexKeyTypeMessage msg){ + try { + msg.prepareMarshal(jdk()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + + return msg.code(); } /** */ @Test - public void testIndexKeyTypeFromCode() { + public void testIndexKeyTypeFromCode() throws IgniteCheckedException { IndexKeyTypeMessage msg = new IndexKeyTypeMessage(null); msg.code(IndexKeyTypeMessage.NULL_VALUE_CODE); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertNull(msg.value()); msg.code((byte)-1); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.UNKNOWN, msg.value()); msg.code((byte)0); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.NULL, msg.value()); msg.code((byte)1); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.BOOLEAN, msg.value()); msg.code((byte)2); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.BYTE, msg.value()); msg.code((byte)3); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.SHORT, msg.value()); msg.code((byte)4); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.INT, msg.value()); msg.code((byte)5); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.LONG, msg.value()); msg.code((byte)6); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.DECIMAL, msg.value()); msg.code((byte)7); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.DOUBLE, msg.value()); msg.code((byte)8); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.FLOAT, msg.value()); msg.code((byte)9); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.TIME, msg.value()); msg.code((byte)10); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.DATE, msg.value()); msg.code((byte)11); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.TIMESTAMP, msg.value()); msg.code((byte)12); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.BYTES, msg.value()); msg.code((byte)13); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.STRING, msg.value()); msg.code((byte)14); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.STRING_IGNORECASE, msg.value()); msg.code((byte)15); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.BLOB, msg.value()); msg.code((byte)16); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.CLOB, msg.value()); msg.code((byte)17); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.ARRAY, msg.value()); msg.code((byte)18); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.RESULT_SET, msg.value()); msg.code((byte)19); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.JAVA_OBJECT, msg.value()); msg.code((byte)20); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.UUID, msg.value()); msg.code((byte)21); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.STRING_FIXED, msg.value()); msg.code((byte)22); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.GEOMETRY, msg.value()); msg.code((byte)24); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.TIMESTAMP_TZ, msg.value()); msg.code((byte)25); + msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.ENUM, msg.value()); - Throwable t = assertThrowsWithCause(() -> msg.code((byte)23), IllegalArgumentException.class); + Throwable t = assertThrowsWithCause(() -> { + msg.code((byte)23); + + try { + msg.finishUnmarshal(jdk(), U.gridClassLoader()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + }, + IllegalArgumentException.class); assertEquals("Unknown index key type code: " + 23, t.getMessage()); for (byte c = 26; c >= 26 && c <= Byte.MAX_VALUE; ++c) { byte c0 = c; - t = assertThrowsWithCause(() -> msg.code(c0), IllegalArgumentException.class); + t = assertThrowsWithCause(() -> { + msg.code(c0); + + try { + msg.finishUnmarshal(jdk(), U.gridClassLoader()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + }, + IllegalArgumentException.class); assertEquals("Unknown index key type code: " + c0, t.getMessage()); } @@ -166,7 +227,16 @@ public void testIndexKeyTypeFromCode() { for (byte c = (byte)(IndexKeyTypeMessage.NULL_VALUE_CODE + 1); c < -1; ++c) { byte c0 = c; - t = assertThrowsWithCause(() -> msg.code(c0), IllegalArgumentException.class); + t = assertThrowsWithCause(() -> { + msg.code(c0); + + try { + msg.finishUnmarshal(jdk(), U.gridClassLoader()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } + }, IllegalArgumentException.class); assertEquals("Unknown index key type code: " + c0, t.getMessage()); } @@ -174,15 +244,20 @@ public void testIndexKeyTypeFromCode() { /** */ @Test - public void testConversionConsistency() { + public void testConversionConsistency() throws IgniteCheckedException { for (IndexKeyType keyType : F.concat(IndexKeyType.values(), (IndexKeyType)null)) { IndexKeyTypeMessage msg = new IndexKeyTypeMessage(keyType); assertEquals(keyType, msg.value()); IndexKeyTypeMessage newMsg = new IndexKeyTypeMessage(); + + msg.prepareMarshal(jdk()); + newMsg.code(msg.code()); + newMsg.finishUnmarshal(jdk(), U.gridClassLoader()); + assertEquals(msg.value(), newMsg.value()); } } From f311ee3d5b0506bb0ec8acd25b0d845f6f02a8b2 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 13 Mar 2026 23:04:42 +0300 Subject: [PATCH 2/5] WIP --- ...CacheEntryPredicateAdapterMessageTest.java | 3 +- .../IndexKeyTypeMessageTest.java | 28 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java index b69cd202dde7f..f56dddb7daecf 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/CacheEntryPredicateAdapterMessageTest.java @@ -49,7 +49,8 @@ public void testCacheEntryPredicateAdapterCode() { } } - byte prepare(CacheEntryPredicateAdapter msg){ + /** */ + byte prepare(CacheEntryPredicateAdapter msg) { try { msg.prepareMarshal(jdk()); } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java index ca76df0d2002e..ee097ff9bb715 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java @@ -68,14 +68,15 @@ public void testIndexKeyTypeCode() { assertTrue(prepare(new IndexKeyTypeMessage(keyType)) != IndexKeyTypeMessage.NULL_VALUE_CODE); } - byte prepare(IndexKeyTypeMessage msg){ + /** */ + byte prepare(IndexKeyTypeMessage msg) { try { msg.prepareMarshal(jdk()); } catch (IgniteCheckedException e) { throw new RuntimeException(e); } - + return msg.code(); } @@ -192,7 +193,8 @@ public void testIndexKeyTypeFromCode() throws IgniteCheckedException { msg.finishUnmarshal(jdk(), U.gridClassLoader()); assertSame(IndexKeyType.ENUM, msg.value()); - Throwable t = assertThrowsWithCause(() -> { + Throwable t = assertThrowsWithCause( + () -> { msg.code((byte)23); try { @@ -209,7 +211,8 @@ public void testIndexKeyTypeFromCode() throws IgniteCheckedException { for (byte c = 26; c >= 26 && c <= Byte.MAX_VALUE; ++c) { byte c0 = c; - t = assertThrowsWithCause(() -> { + t = assertThrowsWithCause( + () -> { msg.code(c0); try { @@ -227,15 +230,16 @@ public void testIndexKeyTypeFromCode() throws IgniteCheckedException { for (byte c = (byte)(IndexKeyTypeMessage.NULL_VALUE_CODE + 1); c < -1; ++c) { byte c0 = c; - t = assertThrowsWithCause(() -> { - msg.code(c0); + t = assertThrowsWithCause( + () -> { + msg.code(c0); - try { - msg.finishUnmarshal(jdk(), U.gridClassLoader()); - } - catch (IgniteCheckedException e) { - throw new RuntimeException(e); - } + try { + msg.finishUnmarshal(jdk(), U.gridClassLoader()); + } + catch (IgniteCheckedException e) { + throw new RuntimeException(e); + } }, IllegalArgumentException.class); assertEquals("Unknown index key type code: " + c0, t.getMessage()); From 47c8f1a825ede264351edc2e2c6f55a859c0395f Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Fri, 13 Mar 2026 23:13:06 +0300 Subject: [PATCH 3/5] WIP --- .../managers/communication/IndexKeyTypeMessageTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java index ee097ff9bb715..4264d2772f877 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/managers/communication/IndexKeyTypeMessageTest.java @@ -240,7 +240,7 @@ public void testIndexKeyTypeFromCode() throws IgniteCheckedException { catch (IgniteCheckedException e) { throw new RuntimeException(e); } - }, IllegalArgumentException.class); + }, IllegalArgumentException.class); assertEquals("Unknown index key type code: " + c0, t.getMessage()); } From d36d40b7e371cbf56babedac6073defe7e0647dc Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Sun, 15 Mar 2026 21:40:58 +0300 Subject: [PATCH 4/5] WIP --- .../ignite/internal/cache/query/index/IndexKeyTypeMessage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java index ba6e55b3db0c2..6364ade45d852 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java @@ -53,6 +53,7 @@ public IndexKeyTypeMessage(@Nullable IndexKeyType keyType) { /** Constructor. */ public IndexKeyTypeMessage(int keyTypeCode) { code = (byte)keyTypeCode; + val = decode(code); } /** @return Code. */ @@ -69,6 +70,8 @@ public void code(byte code) { /** @return Index key type. */ public @Nullable IndexKeyType value() { + assert val != null; + return val; } From 07720796fdbea8d0ecc87b25993c01d9419d0eb7 Mon Sep 17 00:00:00 2001 From: Anton Vinogradov Date: Sun, 15 Mar 2026 21:41:38 +0300 Subject: [PATCH 5/5] WIP --- .../ignite/internal/cache/query/index/IndexKeyTypeMessage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java index 6364ade45d852..b5283f625640e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/cache/query/index/IndexKeyTypeMessage.java @@ -48,6 +48,7 @@ public IndexKeyTypeMessage() { /** Constructor. */ public IndexKeyTypeMessage(@Nullable IndexKeyType keyType) { val = keyType; + code = encode(keyType); } /** Constructor. */