Repository: cassandra Updated Branches: refs/heads/trunk 9b0adf229 -> 7863bd3bf
Fix wrong rack counting and invalid conditions check for TokenAllocation Patch by Branimir Lambov; reviewed by Tyler Hobbs for CASSANDRA-11139 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2954b183 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2954b183 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2954b183 Branch: refs/heads/trunk Commit: 2954b18354b0b3952e40276013852f31c61bb6ff Parents: 1f62608 Author: Branimir Lambov <[email protected]> Authored: Wed Feb 10 17:37:41 2016 -0600 Committer: Tyler Hobbs <[email protected]> Committed: Wed Feb 10 17:37:41 2016 -0600 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../dht/tokenallocator/TokenAllocation.java | 4 +- .../apache/cassandra/dht/BootStrapperTest.java | 62 +++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2954b183/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 6cc6368..d5ad5d3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 3.0.4 + * Fix wrong rack counting and invalid conditions check for TokenAllocation + (CASSANDRA-11139) * Avoid creating empty hint files (CASSANDRA-11090) * Fix leak detection strong reference loop using weak reference (CASSANDRA-11120) * Configurie BatchlogManager to stop delayed tasks on shutdown (CASSANDRA-11062) http://git-wip-us.apache.org/repos/asf/cassandra/blob/2954b183/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java index b4281ce..e715ff6 100644 --- a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java +++ b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java @@ -199,9 +199,9 @@ public class TokenAllocation final int replicas = rs.getReplicationFactor(dc); Topology topology = tokenMetadata.getTopology(); - int racks = topology.getDatacenterRacks().get(dc).size(); + int racks = topology.getDatacenterRacks().get(dc).asMap().size(); - if (replicas >= racks) + if (racks >= replicas) { return new StrategyAdapter() { http://git-wip-us.apache.org/repos/asf/cassandra/blob/2954b183/test/unit/org/apache/cassandra/dht/BootStrapperTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java index 9b1fa01..fbef538 100644 --- a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java +++ b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java @@ -46,7 +46,10 @@ import org.apache.cassandra.dht.tokenallocator.TokenAllocation; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.gms.IFailureDetectionEventListener; import org.apache.cassandra.gms.IFailureDetector; +import org.apache.cassandra.locator.IEndpointSnitch; +import org.apache.cassandra.locator.RackInferringSnitch; import org.apache.cassandra.locator.TokenMetadata; +import org.apache.cassandra.schema.KeyspaceParams; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.FBUtilities; @@ -135,12 +138,17 @@ public class BootStrapperTest private void generateFakeEndpoints(TokenMetadata tmd, int numOldNodes, int numVNodes) throws UnknownHostException { tmd.clearUnsafe(); + generateFakeEndpoints(tmd, numOldNodes, numVNodes, "0", "0"); + } + + private void generateFakeEndpoints(TokenMetadata tmd, int numOldNodes, int numVNodes, String dc, String rack) throws UnknownHostException + { IPartitioner p = tmd.partitioner; for (int i = 1; i <= numOldNodes; i++) { // leave .1 for myEndpoint - InetAddress addr = InetAddress.getByName("127.0.0." + (i + 1)); + InetAddress addr = InetAddress.getByName("127." + dc + "." + rack + "." + (i + 1)); List<Token> tokens = Lists.newArrayListWithCapacity(numVNodes); for (int j = 0; j < numVNodes; ++j) tokens.add(p.getRandomToken()); @@ -160,6 +168,58 @@ public class BootStrapperTest allocateTokensForNode(vn, ks, tm, addr); } + public void testAllocateTokensNetworkStrategy(int rackCount, int replicas) throws UnknownHostException + { + IEndpointSnitch oldSnitch = DatabaseDescriptor.getEndpointSnitch(); + try + { + DatabaseDescriptor.setEndpointSnitch(new RackInferringSnitch()); + int vn = 16; + String ks = "BootStrapperTestNTSKeyspace" + rackCount + replicas; + String dc = "1"; + SchemaLoader.createKeyspace(ks, KeyspaceParams.nts(dc, replicas, "15", 15), SchemaLoader.standardCFMD(ks, "Standard1")); + TokenMetadata tm = new TokenMetadata(); + tm.clearUnsafe(); + for (int i = 0; i < rackCount; ++i) + generateFakeEndpoints(tm, 10, vn, dc, Integer.toString(i)); + InetAddress addr = InetAddress.getByName("127." + dc + ".0.99"); + allocateTokensForNode(vn, ks, tm, addr); + // Note: Not matching replication factor in second datacentre, but this should not affect us. + } finally { + DatabaseDescriptor.setEndpointSnitch(oldSnitch); + } + } + + @Test + public void testAllocateTokensNetworkStrategyOneRack() throws UnknownHostException + { + testAllocateTokensNetworkStrategy(1, 3); + } + + @Test(expected = ConfigurationException.class) + public void testAllocateTokensNetworkStrategyTwoRacks() throws UnknownHostException + { + testAllocateTokensNetworkStrategy(2, 3); + } + + @Test + public void testAllocateTokensNetworkStrategyThreeRacks() throws UnknownHostException + { + testAllocateTokensNetworkStrategy(3, 3); + } + + @Test + public void testAllocateTokensNetworkStrategyFiveRacks() throws UnknownHostException + { + testAllocateTokensNetworkStrategy(5, 3); + } + + @Test + public void testAllocateTokensNetworkStrategyOneRackOneReplica() throws UnknownHostException + { + testAllocateTokensNetworkStrategy(1, 1); + } + private void allocateTokensForNode(int vn, String ks, TokenMetadata tm, InetAddress addr) { SummaryStatistics os = TokenAllocation.replicatedOwnershipStats(tm, Keyspace.open(ks).getReplicationStrategy(), addr);
