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 2009/11/03 03:27:50 UTC

svn commit: r832273 - in /incubator/cassandra/trunk/src/java/org/apache/cassandra: dht/BootStrapper.java locator/DatacenterEndPointSnitch.java locator/EndPointSnitch.java locator/IEndPointSnitch.java

Author: jbellis
Date: Tue Nov  3 02:27:50 2009
New Revision: 832273

URL: http://svn.apache.org/viewvc?rev=832273&view=rev
Log:
add sortByProximity and use to prefer bootstrap from closer nodes.
patch by jbellis and Vijay Parthasarathy for CASSANDRA-513

Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndPointSnitch.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/EndPointSnitch.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/IEndPointSnitch.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java?rev=832273&r1=832272&r2=832273&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/dht/BootStrapper.java Tue Nov  3 02:27:50 2009
@@ -148,6 +148,7 @@
         }
     }
 
+    /** get potential sources for each range, ordered by proximity (as determined by EndPointSnitch) */
     Multimap<Range, InetAddress> getRangesWithSources()
     {
         TokenMetadata temp = tokenMetadata.cloneMe();
@@ -155,7 +156,7 @@
         temp.update(token, address);
         Collection<Range> myRanges = replicationStrategy.getAddressRanges(temp).get(address);
 
-        Multimap<Range, InetAddress> myRangeAddresses = HashMultimap.create();
+        Multimap<Range, InetAddress> myRangeAddresses = ArrayListMultimap.create();
         Multimap<Range, InetAddress> rangeAddresses = replicationStrategy.getRangeAddresses(tokenMetadata);
         for (Range range : rangeAddresses.keySet())
         {
@@ -163,7 +164,8 @@
             {
                 if (range.contains(myRange.right()))
                 {
-                    myRangeAddresses.putAll(myRange, rangeAddresses.get(range));
+                    List<InetAddress> preferred = DatabaseDescriptor.getEndPointSnitch().sortByProximity(address, rangeAddresses.get(range));
+                    myRangeAddresses.putAll(myRange, preferred);
                     break;
                 }
             }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndPointSnitch.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndPointSnitch.java?rev=832273&r1=832272&r2=832273&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndPointSnitch.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/DatacenterEndPointSnitch.java Tue Nov  3 02:27:50 2009
@@ -3,8 +3,7 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.log4j.Logger;
@@ -40,14 +39,12 @@
     /**
      * Reference to the logger.
      */
-    private static Logger logger_ = Logger
-            .getLogger(DatacenterEndPointSnitch.class);
+    private static Logger logger_ = Logger.getLogger(DatacenterEndPointSnitch.class);
 
     /**
      * Constructor, intialize XML config and read the config in...
      */
-    public DatacenterEndPointSnitch() throws IOException,
-                                             ParserConfigurationException, SAXException
+    public DatacenterEndPointSnitch() throws IOException, ParserConfigurationException, SAXException
     {
         xmlUtils = new XMLUtils(DEFAULT_RACK_CONFIG_FILE);
         reloadConfiguration();
@@ -185,4 +182,34 @@
         byte[] ipQuads = getIPAddress(endpoint.getHostAddress());
         return ipDC.get(ipQuads[1]).get(ipQuads[2]);
     }
+
+    // TODO add Datacenter proximity in the XML file or a trace rt to find the number of hops.
+    public List<InetAddress> sortByProximity(final InetAddress address, Collection<InetAddress> unsortedAddress)
+    {
+        List<InetAddress> preferred = new ArrayList<InetAddress>(unsortedAddress);
+        Collections.sort(preferred, new Comparator<InetAddress>()
+        {
+            public int compare(InetAddress a1, InetAddress a2)
+            {
+                try
+                {
+                    if (isOnSameRack(address, a1) && !isOnSameRack(address, a2))
+                        return -1;
+                    if (isOnSameRack(address, a2) && !isOnSameRack(address, a1))
+                        return 1;
+                    if (isInSameDataCenter(address, a1) && !isInSameDataCenter(address, a2))
+                        return -1;
+                    if (isInSameDataCenter(address, a2) && !isInSameDataCenter(address, a1))
+                        return 1;
+                    return 0;
+                }
+                catch (UnknownHostException e)
+                {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        return preferred;
+    }
 }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/EndPointSnitch.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/EndPointSnitch.java?rev=832273&r1=832272&r2=832273&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/EndPointSnitch.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/EndPointSnitch.java Tue Nov  3 02:27:50 2009
@@ -20,6 +20,7 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.*;
 
 public class EndPointSnitch implements IEndPointSnitch
 {
@@ -53,4 +54,33 @@
     {
         throw new UnknownHostException("Not Supported");
     }
+
+    public List<InetAddress> sortByProximity(final InetAddress address, Collection<InetAddress> unsortedAddress)
+    {
+        List<InetAddress> preferred = new ArrayList<InetAddress>(unsortedAddress);
+        Collections.sort(preferred, new Comparator<InetAddress>()
+        {
+            public int compare(InetAddress a1, InetAddress a2)
+            {
+                try
+                {
+                    if (isOnSameRack(address, a1) && !isOnSameRack(address, a2))
+                        return -1;
+                    if (isOnSameRack(address, a2) && !isOnSameRack(address, a1))
+                        return 1;
+                    if (isInSameDataCenter(address, a1) && !isInSameDataCenter(address, a2))
+                        return -1;
+                    if (isInSameDataCenter(address, a2) && !isInSameDataCenter(address, a1))
+                        return 1;
+                    return 0;
+                }
+                catch (UnknownHostException e)
+                {
+                    throw new RuntimeException(e);
+                }
+            }
+        });
+
+        return preferred;
+    }
 }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/IEndPointSnitch.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/IEndPointSnitch.java?rev=832273&r1=832272&r2=832273&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/IEndPointSnitch.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/IEndPointSnitch.java Tue Nov  3 02:27:50 2009
@@ -21,6 +21,9 @@
 import java.net.UnknownHostException;
 
 import java.net.InetAddress;
+import java.util.Set;
+import java.util.List;
+import java.util.Collection;
 
 
 /**
@@ -55,4 +58,9 @@
      * Given endpoints this method will help us know the datacenter name where the node is located at.
      */
     public String getLocation(InetAddress endpoint) throws UnknownHostException;
+
+    /**
+     * This method will sort the Set<InetAddress> according to the proximity of the given address.
+     */
+    public List<InetAddress> sortByProximity(InetAddress address, Collection<InetAddress> unsortedAddress);
 }