[
https://issues.apache.org/jira/browse/IGNITE-15817?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ivan Bessonov updated IGNITE-15817:
-----------------------------------
Description:
h2. Goal
We want to keep PageIO abstraction in general but refine it, address some flaws
and repay tech debt that has built up in this subsystem.
h2. Items to pay attention to
Abstract parent PageIO class is overloaded with functionality (bad smell from
static methods etc), responsibilities split and minor redesign is needed.
Retrieving version of a particular page requires complicated machinery, it
should be simplified.
PageMetaIO hierarchy flattening - responsibilities of intermediate classes
should be unified and grouped in a lower hierarchy.
Old versions cleanup: versions history shrinking is safe as no binary
compatibility between 2.x and 3.0.
Reconsider approaches to support versioning and binary compatibility. Classes
with names like V2, V3 look questionable, we may come up with other naming or
completely different approach.
h2. More details
Generally speaking, there's no point in porting classes like PageMetaIO with
the abstraction. These can be ported with PageMemory component, for example.
Currently, every IO type is described in a single class as a set of constants.
This approach is not flexible enough:
* all methods are static, it's hard to substitute IO in tests, so there are
fields like {{{}PageIO#testIO{}}}, which is a very poor design.
* IO types for every component are crammed into a single class, modules
connectivity is way too high. This leads to very awkward methods like
{{{}PageIO#registerH2{}}}.
I propose using ServiceLoader interfaces or explicit extensions and store IO
objects in a registry, which won't be static.
{{FLAG_IDX}} makes no sense, to be honest, it can be derived from partition id.
It should be removed.
Topic of big page sizes should not be considered here right now, there are
unresolved issues with meta pages and so on.
Classes like {{PageSupport}} and {{ReuseList}} (and others) will be ported
here, but without implementations. Or maybe with test implementations.
was:
h2. Goal
We want to keep PageIO abstraction in general but refine it, address some flaws
and repay tech debt that has built up in this subsystem.
h2. Items to pay attention to
Abstract parent PageIO class is overloaded with functionality (bad smell from
static methods etc), responsibilities split and minor redesign is needed.
Retrieving version of a particular page requires complicated machinery, it
should be simplified.
PageMetaIO hierarchy flattening - responsibilities of intermediate classes
should be unified and grouped in a lower hierarchy.
Old versions cleanup: versions history shrinking is safe as no binary
compatibility between 2.x and 3.0.
Reconsider approaches to support versioning and binary compatibility. Classes
with names like V2, V3 look questionable, we may come up with other naming or
completely different approach.
> [Native Persistence 3.0] PageIOs abstractions porting
> -----------------------------------------------------
>
> Key: IGNITE-15817
> URL: https://issues.apache.org/jira/browse/IGNITE-15817
> Project: Ignite
> Issue Type: Task
> Components: persistence
> Reporter: Sergey Chugunov
> Priority: Major
> Labels: ignite-3
> Fix For: 3.0
>
>
> h2. Goal
> We want to keep PageIO abstraction in general but refine it, address some
> flaws and repay tech debt that has built up in this subsystem.
> h2. Items to pay attention to
> Abstract parent PageIO class is overloaded with functionality (bad smell from
> static methods etc), responsibilities split and minor redesign is needed.
> Retrieving version of a particular page requires complicated machinery, it
> should be simplified.
> PageMetaIO hierarchy flattening - responsibilities of intermediate classes
> should be unified and grouped in a lower hierarchy.
> Old versions cleanup: versions history shrinking is safe as no binary
> compatibility between 2.x and 3.0.
> Reconsider approaches to support versioning and binary compatibility. Classes
> with names like V2, V3 look questionable, we may come up with other naming or
> completely different approach.
> h2. More details
> Generally speaking, there's no point in porting classes like PageMetaIO with
> the abstraction. These can be ported with PageMemory component, for example.
> Currently, every IO type is described in a single class as a set of
> constants. This approach is not flexible enough:
> * all methods are static, it's hard to substitute IO in tests, so there are
> fields like {{{}PageIO#testIO{}}}, which is a very poor design.
> * IO types for every component are crammed into a single class, modules
> connectivity is way too high. This leads to very awkward methods like
> {{{}PageIO#registerH2{}}}.
> I propose using ServiceLoader interfaces or explicit extensions and store IO
> objects in a registry, which won't be static.
> {{FLAG_IDX}} makes no sense, to be honest, it can be derived from partition
> id. It should be removed.
> Topic of big page sizes should not be considered here right now, there are
> unresolved issues with meta pages and so on.
> Classes like {{PageSupport}} and {{ReuseList}} (and others) will be ported
> here, but without implementations. Or maybe with test implementations.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)