Skip to content

Commit 64079de

Browse files
committed
Merge pull request apache#525 from datastax/java989
JAVA-989: Include keyspace name when invalid replication found.
2 parents 8f81e8f + de89751 commit 64079de

5 files changed

Lines changed: 40 additions & 28 deletions

File tree

changelog/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
- [bug] JAVA-983: QueryBuilder cannot handle collections containing function calls.
77
- [improvement] JAVA-863: Idempotence propagation in PreparedStatements.
88
- [bug] JAVA-937: TypeCodec static initializers not always correctly executed.
9+
- [improvement] JAVA-989: Include keyspace name when invalid replication found when generating token map.
10+
- [improvement] JAVA-664: Reduce heap consumption for TokenMap.
911

1012
Merged from 2.0 branch:
1113

driver-core/src/main/java/com/datastax/driver/core/Metadata.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -745,13 +745,18 @@ public static TokenMap build(Token.Factory factory, Map<Host, Collection<String>
745745
Set<TokenRange> tokenRanges = makeTokenRanges(ring, factory);
746746

747747
Map<String, Map<Token, Set<Host>>> tokenToHosts = new HashMap<String, Map<Token, Set<Host>>>();
748+
Map<ReplicationStrategy, Map<Token, Set<Host>>> replStrategyToHosts = new HashMap<ReplicationStrategy, Map<Token, Set<Host>>>();
748749
Map<String, Map<Host, Set<TokenRange>>> hostsToRanges = new HashMap<String, Map<Host, Set<TokenRange>>>();
749750
for (KeyspaceMetadata keyspace : keyspaces)
750751
{
751752
ReplicationStrategy strategy = keyspace.replicationStrategy();
752-
Map<Token, Set<Host>> ksTokens = (strategy == null)
753-
? makeNonReplicatedMap(tokenToPrimary)
754-
: strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
753+
Map<Token, Set<Host>> ksTokens = replStrategyToHosts.get(strategy);
754+
if (ksTokens == null) {
755+
ksTokens = (strategy == null)
756+
? makeNonReplicatedMap(tokenToPrimary)
757+
: strategy.computeTokenToReplicaMap(keyspace.getName(), tokenToPrimary, ring);
758+
replStrategyToHosts.put(strategy, ksTokens);
759+
}
755760

756761
tokenToHosts.put(keyspace.getName(), ksTokens);
757762

driver-core/src/main/java/com/datastax/driver/core/ReplicationStategy.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static ReplicationStrategy create(Map<String, String> replicationOptions) {
6060
}
6161
}
6262

63-
abstract Map<Token, Set<Host>> computeTokenToReplicaMap(Map<Token, Host> tokenToPrimary, List<Token> ring);
63+
abstract Map<Token, Set<Host>> computeTokenToReplicaMap(String keyspaceName, Map<Token, Host> tokenToPrimary, List<Token> ring);
6464

6565
private static Token getTokenWrapping(int i, List<Token> ring) {
6666
return ring.get(i % ring.size());
@@ -74,7 +74,7 @@ private SimpleStrategy(int replicationFactor) {
7474
this.replicationFactor = replicationFactor;
7575
}
7676

77-
Map<Token, Set<Host>> computeTokenToReplicaMap(Map<Token, Host> tokenToPrimary, List<Token> ring) {
77+
Map<Token, Set<Host>> computeTokenToReplicaMap(String keyspaceName, Map<Token, Host> tokenToPrimary, List<Token> ring) {
7878

7979
int rf = Math.min(replicationFactor, ring.size());
8080

@@ -117,7 +117,7 @@ private NetworkTopologyStrategy(Map<String, Integer> replicationFactors) {
117117
this.replicationFactors = replicationFactors;
118118
}
119119

120-
Map<Token, Set<Host>> computeTokenToReplicaMap(Map<Token, Host> tokenToPrimary, List<Token> ring) {
120+
Map<Token, Set<Host>> computeTokenToReplicaMap(String keyspaceName, Map<Token, Host> tokenToPrimary, List<Token> ring) {
121121

122122
// This is essentially a copy of org.apache.cassandra.locator.NetworkTopologyStrategy
123123
Map<String, Set<String>> racks = getRacksInDcs(tokenToPrimary.values());
@@ -189,10 +189,10 @@ Map<Token, Set<Host>> computeTokenToReplicaMap(Map<Token, Host> tokenToPrimary,
189189
int expectedFactor = replicationFactors.get(dcName);
190190
int achievedFactor = entry.getValue().size();
191191
if (achievedFactor < expectedFactor && !warnedDcs.contains(dcName)) {
192-
logger.warn("Error while computing token map for datacenter {}: "
192+
logger.warn("Error while computing token map for keyspace {} with datacenter {}: "
193193
+ "could not achieve replication factor {} (found {} replicas only), "
194194
+ "check your keyspace replication settings.",
195-
dcName, expectedFactor, achievedFactor);
195+
keyspaceName, dcName, expectedFactor, achievedFactor);
196196
// only warn once per DC
197197
warnedDcs.add(dcName);
198198
}

driver-core/src/test/java/com/datastax/driver/core/NetworkTopologyStrategyTest.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ private static ReplicationStrategy networkTopologyStrategy(ReplicationFactorDefi
109109

110110
private static final List<Token> largeRing = Lists.newArrayList();
111111
private static final Map<Token, Host> largeRingTokenToPrimary = Maps.newHashMap();
112+
113+
private static final String keyspace = "Excelsior";
114+
112115
static {
113116
for (int i = 0; i < 100; i++) {
114117
InetSocketAddress address = socketAddress("127.0.0." + i);
@@ -186,7 +189,7 @@ public void networkTopologyWithSimpleDCLayoutTest1() {
186189

187190
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 1), rf(DC2, 1));
188191

189-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
192+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
190193

191194
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2);
192195
assertReplicaPlacement(replicaMap, TOKEN04, IP2, IP1);
@@ -220,7 +223,7 @@ public void networkTopologyWithSimpleDCLayoutTest2() {
220223

221224
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 1), rf(DC2, 1));
222225

223-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
226+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
224227

225228
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2);
226229
assertReplicaPlacement(replicaMap, TOKEN03, IP2, IP3);
@@ -254,7 +257,7 @@ public void networkTopologyWithSimple3DCLayoutTest() {
254257

255258
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 1), rf(DC2, 1), rf(DC3, 1));
256259

257-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
260+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
258261

259262
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2, IP3);
260263
assertReplicaPlacement(replicaMap, TOKEN05, IP2, IP3, IP1);
@@ -294,7 +297,7 @@ public void networkTopologyWithUnbalancedRingTest() {
294297

295298
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 2), rf(DC2, 2));
296299

297-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
300+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
298301

299302
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2, IP3, IP4);
300303
assertReplicaPlacement(replicaMap, TOKEN03, IP1, IP2, IP3, IP4);
@@ -350,7 +353,7 @@ public void networkTopologyWithDCMultirackLayoutTest() {
350353

351354
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 2), rf(DC2, 2));
352355

353-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
356+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
354357

355358
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2, IP3, IP4);
356359
assertReplicaPlacement(replicaMap, TOKEN02, IP2, IP3, IP4, IP5);
@@ -414,7 +417,7 @@ public void networkTopologyWithMultirackHostSkippingTest1() {
414417

415418
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 3), rf(DC2, 3));
416419

417-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
420+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
418421

419422
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2, IP5, IP3, IP6, IP4);
420423
assertReplicaPlacement(replicaMap, TOKEN02, IP2, IP3, IP5, IP6, IP4, IP7);
@@ -477,7 +480,7 @@ public void networkTopologyWithMultirackHostSkippingTest2() {
477480

478481
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 3), rf(DC2, 3));
479482

480-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
483+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
481484

482485
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP3, IP2, IP6, IP4);
483486
assertReplicaPlacement(replicaMap, TOKEN02, IP1, IP5, IP3, IP2, IP6, IP4);
@@ -541,7 +544,7 @@ public void networkTopologyWithMultirackHostSkippingTest3() {
541544
//all nodes will contain all data, question is the replica order
542545
ReplicationStrategy strategy = networkTopologyStrategy(rf(DC1, 4), rf(DC2, 4));
543546

544-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
547+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
545548

546549
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP3, IP7, IP2, IP6, IP4, IP8);
547550
assertReplicaPlacement(replicaMap, TOKEN02, IP1, IP5, IP3, IP7, IP2, IP6, IP4, IP8);
@@ -563,7 +566,7 @@ public void networkTopologyWithMultirackHostSkippingTest3() {
563566

564567
@Test(groups = "unit")
565568
public void networkTopologyStrategyExampleTopologyTest() {
566-
Map<Token, Set<Host>> replicaMap = exampleStrategy.computeTokenToReplicaMap(exampleTokenToPrimary, exampleRing);
569+
Map<Token, Set<Host>> replicaMap = exampleStrategy.computeTokenToReplicaMap(keyspace, exampleTokenToPrimary, exampleRing);
567570

568571
//105 and 106 will appear as replica for all as they're in separate racks
569572
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP2, IP6);
@@ -590,7 +593,7 @@ public void networkTopologyStrategyExampleTopologyTest() {
590593
public void networkTopologyStrategyNoNodesInDCTest() {
591594
long t1 = System.currentTimeMillis();
592595
Map<Token, Set<Host>> replicaMap = networkTopologyStrategy(rf(DC1, 2), rf(DC2, 2))
593-
.computeTokenToReplicaMap(largeRingTokenToPrimary, largeRing);
596+
.computeTokenToReplicaMap(keyspace, largeRingTokenToPrimary, largeRing);
594597
assertThat(System.currentTimeMillis() - t1).isLessThan(10000);
595598

596599
InetSocketAddress currNode = null;
@@ -612,7 +615,7 @@ public void networkTopologyStrategyNoNodesInDCTest() {
612615

613616
@Test(groups = "unit")
614617
public void networkTopologyStrategyExampleTopologyTooManyReplicasTest() {
615-
Map<Token, Set<Host>> replicaMap = exampleStrategyTooManyReplicas.computeTokenToReplicaMap(exampleTokenToPrimary, exampleRing);
618+
Map<Token, Set<Host>> replicaMap = exampleStrategyTooManyReplicas.computeTokenToReplicaMap(keyspace, exampleTokenToPrimary, exampleRing);
616619

617620
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP3, IP2, IP6, IP4);
618621
assertReplicaPlacement(replicaMap, TOKEN02, IP1, IP5, IP3, IP2, IP6, IP4);
@@ -657,15 +660,15 @@ public void should_warn_if_replication_factor_cannot_be_met() {
657660

658661
// Wrong configuration: impossible replication factor for DC2
659662
networkTopologyStrategy(rf(DC1, 2), rf(DC2, 3))
660-
.computeTokenToReplicaMap(tokenToPrimary, ring);
663+
.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
661664
assertThat(logs.getNext())
662-
.contains("Error while computing token map for datacenter DC2");
665+
.contains(String.format("Error while computing token map for keyspace %s with datacenter %s", keyspace, DC2));
663666

664667
// Wrong configuration: non-existing datacenter
665668
networkTopologyStrategy(rf(DC1, 2), rf("does_not_exist", 2))
666-
.computeTokenToReplicaMap(tokenToPrimary, ring);
669+
.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
667670
assertThat(logs.getNext())
668-
.contains("Error while computing token map for datacenter does_not_exist");
671+
.contains(String.format("Error while computing token map for keyspace %s with datacenter %s", keyspace, "does_not_exist"));
669672

670673
logger.setLevel(null);
671674
logger.removeAppender(logs);

driver-core/src/test/java/com/datastax/driver/core/SimpleStrategyTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ private static ReplicationStrategy simpleStrategy(int replicationFactor) {
114114
.put(TOKEN18, host(IP6))
115115
.build();
116116

117+
private static final String keyspace = "excalibur";
118+
117119
/*
118120
* --------------
119121
* Tests
@@ -138,7 +140,7 @@ public void simpleStrategySimpleTopologyTest() {
138140

139141
ReplicationStrategy strategy = simpleStrategy(2);
140142

141-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
143+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
142144

143145
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2);
144146
assertReplicaPlacement(replicaMap, TOKEN06, IP2, IP1);
@@ -164,7 +166,7 @@ public void simpleStrategyConsecutiveRingSectionsTest() {
164166

165167
ReplicationStrategy strategy = simpleStrategy(2);
166168

167-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
169+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
168170

169171
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2);
170172
assertReplicaPlacement(replicaMap, TOKEN06, IP1, IP2);
@@ -190,7 +192,7 @@ public void simpleStrategyUnbalancedRingTest() {
190192

191193
ReplicationStrategy strategy = simpleStrategy(2);
192194

193-
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(tokenToPrimary, ring);
195+
Map<Token, Set<Host>> replicaMap = strategy.computeTokenToReplicaMap(keyspace, tokenToPrimary, ring);
194196

195197
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP2);
196198
assertReplicaPlacement(replicaMap, TOKEN06, IP1, IP2);
@@ -200,7 +202,7 @@ public void simpleStrategyUnbalancedRingTest() {
200202

201203
@Test(groups = "unit")
202204
public void simpleStrategyExampleTopologyMapTest() {
203-
Map<Token, Set<Host>> replicaMap = exampleStrategy.computeTokenToReplicaMap(exampleTokenToPrimary, exampleRing);
205+
Map<Token, Set<Host>> replicaMap = exampleStrategy.computeTokenToReplicaMap(keyspace, exampleTokenToPrimary, exampleRing);
204206

205207
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP3);
206208
assertReplicaPlacement(replicaMap, TOKEN02, IP1, IP5, IP3);
@@ -224,7 +226,7 @@ public void simpleStrategyExampleTopologyMapTest() {
224226

225227
@Test(groups = "unit")
226228
public void simpleStrategyExampleTopologyTooManyReplicasTest() {
227-
Map<Token, Set<Host>> replicaMap = exampleStrategyTooManyReplicas.computeTokenToReplicaMap(exampleTokenToPrimary, exampleRing);
229+
Map<Token, Set<Host>> replicaMap = exampleStrategyTooManyReplicas.computeTokenToReplicaMap(keyspace, exampleTokenToPrimary, exampleRing);
228230

229231
assertReplicaPlacement(replicaMap, TOKEN01, IP1, IP5, IP3, IP2, IP6, IP4);
230232
assertReplicaPlacement(replicaMap, TOKEN02, IP1, IP5, IP3, IP2, IP6, IP4);

0 commit comments

Comments
 (0)