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