Pavel Pereslegin created IGNITE-24698: -----------------------------------------
Summary: Add new serializers that comply 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 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 (CatalogObjectDataInput input = new CatalogObjectDataInputImpl(new IgniteUnsafeDataInput(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} try (CatalogObjectDataOutputImpl output = new CatalogObjectDataOutputImpl(PROTOCOL_VERSION, INITIAL_BUFFER_CAPACITY, serializers)) { 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)