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

Reply via email to