Goal is a communication protocol that able to work between nodes with different Ignite versions.
It is proposed to work between versions that differ by 1 minor version, for example 2.20.X between 2.19.X (but not between 2.20.X and 2.18.X).
Communication protocol consist of 2 parts:
Message classes, including ser/des algorithm.Messages to remote node.Message - is base class for all messages transported between nodes. Proposed changes:
Message#writeTo consumes IgniteProductVersion of destination node and use it for serializing data for this version (mostly, for ignoring some fields).Message#readFrom consumes IgniteProductVersion of source node and use it for deserializing data (mostly, for setting default values of new fields).
public interface Message {
public boolean writeTo(ByteBuffer buf, MessageWriter writer, IgniteProductVersion destVer);
public boolean readFrom(ByteBuffer buf, MessageReader reader, IgniteProductVersion srcVer);
public short directType();
} |
@Since and @Until for Message classes and Message fields, to use it for generating code for Message#writeTo and Message#readFrom:@Since(version = "2.19.0")
public class MyMessage {
private int id;
@Until(version = "2.20.0")
private String rmFld;
@Since(version = "2.20.0")
private String newFld;
// Generated code.
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer, IgniteProductVersion destVer) {
if (destVer.lessThan(2, 19, 0))
throw new IgniteException("Must not send the message to destination node");
if (!writer.writeString(id))
return false;
if (destVer.lessThan(2, 20, 0)) {
if (!writer.writeString(rmFld))
return false;
}
if (destVer.greaterThanEqual(2, 20, 0)) {
if (!writer.writeString(newFld))
return false;
}
return true;
}
@Override public boolean readFrom(ByteBuffer buf, MessageReader reader, IgniteProductVersion srcVer) {
id = reader.readString();
if (srcVer.greaterThanEqual(2, 20, 0))
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. @Since. All such fields must be optional, default value is null. Handling the nulls is care of Message consumer on the reader side.Removing annotated entities is allowed after current version is greater than (@Until + 1) or (@Since + 1).
In case of transport protocol should be changed, Ignite must support -1 Ignite version.
FeatureTable class that used to track changes in transport protocol. Each entry must be annotated with @Since version.(@Since - 1) version. @Since version and notify release manager to drop support of old versions.Handshake algorithm is extended on new step - validating TcpCommunicationConfiguration consistency. Settings that affects both communicating nodes must be same:
Protobuf
Avro
Bson