[ 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)