You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ma...@apache.org on 2020/09/08 11:01:29 UTC

[cassandra] branch trunk updated: Avoid adding locahost when streaming trivial ranges

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


The following commit(s) were added to refs/heads/trunk by this push:
     new 5ec3bae  Avoid adding locahost when streaming trivial ranges
5ec3bae is described below

commit 5ec3bae22b6e252d629daae8549036c1a547d21a
Author: Marcus Eriksson <ma...@apache.org>
AuthorDate: Thu Sep 3 09:32:21 2020 +0200

    Avoid adding locahost when streaming trivial ranges
    
    Patch by marcuse; reviewed by Blake Eggleston for CASSANDRA-16099
---
 CHANGES.txt                                                 |  1 +
 .../org/apache/cassandra/dht/RangeFetchMapCalculator.java   |  6 +++++-
 src/java/org/apache/cassandra/dht/RangeStreamer.java        |  3 ++-
 .../apache/cassandra/dht/RangeFetchMapCalculatorTest.java   | 13 +++++++++++++
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 9188115..1e188bd 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0-beta3
+ * Avoid adding locahost when streaming trivial ranges (CASSANDRA-16099)
  * Add nodetool getfullquerylog (CASSANDRA-15988)
  * Fix yaml format and alignment in tpstats (CASSANDRA-11402)
  * Avoid trying to keep track of RTs for endpoints we won't write to during read repair (CASSANDRA-16084)
diff --git a/src/java/org/apache/cassandra/dht/RangeFetchMapCalculator.java b/src/java/org/apache/cassandra/dht/RangeFetchMapCalculator.java
index 2a2de01..9d47d46f 100644
--- a/src/java/org/apache/cassandra/dht/RangeFetchMapCalculator.java
+++ b/src/java/org/apache/cassandra/dht/RangeFetchMapCalculator.java
@@ -168,8 +168,12 @@ public class RangeFetchMapCalculator
                 {
                     if (passFilters(replica, localDCCheck))
                     {
-                        fetchMap.put(replica.endpoint(), trivialRange);
                         added = true;
+                        // if we pass filters, it means that we don't filter away localhost and we can count it as a source,
+                        // see RangeFetchMapCalculator#addEndpoints  and RangeStreamer#getRangeFetchMap
+                        if (replica.isSelf())
+                            continue; // but don't add localhost to avoid streaming locally
+                        fetchMap.put(replica.endpoint(), trivialRange);
                         break;
                     }
                 }
diff --git a/src/java/org/apache/cassandra/dht/RangeStreamer.java b/src/java/org/apache/cassandra/dht/RangeStreamer.java
index 75ccb4b..4928259 100644
--- a/src/java/org/apache/cassandra/dht/RangeStreamer.java
+++ b/src/java/org/apache/cassandra/dht/RangeStreamer.java
@@ -613,7 +613,8 @@ public class RangeStreamer
     /**
      * Verify that source returned for each range is correct
      */
-    private static void validateRangeFetchMap(EndpointsByRange rangesWithSources, Multimap<InetAddressAndPort, Range<Token>> rangeFetchMapMap, String keyspace)
+    @VisibleForTesting
+    static void validateRangeFetchMap(EndpointsByRange rangesWithSources, Multimap<InetAddressAndPort, Range<Token>> rangeFetchMapMap, String keyspace)
     {
         for (Map.Entry<InetAddressAndPort, Range<Token>> entry : rangeFetchMapMap.entries())
         {
diff --git a/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java b/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
index e2b09bc..8574786 100644
--- a/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
+++ b/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
@@ -371,6 +371,19 @@ public class RangeFetchMapCalculatorTest
 
     }
 
+   @Test
+    public void testTrivalRangeLocalHostStreaming() throws UnknownHostException
+    {
+        // trivial ranges ranges should not try to stream from localhost
+        EndpointsByRange.Builder rangesWithSources = new EndpointsByRange.Builder();
+        addTrivialRangeAndSources(rangesWithSources, 21, 30, "127.0.0.2", "127.0.0.1");
+        addTrivialRangeAndSources(rangesWithSources, 31, 40, "127.0.0.1", "127.0.0.2");
+        EndpointsByRange ebr = rangesWithSources.build();
+        RangeFetchMapCalculator calculator = new RangeFetchMapCalculator(ebr, Collections.emptyList(), "Test");
+        RangeStreamer.validateRangeFetchMap(ebr, calculator.getRangeFetchMap(), "Test");
+    }
+
+
     private void assertArrays(Collection<Range<Token>> expected, Collection<Range<Token>> result)
     {
         Assert.assertEquals(expected.size(), result.size());


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