adelapena commented on a change in pull request #870:
URL: https://github.com/apache/cassandra/pull/870#discussion_r566899298



##########
File path: src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocation.java
##########
@@ -134,7 +134,7 @@ SummaryStatistics 
getAllocationRingOwnership(InetAddressAndPort endpoint)
 
     abstract class StrategyAdapter implements 
ReplicationStrategy<InetAddressAndPort>
     {
-        // return true iff the provided endpoint occurs in the same virtual 
token-ring we are allocating for
+        // return true if the provided endpoint occurs in the same virtual 
token-ring we are allocating for

Review comment:
       I think `iff` stands for "if and only if", is it not correct in the 
context?

##########
File path: 
test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
##########
@@ -365,6 +372,31 @@ public void testKeyspace() throws Throwable
         execute("DROP KEYSPACE testXYZ");
     }
 
+    /**
+     *  Test a warning is thrown on create keyspace with a RF > number of 
nodes.
+     */
+    @Test
+    public void testCreateKeyspaceRFgtNodesWarns() throws Throwable
+    {
+        // NTS
+        ClientWarn.instance.captureWarnings();
+        execute("CREATE KEYSPACE testABC WITH replication = {'class' : 
'NetworkTopologyStrategy', '" + DATA_CENTER + "' : 2 }");
+        List<String> warnings = ClientWarn.instance.getWarnings();
+        warnings.removeIf(s -> !s.equals("Your replication factor 2 for 
keyspace testabc is higher than the number of nodes 1 for datacenter 
datacenter1"));

Review comment:
       ```suggestion
           warnings.removeIf(s -> !s.equals("Your replication factor 2 for 
keyspace testabc is higher than the number of nodes 1 for datacenter " + 
DATA_CENTER));
   ```

##########
File path: src/java/org/apache/cassandra/locator/SimpleStrategy.java
##########
@@ -88,6 +92,18 @@ public void validateOptions() throws ConfigurationException
     {
         validateOptionsInternal(configOptions);
         validateReplicationFactor(configOptions.get(REPLICATION_FACTOR));
+
+        int nodeCount = StorageService.instance.getHostIdToEndpoint().size();
+        // nodeCount==0 on many tests
+        if (rf.fullReplicas > nodeCount && nodeCount!=0)

Review comment:
       ```suggestion
           if (rf.fullReplicas > nodeCount && nodeCount != 0)
   ```

##########
File path: 
src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java
##########
@@ -46,6 +48,7 @@
 
     private final KeyspaceAttributes attrs;
     private final boolean ifNotExists;
+    private HashSet<String> clientWarnings = new HashSet<>();

Review comment:
       Nit: could be final
   ```suggestion
       private final HashSet<String> clientWarnings = new HashSet<>();
   ```

##########
File path: src/java/org/apache/cassandra/locator/TokenMetadata.java
##########
@@ -1331,6 +1331,23 @@ public EndpointsForToken getWriteEndpoints(Token token, 
String keyspaceName, End
         }
     }
 
+    /**
+     * @return a (stable copy, won't be modified) datacenter to Endpoint map 
for all the nodes in the cluster.
+     */
+    public ImmutableMultimap<String, InetAddressAndPort> 
getDC2AllEndpoints(IEndpointSnitch snitch)
+    {
+        ImmutableMultimap.Builder<String, InetAddressAndPort> dc2Nodesbuilder 
= ImmutableMultimap.builder();
+        HashSet<InetAddressAndPort> nodes = new 
HashSet<InetAddressAndPort>(getAllEndpoints());

Review comment:
       Why is the `Set` returned by `getAllEndpoints` encapsulated in another 
`Set`? Can we just iterate `getAllEndpoints`? Also wondering whether we could 
replace the entire method body by `Multimaps.index(getAllEndpoints(), 
snitch::getDatacenter)`.

##########
File path: src/java/org/apache/cassandra/dht/RangeStreamer.java
##########
@@ -353,9 +361,20 @@ public void addRanges(String keyspaceName, 
ReplicaCollection<?> replicas)
      */
     private boolean useStrictSourcesForRanges(AbstractReplicationStrategy 
strat)
     {
-        return useStrictConsistency
-                && tokens != null
-                && metadata.getSizeOfAllEndpoints() != 
strat.getReplicationFactor().allReplicas;
+        int nodes = 0;
+
+        if (strat instanceof NetworkTopologyStrategy)

Review comment:
       We could evaluate the `useStrictConsistency && tokens != null` part of 
the boolean expression at the beginning of the method, so in some cases 
wouldn't  need to compute `nodes`.  Alternatively, we could encapsulate the 
current calculation of `nodes` in a function, so it would be lazily called from 
the boolean expression.

##########
File path: 
src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java
##########
@@ -56,6 +59,9 @@ public CreateKeyspaceStatement(String keyspaceName, 
KeyspaceAttributes attrs, bo
 
     public Keyspaces apply(Keyspaces schema)
     {
+      if (ClientWarn.instance.get() == null)
+          ClientWarn.instance.captureWarnings();

Review comment:
       Nit: misaligned 
   ```suggestion
           if (ClientWarn.instance.get() == null)
               ClientWarn.instance.captureWarnings();
   ```

##########
File path: 
test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
##########
@@ -365,6 +372,31 @@ public void testKeyspace() throws Throwable
         execute("DROP KEYSPACE testXYZ");
     }
 
+    /**
+     *  Test a warning is thrown on create keyspace with a RF > number of 
nodes.
+     */
+    @Test
+    public void testCreateKeyspaceRFgtNodesWarns() throws Throwable

Review comment:
       Nice test :). Don't we need a call to `requireNetwork()` to make the 
client warnings work when the test is run isolated?

##########
File path: 
src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
##########
@@ -51,7 +51,6 @@
 {
     private static final Logger logger = 
LoggerFactory.getLogger(AbstractReplicationStrategy.class);
 
-    @VisibleForTesting

Review comment:
       I think `keyspaceName` could be protected




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to