You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ja...@apache.org on 2010/01/22 01:00:07 UTC
svn commit: r901930 -
/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
Author: jaakko
Date: Fri Jan 22 00:00:07 2010
New Revision: 901930
URL: http://svn.apache.org/viewvc?rev=901930&view=rev
Log:
Ignore non-members in hinted location search. Find hint location based on proximity, not token order. Patch by jaakko, reviewed by jbellis. CASSANDRA-722
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
Modified: incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=901930&r1=901929&r2=901930&view=diff
==============================================================================
--- incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java (original)
+++ incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java Fri Jan 22 00:00:07 2010
@@ -29,9 +29,11 @@
import org.apache.cassandra.dht.Range;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.gms.Gossiper;
import org.apache.cassandra.service.IResponseResolver;
import org.apache.cassandra.service.QuorumResponseHandler;
import org.apache.cassandra.service.WriteResponseHandler;
+import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.FBUtilities;
/**
@@ -114,6 +116,9 @@
Set<InetAddress> usedEndpoints = new HashSet<InetAddress>();
Map<InetAddress, InetAddress> map = new HashMap<InetAddress, InetAddress>();
+ IEndPointSnitch endPointSnitch = StorageService.instance().getEndPointSnitch();
+ Set<InetAddress> liveNodes = Gossiper.instance().getLiveMembers();
+
for (InetAddress ep : targets)
{
if (FailureDetector.instance().isAlive(ep))
@@ -123,25 +128,21 @@
}
else
{
+ // Ignore targets that have died when bootstrapping
+ if (!tokenMetadata_.isMember(ep))
+ continue;
+
// find another endpoint to store a hint on. prefer endpoints that aren't already in use
InetAddress hintLocation = null;
- List tokens = tokenMetadata_.sortedTokens();
- Token token = tokenMetadata_.getToken(ep);
- int index = Collections.binarySearch(tokens, token);
- if (index < 0)
- {
- index = (index + 1) * (-1);
- if (index >= tokens.size()) // handle wrap
- index = 0;
- }
- int totalNodes = tokens.size();
- int startIndex = (index + 1) % totalNodes;
- for (int i = startIndex, count = 1; count < totalNodes; ++count, i = (i + 1) % totalNodes)
+ List<InetAddress> preferred = endPointSnitch.getSortedListByProximity(ep, liveNodes);
+
+ for (InetAddress hintCandidate : preferred)
{
- InetAddress tmpEndPoint = tokenMetadata_.getEndPoint((Token) tokens.get(i));
- if (FailureDetector.instance().isAlive(tmpEndPoint) && !targets.contains(tmpEndPoint) && !usedEndpoints.contains(tmpEndPoint))
+ if (!targets.contains(hintCandidate)
+ && !usedEndpoints.contains(hintCandidate)
+ && tokenMetadata_.isMember(hintCandidate))
{
- hintLocation = tmpEndPoint;
+ hintLocation = hintCandidate;
break;
}
}