[
https://issues.apache.org/jira/browse/IGNITE-24698?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Maksim Zhuravkov reassigned IGNITE-24698:
-----------------------------------------
Assignee: Maksim Zhuravkov
> Add new catalog serializers that conform with the new serialization protocol
> ----------------------------------------------------------------------------
>
> Key: IGNITE-24698
> URL: https://issues.apache.org/jira/browse/IGNITE-24698
> Project: Ignite
> Issue Type: Improvement
> Components: sql
> Reporter: Pavel Pereslegin
> Assignee: Maksim Zhuravkov
> Priority: Major
> Labels: ignite-3
>
> In IGNITE-24564, dynamic creation of serializer registry has been added
> (using the `CatalogSerializer` annotation).
> The target serialization format (v2) should be as follows:
> ||Field description||type||
> |PROTOCOL VERSION|short|
> |Object type|short|
> |Object serialization format version|varint|
> |Object payload|...|
> In order to migrate to the new serialization data format, we need to do the
> following:
> 1. Introduce new decorators for input/output which allow to write/read
> objects.
> {code:Java}
> interface CatalogObjectDataInput extends IgniteDataInput {
> // Reads an object.
> <T> T readObject() throws IOException;
> }
> interface CatalogObjectDataOutput extends IgniteDataOutput {
> // Writes an object.
> void writeObject(MarshallableEntry object) throws IOException;
> }
> {code}
> 2. Change CatalogObjectSerializer to use them instead of
> IgniteDataInput/IgniteDataOutput
> 3. In each serializer container class we need to add a new serializer and
> annotate it with CtalogSerializer(version = 2, since = "3.1.0")
> 4. Update unmarshal in UpdateLogMarshallerImpl
> {code:java}
> try (CatalogObjectDataInputImpl input = new
> CatalogObjectDataInputImpl(bytes, serializers)) {
> short protoVersion = input.readShort();
> switch (protoVersion) {
> case 1:
> int typeId = input.readShort();
> return (UpdateLogEvent) serializers.get(1,
> typeId).readFrom(input);
> case 2:
> return input.readObject();
> default:
> throw new IllegalStateException(format("An object could
> not be deserialized because it was using "
> + "a newer version of the serialization protocol
> [objectVersion={}, supported={}]", protoVersion, PROTOCOL_VERSION));
> }
> } catch (Throwable t) {
> throw new CatalogMarshallerException(t);
> }
> {code}
> 5. Simplify marshal in UpdateLogMarshallerImpl
> {code:java}
> public byte[] marshall(UpdateLogEvent update) {
> try (CatalogObjectDataOutputImpl output = new
> CatalogObjectDataOutputImpl(INITIAL_BUFFER_CAPACITY, serializers)) {
> output.writeShort(PROTOCOL_VERSION);
> output.writeObject(update);
> return output.array();
> } catch (Throwable t) {
> throw new CatalogMarshallerException(t);
> }
> }
> {code}
> This way we will read data depending on the protocol version, but write in
> version 2 format and thus ensure a transparent transition from version 1 to
> version 2.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)