blob: d0426f506fbe8192cd135cd2e729c09656132afc [file] [log] [blame] [view]
Thrift
======
Aurora uses [Apache Thrift](https://thrift.apache.org/) for representing structured data in
client/server RPC protocol as well as for internal data storage. While Thrift is capable of
correctly handling additions and renames of the existing members, field removals must be done
carefully to ensure backwards compatibility and provide predictable deprecation cycle. This
document describes general guidelines for making Thrift schema changes to the existing fields in
[api.thrift](../../api/src/main/thrift/org/apache/aurora/gen/api.thrift).
It is highly recommended to go through the
[Thrift: The Missing Guide](http://diwakergupta.github.io/thrift-missing-guide/) first to refresh on
basic Thrift schema concepts.
Checklist
---------
Every existing Thrift schema modification is unique in its requirements and must be analyzed
carefully to identify its scope and expected consequences. The following checklist may help in that
analysis:
* Is this a new field/struct? If yes, go ahead
* Is this a pure field/struct rename without any type/structure change? If yes, go ahead and rename
* Anything else, read further to make sure your change is properly planned
Deprecation cycle
-----------------
Any time a breaking change (e.g.: field replacement or removal) is required, the following cycle
must be followed:
### vCurrent
Change is applied in a way that does not break scheduler/client with this version to
communicate with scheduler/client from vCurrent-1.
* Do not remove or rename the old field
* Add a new field as an eventual replacement of the old one and implement a dual read/write
anywhere the old field is used. If a thrift struct is mapped in the DB store make sure both columns
are marked as `NOT NULL`
* Check [storage.thrift](../../api/src/main/thrift/org/apache/aurora/gen/storage.thrift) to see if
the affected struct is stored in Aurora scheduler storage. If so, it's almost certainly also
necessary to perform a [DB migration](db-migration.md).
* Add a deprecation jira ticket into the vCurrent+1 release candidate
* Add a TODO for the deprecated field mentioning the jira ticket
### vCurrent+1
Finalize the change by removing the deprecated fields from the Thrift schema.
* Drop any dual read/write routines added in the previous version
* Remove thrift backfilling in scheduler
* Remove the deprecated Thrift field
Testing
-------
It's always advisable to test your changes in the local vagrant environment to build more
confidence that you change is backwards compatible. It's easy to simulate different
client/scheduler versions by playing with `aurorabuild` command. See [this document](../getting-started/vagrant.md)
for more.