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

Bill Burcham reassigned GEODE-8330:
-----------------------------------

    Assignee: Bill Burcham

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

Reply via email to