Skip to content

Commit

Permalink
Update snitch/location config selection
Browse files Browse the repository at this point in the history
CASSANDA-19488 deprecates IEndpointSnitch and replaces it with
InitialLocationProvider and NodeProximity classes. In Cassandra, the
default yaml config retains the endpoint_snitch setting, whereas the
alternative cassandra_latest yaml specifies the new options. CCM injects
PropertyFileSnitch into config for multi datacenter clusters, but this
is problematic as the old and new config options are mutually exclusive.

This patch injects both the old and new settings into config when the
cluster is populated, then removes whichever one was not present in the
original yaml once it has been loaded. This allows dtests to run with
both the legacy and latest configs and exercises both code paths.
  • Loading branch information
beobal committed Dec 17, 2024
1 parent cc8cb98 commit cda502c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 0 deletions.
5 changes: 5 additions & 0 deletions ccmlib/cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,12 @@ def populate(self, nodes, debug=False, tokens=None, use_vnodes=None, ipprefix='1
self.use_vnodes = use_vnodes

if isinstance(nodes, list):
# We set both the legacy and modern config options here, although they are mutually exclusive. When we
# actually finalise the config for nodes in the cluster we select which one to keep based on the supplied
# yaml file. One of the two keys must be present in the yaml, so we retain whichever that is.
self.set_configuration_options(values={'endpoint_snitch': 'org.apache.cassandra.locator.PropertyFileSnitch'})
self.set_configuration_options(values={'initial_location_provider': 'org.apache.cassandra.locator.TopologyFileLocationProvider'})

node_count = 0
i = 0
for c in nodes:
Expand Down
9 changes: 9 additions & 0 deletions ccmlib/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -1760,12 +1760,21 @@ def _update_yaml(self):
if self.cluster.partitioner:
data['partitioner'] = self.cluster.partitioner


# Get a map of combined cluster and node configuration with the node
# configuration taking precedence.
full_options = common.merge_configuration(
self.cluster._config_options,
self.__config_options, delete_empty=False)

if 'initial_location_provider' in data:
common.debug("yaml contained initial_location_provider, removing endpoint_snitch from merged config")
full_options.pop('endpoint_snitch', None)
elif 'endpoint_snitch' in data:
common.debug("yaml contained endpoint_snitch, removing initial_location_provider from merged config")
full_options.pop('initial_location_provider', None)
full_options.pop('node_proximity', None)

# Merge options with original yaml data.
data = common.merge_configuration(data, full_options)

Expand Down

0 comments on commit cda502c

Please sign in to comment.