You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/10/07 22:32:52 UTC

svn commit: r1005616 - in /cassandra/trunk/src/java/org/apache/cassandra: config/KSMetaData.java locator/NetworkTopologyStrategy.java locator/TokenMetadata.java

Author: jbellis
Date: Thu Oct  7 20:32:52 2010
New Revision: 1005616

URL: http://svn.apache.org/viewvc?rev=1005616&view=rev
Log:
clean up NTS and remove DSS->NTS migration since replicas chosen may be different (see #1103).  patch by jbellis; reviewed by Stu Hood for CASSANDRA-1593

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/TokenMetadata.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java?rev=1005616&r1=1005615&r2=1005616&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/KSMetaData.java Thu Oct  7 20:32:52 2010
@@ -124,7 +124,6 @@ public final class KSMetaData
     public static String convertOldStrategyName(String name)
     {
         return name.replace("RackUnawareStrategy", "SimpleStrategy")
-                   .replace("RackAwareStrategy", "OldNetworkTopologyStrategy")
-                   .replace("DatacenterShardStrategy", "NetworkTopologyStrategy");
+                   .replace("RackAwareStrategy", "OldNetworkTopologyStrategy");
     }
 }

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=1005616&r1=1005615&r2=1005616&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java Thu Oct  7 20:32:52 2010
@@ -69,59 +69,51 @@ public class NetworkTopologyStrategy ext
 
     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>>();
-        List<InetAddress> endpoints = new ArrayList<InetAddress>(totalReplicas);
-
-        // first pass: only collect replicas on unique racks
-        for (Iterator<Token> iter = TokenMetadata.ringIterator(tokenMetadata.sortedTokens(), searchToken);
-             endpoints.size() < totalReplicas && iter.hasNext();)
+        List<InetAddress> endpoints = new ArrayList<InetAddress>(getReplicationFactor());
+
+        for (Entry<String, Integer> dcEntry : datacenters.entrySet())
         {
-            Token token = iter.next();
-            InetAddress endpoint = tokenMetadata.getEndpoint(token);
-            String datacenter = snitch.getDatacenter(endpoint);
-            int remaining = remainingReplicas.containsKey(datacenter) ? remainingReplicas.get(datacenter) : 0;
-            if (remaining > 0)
+            String dcName = dcEntry.getKey();
+            int dcReplicas = dcEntry.getValue();
+
+            // collect endpoints in this DC
+            TokenMetadata dcTokens = new TokenMetadata();
+            for (Entry<Token, InetAddress> tokenEntry : tokenMetadata.entrySet())
             {
-                Set<String> usedRacks = dcUsedRacks.get(datacenter);
-                if (usedRacks == null)
-                {
-                    usedRacks = new HashSet<String>();
-                    dcUsedRacks.put(datacenter, usedRacks);
-                }
+                if (snitch.getDatacenter(tokenEntry.getValue()).equals(dcName))
+                    dcTokens.updateNormalToken(tokenEntry.getKey(), tokenEntry.getValue());
+            }
+
+            List<InetAddress> dcEndpoints = new ArrayList<InetAddress>(dcReplicas);
+            Set<String> racks = new HashSet<String>();
+            // first pass: only collect replicas on unique racks
+            for (Iterator<Token> iter = TokenMetadata.ringIterator(dcTokens.sortedTokens(), searchToken);
+                 dcEndpoints.size() < dcReplicas && iter.hasNext(); )
+            {
+                Token token = iter.next();
+                InetAddress endpoint = dcTokens.getEndpoint(token);
                 String rack = snitch.getRack(endpoint);
-                if (!usedRacks.contains(rack))
+                if (!racks.contains(rack))
                 {
-                    endpoints.add(endpoint);
-                    usedRacks.add(rack);
-                    remainingReplicas.put(datacenter, remaining - 1);
+                    dcEndpoints.add(endpoint);
+                    racks.add(rack);
                 }
             }
-        }
 
-        // second pass: if replica count has not been achieved from unique racks, add nodes from the same racks
-        for (Iterator<Token> iter = TokenMetadata.ringIterator(tokenMetadata.sortedTokens(), searchToken);
-             endpoints.size() < totalReplicas && iter.hasNext();)
-        {
-            Token token = iter.next();
-            InetAddress endpoint = tokenMetadata.getEndpoint(token);
-            if (endpoints.contains(endpoint))
-                continue;
-
-            String datacenter = snitch.getDatacenter(endpoint);
-            int remaining = remainingReplicas.containsKey(datacenter) ? remainingReplicas.get(datacenter) : 0;
-            if (remaining > 0)
+            // second pass: if replica count has not been achieved from unique racks, add nodes from duplicate racks
+            for (Iterator<Token> iter = TokenMetadata.ringIterator(dcTokens.sortedTokens(), searchToken);
+                 dcEndpoints.size() < dcReplicas && iter.hasNext(); )
             {
-                endpoints.add(endpoint);
-                remainingReplicas.put(datacenter, remaining - 1);
+                Token token = iter.next();
+                InetAddress endpoint = dcTokens.getEndpoint(token);
+                if (!dcEndpoints.contains(endpoint))
+                    dcEndpoints.add(endpoint);
             }
-        }
 
-        for (Map.Entry<String, Integer> entry : remainingReplicas.entrySet())
-        {
-            if (entry.getValue() > 0)
-                throw new IllegalStateException(String.format("datacenter (%s) has no more endpoints, (%s) replicas still needed", entry.getKey(), entry.getValue()));
+            if (dcEndpoints.size() < dcReplicas)
+                throw new IllegalStateException(String.format("datacenter (%s) has no more endpoints, (%s) replicas still needed",
+                                                              dcName, dcReplicas - dcEndpoints.size()));
+            endpoints.addAll(dcEndpoints);
         }
 
         return endpoints;

Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/TokenMetadata.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/TokenMetadata.java?rev=1005616&r1=1005615&r2=1005616&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/TokenMetadata.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/TokenMetadata.java Thu Oct  7 20:32:52 2010
@@ -287,6 +287,11 @@ public class TokenMetadata
         }
     }
 
+    public Set<Map.Entry<Token,InetAddress>> entrySet()
+    {
+        return tokenToEndpointMap.entrySet();
+    }
+
     public InetAddress getEndpoint(Token token)
     {
         lock.readLock().lock();