Author: jbellis
Date: Tue May  4 20:54:47 2010
New Revision: 941037

URL: http://svn.apache.org/viewvc?rev=941037&view=rev
Log:
Add per-keyspace option to turn off Hinted Handoff.  patch by goffinet and Ryan 
King; reviewed by jbellis for CASSANDRA-894

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=941037&r1=941036&r2=941037&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Tue May  4 20:54:47 2010
@@ -5,6 +5,7 @@
  * add latency histograms to CFSMBean (CASSANDRA-1024)
  * make resolving timestamp ties deterministic by using value bytes
    as a tiebreaker (CASSANDRA-1039)
+ * Add per-keyspace option to turn off Hinted Handoff (CASSANDRA-894)
 
 
 0.6.1

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=941037&r1=941036&r2=941037&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
 Tue May  4 20:54:47 2010
@@ -132,6 +132,8 @@ public class DatabaseDescriptor
     private static boolean snapshotBeforeCompaction;
     private static boolean autoBootstrap = false;
 
+    private static Map<String,Boolean> hintedHandOffByKS = new 
HashMap<String,Boolean>();
+
     private static IAuthenticator authenticator = new AllowAllAuthenticator();
 
     private final static String STORAGE_CONF_FILE = "storage-conf.xml";
@@ -619,6 +621,17 @@ public class DatabaseDescriptor
                     throw new ConfigurationException("Invalid endpointsnitch 
class " + endPointSnitchClassName + " " + e.getMessage());
                 }
 
+                /* should Hinted Handoff be on? */
+                String hintedHandOffStr = 
xmlUtils.getNodeValue("/Storage/Keyspaces/keyspa...@name='" + ksName + 
"']/HintedHandoff");
+                if (hintedHandOffStr == null || 
hintedHandOffStr.equalsIgnoreCase("true"))
+                    hintedHandOffByKS.put(ksName, true);
+                else if (hintedHandOffStr.equalsIgnoreCase("false"))
+                    hintedHandOffByKS.put(ksName, false);
+                else
+                    throw new ConfigurationException("Unrecognized value for 
HintedHandoff.  Use 'true' or 'false'.");
+                if (logger.isDebugEnabled())
+                    logger.debug("setting hintedHandOff to " + 
hintedHandOffByKS.get(ksName).toString() + " for " + ksName);
+
                 String xqlTable = "/Storage/Keyspaces/keyspa...@name='" + 
ksName + "']/";
                 NodeList columnFamilies = 
xmlUtils.getRequestedNodeList(xqlTable + "ColumnFamily");
 
@@ -1208,4 +1221,9 @@ public class DatabaseDescriptor
     {
         return autoBootstrap;
     }
+
+    public static boolean isHintedHandOff(String table)
+    {
+        return hintedHandOffByKS.get(table);
     }
+}

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=941037&r1=941036&r2=941037&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
 Tue May  4 20:54:47 2010
@@ -87,8 +87,9 @@ public abstract class AbstractReplicatio
                 map.put(ep, ep);
         }
 
-        if (map.size() == targets.size())
-            return map; // everything was alive
+        // if everything was alive or we're not doing HH on this keyspace, 
stop with just the live nodes
+        if (map.size() == targets.size() || 
!DatabaseDescriptor.isHintedHandOff(table))
+            return map;
 
         // assign dead endpoints to be hinted to the closest live one, or to 
the local node
         // (since it is trivially the closest) if none are alive.  This way, 
the cost of doing


Reply via email to