Hello, Alexey. Think we can extend our @IgniteExperimental annotation.
`@IgniteExperimental` - mark features that are truly experimental and can be completely removed in future releases. `@NotRecommended` - mark features that widely adopted by the users but implemented wrong or have known issues that can’t be fixed. `@NotStable` - mark features supported by community but API not stable and can be reworked in the next release. `@Stable` - mark features that are completely OK and here to stay. We should output notes about these annotations in the JavaDoc, also. What do you think? > 8 дек. 2020 г., в 12:49, Alexey Goncharuk <alexey.goncha...@gmail.com> > написал(а): > > Igniters, > > I want to tackle the topic of modules structure in Ignite 3. So far, the > modules in Ignite are mostly defined intuitively which leads to some > complications: > > - Ignite public API is separated from the rest of the code only by > package name. This leads to private classes leaking to public API which is > very hard to catch even during the review process (we missed a bunch of > such leaks for new metrics API [1] and I remember this happening for almost > every SPI) > - Classes from 'internal' packages are considered to be 'free for grabs' > in every place of the code. This leads to tight coupling and abstraction > leakage in the code. An example of such a case - an often cast of > WALPointer to FileWALPointer, so that the community decided to get rid of > the WALPointer interface altogether [2] > - Overall code complexity. Because of the lack of inter-module > interaction rules, we are free to add new methods and callbacks to any > class, which leads to duplicating entities and verbose interfaces. A good > example of this is the clear duplication of methods in > IgniteCacheOffheapManager and IgniteCacheOffheapManager.DataStore [3] > > I think we need to work out some rules that will help us define and control > both Ignite public API and module internal API which still defines a clear > contract for other modules. Some ideas: > > - Perhaps we can move all user public classed and interfaces to an > Ignite-API module which will have no dependencies on implementation > modules. This will prevent private classes from leaking to the API module. > - We need somehow define which classes from a module are exposed to > other modules, and which classes are left for module-private usage. Maybe > Java's jigsaw will help us here, but maybe we will be ok with just more > strict java access modifiers usage :) The idea here is that a module should > never touch a dependent module's private classes, ever. The exported > classes and interfaces are still free to be modified between releases, as > long as it is not a user public API. > - A module should be logically complete, thus it may be beneficial if > module name matches with the code package it provides (e.g. configuration > -> org.apache.ignite.configuration, replication -> > org.apache.ignite.replication, raft->org.apache.ignite.raft, etc) > > Any other principles/rules we can apply to make the code structure more > concise? Thoughts? > > --AG > > [1] https://issues.apache.org/jira/browse/IGNITE-12552 > [2] https://issues.apache.org/jira/browse/IGNITE-13513 > [3] https://issues.apache.org/jira/browse/IGNITE-13220