> The downside is that we will need to maintain a copy of Cassandra's 
> Config.java class in sidecar and keep this in sync with Cassandra's everytime 
> a new major is released, but we would have to update the schema anyway even 
> if using a schema spec language.
Rather than copying, can we automate pulling this file down from each supported 
C* version as part of the build process? We need to unwind a bunch of code 
duplication in the ecosystem already.

Ultimately, I'd like to see Config and some shared utility classes (CommitLog 
reading, SSTable reading/writing, etc) end up in a shared artifact which would 
make a lot of this kind of stuff (cross-ecosystem understanding on formats, 
versioning, and re-use) a *lot* simpler and cleaner for all of us. Never-mind 
versioning on Hints / CommitLog / MessagingService and the embedding of MS 
versions inside CommitLog files that's given rise to the compounding complexity 
and confusion around storage_compatibility_mode setups.

On Wed, Mar 18, 2026, at 1:30 PM, Paulo Motta wrote:
> Thanks for your input, Chris! See answers below.
> 
> > *Do you have any thoughts on what the schema may look like?*
> 
> My idea is to use Cassandra's own Java validation mechanism to check the 
> updated setting against the schema, for example:
> 
> ```
> YamlConfigurationLoader loader = new YamlConfigurationLoader();
> Map<String, Object> settings = Map.of("setting_name", value);
> Config config = loader.fromMap(settings, Config.class); // throws 
> ConfigurationException on invalid
> ```
> 
> The downside is that we will need to maintain a copy of Cassandra's 
> Config.java class in sidecar and keep this in sync with Cassandra's everytime 
> a new major is released, but we would have to update the schema anyway even 
> if using a schema spec language.
> 
> > *Are there any plans to support externally provided schemas?*
> 
> I haven't thought about externally provided schemas, since this doesn't 
> really fit the schema model I'm planning to use. I have added a parameter 
> `skipValidation` to bypass schema validation for lesser known or 
> not-yet-supported settings.
> 
> > *What is the scope of a configuration?*
> 
> The scope of a configuration is all instances managed by a single sidecar 
> instance, which means they're collocated in the same physical machine. The 
> scope of the CEP is to provide only instance-based configuration, wider-scope 
> configuration should be provided by an external configuration manager or 
> orchestrator.
> 
> > *What happens when someone logs into a node and changes a configuration
> file manually?*
> 
> This scenario will not be possible if sidecar APIs are used to start the 
> node, because the node startup endpoint will refresh the disk configuration 
> with the base template + provider overlay prior to starting the node 
> overwriting any manual changes and ensuring only the configuration modified 
> by the API will be loaded.
> 
> I hope I have provided answers to your questions, please let me know if 
> anything is not clear.
> 
> On Tue, 17 Mar 2026 at 16:20 Christopher Bradford <[email protected]> 
> wrote:
>> Thank you for sharing Paulo, this is awesome! It's interesting to look at 
>> the myriad of ways users implement configuration for cassandra (manual, 
>> automation templates, etc). I'm very interested in the version specific 
>> schema validation for configuration, configuration drift and uniformity. 
>> Some questions:
>> 
>> *Do you have any thoughts on what this may look like?*
>> For example OpenAPI spec, JSON Schema etc? DataStax maintained a set of 
>> configuration definitions 
>> <https://github.com/datastax/cass-config-definitions> and templates for a 
>> time. It felt like there was a significant barrier to entry around updating 
>> them. These were leveraged by the cass-config-builder 
>> <https://github.com/datastax/cass-config-builder> and K8ssandra, but that 
>> has been deprecated in favor of a different approach today.
>> 
>> *Are there any plans to support externally provided schemas?*
>> Can I provide my own schema file and validation parameters and expect it to 
>> work with Sidecar? We've encountered a few examples of hidden parameters in 
>> cassandra.yaml (depending on the flavor of C* being run) that would have 
>> tripped up strict validation.
>> 
>> *What is the scope of a configuration?*
>> It's fairly common to provide a unique configuration per DC based on 
>> hardware, workload, etc (not to mention any changes to rackdc.properties). 
>> As a user of this system are we pushing overlays (and or configuration HTTP 
>> requests) to the sidecar running on each node, each DC, per cluster with 
>> flags? Looking at the current design it appears as though configuration is 
>> handled per node.
>> 
>> *What happens when someone logs into a node and changes a configuration file 
>> manually?*
>> I wonder if it would be helpful to provide an endpoint (possibly enriching 
>> an existing one) to report when the configuration files on disk differ from 
>> the values materialized by sidecar. I remember generating a number of 
>> reports for users highlighting the inconsistency in configuration between 
>> nodes. Ideally Sidecar resolves the possibility of this happening, but a 
>> user with ssh and a bit of determination will always find a way. I could see 
>> this being leveraged for determining which nodes may need a restart to pick 
>> up configuration changes (assuming lack of hot-reloading support for 
>> specific fields) as well as running reports for misconfigured instances.
>> 
>> I see there may be a little overlap with Josh's questions, my apologies for 
>> any duplication. Again, thank you for the CEP.
>> 
>> Cheers,
>> ~Chris
>> Christopher Bradford
>> 
>> 
>> 
>> On Tue, Mar 17, 2026 at 3:04 PM Josh McKenzie <[email protected]> wrote:
>>> __
>>> Fantastic work here Paulo et al. Just finished first read through and have 
>>> some questions and observations.
>>> 
>>>> Operators can update the base template for all instances by modifying 
>>>> sidecar.yaml and restarting Sidecar, while individual instance 
>>>> customizations remain preserved in their respective overlays.
>>> Could we allow hot reloading via API endpoint trigger rather than requiring 
>>> bouncing the sidecar?
>>> 
>>>> It then validates this result against a version-aware configuration schema 
>>>> maintained per Cassandra major version to ensure that all `cassandraYaml` 
>>>> keys being updated are recognized for that version. Updates of unknown 
>>>> keys are rejected to prevent Cassandra startup failures.
>>> Am I reading this correctly that this design would be a single 
>>> cassandra.yaml per MAJOR Cassandra version? If we introduce new Config.java 
>>> + cassandra.yaml values in a patch release, won't that run afoul of this 
>>> design?
>>> 
>>> Q: I didn't see anything about polling an external config provider for 
>>> updates to configuration; config on a sidecar could end up stale relative 
>>> to the config stored in an external system if not restarted. Is that 
>>> something we're going to leave for future work or leave in the hands of 
>>> operators?
>>> 
>>> Q: If a new config param is added in a patch version and we don't have an 
>>> updated base cassandra.yaml, we'd be moving from "cassandra.yaml w/default 
>>> overrides what's in Config.java" to "we use what's in Config.java". *In 
>>> theory* we'd always keep our values in cassandra.yaml in sync 
>>> w/Config.java, but this change to the sidecar base .yaml as authoritative 
>>> means we'd need a new mechanism (human toil, automated generation, ?) to 
>>> keep the base sidecar C* .yaml config in sync w/whatever MINOR we're 
>>> running I think.
>>> 
>>> Q: What happens if someone mutates parameters via the REST API that are Bad 
>>> News? Thinking things like num_tokens, partitioner, cluster_name, 
>>> initial_token, etc. Maybe we have a built-in blocklist for .yaml values you 
>>> can't mutate remotely and 422 on them, or provide a base list of 
>>> blocklisted .yaml params disallowed in overlay PATCH to prevent these kinds 
>>> of issues and make them more "durable" in the base .yaml config file? 
>>> There's a tension here between wanting to be able to setup the normal base 
>>> config via API and wanting to prevent disastrous changes via the API.
>>> 
>>> Q: Which leads to the question: how do operators push out the base .yaml 
>>> config across a fleet? We have the ConfigurationProvider abstraction for 
>>> overlays, but how do operators get the base template out there? Especially 
>>> since you can / will have a different base template per instance on the 
>>> node, this seems like a gap where operators would still have a lot of toil. 
>>> Maybe some kind of "pull the base cassandra.yaml from the local node as 
>>> base template if none is provided" so the default is to defer to what's in 
>>> the local node, lock it in, then add overlays? I think a mechanism like 
>>> this could help w/the MINOR version .yaml drift as well, if we had a 
>>> mechanism to defer to the node local base .yaml file and then overlay 
>>> things on top of it.
>>> 
>>> And lastly - apologies if I misread or misunderstood anything in the CEP. 
>>> If nothing else it'll give us insight into areas to flesh out verbiage for 
>>> clarity.
>>> 
>>> On Tue, Mar 17, 2026, at 12:32 PM, Paulo Motta wrote:
>>>> Hi everyone,
>>>> 
>>>> I'd like to propose CEP-62: Cassandra Configuration Management via Sidecar 
>>>> for discussion by the community.
>>>> 
>>>> CASSSIDECAR-266[1] introduced Cassandra process lifecycle management 
>>>> capabilities to Sidecar, giving operators the ability to start and stop 
>>>> Cassandra instances programmatically. However, Sidecar currently has no 
>>>> way to manipulate the configuration files that those instances consume at 
>>>> startup.
>>>> 
>>>> Many Cassandra settings (memtable configuration, SSTable settings, 
>>>> storage_compatibility_mode) cannot be modified at runtime via JMX/CQL and 
>>>> must be set in cassandra.yaml or JVM options files, requiring a restart to 
>>>> take effect. Managing these files manually or through custom tooling is 
>>>> cumbersome and lacks a stable API.
>>>> 
>>>> This CEP extends Sidecar's lifecycle management by adding configuration 
>>>> management capabilities for persisted configuration artifacts. It 
>>>> introduces a REST API for reading and updating cassandra.yaml and JVM 
>>>> options, a pluggable ConfigurationProvider abstraction for integration 
>>>> with centralized configuration systems (etcd, Consul, or custom backends), 
>>>> and version-aware validation to prevent startup failures.
>>>> 
>>>> This CEP also serves as a prerequisite for future Cassandra upgrades via 
>>>> Sidecar. For example, upgrading from Cassandra 4 to Cassandra 5 requires 
>>>> updating storage_compatibility_mode in cassandra.yaml. The configuration 
>>>> management capabilities introduced here will enable Sidecar to orchestrate 
>>>> such upgrades by updating configuration artifacts alongside binary version 
>>>> changes.
>>>> 
>>>> The CEP is linked here: 
>>>> https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-62%3A+Cassandra+Configuration+Management+via+Sidecar
>>>> 
>>>> Looking forward to your feedback!
>>>> 
>>>> Thanks,
>>>> 
>>>> Paulo
>>>> 
>>>> [1] - https://issues.apache.org/jira/browse/CASSSIDECAR-266
>>> 

Reply via email to