Merge branch 'cassandra-2.1' into trunk
Conflicts:
src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
src/java/org/apache/cassandra/service/ScheduledRangeTransferExecutorService.java
test/unit/org/apache/cassandra/service/RelocateTest.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/4626fc43
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/4626fc43
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/4626fc43
Branch: refs/heads/trunk
Commit: 4626fc439572a4dc93f1b809929175d0b099763e
Parents: 57cecd9 6554bcc
Author: Brandon Williams <[email protected]>
Authored: Wed Jul 30 11:59:56 2014 -0500
Committer: Brandon Williams <[email protected]>
Committed: Wed Jul 30 11:59:56 2014 -0500
----------------------------------------------------------------------
CHANGES.txt | 1 +
NEWS.txt | 3 +
debian/cassandra.install | 1 -
.../apache/cassandra/gms/VersionedValue.java | 7 -
.../apache/cassandra/locator/TokenMetadata.java | 102 +--
.../cassandra/net/MessageDeliveryTask.java | 2 +-
.../org/apache/cassandra/net/MessageIn.java | 2 +-
.../service/PendingRangeCalculatorService.java | 73 +-
.../cassandra/service/StorageService.java | 149 +---
.../cassandra/service/StorageServiceMBean.java | 10 -
.../org/apache/cassandra/tools/NodeProbe.java | 5 -
.../org/apache/cassandra/tools/NodeTool.java | 21 -
.../org/apache/cassandra/tools/Shuffle.java | 722 -------------------
13 files changed, 80 insertions(+), 1018 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/CHANGES.txt
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/NEWS.txt
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
----------------------------------------------------------------------
diff --cc
src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
index 2276c4a,063633f..d3aa6b6
--- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
+++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
@@@ -96,6 -117,77 +96,77 @@@ public class PendingRangeCalculatorServ
// public & static for testing purposes
public static void calculatePendingRanges(AbstractReplicationStrategy
strategy, String keyspaceName)
{
-
StorageService.instance.getTokenMetadata().calculatePendingRanges(strategy,
keyspaceName);
+ TokenMetadata tm = StorageService.instance.getTokenMetadata();
+ Multimap<Range<Token>, InetAddress> pendingRanges =
HashMultimap.create();
+ BiMultiValMap<Token, InetAddress> bootstrapTokens =
tm.getBootstrapTokens();
+ Set<InetAddress> leavingEndpoints = tm.getLeavingEndpoints();
+
+ if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() &&
tm.getMovingEndpoints().isEmpty())
+ {
+ if (logger.isDebugEnabled())
- logger.debug("No bootstrapping, leaving or moving nodes, and
no relocating tokens -> empty pending ranges for {}", keyspaceName);
++ logger.debug("No bootstrapping, leaving or moving nodes ->
empty pending ranges for {}", keyspaceName);
+ tm.setPendingRanges(keyspaceName, pendingRanges);
+ return;
+ }
+
+ Multimap<InetAddress, Range<Token>> addressRanges =
strategy.getAddressRanges();
+
+ // Copy of metadata reflecting the situation after all leave
operations are finished.
+ TokenMetadata allLeftMetadata = tm.cloneAfterAllLeft();
+
+ // get all ranges that will be affected by leaving nodes
+ Set<Range<Token>> affectedRanges = new HashSet<Range<Token>>();
+ for (InetAddress endpoint : leavingEndpoints)
+ affectedRanges.addAll(addressRanges.get(endpoint));
+
+ // for each of those ranges, find what new nodes will be responsible
for the range when
+ // all leaving nodes are gone.
+ for (Range<Token> range : affectedRanges)
+ {
+ Set<InetAddress> currentEndpoints =
ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right,
tm.cloneOnlyTokenMap()));
+ Set<InetAddress> newEndpoints =
ImmutableSet.copyOf(strategy.calculateNaturalEndpoints(range.right,
allLeftMetadata));
+ pendingRanges.putAll(range, Sets.difference(newEndpoints,
currentEndpoints));
+ }
+
+ // At this stage pendingRanges has been updated according to leave
operations. We can
+ // now continue the calculation by checking bootstrapping nodes.
+
+ // For each of the bootstrapping nodes, simply add and remove them
one by one to
+ // allLeftMetadata and check in between what their ranges would be.
+ Multimap<InetAddress, Token> bootstrapAddresses =
bootstrapTokens.inverse();
+ for (InetAddress endpoint : bootstrapAddresses.keySet())
+ {
+ Collection<Token> tokens = bootstrapAddresses.get(endpoint);
+
+ allLeftMetadata.updateNormalTokens(tokens, endpoint);
+ for (Range<Token> range :
strategy.getAddressRanges(allLeftMetadata).get(endpoint))
+ pendingRanges.put(range, endpoint);
+ allLeftMetadata.removeEndpoint(endpoint);
+ }
+
+ // At this stage pendingRanges has been updated according to leaving
and bootstrapping nodes.
+ // We can now finish the calculation by checking moving and
relocating nodes.
+
+ // For each of the moving nodes, we do the same thing we did for
bootstrapping:
+ // simply add and remove them one by one to allLeftMetadata and check
in between what their ranges would be.
+ for (Pair<Token, InetAddress> moving : tm.getMovingEndpoints())
+ {
+ InetAddress endpoint = moving.right; // address of the moving node
+
+ // moving.left is a new token of the endpoint
+ allLeftMetadata.updateNormalToken(moving.left, endpoint);
+
+ for (Range<Token> range :
strategy.getAddressRanges(allLeftMetadata).get(endpoint))
+ {
+ pendingRanges.put(range, endpoint);
+ }
+
+ allLeftMetadata.removeEndpoint(endpoint);
+ }
+
+ tm.setPendingRanges(keyspaceName, pendingRanges);
+
+ if (logger.isDebugEnabled())
+ logger.debug("Pending ranges:\n" + (pendingRanges.isEmpty() ?
"<empty>" : tm.printPendingRanges()));
}
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/src/java/org/apache/cassandra/tools/NodeProbe.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/4626fc43/src/java/org/apache/cassandra/tools/NodeTool.java
----------------------------------------------------------------------