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