Nikolay Izhikov created IGNITE-29189:
----------------------------------------

             Summary: Read cpMapSnapshot.bin written by builds with the 
generated EarliestCheckpointMapSnapshot serializer
                 Key: IGNITE-29189
                 URL: https://issues.apache.org/jira/browse/IGNITE-29189
             Project: Ignite
          Issue Type: Improvement
            Reporter: Nikolay Izhikov


h3. Context

IGNITE-29185 made {{EarliestCheckpointMapSnapshot}} write and read 
{{cpMapSnapshot.bin}} in the layout used by 2.17 / 2.18 (UUIDs written with 
{{writeObject}}).

Builds that contain IGNITE-27775 but not IGNITE-29185 (no release, but 
intermediate master builds) wrote the file with the generated 
{{EarliestCheckpointMapSnapshotSerializer}}, where UUID map keys and 
{{checkpointIds}} elements are written with {{U.writeUuid}} (null flag + two 
longs). Such a file can't be read by the current code, so a node upgraded from 
one of these builds logs "Failed to unmarshal earliest checkpoint map snapshot" 
and rebuilds the earliest checkpoint map.

h3. Proposal

Support both layouts on read: {{readExternal}} reads the payload bytes once, 
tries the legacy layout first and, if that fails, re-reads the same bytes with 
a copy of the generated code. The legacy parse of a generated-layout payload 
fails deterministically ({{StreamCorruptedException}}: the first byte of a 
{{U.writeUuid}} UUID is 0x00/0x01, never a valid type code), so the fallback is 
safe. Writing stays in the legacy layout.

Covered by {{EarliestCheckpointMapSnapshotSerializationTest}} (round trip, 
legacy layout with 2.17 and 2.18 headers, generated layout, empty snapshot) and 
{{CheckpointMapSnapshotCompatibilityTest}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to