DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
...
There should be one serialization framework for communication and discovery protocol.
MessageWriter, MessageReader logic is depends on a remote IgniteProductVersion.Message#writeTo, Message#readFrom is auto-generated and stored separately from Message DTO classes classes.Message#writeObject - for serializing Objects (java functions, and user objects) :MessageWriter for communication protocol use BinaryMarshallerMessageWriter for discovery protocol use JdkMarshallerBinaryMarshaller.Message fields may containMessage fields contain:Message.@Order annotation.@Since, @Until annotations annotations for Message classes and fields....
(curVer - 1)....
Message classes, including ser/des algorithm.Messages to remote node.Message - is base class for all messages transported between nodes. Proposed changes:
Message#writeTo and Message#readFrom in favor generated MessageSerializer. MessageSerializer#writeTo Message#writeTo consumes MessageWriter that stores IgniteProductVersion of destination a receiver node and use it for serializing data for this version (mostly, for ignoring some fields).Message#readFrom MessageSerializer#readFrom consumes MessageReader that stores IgniteProductVersion of source node and use it for deserializing data (mostly, for setting default values of new fields).
| Code Block | ||||
|---|---|---|---|---|
| ||||
public interface MessageSerializer { public boolean writeTo(Message msg, ByteBuffer buf, MessageWriter writer); public boolean readFrom(Message msg, ByteBuffer buf, MessageReader reader); } public interface MessageWriter { public IgniteProductVersion destinationVersionreceiverVersion(); } public interface MessageReader { public IgniteProductVersion sourceVersionsenderVersion(); } |
@Since and @Until for Message classes and Message fields, to use it for generating code for Message#writeTo and Message#readFrom:| Code Block | ||||
|---|---|---|---|---|
| ||||
// Package where the Message is defined. package org.apache.ignite.internal.my.message; // package private class. @Since(version = "2.19.0") public class MyMessage implements Message { @Order(0) private int id; /** Remove field. */ @Until(version = "2.20.0") @Order(1) private String rmFld; /** New field. */ @Since(version = "2.20.0") @Order(2) private String newFld; // DelegatesMessage must #writeTohave methodsetters/getters callfor toall generated@Ordered serializerfields. Methods names @Overrideare publicequal booleanto writeTo(ByteBuffer buf, MessageWriter writer) { return MyMessageSerializer.writeTo(this, buf, writer); } // Delegates #readFrom method call to generated serializer. @Override public boolean readFrom(ByteBuffer buf, MessageReader reader) { return MyMessageSerializer.readFrom(this, buf, reader); a corresponding field name. public void id(int id) { this.id = id; } public int id() { return id; } public void newFld(String newFld) { this.newFld = newFld; } public String newFld() { return newFld; } } // Generated code from the message ^ for Ignite version 2.20.0. // Use the same package as corresponding message. package org.apache.ignite.internal.my.message; class MyMessageMyMessageSerializer { public static boolean writeTo(MyMessageMessage msgm, MByteBufferByteBuffer buf, MessageWriter writer) { MyMessage IgniteProductVersion destVer msg = writer.version(MyMessage)m; IgniteProductVersion rcvVer if (destVer.lessThan(2, 19, 0)) throw new IgniteException("Must not send the message to destination node")= writer.receiverVersion(); writer.writeString(msg.id()); if (destVerrcvVer.lessThan(2, 20, 0)) writer.writeString(msg.rmFld()); if (destVerrcvVer.greaterThanEqual(2, 20, 0)) writer.writeString(msg.newFld()); return true; } public static boolean readFrom(MyMessageMessage msgm, ByteBuffer buf, MessageReader reader) { MyMessage msg = (MyMessage)m; IgniteProductVersion srcVer = reader.versionsenderVersion(); msg.id(reader.readString()); if (srcVer.lessThan(2, 20, 0)) msg.rmFld(reader.readString()); if (srcVer.greaterThanEqual(2, 20, 0)) msg.newFld(reader.readString()); return true; } } |
...
Message class or Message fields, but annotate it with @Until. @Order of fields.@Since. All such fields must be optional, default value is null. Handling the nulls is care of Message consumer on the reader side....
...