Was drafting up a VOTE thread and have one thing I want to add - anyone think 
of any major issues w/this I'm missing?

• All supported branches are *built on the oldest JDK they support*. Our 
support model is: build on single JDK, run on oldest up to current LTS

On Sat, Jun 7, 2025, at 10:53 AM, Josh McKenzie wrote:
> Any other thoughts on this? We think we're ready for a [VOTE] thread?
> 
> On Tue, Jun 3, 2025, at 2:07 PM, Josh McKenzie wrote:
>>> 1) As you said, in trunk, we would go with the latest language level 
>>> features and if we backported and these language features are not present 
>>> there because of older JDK, the patch would need to be rewritten to comply.
>> We already have plenty of cases where we have to write a patch for one 
>> branch, merge -s ours, then --amend in a different patch for the subsequent 
>> branch. I would expect this process (late-discovered multi-branch applying 
>> patches) would be lighter weight than that and far less frequent.
>> 
>> My intuition is that the number of patches that:
>>  1. Are bugfixes or non-invasive improvements we think are trunk only so 
>> leverage latest language level features, that
>>  2. are non-trivial in size or scope, and
>>  3. we later determine we need to backport to older branches
>> Is probably going to be vanishingly small. In most cases when working on a 
>> bug or improvement it's pretty clear where it needs to land day 1.
>> 
>> 
>> On Tue, Jun 3, 2025, at 11:36 AM, Štefan Miklošovič wrote:
>>> Hi Josh,
>>> 
>>> One observation, you wrote:
>>> 
>>> "Backports from trunk to older branches that utilize the latest language 
>>> level would need to be refactored to work on older branches."
>>> 
>>> This is interesting. There are two possibilities
>>> 
>>> 1) As you said, in trunk, we would go with the latest language level 
>>> features and if we backported and these language features are not present 
>>> there because of older JDK, the patch would need to be rewritten to comply.
>>> 
>>> 2) The patch would be written in such a way in trunk that it would use 
>>> language features which would be present in older branches already so a 
>>> backport would be easier in this regard as the code as such would not need 
>>> to be reworked if it does not differ functionally a lot otherwise.
>>> 
>>> It seems to me you have already identified what might happen in your older 
>>> emails here:
>>> 
>>> "Our risk would be patches going to trunk targeting new language features 
>>> we then found out we needed to back-port would require some massaging to be 
>>> compatible with older branches. I suspect that'll be a rare edge-case so 
>>> seems ok?"
>>> 
>>> Totally agree.
>>> 
>>> I do not know what approach I would use by default but thinking about it 
>>> more I would probably do 2) just for the sake of not rewriting it in older 
>>> branches. A patch might be complicated already enough and keeping in mind 
>>> to use newest features in trunk and not using them in older branches is 
>>> just too much of a mental jugglery to handle for me.
>>> 
>>> I guess that the discussion when the usage of newest language features 
>>> would be recommended and justified would follow. I do not think that 
>>> blindly using the latest greatest _everywhere_ is always good when 
>>> maintainers need to take care of it for years in the light of backports and 
>>> bug fixes etc.
>>> 
>>> It probably also depends on how complex the patch is and if using the 
>>> newest language level would yield some considerable performance gains etc.
>>> 
>>> Regards
>>> 
>>> On Tue, Jun 3, 2025 at 4:38 PM Josh McKenzie <jmcken...@apache.org> wrote:
>>>> __
>>>> I was attempting to convey the language level support for a given branch 
>>>> at any snapshot in time; my reading of Doug's email was for something that 
>>>> shouldn't be a problem with this new paradigm (since we would be doing 
>>>> bugfixes targeting oldest then merge up, and new improvements and features 
>>>> should be going trunk only).
>>>> 
>>>> Flowing through time, here's what a new release looks like at time of 
>>>> release. I'll format it as:
>>>> *C* Version / JDK Build Version / JDK Run Version(s) / Language Level*
>>>> 
>>>> For our first release:
>>>>  • C* 1.0 / 11 / 11 / 11
>>>> Then we release the next C* version; for sake of illustration let's assume 
>>>> a new JDK LTS 12:
>>>>  • C* 2.0 / 12 / 12 / 12
>>>>  • C* 1.0 / 11 / 11+12 / 11
>>>> Notice: we added the ability to *run* C* 1.0 on JDK12 and otherwise didn't 
>>>> modify the properties of the branch re: JDK's.
>>>> 
>>>> Then our 3rd release of C*, same assumption w/JDK LTS 13 support added:
>>>>  • C* 3.0 / 13 / 13 / 13
>>>>  • C* 2.0 / 12 / 12+13 / 12
>>>>  • C* 1.0 / 11 / 11+12+13 / 11
>>>> The ability to run on the new JDK13 is backported to all supported 
>>>> branches. Otherwise: no JDK-related changes.
>>>> 
>>>> And upon our 4th release, we drop support for C*1.0:
>>>>  • C* 4.0 / 14 / 14 / 14
>>>>  • C* 3.0 / 13 / 13+14 / 13
>>>>  • C* 2.0 / 12 / 12+13+14 / 12
>>>> The properties this gives us:
>>>>  1. At any given time as a project we have a JDK version that shares 
>>>> support between 2 branches.
>>>>  2. Any supported version of C* has a JDK that it can be run on that 
>>>> allows upgrade to any other supported version of C* on that same JDK.
>>>>  3. Operators retain the ability to verify a new JDK independently of the 
>>>> new C* version (i.e. bump C* 2.0 from JDK12 to JDK13, then move from C* 
>>>> 2.0 on JDK13 to C* 3.0 on JDK13).
>>>>  4. We are able to aggressively adopt new language level features for 
>>>> improvements and new features on trunk
>>>>  5. Bugfixes that apply to older GA branches will need to target maximally 
>>>> the language level of the oldest branch to which they apply
>>>>  6. Backports from trunk to older branches that utilize the latest 
>>>> language level would need to be refactored to work on older branches
>>>> Does this exercise help clarify?
>>>> 
>>>> On Tue, Jun 3, 2025, at 8:22 AM, Mick Semb Wever wrote:
>>>>> What's difficult for me to grok here is you're treating each branch as 
>>>>> static, while the discussion has already evolved to branches evolving 
>>>>> over time (with jdks being back-ported, etc).  Might be more helpful to 
>>>>> explain states and events at different points of branch lifecycles… 
>>>>> 
>>>>> On Tue, 3 Jun 2025 at 00:16, Josh McKenzie <jmcken...@apache.org> wrote:
>>>>>> __
>>>>>> I originally had "everyone supports highest language level whee" which 
>>>>>> of course would fail to build on older branches.
>>>>>> 
>>>>>> So this new paradigm would give us the following branch:language level 
>>>>>> support (assuming JDK bump on each release which also won't always 
>>>>>> happen):
>>>>>> - trunk: latest
>>>>>> - trunk-1: latest lang - 1
>>>>>> - trunk-2: latest lang - 2
>>>>>> 
>>>>>> So while trunk-1 and trunk-2 would both *support* the newest JDK 
>>>>>> (wherever possible) for runtime, they wouldn't be switched to the new 
>>>>>> language level. That'd leave us able to use the newest language features 
>>>>>> on trunk much more rapidly while *effectively snapshotting the supported 
>>>>>> language on older branches to the lowest JDK they support* (which, when 
>>>>>> they're last in line and about to fall off, is the JDK that was newest 
>>>>>> at the time they came about).
>>>>>> 
>>>>>> Our risk would be patches going to trunk targeting new language features 
>>>>>> we then found out we needed to back-port would require some massaging to 
>>>>>> be compatible with older branches. I suspect that'll be a rare edge-case 
>>>>>> so seems ok?
>>>>>> 
>>>>>> Unless I'm completely missing something. I was the one who originally 
>>>>>> just wanted to "latest JDK All The Things" for a hot minute there. =/
>>>>>> 
>>>>>> On Mon, Jun 2, 2025, at 9:40 AM, Doug Rohrer wrote:
>>>>>>> Only thing I’d suggest changing here is “Trunk targets the language 
>>>>>>> level of that JDK” shouldn’t happen until after we’ve confirmed the 
>>>>>>> back port of the new JDK LTS changes to previous versions - otherwise, 
>>>>>>> you have folks starting to use new language features and then have to 
>>>>>>> rip them all out when you find that some previous supported Cassandra 
>>>>>>> release can’t use that JDK.
>>>>>>> 
>>>>>>> Doug
>>>>>>> 
>>>>>>>> On May 27, 2025, at 10:37 AM, Josh McKenzie <jmcken...@apache.org> 
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> revised snapshot of the state of conversation here:
>>>>>>>> 
>>>>>>>> *[New LTS JDK Adoption]*
>>>>>>>>  • Trunk supports 1 JDK at a time
>>>>>>>>  • After a branch is cut for a release, we push to get trunk to 
>>>>>>>> support latest LTS JDK version available at that time
>>>>>>>>  • Trunk targets the language level of that JDK
>>>>>>>>  • CI on trunk is that single JDK only
>>>>>>>>  • We merge new JDK LTS support to all supported branches at the same 
>>>>>>>> time as trunk
>>>>>>>>    • In the very rare case a feature would have to be removed due to 
>>>>>>>> JDK change (think UDF's scripting engine), we instead keep the maximum 
>>>>>>>> allowable JDK for that feature supported on trunk and subsequent 
>>>>>>>> releases. We then drop that JDK across all branches once the oldest C* 
>>>>>>>> w/that feature ages out of support.
>>>>>>>>  • Otherwise, we don't need to worry about dropping JDK support as 
>>>>>>>> that will happen naturally w/the dropping of support for a branch. 
>>>>>>>> Branches will slowly gain JDK support w/each subsequent trunk-based 
>>>>>>>> LTS integration.
>>>>>>>> *[Branch JDK Support]*
>>>>>>>>  • N-2: JDK, JDK-1, JDK-2
>>>>>>>>  • N-1: JDK, JDK-1
>>>>>>>>  • N: JDK
>>>>>>>> *[CI, JDK's, Upgrades]*
>>>>>>>>  • CI:
>>>>>>>>    • For each branch we run per-commit CI for the latest JDK they 
>>>>>>>> support
>>>>>>>>    • *TODO: *Periodically we run all CI pipelines for older JDK's 
>>>>>>>> per-branch (cadence TBD)
>>>>>>>>    • *TODO: *We add basic perf testing across all GA branches with 
>>>>>>>> reference workloads (easy-cass-stress workloads? 
>>>>>>>> <https://github.com/apache/cassandra-easy-stress/tree/main/src/main/kotlin/com/rustyrazorblade/easycassstress/workloads>)
>>>>>>>>  • Upgrades
>>>>>>>>    • N-2 -> N-1: tested on JDK and JDK-1
>>>>>>>>    • N-2 -> N: tested on JDK
>>>>>>>>    • N-1 -> N: tested on JDK
>>>>>>>> 
>>>>>>>> -----------------------
>>>>>>>> The above has 2 non-trivial CI orchestration investments:
>>>>>>>>  1. Running all CI across all supported JDK on a cadence
>>>>>>>>  2. Adding some basic perf smoke tests
>>>>>>>> Both seem reasonable to me.
>>>>>>>> 
>>>>>>>> On Fri, May 23, 2025, at 7:39 AM, Mick Semb Wever wrote:
>>>>>>>>>  
>>>>>>>>>    .
>>>>>>>>>   
>>>>>>>>>   
>>>>>>>>>>> For the rare edge case where we have to stop supporting something 
>>>>>>>>>>> entirely because it's incompatible with a JDK release (has this 
>>>>>>>>>>> happened more than the 1 time?) - I think a reasonable fallback is 
>>>>>>>>>>> to just not backport new JDK support and consider carrying forward 
>>>>>>>>>>> the older JDK support until the release w/the feature in it is 
>>>>>>>>>>> EoL'ed. That'd allow us to continue to run in-jvm upgrade dtests 
>>>>>>>>>>> between the versions on the older JDK.
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> This.
>>>>>>>>>> I think the idea of adding new major JDKs to release branches for a 
>>>>>>>>>> number of reasons, in theory at least.  …
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> I *like* the idea … :) 
>>>>>>>> 
>>>>>> 
>>>> 
>> 
> 

Reply via email to