You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by pa...@apache.org on 2017/12/26 12:53:11 UTC

[3/5] cassandra git commit: Avoid invalidating disk boundaries unnecessarily

Avoid invalidating disk boundaries unnecessarily

Patch by Paulo Motta; Reviewed by Marcus Eriksson for CASSANDRA-14083


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9337ca31
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9337ca31
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9337ca31

Branch: refs/heads/trunk
Commit: 9337ca316a24a2a08f3c19cec2170ca1db80976b
Parents: e208a6a
Author: Paulo Motta <pa...@gmail.com>
Authored: Fri Dec 1 03:37:47 2017 +1100
Committer: Paulo Motta <pa...@apache.org>
Committed: Tue Dec 26 23:19:11 2017 +1100

----------------------------------------------------------------------
 CHANGES.txt                                              |  1 +
 .../org/apache/cassandra/db/DiskBoundaryManager.java     |  2 ++
 src/java/org/apache/cassandra/db/Keyspace.java           | 10 ++++++++--
 .../org/apache/cassandra/db/DiskBoundaryManagerTest.java | 11 +++++++----
 4 files changed, 18 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/9337ca31/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 8a6b61a..7ac528c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.11.2
+ * Avoid invalidating disk boundaries unnecessarily (CASSANDRA-14083)
  * Avoid exposing compaction strategy index externally (CASSANDRA-14082)
  * Prevent continuous schema exchange between 3.0 and 3.11 nodes (CASSANDRA-14109)
  * Fix imbalanced disks when replacing node with same address with JBOD (CASSANDRA-14084)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9337ca31/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DiskBoundaryManager.java b/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
index ad6a67e..03cbf7b 100644
--- a/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
+++ b/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
@@ -31,6 +31,7 @@ import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Splitter;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -78,6 +79,7 @@ public class DiskBoundaryManager
             if (StorageService.instance.isBootstrapMode()
                 && !StorageService.isReplacingSameAddress()) // When replacing same address, the node marks itself as UN locally
             {
+                PendingRangeCalculatorService.instance.blockUntilFinished();
                 localRanges = tmd.getPendingRanges(cfs.keyspace.getName(), FBUtilities.getBroadcastAddress());
             }
             else

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9337ca31/src/java/org/apache/cassandra/db/Keyspace.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java
index 01fd451..5e39823 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -46,6 +46,7 @@ import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.metrics.KeyspaceMetrics;
 import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.ReplicationParams;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.*;
@@ -82,6 +83,7 @@ public class Keyspace
     private final ConcurrentMap<UUID, ColumnFamilyStore> columnFamilyStores = new ConcurrentHashMap<>();
     private volatile AbstractReplicationStrategy replicationStrategy;
     public final ViewManager viewManager;
+    private volatile ReplicationParams replicationParams;
 
     public static final Function<String,Keyspace> keyspaceTransformer = new Function<String, Keyspace>()
     {
@@ -344,8 +346,12 @@ public class Keyspace
                                                                                     StorageService.instance.getTokenMetadata(),
                                                                                     DatabaseDescriptor.getEndpointSnitch(),
                                                                                     ksm.params.replication.options);
-        logger.debug("New replication strategy instance - invalidating disk boundary cache");
-        columnFamilyStores.values().forEach(ColumnFamilyStore::invalidateDiskBoundaries);
+        if (!ksm.params.replication.equals(replicationParams))
+        {
+            logger.debug("New replication settings for keyspace {} - invalidating disk boundary caches", ksm.name);
+            columnFamilyStores.values().forEach(ColumnFamilyStore::invalidateDiskBoundaries);
+        }
+        replicationParams = ksm.params.replication;
     }
 
     // best invoked on the compaction mananger.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/9337ca31/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java b/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
index de79959..5231e17 100644
--- a/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
@@ -35,6 +35,8 @@ import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -51,11 +53,11 @@ public class DiskBoundaryManagerTest extends CQLTester
         TokenMetadata metadata = StorageService.instance.getTokenMetadata();
         metadata.updateNormalTokens(BootStrapper.getRandomTokens(metadata, 10), FBUtilities.getBroadcastAddress());
         createTable("create table %s (id int primary key, x text)");
-        dbm = getCurrentColumnFamilyStore().diskBoundaryManager;
         dirs = new Directories(getCurrentColumnFamilyStore().metadata, Lists.newArrayList(new Directories.DataDirectory(new File("/tmp/1")),
                                                                                           new Directories.DataDirectory(new File("/tmp/2")),
                                                                                           new Directories.DataDirectory(new File("/tmp/3"))));
         mock = new MockCFS(getCurrentColumnFamilyStore(), dirs);
+        dbm = mock.diskBoundaryManager;
     }
 
     @Test
@@ -92,13 +94,14 @@ public class DiskBoundaryManagerTest extends CQLTester
     @Test
     public void alterKeyspaceTest() throws Throwable
     {
+        //do not use mock to since it will not be invalidated after alter keyspace
+        DiskBoundaryManager dbm = getCurrentColumnFamilyStore().diskBoundaryManager;
         DiskBoundaries dbv1 = dbm.getDiskBoundaries(mock);
         execute("alter keyspace "+keyspace()+" with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 3 }");
         DiskBoundaries dbv2 = dbm.getDiskBoundaries(mock);
-        // == on purpose - we just want to make sure that there is a new instance cached
-        assertFalse(dbv1 == dbv2);
+        assertNotSame(dbv1, dbv2);
         DiskBoundaries dbv3 = dbm.getDiskBoundaries(mock);
-        assertTrue(dbv2 == dbv3);
+        assertSame(dbv2, dbv3);
 
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org