You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2011/01/20 23:53:12 UTC
svn commit: r1061557 - in /cassandra/branches/cassandra-0.7: conf/
src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/gms/
src/java/org/apache/cassandra/locator/ src/java/org/apache/cassandra/service/
Author: brandonwilliams
Date: Thu Jan 20 22:53:11 2011
New Revision: 1061557
URL: http://svn.apache.org/viewvc?rev=1061557&view=rev
Log:
Add a configurable maximum amount of time to hint for a dead host.
Patch by brandonwilliams, reviewed by jbellis for CASSANDRA-1459
Modified:
cassandra/branches/cassandra-0.7/conf/cassandra.yaml
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/Config.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxy.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxyMBean.java
Modified: cassandra/branches/cassandra-0.7/conf/cassandra.yaml
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/conf/cassandra.yaml?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/conf/cassandra.yaml (original)
+++ cassandra/branches/cassandra-0.7/conf/cassandra.yaml Thu Jan 20 22:53:11 2011
@@ -31,6 +31,10 @@ auto_bootstrap: false
# See http://wiki.apache.org/cassandra/HintedHandoff
hinted_handoff_enabled: true
+# this defines the maximum amount of time a dead host will have hints
+# generated. After it has been dead this long, hints will be dropped.
+# Maximum is approximately 50 days
+max_hint_window_in_ms: 2147483647
# authentication backend, implementing IAuthenticator; used to identify users
authenticator: org.apache.cassandra.auth.AllowAllAuthenticator
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/Config.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/Config.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/Config.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/Config.java Thu Jan 20 22:53:11 2011
@@ -34,6 +34,7 @@ public class Config
public Boolean auto_bootstrap = false;
public Boolean hinted_handoff_enabled = true;
+ public Integer max_hint_window_in_ms = Integer.MAX_VALUE;
public String[] seeds;
public DiskAccessMode disk_access_mode = DiskAccessMode.auto;
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Thu Jan 20 22:53:11 2011
@@ -1079,6 +1079,11 @@ public class DatabaseDescriptor
return conf.hinted_handoff_enabled;
}
+ public static int getMaxHintWindow()
+ {
+ return conf.max_hint_window_in_ms;
+ }
+
public static AbstractType getValueValidator(String keyspace, String cf, ByteBuffer column)
{
return getCFMetaData(keyspace, cf).getValueValidator(column);
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/gms/Gossiper.java Thu Jan 20 22:53:11 2011
@@ -128,7 +128,7 @@ public class Gossiper implements IFailur
private Set<InetAddress> liveEndpoints_ = new ConcurrentSkipListSet<InetAddress>(inetcomparator);
/* unreachable member set */
- private Set<InetAddress> unreachableEndpoints_ = new ConcurrentSkipListSet<InetAddress>(inetcomparator);
+ private Map<InetAddress, Long> unreachableEndpoints_ = new ConcurrentHashMap<InetAddress, Long>();
/* initial seeds for joining the cluster */
private Set<InetAddress> seeds_ = new ConcurrentSkipListSet<InetAddress>(inetcomparator);
@@ -179,7 +179,16 @@ public class Gossiper implements IFailur
public Set<InetAddress> getUnreachableMembers()
{
- return new HashSet<InetAddress>(unreachableEndpoints_);
+ return unreachableEndpoints_.keySet();
+ }
+
+ public long getEndpointDowntime(InetAddress ep)
+ {
+ Long downtime = unreachableEndpoints_.get(ep);
+ if (downtime != null)
+ return System.currentTimeMillis() - downtime;
+ else
+ return 0L;
}
/**
@@ -353,7 +362,7 @@ public class Gossiper implements IFailur
double prob = unreachableEndpoints / (liveEndpoints + 1);
double randDbl = random_.nextDouble();
if ( randDbl < prob )
- sendGossip(message, unreachableEndpoints_);
+ sendGossip(message, unreachableEndpoints_.keySet());
}
}
@@ -735,7 +744,7 @@ public class Gossiper implements IFailur
else
{
liveEndpoints_.remove(addr);
- unreachableEndpoints_.add(addr);
+ unreachableEndpoints_.put(addr, System.currentTimeMillis());
for (IEndpointStateChangeSubscriber subscriber : subscribers_)
subscriber.onDead(addr, epState);
}
@@ -871,7 +880,7 @@ public class Gossiper implements IFailur
epState.isAGossiper(true);
epState.setHasToken(true);
endpointStateMap_.put(ep, epState);
- unreachableEndpoints_.add(ep);
+ unreachableEndpoints_.put(ep, System.currentTimeMillis());
}
}
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java Thu Jan 20 22:53:11 2011
@@ -25,6 +25,7 @@ import java.util.*;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
+import org.apache.cassandra.gms.Gossiper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -163,6 +164,12 @@ public abstract class AbstractReplicatio
{
if (map.containsKey(ep))
continue;
+ if (!StorageProxy.shouldHint(ep))
+ {
+ if (logger.isDebugEnabled())
+ logger.debug("not hinting " + ep + " which has been down " + Gossiper.instance.getEndpointDowntime(ep) + "ms");
+ continue;
+ }
InetAddress destination = map.isEmpty()
? localAddress
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxy.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxy.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxy.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxy.java Thu Jan 20 22:53:11 2011
@@ -75,6 +75,7 @@ public class StorageProxy implements Sto
private static final LatencyTracker rangeStats = new LatencyTracker();
private static final LatencyTracker writeStats = new LatencyTracker();
private static boolean hintedHandoffEnabled = DatabaseDescriptor.hintedHandoffEnabled();
+ private static int maxHintWindow = DatabaseDescriptor.getMaxHintWindow();
private static final String UNREACHABLE = "UNREACHABLE";
private StorageProxy() {}
@@ -182,7 +183,7 @@ public class StorageProxy implements Sto
}
}
responseHandler.addHintCallback(hintedMessage, destination);
-
+
Multimap<Message, InetAddress> messages = dcMessages.get(dc);
if (messages == null)
@@ -190,7 +191,7 @@ public class StorageProxy implements Sto
messages = HashMultimap.create();
dcMessages.put(dc, messages);
}
-
+
messages.put(hintedMessage, destination);
}
}
@@ -803,6 +804,21 @@ public class StorageProxy implements Sto
return hintedHandoffEnabled;
}
+ public int getMaxHintWindow()
+ {
+ return maxHintWindow;
+ }
+
+ public void setMaxHintWindow(int ms)
+ {
+ maxHintWindow = ms;
+ }
+
+ public static boolean shouldHint(InetAddress ep)
+ {
+ return Gossiper.instance.getEndpointDowntime(ep) <= maxHintWindow;
+ }
+
/**
* Performs the truncate operatoin, which effectively deletes all data from
* the column family cfname
Modified: cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxyMBean.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxyMBean.java?rev=1061557&r1=1061556&r2=1061557&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxyMBean.java (original)
+++ cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/service/StorageProxyMBean.java Thu Jan 20 22:53:11 2011
@@ -40,4 +40,6 @@ public interface StorageProxyMBean
public boolean getHintedHandoffEnabled();
public void setHintedHandoffEnabled(boolean b);
+ public int getMaxHintWindow();
+ public void setMaxHintWindow(int ms);
}