101| 132 |
| Author | |
| Sponsor | |
| Created | |
| Status | | Status |
|---|
| colour | Blue |
|---|
| title | IN PROGRESS |
|---|
|
|
Motivation
...
- Is there rolling upgrade feature?
- How it implemented?
- How it tested?
- When it tested: Each PR? Weekly? Only on release?
- Network message format.
- Serdes implementation.
- How many earlier releases can be upgraded.
Is there rolling upgrade feature?Supported | How it implemented? | How it tested? | When it tested? | Network message format | Serdes implementation | How many earlier releases can be upgraded? |
|---|
| Apache Cassandra | Yes (1), (2) | Server-client compatibility works similar to Ignite Thin Client protocol. | Compatibility checked with the special test framework (3) At a first glance, there are no special source code checks to ensure compatibility in day by day coding | On release or by request | POJO | Custom serdes implementation. |
|
| Apache Kafka | Yes (4) | Message formats checked on PR reivew. At a first glance, there are no special source code checks to ensure compatibility in day by day coding. But, all machinery to code compatible implemented in code generation framework (5) | Compatibility checked with the special test framework ducktest (6) | On release or by request. Kafka doesn't provide public resources to run ducktests. Run done by contributors or by confluent employers on private hosts | POJO | Custom serdes implementation. | All |
| Yugabyte | Yes (7) | checked on review (see commit message section "Upgrade/Rollback safety") (8) |
|
| plain objects | Protobuf |
|
| YDB | Yes | Message formats checked on PR rivew - grpc+protobuf helps to maintain compatibility | Compatibility checked with the special test framework (9) | On request. | plain objects | Protobuf |
|
| Cockroach DB | Yes |
|
|
| plain objects | Protobuf |
|
| Hazelcast | Yes (12) |
|
|
|
|
|
|
Description
Rolling Upgrade assumes that cluster can consist of Ignite nodes of different versions.
So Ignite must provide backward compatibility on network level and ability to work in mixed topology.
Development time checks, tests must be added to provide protection of incorrect patches.
Ignite codebase must be reorganized in a way to clearly distinguish those parts that require compatibility and those who don't.
Let's define clearly, what backward compatibility for the network messages means:
...
- PDS
- partition data
- WAL records
- Metadata
- binary meta
- marshaller
- Communication SPI
- Discovery SPI
- Binary Marshaller
- Affinity.
- Management API
- argument
- results
- tasks (class names).
- ThinClient Protocol
Compatibility Matrix
| Component | Type | Number of releases |
|---|
| Ignite public API | backward | 1 |
| PDS | backward | all |
| WAL | backward | all |
| Metadata | backward | all |
| Thin Client | full | all |
| Communication SPI | full | 1 |
| Discovery SPI | full | 1 |
| Binary Marshaller | backward | all |
| Management API | backward | 1 |
| Affinity | full | all |
| JDBC | backward | 1 |
| ODBC | backward | 1 |
| Rest | backward | 1 |
| CDC | full | 1 |
Current Ignite codebase
- Is there any primitives, building blocks to provide compatibility?
- Difficulties for day by day coding.
- java serialzation
- anonymous class names based on declaration order
- Compatibility testing.
- explicit tests.
- ability to run tests with random node versions
- New feature implementation, enabling.
- patterns for implementing commons cases: new version of algorithmes, testing against new versions.
- Scope of compatibility:
- Currently any third-party module can register own ports (messages?) and must be able to track compatibility.
Implementation phases
Code
...
Cleanup
- remove
DirectByteBufferStreamImpl V1-V3, keep V4, only.
...
- remove all items from
IgniteFeatures and corresponding checks.
...
- remove all code and checks for GridContinuousProcessor#discoProtoVer
...
- TcpDiscoverySpi#setForceServerMode
...
- All old version of classes - keep only max from V2, V3, etc. versions. StartRequestV2 that belongs to internal communication.
Classes releated to thin client, jdbc, odbc interaction must stay.
...
- StartRequest must be deleted. Rename StartRequestV2 → StartRequest.
...
- CacheMetricsSnapshot must be deleted. Rename CacheMetricsSnapshotV2 → CacheMetricsSnapshot.
- remove MessageFactory.
- IgniteDataTransferObject
-
EXCHANGE_PROTOCOL_2_SINCE and related code
-
IgniteProductVersion.fromString - usages
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-27674 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
BinaryMarshaller modularization
- modularize BinaryMarshaller.
- create small jar for ignite thin client. As a separate module, not part of the core. Optional, helps to see if changes affect resialization.
- provide clear API for binary objects inside ignite-code and other modules. Finish IEP-119. Optional, helps to see if changes affect resialization.
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-24780 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
Communication SPI Compatibility
- Communication MessageWriter and MessageReader are aware of peers version, and then schema of a message.
- Distinguish serdes generation from POJO
- Guarantee that all messages use new serialization framework. Remove previous framework classes.
- Code checks, see Communication protocol#Codechecks
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-25881 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
Discovery SPI Compatibility
-
Serdes changes to provide compatibility? (current approach with JDK serialization provides some compatibility (13).
Is it enough for long-term compatibility support? -
Serdes changes to restrict classes that can be sent over SPI. - Guarantee that all messages use new serialization framework. Remove previous framework classes.
- Code checks, see Communication protocol#Codechecks
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-25883 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
Public API PR validation
- PR checks for
Messages ancestor change with the some warning, labels, etc. that can draw reviewer attention to the possible compatibility issues.
Management API
- Provide ability to change arg, result classes in compatible way.
- Possible approach is to reuse communication serdes framework.
- Other possibility is to migrate on BinaryObject as a arguments and results.
- PR checks for
Messages ancestor change with the some warning, labels, etc. that can draw reviewer attention to the possible compatibility issues.
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-27621 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
IgniteFeatures
- Write down clear rules to deal with the new features and not compatible enhancements.
- Support, if not, already this rules in IgniteFeatures framework.
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | issue = IGNITE-28424 |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|
Compatibility Matrix
- A way to declare one version as incompatible with another.
- A component to enforce a rule that only compatible versions can join one cluster.
- Only nodes with close versions (like 2.17 and 2.18, not 2.17 and 2.19) should be allowed to join cluster.
Testing
- ducktests to check upgrade procedure.
unit tests mode that start some nodes of previous version.
Development process changes
Any change in public API MUST be in the form of IEP.
Any change in public API MUST be voted by two(three?) committers.- Documentation with clear description of development rules for all subsystems required to be compatible.
- Each release should be started with compatibility code removal.MessageFactory
Alternative designs
- subsystem API versions (like in REST API)
- runtime component(IgniteProcessor, IgniteManager) upgrade with the dynamic class loading.
...
- https://www.datastax.com/learn/whats-new-for-cassandra-4/migrating-cassandra-4x
- https://docs.datastax.com/en/luna-cassandra/guides/upgrade/overview.html
- https://github.com/apache/cassandra-dtest/blob/trunk/upgrade_tests/README.md
- https://kafka.apache.org/documentation/#upgrade
- https://github.com/apache/kafka/blob/trunk/clients/src/main/resources/common/message/AlterPartitionResponse.json
- https://github.com/apache/kafka/blob/trunk/tests/kafkatest/tests/core/kraft_upgrade_test.py
- https://docs.yugabyte.com/preview/manage/upgrade-deployment/
- https://github.com/yugabyte/yugabyte-db/commit/e9ab17dea0d3b4f1673531c07404a290f9fbd8f2
- https://github.com/ydb-platform/ydb/blob/main/ydb/tests/functional/restarts/
- IEP-119 Binary infrastructure modularization
- PDS Compatibility Guide (WIP)
- https://hazelcast.com/products/rolling-upgrade/
- https://docs.oracle.com/en/java/javase/17/docs/specs/serialization/version.html#compatible-java-type-evolution
Tickets
| Jira |
|---|
| server | ASF JIRA |
|---|
| columnIds | issuekey,summary,issuetype,created,updated,duedate,assignee,reporter,priority,status,resolution |
|---|
| columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
|---|
| maximumIssues | 20 |
|---|
| jqlQuery | labels = IEP-132 and type != Epic |
|---|
| serverId | 5aa69414-a9e9-3523-82ec-879b028fb15b |
|---|
|