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/11 17:23:42 UTC
svn commit: r834945 - in
/incubator/cassandra/trunk/src/java/org/apache/cassandra:
locator/AbstractReplicationStrategy.java service/StorageService.java
Author: jbellis
Date: Wed Nov 11 16:23:41 2009
New Revision: 834945
URL: http://svn.apache.org/viewvc?rev=834945&view=rev
Log:
simplify getChangedRangesForLeaving. patch by Jaakko Laine; reviewed by jbellis for CASSANDRA-435
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=834945&r1=834944&r2=834945&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java Wed Nov 11 16:23:41 2009
@@ -206,32 +206,6 @@
return getAddressRanges(temp).get(pendingAddress);
}
- /**
- * @param endpoint the endpoint leaving
- * @return a map of where the endpoint's current ranges get sent
- */
- public Multimap<Range, InetAddress> getRangeAddressesAfterLeaving(InetAddress endpoint)
- {
- TokenMetadata metadataAfterLeaving = tokenMetadata_.cloneWithoutPending();
- metadataAfterLeaving.removeEndpoint(endpoint);
- Multimap<Range, InetAddress> rangesAfterLeaving = getRangeAddresses(metadataAfterLeaving);
-
- Multimap<Range, InetAddress> map = HashMultimap.create();
- for (Range range : getAddressRanges().get(endpoint))
- {
- for (Range newRange : rangesAfterLeaving.keySet())
- {
- if (newRange.contains(range))
- {
- map.putAll(range, rangesAfterLeaving.get(newRange));
- break;
- }
- }
- }
-
- return map;
- }
-
public void removeObsoletePendingRanges()
{
Multimap<InetAddress, Range> ranges = getAddressRanges();
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=834945&r1=834944&r2=834945&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Wed Nov 11 16:23:41 2009
@@ -396,34 +396,38 @@
private Multimap<Range, InetAddress> getChangedRangesForLeaving(InetAddress endpoint)
{
- Multimap<Range, InetAddress> newRangeAddresses = replicationStrategy_.getRangeAddressesAfterLeaving(endpoint);
+ // First get all ranges the leaving endpoint is responsible for
+ Collection<Range> ranges = getRangesForEndPoint(endpoint);
+
if (logger_.isDebugEnabled())
- logger_.debug("leaving node ranges are [" + StringUtils.join(newRangeAddresses.keySet(), ", ") + "]");
+ logger_.debug("leaving node ranges are [" + StringUtils.join(ranges, ", ") + "]");
+
+ Map<Range, ArrayList<InetAddress>> currentReplicaEndpoints = new HashMap<Range, ArrayList<InetAddress>>();
+
+ // Find (for each range) all nodes that store replicas for these ranges as well
+ for (Range range : ranges)
+ currentReplicaEndpoints.put(range, replicationStrategy_.getNaturalEndpoints(range.right(), tokenMetadata_));
+
+ TokenMetadata temp = tokenMetadata_.cloneWithoutPending();
+ temp.removeEndpoint(endpoint);
+
Multimap<Range, InetAddress> changedRanges = HashMultimap.create();
- for (final Range range : newRangeAddresses.keySet())
+
+ // Go through the ranges and for each range check who will be
+ // storing replicas for these ranges when the leaving endpoint
+ // is gone. Whoever is present in newReplicaEndpoins list, but
+ // not in the currentReplicaEndpoins list, will be needing the
+ // range.
+ for (Range range : ranges)
{
+ ArrayList<InetAddress> newReplicaEndpoints = replicationStrategy_.getNaturalEndpoints(range.right(), temp);
+ newReplicaEndpoints.removeAll(currentReplicaEndpoints.get(range));
if (logger_.isDebugEnabled())
- logger_.debug("considering Range " + range);
- for (InetAddress newEndpoint : newRangeAddresses.get(range))
- {
- boolean alreadyReplicatesRange = false;
- for (Range existingRange : getRangesForEndPoint(newEndpoint))
- {
- if (existingRange.contains(range))
- {
- alreadyReplicatesRange = true;
- break;
- }
- }
- if (!alreadyReplicatesRange)
- {
- if (logger_.isDebugEnabled())
- logger_.debug(newEndpoint + " needs pendingrange " + range);
- changedRanges.put(range, newEndpoint);
- }
- }
+ logger_.debug("adding pending range " + range + " to endpoints " + StringUtils.join(newReplicaEndpoints, ", "));
+ changedRanges.putAll(range, newReplicaEndpoints);
}
- return changedRanges;
+
+ return changedRanges;
}
private void updateLeavingRanges(final InetAddress endpoint)