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
----------------------------------------------------------------------

Reply via email to