Hi Dev@ List—

TL;DR:
I’d love it if we could modify the C* release cycle to include an additional 
“experimental” release branch that straddles the current major releases that 
includes somewhat “untested” or “risky” commits that normally would only go 
into the next major release. Releases based from this branch wouldn’t contain 
any features that require breaking changes or are considered highly “untested” 
or “risky” but would include the many other commits that today are considered 
too unsafe to put into the previous stable branch. This will allow us to run 
code closer to the current stable release branch when we are unable to move 
fully to the new major release branch. Also, during the release cycle of the 
next major release branch the project can get feedback from a subset of the 
total changes that will ultimately make it into that final new major release. 
Also — i’m aware that any additional branches/releases will add additional work 
for any developer that works on C*. It would be great if we could strike a 
balance that hopefully doesn’t add significant additional merging/rebasing/work 
for the team...

The Longer Story:
Last week I had a conversation with a few people regarding a proposed change to 
the current C* release schedule. 

Other than an attempt to make Jonathan and Sylvian’s lives more difficult, it 
would be ideal if we could better sync our internal release schedule with more 
recent Cassandra releases. The current cycle has resulted in currently “active” 
branches for 1.2, 2.0, 2.1, and +3.0. Official stable releases are from 2.0, 
beta’s/RC’s from 2.1, and there is the potential for another out-of-band 
1.2/previous stable release build. We would love to always run the current 
“stable” release in production but generally/historically it takes time and a 
few minor releases to the current “major” branch stable to get to a state where 
we can accept for use in production. Additionally, as major releases are 
currently used to make “breaking” changes that require a more involved and 
risky upgrade process, it’s a much bigger deal to deploy a new major into 
production than a release without breaking changes. (upgrade-sstables for 
example is required when upgrading to a new major release branch. this 
unavoidable step adds lots of temporary load to the cluster and means 
deploying/upgrading to major releases tends to be a bit more risky than between 
minor releases and a more involved/long running process). This means even 
though there are months worth of stable hard work/awesome improvements in the 
current “stable” major release branch (today this is 2.0), we end up with an 
unavoidable and undesired lag in getting more recent C* changes pushed into 
production. This means we are unable to provide feedback on newer changes 
sooner to the community, stuck and unable to get even a subset of the awesome 
changes as we can’t yet take ALL the changes from the new major release branch, 
and finally if we find an issue in production or want to work on new 
functionality it would be ideal if we can write it against a release that is 
closer to the next major release while also providing us a reasonable way to 
get the feature deployed internally on a branch we are running.

Currently, the project generally tends to include all risky/breaking/more 
“feature” oriented tickets only into the next major release + trunk. However, 
there is a subset of these changes that are “somewhat” more risky changes but 
pose little/less/no risk the commit with introduce a regression outside of the 
scope of the patch/component. Additionally, any changes that  depend on other 
higher risk/breaking commits/changes wouldn’t be candidates for this proposed 
release branch. In a perfect world we would love to target a new “interim” or 
“experimental” train of releases which is loosely the most stable current 
release train but also includes a subset of changes from the next major train. 
(While we were discussing we thought about possible parallels to the concept of 
a LTS (Long Term Support) release cycle and what some people have dubbed the 
“tick-tock” release cycle.) This might look something like 1.2 branch + all 
moderately-to-“less”-risky/non-breaking commits which currently would only end 
up in a 2.0 or 2.1 release. (Off the top of my head, immediately bad candidates 
for this build would be for changes to components such as gossip, streaming, or 
any patch that changes the storage format etc). This would enable the project 
to provide builds for more active/risk-adverse users looking for a reasonable 
way to get more features and changes into production than with today’s release 
cycle. Additionally, this would hopefully facilitate/increase quicker feedback 
to the project on a subset of the new major release branch and any bugs found 
could be reported against an actual reproducible release instead of some custom 
build with a given number of patches from Jira or git SHAs applied/backported.

As it will always take both time and n releases to reach a stable minor release 
for a new major train; users could deploy this new release to get a subset of 
new features and changes with higher risk than would otherwise go into a minor 
release of the previous stable release train. If internally we wanted to add a 
new feature we could target this release while testing internally, and 
hopefully given the smaller delta between this “interim/experimental” to make 
it easier to re-base patches into the next major release train. This would help 
us avoid what today has unfortunately become a unavoidable large lag in getting 
new C* builds into production as while we attempt to sync our internal releases 
with a internally/or community QA’ed/accepted build/release of the current 
“stable” build/branch (currently this is 2.0).

To accomplish this, the commit workflow would unfortunately need change where 
an additional process is added to determine “eligibility” or “appropriateness” 
of a given commit to additionally also be committed to the “experimental” build 
branch (maybe it’s as simple as leaving it up to the reviewer + author to 
determine the risk factor and difficulty in merging the change back into the 
“experimental” build?). If it is agreed the commit/change/patch is a good 
candidate for the “experimental” branch, in addition to committing the patch to 
the current major release branch, the commit would also be merged into the new 
“experimental” release. If commits make it into the “experimental” branch 
frequently, I would expect/hope merging patches into the “experimental” build 
would be relatively easy as the “experimental” branch should also have most of 
the changes from the major release branch sans those considered highly risky or 
breaking. Additionally, if internally we want to work on a new feature and test 
internally before submitting a patch, we could target our code against the 
“experimental” branch, allowing us to test our changes in production without 
forking C* internally, writing our code against more recent “modern” changes, 
and then hopefully getting that work back to the community.


Hope this was clear enough and accurately summarizes the conversation a few of 
us had! Looking forward to everyone’s feedback and comments.

best,
kjellman

Reply via email to