This is an automated email from the ASF dual-hosted git repository. marcuse pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra.git
commit 8404d2fd5cbda4ba5210522ee612ac2fd169278e Author: Marcus Eriksson <marc...@apache.org> AuthorDate: Fri Apr 4 08:23:32 2025 +0200 Improve performance when getting writePlacementAllSettled from ClusterMetadata in large cluster with many range movements Patch by marcuse; reviewed by Sam Tunnicliffe for CASSANDRA-20526 --- CHANGES.txt | 1 + .../org/apache/cassandra/tcm/ClusterMetadata.java | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index c4676baf07..b6c8599ab6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.1 + * Improve performance when getting writePlacementsAllSettled from ClusterMetadata (CASSANDRA-20526) * Add nodetool command to dump the contents of the system_views.{cluster_metadata_log, cluster_metadata_directory} tables (CASSANDRA-20525) * Fix TreeMap race in CollectionVirtualTableAdapter causing us to lose rows in the virtual table (CASSANDRA-20524) * Improve metadata log catch up with inter-DC mutation forwarding (CASSANDRA-20523) diff --git a/src/java/org/apache/cassandra/tcm/ClusterMetadata.java b/src/java/org/apache/cassandra/tcm/ClusterMetadata.java index 64eadc76dd..607978806e 100644 --- a/src/java/org/apache/cassandra/tcm/ClusterMetadata.java +++ b/src/java/org/apache/cassandra/tcm/ClusterMetadata.java @@ -104,6 +104,7 @@ public class ClusterMetadata private EndpointsForRange fullCMSReplicas; private Set<InetAddressAndPort> fullCMSEndpoints; private Set<NodeId> fullCMSIds; + private DataPlacements writePlacementAllSettled; public ClusterMetadata(IPartitioner partitioner) { @@ -282,15 +283,19 @@ public class ClusterMetadata public DataPlacement writePlacementAllSettled(KeyspaceMetadata ksm) { - ClusterMetadata metadata = this; - Iterator<MultiStepOperation<?>> iter = metadata.inProgressSequences.iterator(); - while (iter.hasNext()) + if (writePlacementAllSettled == null) { - Transformation.Result result = iter.next().applyTo(metadata); - assert result.isSuccess(); - metadata = result.success().metadata; + ClusterMetadata metadata = this; + Iterator<MultiStepOperation<?>> iter = metadata.inProgressSequences.iterator(); + while (iter.hasNext()) + { + Transformation.Result result = iter.next().applyTo(metadata); + assert result.isSuccess(); + metadata = result.success().metadata; + } + writePlacementAllSettled = metadata.placements; } - return metadata.placements.get(ksm.params.replication); + return writePlacementAllSettled.get(ksm.params.replication); } // TODO Remove this as it isn't really an equivalent to the previous concept of pending ranges --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org