The public API comprises public classes that are included in Javadoc.
Note
|
Other public classes are not subject to the following rules; they may be changed in any way, or even removed. |
-
Class and method names, types, and number of parameters in already existing methods, should not be changed.
-
Any methods can be added to the classes and interfaces that are not subject for subclassing or implementing by the library users; such as
ChronicleMap
,ChronicleMapBuilder
,MapEntry
. They must be added in such a way that any existing code, calling methods on those classes still compiles; and does not break due to ambiguity in method resolution. -
Only non-abstract (concrete or default) methods can be added to the classes and interfaces that are subject for subclassing by the library users; such as
MapMethods
,MapEntryOperations
,SizedReader
.
Semantics and actual effects of API calls may change between Chronicle Map versions with
different <minor>
number versioning.
For example, default serialization forms of key or value objects of some types could change, "high level" configurations in ChronicleMapBuilder
could produce
Chronicle Maps with different "low level" configurations, etc.
Such changes should be documented in the release notes.
A persisted Chronicle Map store (a binary file), produced by a production release of the library, should be accessible and updatable by any subsequent production release of the library in the 3.x
branch; unless the older version has bugs that lead to data corruption.
To support this:
-
Serialization forms of any classes should not be changed. For example, when a marshaller class (for example,
StringBytesReader
) of objects of some type is changed, and its serialization form should be changed, a new class calledStringBytesReader_3_5
(5
is the<minor>
number of the version of the library, in which this change is made) should be created, and put along with older class. -
When the specification revision is updated (where the binary form could be completely changed), a new version of the root implementation class (say,
VanillaChronicleMap_3_5
) should be created and put along with older version, which should behave the same as before.
The replication protocol may change between Chronicle Map versions with different <minor>
numbers.
Chronicle Map nodes should only communicate with other nodes of the same version.
Chronicle Map nodes running different versions of the library should not communicate with each other. This may lead to failures, but not to data corruption on either of the nodes.
The Chronicle Map Data Store specification can be updated without changing the revision while it remains backward compatible. Backward compatibility means that the implementation of the newer version of the specification can access and update any persisted Chronicle Map store that was produced by an older version.
In addition, potential concurrent accessing implementations of older versions ("within" the same revision) should not lose correctness or corrupt the data.
If more substantial changes to the specification are required, then the revision number should be updated.
The binary form of Chronicle Map and its algorithms could change between revisions to any degree, but guarantees provided by the specification are not weakened.
The versioning format is as follows:
<major>.<minor>.<patch>
For example:
3.14.1
-
a feature, or public API method is added.
-
the behaviour of
ChronicleMap
,ChronicleMapBuilder
, or any other class or method or subsystem, is semantically changed.
For example, when configuration heuristics inChronicleMapBuilder
are improved, andChronicleMapBuilder
configured the same way constructs aChronicleMap
with a different number of segments, or segment’s capacity. -
any dependency is updated; even if only the
<patch>
number is updated. For example,chronicle-bytes
dependency is updated from1.1.1
to1.1.2
.
This rule does not apply to dependencies to the umbrella POMs which merely determine versions of other dependencies (namely,chronicle-bom
andthird-party-bom
), if the versions of actual dependencies do not change between those versions of umbrella POMs.
Also, this rule does not apply to dependencies with Maven scopes oftest
orprovided
. -
bug fixes, performance optimization, or feature additions that requires changes to:
-
the binary, or serialized, form of Chronicle Map data store; therefore revising the Chronicle Map data store specification.
-
the binary replication protocol, or the serialized form of some marshaller classes, that require creation of new versions of classes.
-
-
a bug is fixed, in a way that does not make any working code to change its behaviour semantically.
-
performance is optimized, changing its performance characteristics, but not semantics.
During development, and after the release of the version 3.y.z
, the library should be versioned 3.y.<x+1>-SNAPSHOT
.
As soon as changes are made that are substantial enough for the next released version
to update the <minor>
number, then the version should be changed to 3.<y+1>.0-SNAPSHOT
, in the same
commit operation that these changes are made.
Suffixes -alpha
, -beta
, -rc
, mean it is a pre-production release.
Note
|
If the <minor> number is not to be updated, the next release updates the <patch> number.
|
The first Chronicle Map 3 production release designates the Chronicle Map data store specification; revision 1.
When the specification needs to be updated in a way that is not backward compatible, the revision should be updated (revision 2
, 3
, …) and the Java implementation of this revision should have its '<minor>' version number updated.
During development, and after the release of the revision x
, while the specification is backward compatible, it should remain versioned x
. In the same commit operation where the specification becomes
incompatible, its revision should be set to <x+1>-pre
until the next production release.
Releases and updates to the <minor>
number in the library version should be synchronized with updates to the specification revision number.