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.
...
This protocol is out of scope of this proposal.
Server nodes stores ClusterVersion - set of Ignite versions in cluster (server and clients nodes). The joining node version must be checked versus the version (see actual Ignite versions in a cluster (within OnDiscoveryNodeValidationProcessor):
ClusterVersion a cluster contains nodes of only one version (all nodes are run same version), then the joining node can be greater/less than this version by up to 1 minor version.ClusterVersion a cluster contains nodes of two versions, then joining node version must be one of the ClusterVersionthem....
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; // Message Delegatesmust #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....
...