You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/11/06 00:04:47 UTC
cassandra git commit: Fix MV replica filtering for
non-NetworkTopologyStrategy
Repository: cassandra
Updated Branches:
refs/heads/cassandra-3.0 4db577abf -> 1bd2c9425
Fix MV replica filtering for non-NetworkTopologyStrategy
patch by Joel Knighton; reviewed by Carl Yeksigian for CASSANDRA-10634
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1bd2c942
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1bd2c942
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1bd2c942
Branch: refs/heads/cassandra-3.0
Commit: 1bd2c94252b52d99b0c49257d2365f7c85935dcd
Parents: 4db577a
Author: Joel Knighton <jo...@datastax.com>
Authored: Mon Nov 2 15:21:11 2015 -0600
Committer: Aleksey Yeschenko <al...@apache.org>
Committed: Thu Nov 5 23:04:20 2015 +0000
----------------------------------------------------------------------
CHANGES.txt | 1 +
.../org/apache/cassandra/db/view/ViewUtils.java | 31 ++++++++++++--------
2 files changed, 19 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1bd2c942/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index b469594..ce24c2b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
3.0
+ * Fix MV replica filtering for non-NetworkTopologyStrategy (CASSANDRA-10634)
* (Hadoop) fix CIF describeSplits() not handling 0 size estimates (CASSANDRA-10600)
* Fix reading of legacy sstables (CASSANDRA-10590)
* Use CQL type names in schema metadata tables (CASSANDRA-10365)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/1bd2c942/src/java/org/apache/cassandra/db/view/ViewUtils.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/view/ViewUtils.java b/src/java/org/apache/cassandra/db/view/ViewUtils.java
index ebbae65..089a3b7 100644
--- a/src/java/org/apache/cassandra/db/view/ViewUtils.java
+++ b/src/java/org/apache/cassandra/db/view/ViewUtils.java
@@ -26,6 +26,7 @@ import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.Keyspace;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.locator.NetworkTopologyStrategy;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.FBUtilities;
@@ -38,9 +39,10 @@ public final class ViewUtils
/**
* Calculate the natural endpoint for the view.
*
- * The view natural endpoint is the endpint which has the same cardinality as this node in the replication factor.
+ * The view natural endpoint is the endpoint which has the same cardinality as this node in the replication factor.
* The cardinality is the number at which this node would store a piece of data, given the change in replication
- * factor.
+ * factor. If the keyspace's replication strategy is a NetworkTopologyStrategy, we filter the ring to contain only
+ * nodes in the local datacenter when calculating cardinality.
*
* For example, if we have the following ring:
* A, T1 -> B, T2 -> C, T3 -> A
@@ -61,12 +63,14 @@ public final class ViewUtils
AbstractReplicationStrategy replicationStrategy = Keyspace.open(keyspaceName).getReplicationStrategy();
String localDataCenter = DatabaseDescriptor.getEndpointSnitch().getDatacenter(FBUtilities.getBroadcastAddress());
- List<InetAddress> localBaseEndpoints = new ArrayList<>();
- List<InetAddress> localViewEndpoints = new ArrayList<>();
+ List<InetAddress> baseEndpoints = new ArrayList<>();
+ List<InetAddress> viewEndpoints = new ArrayList<>();
for (InetAddress baseEndpoint : replicationStrategy.getNaturalEndpoints(baseToken))
{
- if (DatabaseDescriptor.getEndpointSnitch().getDatacenter(baseEndpoint).equals(localDataCenter))
- localBaseEndpoints.add(baseEndpoint);
+ // An endpoint is local if we're not using Net
+ if (!(replicationStrategy instanceof NetworkTopologyStrategy) ||
+ DatabaseDescriptor.getEndpointSnitch().getDatacenter(baseEndpoint).equals(localDataCenter))
+ baseEndpoints.add(baseEndpoint);
}
for (InetAddress viewEndpoint : replicationStrategy.getNaturalEndpoints(viewToken))
@@ -77,17 +81,18 @@ public final class ViewUtils
// We have to remove any endpoint which is shared between the base and the view, as it will select itself
// and throw off the counts otherwise.
- if (localBaseEndpoints.contains(viewEndpoint))
- localBaseEndpoints.remove(viewEndpoint);
- else if (DatabaseDescriptor.getEndpointSnitch().getDatacenter(viewEndpoint).equals(localDataCenter))
- localViewEndpoints.add(viewEndpoint);
+ if (baseEndpoints.contains(viewEndpoint))
+ baseEndpoints.remove(viewEndpoint);
+ else if (!(replicationStrategy instanceof NetworkTopologyStrategy) ||
+ DatabaseDescriptor.getEndpointSnitch().getDatacenter(viewEndpoint).equals(localDataCenter))
+ viewEndpoints.add(viewEndpoint);
}
// The replication strategy will be the same for the base and the view, as they must belong to the same keyspace.
// Since the same replication strategy is used, the same placement should be used and we should get the same
// number of replicas for all of the tokens in the ring.
- assert localBaseEndpoints.size() == localViewEndpoints.size() : "Replication strategy should have the same number of endpoints for the base and the view";
- int baseIdx = localBaseEndpoints.indexOf(FBUtilities.getBroadcastAddress());
+ assert baseEndpoints.size() == viewEndpoints.size() : "Replication strategy should have the same number of endpoints for the base and the view";
+ int baseIdx = baseEndpoints.indexOf(FBUtilities.getBroadcastAddress());
if (baseIdx < 0)
{
@@ -104,6 +109,6 @@ public final class ViewUtils
}
- return localViewEndpoints.get(baseIdx);
+ return viewEndpoints.get(baseIdx);
}
}