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 only one version (all nodes are run same version)nodes of only version, then the joining node can be greater/less than this version by up to 1 minor version.ClusterVersionsthem....
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#writeJavaObject Message#writeObject - for serializing Java Objects (java functions, and user objects (ComputeJob, etc) with JdkMarshaller) with BinaryMarshaller.Message fields containfields may 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 IgniteProduceVersion 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 MessageMessageSerializer { public boolean writeTo(Message msg, ByteBuffer buf, MessageWriter writer); public boolean readFrom(Message msg, ByteBuffer buf, MessageReader reader); } public interface MessageWriter { public IgniteProductVersion receiverVersion(); } public interface MessageReader { public shortIgniteProductVersion directTypesenderVersion(); } |
@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 thatthe storeMessage allis schemasdefined. package org.apache.ignite.internal.messagesmy.schemamessage; // 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; } // GeneratedMessage codemust from the schema ^have setters/getters for Igniteall version@Ordered 2.20.0. package org.apache.ignite.internal.messages; // public class. public class MyMessage { private int id; /** * Remove field. * @deprecated since 2.20.0. */ @Deprecated private String rmFld; /** * New field. * @sincefields. Methods names are equal to 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 private String newFld; @Override publicorg.apache.ignite.internal.my.message; class MyMessageSerializer { public boolean writeTo(Message m, ByteBuffer 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; } @Overridepublic publicstatic boolean readFrom(Message m, 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()); else rmFld = null; if (srcVer.greaterThanEqual(2, 20, 0)) msg.newFld = (reader.readString()); else newFld = null; return true; } } |
Rules to describe Message (must be automated and validated):
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....
...