Author: jbellis
Date: Tue Sep 21 19:40:54 2010
New Revision: 999571

URL: http://svn.apache.org/viewvc?rev=999571&view=rev
Log:
Change Strategy to generate List of endpoints instead of Set to preserve order. 
 Document that SimpleSnitch maintains that order.

Modified:
    cassandra/trunk/conf/cassandra.yaml
    
cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/LocalStrategy.java
    
cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
    
cassandra/trunk/src/java/org/apache/cassandra/locator/OldNetworkTopologyStrategy.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleSnitch.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleStrategy.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java

Modified: cassandra/trunk/conf/cassandra.yaml
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/conf/cassandra.yaml?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- cassandra/trunk/conf/cassandra.yaml (original)
+++ cassandra/trunk/conf/cassandra.yaml Tue Sep 21 19:40:54 2010
@@ -184,9 +184,16 @@ rpc_timeout_in_ms: 10000
 # IEndpointSnitch, which will let Cassandra know enough
 # about your network topology to route requests efficiently.
 # Out of the box, Cassandra provides
-# org.apache.cassandra.locator.SimpleSnitch,
-# org.apache.cassandra.locator.RackInferringSnitch, and
-# org.apache.cassandra.locator.PropertyFileSnitch.
+#  - org.apache.cassandra.locator.SimpleSnitch:
+#    Treats Strategy order as proximity. This improves cache locality
+#    when disabling read repair, which can further improve throughput.
+#  - org.apache.cassandra.locator.RackInferringSnitch:
+#    Proximity is determined by rack and data center, which are
+#    assumed to correspond to the 3rd and 2nd octet of each node's
+#    IP address, respectively
+# org.apache.cassandra.locator.PropertyFileSnitch:
+#  - Proximity is determined by rack and data center, which are
+#    explicitly configured in cassandra-rack.properties.
 endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
 
 # dynamic_snitch -- This boolean controls whether the above snitch is

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
 Tue Sep 21 19:40:54 2010
@@ -103,7 +103,7 @@ public abstract class AbstractReplicatio
      * @return a copy of the natural endpoints for the given token
      * @throws IllegalStateException if the number of requested replicas is 
greater than the number of known endpoints
      */
-    public abstract Set<InetAddress> calculateNaturalEndpoints(Token 
searchToken, TokenMetadata tokenMetadata) throws IllegalStateException;
+    public abstract List<InetAddress> calculateNaturalEndpoints(Token 
searchToken, TokenMetadata tokenMetadata) throws IllegalStateException;
 
     public IWriteResponseHandler 
getWriteResponseHandler(Collection<InetAddress> writeEndpoints,
                                                          Multimap<InetAddress, 
InetAddress> hintedEndpoints,

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/LocalStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/LocalStrategy.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/LocalStrategy.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/LocalStrategy.java 
Tue Sep 21 19:40:54 2010
@@ -20,9 +20,7 @@
 package org.apache.cassandra.locator;
 
 import java.net.InetAddress;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.dht.Token;
@@ -34,11 +32,8 @@ public class LocalStrategy extends Abstr
         super(table, tokenMetadata, snitch, configOptions);
     }
 
-    public Set<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
+    public List<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
     {
-        Set<InetAddress> endpoints = new HashSet<InetAddress>(1);
-        InetAddress local = FBUtilities.getLocalAddress();
-        endpoints.add(local);
-        return endpoints;
+        return Arrays.asList(FBUtilities.getLocalAddress());
     }
 }

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
 Tue Sep 21 19:40:54 2010
@@ -67,12 +67,12 @@ public class NetworkTopologyStrategy ext
         datacenters = Collections.unmodifiableMap(newDatacenters);
     }
 
-    public Set<InetAddress> calculateNaturalEndpoints(Token searchToken, 
TokenMetadata tokenMetadata)
+    public List<InetAddress> calculateNaturalEndpoints(Token searchToken, 
TokenMetadata tokenMetadata)
     {
         int totalReplicas = getReplicationFactor();
         Map<String, Integer> remainingReplicas = new HashMap<String, 
Integer>(datacenters);
         Map<String, Set<String>> dcUsedRacks = new HashMap<String, 
Set<String>>();
-        Set<InetAddress> endpoints = new HashSet<InetAddress>(totalReplicas);
+        List<InetAddress> endpoints = new 
ArrayList<InetAddress>(totalReplicas);
 
         // first pass: only collect replicas on unique racks
         for (Iterator<Token> iter = 
TokenMetadata.ringIterator(tokenMetadata.sortedTokens(), searchToken);

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/OldNetworkTopologyStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/OldNetworkTopologyStrategy.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/locator/OldNetworkTopologyStrategy.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/locator/OldNetworkTopologyStrategy.java
 Tue Sep 21 19:40:54 2010
@@ -38,10 +38,10 @@ public class OldNetworkTopologyStrategy 
         super(table, tokenMetadata, snitch, configOptions);
     }
 
-    public Set<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
+    public List<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
     {
         int replicas = getReplicationFactor();
-        Set<InetAddress> endpoints = new HashSet<InetAddress>(replicas);
+        List<InetAddress> endpoints = new ArrayList<InetAddress>(replicas);
         ArrayList<Token> tokens = metadata.sortedTokens();
 
         if (tokens.isEmpty())

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleSnitch.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleSnitch.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleSnitch.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleSnitch.java Tue 
Sep 21 19:40:54 2010
@@ -24,8 +24,9 @@ import java.util.Collection;
 import java.util.List;
 
 /**
- * A simple endpoint snitch implementation does not sort addresses by
- * proximity.
+ * A simple endpoint snitch implementation that treats Strategy order as 
proximity,
+ * allowing non-read-repaired reads to prefer a single endpoint, which improves
+ * cache locality.
  */
 public class SimpleSnitch extends AbstractEndpointSnitch
 {

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleStrategy.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleStrategy.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/SimpleStrategy.java 
Tue Sep 21 19:40:54 2010
@@ -37,11 +37,11 @@ public class SimpleStrategy extends Abst
         super(table, tokenMetadata, snitch, configOptions);
     }
 
-    public Set<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
+    public List<InetAddress> calculateNaturalEndpoints(Token token, 
TokenMetadata metadata)
     {
         int replicas = getReplicationFactor();
         ArrayList<Token> tokens = metadata.sortedTokens();
-        Set<InetAddress> endpoints = new HashSet<InetAddress>(replicas);
+        List<InetAddress> endpoints = new ArrayList<InetAddress>(replicas);
 
         if (tokens.isEmpty())
             return endpoints;

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=999571&r1=999570&r2=999571&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java 
Tue Sep 21 19:40:54 2010
@@ -42,7 +42,6 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
 import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.concurrent.StageManager;
@@ -813,8 +812,8 @@ public class StorageService implements I
         // all leaving nodes are gone.
         for (Range range : affectedRanges)
         {
-            Set<InetAddress> currentEndpoints = 
strategy.calculateNaturalEndpoints(range.right, tm);
-            Set<InetAddress> newEndpoints = 
strategy.calculateNaturalEndpoints(range.right, allLeftMetadata);
+            Collection<InetAddress> currentEndpoints = 
strategy.calculateNaturalEndpoints(range.right, tm);
+            Collection<InetAddress> newEndpoints = 
strategy.calculateNaturalEndpoints(range.right, allLeftMetadata);
             newEndpoints.removeAll(currentEndpoints);
             pendingRanges.putAll(range, newEndpoints);
         }
@@ -919,7 +918,7 @@ public class StorageService implements I
         if (logger_.isDebugEnabled())
             logger_.debug("Node " + endpoint + " ranges [" + 
StringUtils.join(ranges, ", ") + "]");
 
-        Map<Range, Set<InetAddress>> currentReplicaEndpoints = new 
HashMap<Range, Set<InetAddress>>();
+        Map<Range, List<InetAddress>> currentReplicaEndpoints = new 
HashMap<Range, List<InetAddress>>();
 
         // Find (for each range) all nodes that store replicas for these 
ranges as well
         for (Range range : ranges)
@@ -941,7 +940,7 @@ public class StorageService implements I
         // range.
         for (Range range : ranges)
         {
-            Set<InetAddress> newReplicaEndpoints = 
getReplicationStrategy(table).calculateNaturalEndpoints(range.right, temp);
+            Collection<InetAddress> newReplicaEndpoints = 
getReplicationStrategy(table).calculateNaturalEndpoints(range.right, temp);
             newReplicaEndpoints.removeAll(currentReplicaEndpoints.get(range));
             if (logger_.isDebugEnabled())
                 if (newReplicaEndpoints.isEmpty())


Reply via email to