You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "Nabarun Nag (Jira)" <ji...@apache.org> on 2021/09/03 02:22:10 UTC

[jira] [Closed] (GEODE-8330) Structural Improvements to Serialization Versioning

     [ https://issues.apache.org/jira/browse/GEODE-8330?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nabarun Nag closed GEODE-8330.
------------------------------

> Structural Improvements to Serialization Versioning
> ---------------------------------------------------
>
>                 Key: GEODE-8330
>                 URL: https://issues.apache.org/jira/browse/GEODE-8330
>             Project: Geode
>          Issue Type: Improvement
>          Components: serialization
>            Reporter: Bill Burcham
>            Assignee: Bill Burcham
>            Priority: Major
>              Labels: membership
>             Fix For: 1.14.0
>
>
> As a follow-on to GEODE-8240 we want to do another ticket to improve, outside the context of a big release-blocking bug, the versioning framework. The starting point for this work will be the work completed and merged for GEODE-8240.
> Our goals are to:
> * Make the version type hierarchy easily understood by Geode developers
> * Make the framework foolproof so we prevent bugs like GEODE-8240
> We’ll rely on a handful of techniques to accomplish this:
> * Clear naming
> * Orthogonality—separation of concerns, one way to do each thing
> * No {{null}}—it’s not needed in this framework at all
> * No exceptions (no throws)—prefer total functions instead
> * Separate “model” code from I/O code
> When fixing the rolling upgrade bug in GEODE-8240 we introduced a base type: {{VersionOrdinal}} for the existing "enum" {{Version}}. During the work for that ticket we saw lots of little things that needed cleaning up, but we didn't want to do them in that other PR because we had a couple support branches waiting for that ticket to complete. Also we wanted the GEODE-8240 changes to be minimal so as to minimize the complexity of our back-porting work.
> Now that that ticket is complete and back-ported, this ticket will:
> * get rid of confusing and wrong inheritance relationship between {{VersionOrdinalImpl}} and {{Version}}: now {{Version}} (i.e. known version) and {{UnknownVersion}} both extend {{AbstractVersion}} which implements {{VersionOrdinal}}—improved naming of this hierarchy will come, probably in a follow-on PR since it would touch lots of files
> * flesh-out {{Versioning}} factory:
> ** add {{Version getKnownVersion(final VersionOrdinal anyVersion, Version returnWhenUnknown)}} method that simply downcasts {{anyVersion}} if it can
> ** ensure there's exactly _one way_ to construct a version ({{VersionOrdinal}}) from a {{short}}, and there is exactly _one way_ to get a known version ({{Version}}) from a {{VersionOrdinal}}
> * version acquisition no longer throws exceptions ever
> * eliminate {{InternalDistributedMember.getVersionObject()}} in favor of {{Versioning.getKnownVersion(Versioning.getVersionOrdinal(ver), Version.CURRENT)}}: the latter makes it clear to maintainers that {{Version.CURRENT}} will be used as a stand-in for unknown versions
> * move I/O logic to a separate class, {{VersioningIO}}
> * eliminate tons of redundant and unused methods in {{Version}}
> The type hierarchy after this story is complete will be:
> {noformat}
>     VersionOrdinal
>     <<interface>>
>           ^
>           |
>     AbstractVersion
>     <<abstract>>
>           ^
>           |
>    -----------------
>    |               |
> Version      UnknownVersion
> <<enum>> 
> {noformat}
> In a separate ticket/story we will tackle the final improvements to the type names:
> {{Version}} will become {{KnownVersion}}
> {{VersionOrdinal}} will become {{Version}} yippee!!
> Changing {{Version}} to {{KnownVersion}} will touch hundreds of files. We'll tackle that in a separate ticket/story/PR that is focused just on that renaming.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)