Skip to content

IGNITE-28520 Auto-generate message serialization / marshalling / deployment#13095

Open
anton-vinogradov wants to merge 279 commits into
apache:masterfrom
anton-vinogradov:ignite-28520
Open

IGNITE-28520 Auto-generate message serialization / marshalling / deployment#13095
anton-vinogradov wants to merge 279 commits into
apache:masterfrom
anton-vinogradov:ignite-28520

Conversation

@anton-vinogradov

@anton-vinogradov anton-vinogradov commented Apr 30, 2026

Copy link
Copy Markdown
Contributor

What

Extends the annotation-driven message codegen (previously serialization-only) to
marshalling and deployment: a message's wire read/write, marshalling and
deployment are now generated from declarative field annotations, replacing
hand-written writeTo/readFrom, prepareMarshal/finishUnmarshal and prepareDeployment.

Main directions

  1. Generated marshaller & deployer companions. MessageProcessor now emits
    <Msg>Marshaller and <Msg>Deployer next to <Msg>Serializer, driven by
    @Marshalled / @MarshalledCollection / @MarshalledMap (with @Order /
    @NioField). Hand-written marshalling/deployment hooks are removed from messages.

  2. Uniform factory dispatch. MessageFactory resolves all three by direct type —
    serializer() / marshaller() / deployer() — via one
    register(directType, supplier, serializer, marshaller, deployer). Callers use the
    static facades MessageSerializer.writeTo/readFrom, MessageMarshaller.marshal/unmarshal,
    GridCacheMessageDeployer.deploy; an ArchUnit rule (MessageSerializationArchitectureTest)
    enforces it.

  3. Comm & discovery wired to it. GridIoManager / GridCacheIoManager /
    IgniteTxManager and the TCP/ZK discovery I/O call MessageMarshaller.marshal/unmarshal;
    discovery custom messages (MetadataUpdateProposedMessage, BinaryMetadataVersionInfo, …)
    move from MarshallableMessage hooks to @Marshalled.

  4. Deployment collapsed. GridCacheMessageDeployer is now only the codegen interface
    plus the factory-resolving facade; per-field static bridges dropped, GridCacheMessage#deploy*
    accessed directly.

  5. Marshalling stays off the NIO threads. The NIO codec does only serialization
    (writeTo/readFrom); the actual marshal/unmarshal runs on the sender and worker
    threads. @NioField + unmarshalNio are the explicit, minimal exception — only the
    handful of fields needed for early dispatch are unmarshalled on the NIO thread.

Side effects (mechanical — skim)

  • Rename to a consistent vocabulary (bulk of the diff, purely mechanical):
    • prepareMarshalmarshal, finishUnmarshalunmarshal,
      finishUnmarshalNiounmarshalNio (on MarshallableMessage / MessageMarshaller);
    • CacheObject#prepareMarshal(ctx) / finishUnmarshal(ctx)marshal / unmarshal;
    • deployment prepareDeployment + prepare*Deployment helpers → deploy / deploy*;
    • test renames: MarshallerCacheFreeFinishTest…UnmarshalTest,
      MessageFinishUnmarshalOnceTestMessageUnmarshalOnceTest.
  • Build/CI: .mvn/jvm.config opens jdk.compiler for the codegen tests
    (Google compile-testing); commit-check.yml now surfaces the real compile error
    behind the generated-class "cannot find symbol" cascade.

Performance

JMH-verified: serialization hot path unchanged (Δ ≈ 0 vs master); marshalling adds
~1.8 ns/message of factory dispatch (<0.5% of the actual U.marshal, ~µs); zero extra
allocations.

# Conflicts:
#	modules/codegen/src/main/java/org/apache/ignite/internal/MessageSerializerGenerator.java
#	modules/commons/src/main/java/org/apache/ignite/internal/processors/cache/version/GridCacheVersion.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/operation/SchemaAddQueryEntityOperation.java
#	modules/core/src/test/java/org/apache/ignite/internal/direct/stream/DirectByteBufferStreamImplByteOrderSelfTest.java
#	modules/core/src/test/resources/codegen/TestCollectionsMessageSerializer.java
#	modules/core/src/test/resources/codegen/TestMapMessageSerializer.java
#	modules/core/src/test/resources/codegen/TestMessageSerializer.java
package org.apache.ignite.plugin.extensions.communication;

/** Marker interface: no {@link MessageMarshaller} is generated for implementing classes. */
public interface NonMarshallableMessage extends Message {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we use an annotation instead of an empty interface. Empty interface is a bad, outdated practice to me.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An annotation can't give us two things this marker relies on: (1) NonMarshallableMessage extends Message, so the compiler itself guarantees the marker is only placed on messages — with an annotation we'd need another processor validation for that; (2) interface inheritance is exactly the semantic we need — the generator skips marshal recursion for a field of type X because any subtype of X is also non-marshallable, which plain annotations don't provide (@Inherited is subtle both at runtime and in annotation processing). Plus the runtime side (isAssignableFrom at registration, instanceof in the factory guarantees) stays trivial, and it follows the codebase convention for message markers (GridCacheDeployable, IgniteTxStateAware, …).

/** Marks a {@code Collection} field whose wire form is a companion {@code @Order} array field named by {@link #value()}. */
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.FIELD)
public @interface MarshalledCollection {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it so necessary to bring one more annotation? Can we use Marshalled?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They intentionally encode four different mechanics, not one: @Marshalled = a single Marshaller blob for an arbitrary object; @MarshalledCollection/@MarshalledMap = per-element Message serialization (no Marshaller involved at all; the map flavour needs two companion fields, keys()/values()); @MarshalledObjects = per-element Marshaller blobs so each element keeps its own deployment class loader (P2P) and query-row keys get finished. Folding them into one annotation would mean a union of attributes where half the combinations are invalid (validation moves into processor errors), and the field declaration would stop telling the reader which of the four mechanics applies.

this.txHashRes = txHashRes;
this.partHashRes = partHashRes;
this.partiallyCommittedTxs = partiallyCommittedTxs;
this.exceptions = exceptions == null ? null : F.viewReadOnly(exceptions, ErrorMessage::new);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why changed?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

viewReadOnly is a lazy view that creates fresh ErrorMessage instances on every iteration. The flow is two-pass — MessageMarshaller.marshal fills each element's serialized form, then writeTo iterates again — so with a lazy view the write pass would see brand-new elements with the marshalled state lost. Now switched to eager F.transform, which keeps the one-liner while materializing the collection (same fix applies in GridDhtPartitionsFullMessage and ServiceSingleNodeDeploymentResult).

*/
public abstract class MessageGenerator {
/** Blank separator line in generated code. */
public static final String EMPTY = "";

@Vladsz83 Vladsz83 Jul 9, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not NL?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the accumulated entries are terminator-free lines: buildClassCode writes each as line + NL. A separator entry therefore has to be the empty string — using NL would render as a double blank line.

Comment thread modules/codegen/src/main/java/org/apache/ignite/internal/MessageGenerator.java Outdated
MessageGenerator(ProcessingEnvironment env) {
this.env = env;

cacheIdAwareMirror = type("org.apache.ignite.plugin.extensions.communication.CacheIdAware");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

org.apache.ignite.plugin.extensions.communication.CacheIdAware might be constant

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't be a Class reference — CacheIdAware lives in core, which isn't on the codegen classpath (that's exactly why external types are looked up as FQN-string mirrors). And per the sibling thread in MessageDeploymentGenerator we've just unified all single-use type FQNs to plain strings, so a String constant would go against that.

" */";

/** */
final ProcessingEnvironment env;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

protected? The others fields and methods below too,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Visibility here is "tightest that works": public only for what's genuinely used from another package (NL/TAB and the static helpers are imported by the internal.idto processors), package-private for everything the subclass generators and the processor need — they all share this package. protected would only widen access to hypothetical out-of-package subclasses.

Comment thread modules/core/src/test/resources/codegen/ChildMessageSerializer.java Outdated
package org.apache.ignite.plugin.extensions.communication;

/**
* Implemented by messages targeting a specific cache. The cache ID lets the generated marshaller and deployer resolve

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

targeting a specific cache -> smth. like holding certain cache data/CacheObject to transfer?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree, reworded — now "Implemented by messages that carry cache data (CacheObjects) to transfer. The cache ID lets the generated marshaller and deployer resolve the cache object context used to (un)marshal and deploy that data."

* the cache object context used to (un)marshal and deploy the message's cache objects.
*/
public interface CacheIdAware {
/** @return Cache ID identifying the target cache. */

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

target cache -> smth. like cache data/CacheObject to transfer

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — now "ID of the cache whose data the message transfers."

/**
* Implemented by messages targeting a specific cache. The cache ID lets the generated marshaller and deployer resolve
* the cache object context used to (un)marshal and deploy the message's cache objects.
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wy might also refer some @see to a factory or a serializer.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added @see MessageMarshaller and @see MessageFactory.


/** {@inheritDoc} */
@Override public int hashCode() {
assert val != null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is assert isn't enough?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It isn't, unfortunately: with assertions off (production) the control falls through to IgniteUtils.hashCode(null), which silently returns 0 — an unresolved key would quietly land in the wrong hash bucket instead of failing. The exception also isn't just diagnostics: GridCacheIoManager catches CacheObjectNotResolvedException next to BinaryObjectException and routes it to onClassError, i.e. the regular per-message error handling. The contract (query row keys travel bytes-only and must arrive resolved) is pinned by GridCacheQueryResponseUnmarshalTest.


/** @return the serializer registered for {@code msg}'s direct type. */
@SuppressWarnings("unchecked")
private static <M extends Message> MessageSerializer<M> resolve(MessageFactory factory, M msg) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is used only within the interface. Do we need to expose it? Or we need some SerializationUtil/Helper?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's actually called from a dozen production sites — GridNioServer, GridDirectParser, DirectByteBufferStream, TcpHandshakeExecutor, TcpDiscoveryIoSession, the ZK DiscoveryMessageParser (the private resolve below is the interface-internal one). Rationale for statics-on-interface — see the sibling thread above.

* @param <M> Message type.
* @return Whether message was fully written.
*/
static <M extends Message> boolean writeTo(MessageFactory factory, M msg, MessageWriter writer) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to expose it? Or we need some SerializationUtil/Helper or an abstract class instead of declaring static methods in an interface?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

They're the family-wide pattern: instance methods are the per-type generated implementations, while the interface statics are the resolve-and-dispatch entry point — same as MessageMarshaller.marshal/unmarshal and GridCacheMessageDeployer.deploy. A separate SerializationUtil would split the contract and its entry point across two types, and an abstract class isn't an option — this is an interface-based SPI implemented by the generated serializers. The statics are also the enforced entry: MessageSerializationArchitectureTest (ArchUnit) fails any direct instance-method call.

# Conflicts:
#	modules/zookeeper/src/main/java/org/apache/ignite/spi/discovery/zk/internal/DiscoveryMessageParser.java
@github-actions

Copy link
Copy Markdown

Possible compatibility issues. Please, check rolling upgrade cases

This PR modifies protected classes (with Order annotation).
Changes to these classes can break rolling upgrade compatibility.

Affected files:

  • modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/message/GenericValueMessage.java
  • modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/message/QueryStartRequest.java
  • modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/message/QueryTxEntry.java
  • modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/metadata/ColocationGroup.java
  • modules/codegen/src/main/java/org/apache/ignite/internal/MessageProcessor.java
  • modules/codegen/src/main/java/org/apache/ignite/internal/idto/IDTOSerializerGenerator.java
  • modules/core/src/main/java/org/apache/ignite/internal/managers/communication/ErrorMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/managers/communication/IgniteIoTestMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheEntryPredicateAdapter.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheInvokeDirectResult.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryInfo.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIdMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheReturn.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/StoredCacheData.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/BinaryMetadataVersionInfo.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/MetadataUpdateProposedMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheTtlUpdateRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedLockResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridDistributedTxPrepareRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/GridNearUnlockRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtLockResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxFinishResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtUnlockRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/TransactionAttributesAwareRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/AtomicApplicationAttributesAwareRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicNearResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicSingleUpdateRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicUpdateResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicFullUpdateRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateFilterRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateInvokeRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicSingleUpdateRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/UpdateErrors.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtForceKeysResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionSupplyMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsSingleMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/CacheVersionedValue.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearGetResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearSingleGetResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxPrepareResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IncrementalSnapshotAwareMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IncrementalSnapshotVerifyResult.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryEntry.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxKey.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxEntryValueHolder.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TxLocksResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/PartitionHashRecord.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/TransactionsHashRecord.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/cluster/ChangeGlobalStateMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/StartRequestData.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageCasMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/metastorage/persistence/DistributedMetaStorageUpdateMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/PluginsDataBagItem.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/query/schema/message/QueryEntityMessage.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/task/GridTaskResultResponse.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentRequest.java
  • modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResult.java
  • modules/core/src/main/java/org/apache/ignite/spi/discovery/SerializableDataBagItemWrapper.java
  • modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/internal/TcpDiscoveryNode.java
  • modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAbstractTraceableMessage.java
  • modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryNodeAddFinishedMessage.java
  • modules/core/src/test/java/org/apache/ignite/internal/codegen/MessageProcessorTest.java
  • modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TestDelayMessage.java
  • modules/core/src/test/java/org/apache/ignite/spi/discovery/tcp/ExploitMessage.java
  • modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/msg/GridH2CacheObject.java

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants