You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ad...@apache.org on 2021/02/01 17:42:47 UTC

[cassandra] 01/01: Merge branch 'cassandra-2.2' into cassandra-3.0

This is an automated email from the ASF dual-hosted git repository.

adelapena pushed a commit to branch cassandra-3.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 08be5e0c54c84e2828a91ae060c88fb2ebc9354f
Merge: f35ab19 d3e48e4
Author: Andrés de la Peña <a....@gmail.com>
AuthorDate: Mon Feb 1 17:23:37 2021 +0000

    Merge branch 'cassandra-2.2' into cassandra-3.0
    
    # Conflicts:
    #	CHANGES.txt
    #	src/java/org/apache/cassandra/locator/TokenMetadata.java

 CHANGES.txt                                        |  2 ++
 .../apache/cassandra/locator/TokenMetadata.java    | 40 ++++++++++++++++++----
 .../cassandra/locator/TokenMetadataTest.java       | 24 +++++++++++++
 3 files changed, 59 insertions(+), 7 deletions(-)

diff --cc CHANGES.txt
index 37ddf28,36a244a..da8ceaa
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,24 -1,5 +1,26 @@@
 -2.2.20
 +3.0.25:
++Merged from 2.2:
+  * Make TokenMetadata's ring version increments atomic (CASSANDRA-16286)
 +
 +
 +3.0.24:
 + * Prevent unbounded number of pending flushing tasks; Add PendingFlushTasks metric (CASSANDRA-16261)
 + * Improve empty hint file handling during startup (CASSANDRA-16162)
 + * Allow empty string in collections with COPY FROM in cqlsh (CASSANDRA-16372)
 + * Fix skipping on pre-3.0 created compact storage sstables due to missing primary key liveness (CASSANDRA-16226)
 + * Fix DecimalDeserializer#toString OOM (CASSANDRA-14925)
 + * Extend the exclusion of replica filtering protection to other indices instead of just SASI (CASSANDRA-16311)
 + * Synchronize transaction logs for JBOD (CASSANDRA-16225)
 + * Fix the counting of cells per partition (CASSANDRA-16259)
 + * Fix serial read/non-applying CAS linearizability (CASSANDRA-12126)
 + * Avoid potential NPE in JVMStabilityInspector (CASSANDRA-16294)
 + * Improved check of num_tokens against the length of initial_token (CASSANDRA-14477)
 + * Fix a race condition on ColumnFamilyStore and TableMetrics (CASSANDRA-16228)
 + * Remove the SEPExecutor blocking behavior (CASSANDRA-16186)
 + * Wait for schema agreement when bootstrapping (CASSANDRA-15158)
 + * Fix invalid cell value skipping when reading from disk (CASSANDRA-16223)
 + * Prevent invoking enable/disable gossip when not in NORMAL (CASSANDRA-16146)
 +Merged from 2.2:
   * Remove OpenJDK log warning (CASSANDRA-15563)
   * Fix the histogram merge of the table metrics (CASSANDRA-16259)
  
diff --cc src/java/org/apache/cassandra/locator/TokenMetadata.java
index 3978eeb,44eb925..da5f5e3
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@@ -26,7 -26,9 +26,9 @@@ import java.util.concurrent.atomic.Atom
  import java.util.concurrent.locks.ReadWriteLock;
  import java.util.concurrent.locks.ReentrantReadWriteLock;
  
+ import javax.annotation.concurrent.GuardedBy;
+ 
 -import com.google.common.base.Optional;
 +import com.google.common.annotations.VisibleForTesting;
  import com.google.common.collect.*;
  import org.apache.commons.lang3.StringUtils;
  import org.slf4j.Logger;
@@@ -495,9 -465,8 +498,9 @@@ public class TokenMetadat
          try
          {
              logger.info("Updating topology for {}", endpoint);
 -            topology.updateEndpoint(endpoint);
 +            topology = topology.unbuild().updateEndpoint(endpoint).build();
-             invalidateCachedRings();
+             invalidateCachedRingsUnsafe();
 +            return topology;
          }
          finally
          {
@@@ -515,9 -484,8 +518,9 @@@
          try
          {
              logger.info("Updating topology for all endpoints that have changed");
 -            topology.updateEndpoints();
 +            topology = topology.unbuild().updateEndpoints().build();
-             invalidateCachedRings();
+             invalidateCachedRingsUnsafe();
 +            return topology;
          }
          finally
          {
@@@ -1133,8 -1090,8 +1136,8 @@@
              pendingRanges.clear();
              movingEndpoints.clear();
              sortedTokens.clear();
 -            topology.clear();
 +            topology = Topology.empty();
-             invalidateCachedRings();
+             invalidateCachedRingsUnsafe();
          }
          finally
          {
diff --cc test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
index dab7082,6cd5180..0ec8eeb
--- a/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
+++ b/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
@@@ -21,8 -22,10 +21,11 @@@ import java.net.InetAddress
  import java.net.UnknownHostException;
  import java.util.ArrayList;
  import java.util.Map;
+ import java.util.concurrent.ExecutorService;
+ import java.util.concurrent.Executors;
+ import java.util.concurrent.TimeUnit;
  
 +import com.google.common.collect.ImmutableMultimap;
  import com.google.common.collect.Iterators;
  import com.google.common.collect.Multimap;
  
@@@ -68,6 -70,33 +71,27 @@@ public class TokenMetadataTes
              assertEquals("Mismatch at index " + i + ": " + actual, token(expected[i]), actual.get(i));
      }
  
+     /**
+      * This test is very likely (but not guaranteed) to fail if ring invalidations are ever allowed to interleave.
+      */
+     @Test
+     public void testConcurrentInvalidation() throws InterruptedException
+     {
+         long startVersion = tmd.getRingVersion();
+ 
+         ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);
+         
+         int invalidations = 1024;
+         
+         for (int i = 0; i < invalidations; i++)
 -            pool.execute(new Runnable()
 -            {
 -                public void run()
 -                {
 -                    tmd.invalidateCachedRings();
 -                }
 -            });
++            pool.execute(() -> tmd.invalidateCachedRings());
+ 
+         pool.shutdown();
+         
+         assertTrue(pool.awaitTermination(30, TimeUnit.SECONDS));
+         assertEquals(invalidations + startVersion, tmd.getRingVersion());
+     }
+ 
      @Test
      public void testRingIterator()
      {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org