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)

Reply via email to