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

absurdfarce pushed a commit to branch 4.x
in repository https://gitbox.apache.org/repos/asf/cassandra-java-driver.git


The following commit(s) were added to refs/heads/4.x by this push:
     new 432e107bc CASSANDRA-19635: Run integration tests with C* 5.x
432e107bc is described below

commit 432e107bc6a2dda19385b7c423d2768e3a879965
Author: Lukasz Antoniak <[email protected]>
AuthorDate: Thu May 16 14:13:05 2024 +0200

    CASSANDRA-19635: Run integration tests with C* 5.x
    
    patch by Lukasz Antoniak; reviewed by Andy Tolbert, and Bret McGuire for 
CASSANDRA-19635
---
 integration-tests/pom.xml                          |  3 +
 .../api/core/auth/DseProxyAuthenticationIT.java    | 60 ++++++++++--------
 .../oss/driver/core/cql/AsyncResultSetIT.java      | 18 +++---
 .../oss/driver/core/cql/BatchStatementIT.java      | 18 +++---
 .../oss/driver/core/cql/BoundStatementCcmIT.java   | 73 ++++++++++++----------
 .../driver/core/cql/ExecutionInfoWarningsIT.java   | 17 +++--
 .../oss/driver/core/cql/PagingStateIT.java         | 14 +++--
 .../oss/driver/core/cql/PerRequestKeyspaceIT.java  | 60 ++++++++++--------
 .../core/cql/PreparedStatementCachingIT.java       | 49 +++++++++++----
 .../cql/reactive/DefaultReactiveResultSetIT.java   | 32 +++++-----
 .../oss/driver/core/metadata/DescribeIT.java       | 23 ++++---
 .../oss/driver/core/metadata/SchemaIT.java         | 14 +++++
 .../core/type/codec/registry/CodecRegistryIT.java  | 63 ++++++++++---------
 .../com/datastax/oss/driver/mapper/DeleteIT.java   |  9 ++-
 .../oss/driver/mapper/DeleteReactiveIT.java        | 18 ++++--
 .../oss/driver/mapper/EntityPolymorphismIT.java    | 38 ++++++-----
 .../oss/driver/mapper/ImmutableEntityIT.java       | 14 +++--
 .../oss/driver/mapper/InventoryITBase.java         |  8 +--
 .../datastax/oss/driver/mapper/NestedUdtIT.java    | 48 +++++++-------
 .../driver/mapper/SelectCustomWhereClauseIT.java   | 14 +++--
 .../oss/driver/mapper/SelectReactiveIT.java        | 14 +++--
 .../com/datastax/oss/driver/mapper/UpdateIT.java   | 21 ++++---
 .../internal/osgi/support/CcmStagedReactor.java    |  2 +-
 pom.xml                                            | 11 ++++
 .../oss/driver/api/testinfra/ccm/BaseCcmRule.java  |  4 +-
 .../oss/driver/api/testinfra/ccm/CcmBridge.java    | 20 +++---
 .../testinfra/ccm/SchemaChangeSynchronizer.java    | 42 +++++++++++++
 .../driver/api/testinfra/session/SessionRule.java  |  6 +-
 28 files changed, 455 insertions(+), 258 deletions(-)

diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 32cabdb34..d1b0a736b 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -242,6 +242,8 @@
               <threadCountClasses>8</threadCountClasses>
               
<summaryFile>${project.build.directory}/failsafe-reports/failsafe-summary-parallelized.xml</summaryFile>
               <skipITs>${skipParallelizableITs}</skipITs>
+              <argLine>${blockhound.argline}</argLine>
+              <jvm>${testing.jvm}/bin/java</jvm>
             </configuration>
           </execution>
           <execution>
@@ -253,6 +255,7 @@
               
<excludedGroups>com.datastax.oss.driver.categories.ParallelizableTests, 
com.datastax.oss.driver.categories.IsolatedTests</excludedGroups>
               
<summaryFile>${project.build.directory}/failsafe-reports/failsafe-summary-serial.xml</summaryFile>
               <skipITs>${skipSerialITs}</skipITs>
+              <argLine>${blockhound.argline}</argLine>
               <jvm>${testing.jvm}/bin/java</jvm>
             </configuration>
           </execution>
diff --git 
a/integration-tests/src/test/java/com/datastax/dse/driver/api/core/auth/DseProxyAuthenticationIT.java
 
b/integration-tests/src/test/java/com/datastax/dse/driver/api/core/auth/DseProxyAuthenticationIT.java
index 126a110da..a3f1c04af 100644
--- 
a/integration-tests/src/test/java/com/datastax/dse/driver/api/core/auth/DseProxyAuthenticationIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/dse/driver/api/core/auth/DseProxyAuthenticationIT.java
@@ -29,6 +29,7 @@ import 
com.datastax.oss.driver.api.core.config.DefaultDriverOption;
 import com.datastax.oss.driver.api.core.cql.ResultSet;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.core.servererrors.UnauthorizedException;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
@@ -57,33 +58,38 @@ public class DseProxyAuthenticationIT {
   @Before
   public void setupRoles() {
 
-    try (CqlSession session = ads.newKeyTabSession()) {
-      session.execute(
-          "CREATE ROLE IF NOT EXISTS alice WITH PASSWORD = 
'fakePasswordForAlice' AND LOGIN = FALSE");
-      session.execute(
-          "CREATE ROLE IF NOT EXISTS ben WITH PASSWORD = 'fakePasswordForBen' 
AND LOGIN = TRUE");
-      session.execute("CREATE ROLE IF NOT EXISTS '[email protected]' WITH 
LOGIN = TRUE");
-      session.execute(
-          "CREATE ROLE IF NOT EXISTS '[email protected]' WITH PASSWORD = 
'fakePasswordForCharlie' AND LOGIN = TRUE");
-      session.execute(
-          "CREATE ROLE IF NOT EXISTS steve WITH PASSWORD = 
'fakePasswordForSteve' AND LOGIN = TRUE");
-      session.execute(
-          "CREATE KEYSPACE IF NOT EXISTS aliceks WITH REPLICATION = 
{'class':'SimpleStrategy', 'replication_factor':'1'}");
-      session.execute(
-          "CREATE TABLE IF NOT EXISTS aliceks.alicetable (key text PRIMARY 
KEY, value text)");
-      session.execute("INSERT INTO aliceks.alicetable (key, value) VALUES 
('hello', 'world')");
-      session.execute("GRANT ALL ON KEYSPACE aliceks TO alice");
-      session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 'ben'");
-      session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'[email protected]'");
-      session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'steve'");
-      session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'[email protected]'");
-      session.execute("GRANT PROXY.LOGIN ON ROLE 'alice' TO 'ben'");
-      session.execute("GRANT PROXY.LOGIN ON ROLE 'alice' TO 
'[email protected]'");
-      session.execute("GRANT PROXY.EXECUTE ON ROLE 'alice' TO 'steve'");
-      session.execute("GRANT PROXY.EXECUTE ON ROLE 'alice' TO 
'[email protected]'");
-      // ben and bob are allowed to login as alice, but not execute as alice.
-      // charlie and steve are allowed to execute as alice, but not login as 
alice.
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          try (CqlSession session = ads.newKeyTabSession()) {
+            session.execute(
+                "CREATE ROLE IF NOT EXISTS alice WITH PASSWORD = 
'fakePasswordForAlice' AND LOGIN = FALSE");
+            session.execute(
+                "CREATE ROLE IF NOT EXISTS ben WITH PASSWORD = 
'fakePasswordForBen' AND LOGIN = TRUE");
+            session.execute("CREATE ROLE IF NOT EXISTS '[email protected]' 
WITH LOGIN = TRUE");
+            session.execute(
+                "CREATE ROLE IF NOT EXISTS '[email protected]' WITH 
PASSWORD = 'fakePasswordForCharlie' AND LOGIN = TRUE");
+            session.execute(
+                "CREATE ROLE IF NOT EXISTS steve WITH PASSWORD = 
'fakePasswordForSteve' AND LOGIN = TRUE");
+            session.execute(
+                "CREATE KEYSPACE IF NOT EXISTS aliceks WITH REPLICATION = 
{'class':'SimpleStrategy', 'replication_factor':'1'}");
+            session.execute(
+                "CREATE TABLE IF NOT EXISTS aliceks.alicetable (key text 
PRIMARY KEY, value text)");
+            session.execute(
+                "INSERT INTO aliceks.alicetable (key, value) VALUES ('hello', 
'world')");
+            session.execute("GRANT ALL ON KEYSPACE aliceks TO alice");
+            session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'ben'");
+            session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'[email protected]'");
+            session.execute("GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'steve'");
+            session.execute(
+                "GRANT EXECUTE ON ALL AUTHENTICATION SCHEMES TO 
'[email protected]'");
+            session.execute("GRANT PROXY.LOGIN ON ROLE 'alice' TO 'ben'");
+            session.execute("GRANT PROXY.LOGIN ON ROLE 'alice' TO 
'[email protected]'");
+            session.execute("GRANT PROXY.EXECUTE ON ROLE 'alice' TO 'steve'");
+            session.execute("GRANT PROXY.EXECUTE ON ROLE 'alice' TO 
'[email protected]'");
+            // ben and bob are allowed to login as alice, but not execute as 
alice.
+            // charlie and steve are allowed to execute as alice, but not 
login as alice.
+          }
+        });
   }
   /**
    * Validates that a connection may be successfully made as user 'alice' 
using the credentials of a
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/AsyncResultSetIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/AsyncResultSetIT.java
index 2d01043b4..e109c2852 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/AsyncResultSetIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/AsyncResultSetIT.java
@@ -29,6 +29,7 @@ import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
 import com.datastax.oss.driver.categories.ParallelizableTests;
@@ -67,13 +68,16 @@ public class AsyncResultSetIT {
   @BeforeClass
   public static void setupSchema() {
     // create table and load data across two partitions so we can test paging 
across tokens.
-    SESSION_RULE
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS test (k0 text, k1 int, v int, 
PRIMARY KEY(k0, k1))")
-                .setExecutionProfile(SESSION_RULE.slowProfile())
-                .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          SESSION_RULE
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test (k0 text, k1 int, v 
int, PRIMARY KEY(k0, k1))")
+                      .setExecutionProfile(SESSION_RULE.slowProfile())
+                      .build());
+        });
 
     PreparedStatement prepared =
         SESSION_RULE.session().prepare("INSERT INTO test (k0, k1, v) VALUES 
(?, ?, ?)");
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BatchStatementIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BatchStatementIT.java
index 04e5798be..8b6526387 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BatchStatementIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BatchStatementIT.java
@@ -34,6 +34,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.core.cql.Statement;
 import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -72,13 +73,16 @@ public class BatchStatementIT {
           "CREATE TABLE counter3 (k0 text PRIMARY KEY, c counter)",
         };
 
-    for (String schemaStatement : schemaStatements) {
-      sessionRule
-          .session()
-          .execute(
-              SimpleStatement.newInstance(schemaStatement)
-                  .setExecutionProfile(sessionRule.slowProfile()));
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String schemaStatement : schemaStatements) {
+            sessionRule
+                .session()
+                .execute(
+                    SimpleStatement.newInstance(schemaStatement)
+                        .setExecutionProfile(sessionRule.slowProfile()));
+          }
+        });
   }
 
   @Test
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BoundStatementCcmIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BoundStatementCcmIT.java
index 79156fcce..9e4b62cd2 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BoundStatementCcmIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/BoundStatementCcmIT.java
@@ -40,6 +40,7 @@ import com.datastax.oss.driver.api.core.cql.Statement;
 import com.datastax.oss.driver.api.core.metadata.token.Token;
 import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -94,40 +95,44 @@ public class BoundStatementCcmIT {
   @Before
   public void setupSchema() {
     // table where every column forms the primary key.
-    sessionRule
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS test (k text, v int, PRIMARY 
KEY(k, v))")
-                .setExecutionProfile(sessionRule.slowProfile())
-                .build());
-    for (int i = 0; i < 100; i++) {
-      sessionRule
-          .session()
-          .execute(
-              SimpleStatement.builder("INSERT INTO test (k, v) VALUES (?, ?)")
-                  .addPositionalValues(KEY, i)
-                  .build());
-    }
-
-    // table with simple primary key, single cell.
-    sessionRule
-        .session()
-        .execute(
-            SimpleStatement.builder("CREATE TABLE IF NOT EXISTS test2 (k text 
primary key, v0 int)")
-                .setExecutionProfile(sessionRule.slowProfile())
-                .build());
-
-    // table with composite partition key
-    sessionRule
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS test3 "
-                        + "(pk1 int, pk2 int, v int, "
-                        + "PRIMARY KEY ((pk1, pk2)))")
-                .setExecutionProfile(sessionRule.slowProfile())
-                .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          sessionRule
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test (k text, v int, 
PRIMARY KEY(k, v))")
+                      .setExecutionProfile(sessionRule.slowProfile())
+                      .build());
+          for (int i = 0; i < 100; i++) {
+            sessionRule
+                .session()
+                .execute(
+                    SimpleStatement.builder("INSERT INTO test (k, v) VALUES 
(?, ?)")
+                        .addPositionalValues(KEY, i)
+                        .build());
+          }
+
+          // table with simple primary key, single cell.
+          sessionRule
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test2 (k text primary 
key, v0 int)")
+                      .setExecutionProfile(sessionRule.slowProfile())
+                      .build());
+
+          // table with composite partition key
+          sessionRule
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test3 "
+                              + "(pk1 int, pk2 int, v int, "
+                              + "PRIMARY KEY ((pk1, pk2)))")
+                      .setExecutionProfile(sessionRule.slowProfile())
+                      .build());
+        });
   }
 
   @Test
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/ExecutionInfoWarningsIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/ExecutionInfoWarningsIT.java
index 5907206d1..edee9723a 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/ExecutionInfoWarningsIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/ExecutionInfoWarningsIT.java
@@ -33,6 +33,7 @@ import com.datastax.oss.driver.api.core.cql.ResultSet;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.core.cql.Statement;
 import com.datastax.oss.driver.api.testinfra.ccm.CustomCcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -88,12 +89,16 @@ public class ExecutionInfoWarningsIT {
   @Before
   public void createSchema() {
     // table with simple primary key, single cell.
-    sessionRule
-        .session()
-        .execute(
-            SimpleStatement.builder("CREATE TABLE IF NOT EXISTS test (k int 
primary key, v text)")
-                .setExecutionProfile(sessionRule.slowProfile())
-                .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          sessionRule
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test (k int primary key, 
v text)")
+                      .setExecutionProfile(sessionRule.slowProfile())
+                      .build());
+        });
     for (int i = 0; i < 100; i++) {
       sessionRule
           .session()
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PagingStateIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PagingStateIT.java
index dcd801f19..6d33f3523 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PagingStateIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PagingStateIT.java
@@ -30,6 +30,7 @@ import 
com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException;
 import com.datastax.oss.driver.api.core.type.codec.MappingCodec;
 import com.datastax.oss.driver.api.core.type.reflect.GenericType;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
 import com.datastax.oss.driver.categories.ParallelizableTests;
@@ -55,11 +56,14 @@ public class PagingStateIT {
   @Before
   public void setupSchema() {
     CqlSession session = SESSION_RULE.session();
-    session.execute(
-        SimpleStatement.builder(
-                "CREATE TABLE IF NOT EXISTS foo (k int, cc int, v int, PRIMARY 
KEY(k, cc))")
-            .setExecutionProfile(SESSION_RULE.slowProfile())
-            .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          session.execute(
+              SimpleStatement.builder(
+                      "CREATE TABLE IF NOT EXISTS foo (k int, cc int, v int, 
PRIMARY KEY(k, cc))")
+                  .setExecutionProfile(SESSION_RULE.slowProfile())
+                  .build());
+        });
     for (int i = 0; i < 20; i++) {
       session.execute(
           SimpleStatement.newInstance("INSERT INTO foo (k, cc, v) VALUES (1, 
?, ?)", i, i));
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PerRequestKeyspaceIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PerRequestKeyspaceIT.java
index 2b418e76f..9eb883144 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PerRequestKeyspaceIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PerRequestKeyspaceIT.java
@@ -31,6 +31,7 @@ import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.core.cql.Statement;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -67,13 +68,16 @@ public class PerRequestKeyspaceIT {
 
   @Before
   public void setupSchema() {
-    sessionRule
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS foo (k text, cc int, v int, 
PRIMARY KEY(k, cc))")
-                .setExecutionProfile(sessionRule.slowProfile())
-                .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          sessionRule
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS foo (k text, cc int, v 
int, PRIMARY KEY(k, cc))")
+                      .setExecutionProfile(sessionRule.slowProfile())
+                      .build());
+        });
   }
 
   @Test
@@ -220,27 +224,31 @@ public class PerRequestKeyspaceIT {
   @BackendRequirement(type = BackendType.CASSANDRA, minInclusive = "4.0")
   public void should_reprepare_statement_with_keyspace_on_the_fly() {
     // Create a separate session because we don't want it to have a default 
keyspace
-    try (CqlSession session = SessionUtils.newSession(ccmRule)) {
-      executeDdl(
-          session,
-          String.format(
-              "CREATE TABLE IF NOT EXISTS %s.bar (k int primary key)", 
sessionRule.keyspace()));
-      PreparedStatement pst =
-          session.prepare(
-              SimpleStatement.newInstance("SELECT * FROM bar WHERE k=?")
-                  .setKeyspace(sessionRule.keyspace()));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          try (CqlSession session = SessionUtils.newSession(ccmRule)) {
+            executeDdl(
+                session,
+                String.format(
+                    "CREATE TABLE IF NOT EXISTS %s.bar (k int primary key)",
+                    sessionRule.keyspace()));
+            PreparedStatement pst =
+                session.prepare(
+                    SimpleStatement.newInstance("SELECT * FROM bar WHERE k=?")
+                        .setKeyspace(sessionRule.keyspace()));
 
-      // Drop and re-create the table to invalidate the prepared statement 
server side
-      executeDdl(session, String.format("DROP TABLE %s.bar", 
sessionRule.keyspace()));
-      executeDdl(
-          session,
-          String.format("CREATE TABLE %s.bar (k int primary key)", 
sessionRule.keyspace()));
-      assertThat(preparedStatementExistsOnServer(session, 
pst.getId())).isFalse();
+            // Drop and re-create the table to invalidate the prepared 
statement server side
+            executeDdl(session, String.format("DROP TABLE %s.bar", 
sessionRule.keyspace()));
+            executeDdl(
+                session,
+                String.format("CREATE TABLE %s.bar (k int primary key)", 
sessionRule.keyspace()));
+            assertThat(preparedStatementExistsOnServer(session, 
pst.getId())).isFalse();
 
-      // This will re-prepare on the fly
-      session.execute(pst.bind(0));
-      assertThat(preparedStatementExistsOnServer(session, 
pst.getId())).isTrue();
-    }
+            // This will re-prepare on the fly
+            session.execute(pst.bind(0));
+            assertThat(preparedStatementExistsOnServer(session, 
pst.getId())).isTrue();
+          }
+        });
   }
 
   private void executeDdl(CqlSession session, String query) {
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java
index 92c6fd8a1..05ac3bd0e 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/PreparedStatementCachingIT.java
@@ -30,6 +30,7 @@ import 
com.datastax.oss.driver.api.core.metrics.DefaultSessionMetric;
 import com.datastax.oss.driver.api.core.session.ProgrammaticArguments;
 import com.datastax.oss.driver.api.core.session.SessionBuilder;
 import com.datastax.oss.driver.api.testinfra.ccm.CustomCcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
 import com.datastax.oss.driver.categories.IsolatedTests;
@@ -305,12 +306,19 @@ public class PreparedStatementCachingIT {
 
   @Test
   public void should_invalidate_cache_entry_on_basic_udt_change_result_set() {
-    invalidationResultSetTest(setupCacheEntryTestBasic, 
ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationResultSetTest(setupCacheEntryTestBasic, 
ImmutableSet.of("test_type_2"));
+        });
   }
 
   @Test
   public void 
should_invalidate_cache_entry_on_basic_udt_change_variable_defs() {
-    invalidationVariableDefsTest(setupCacheEntryTestBasic, false, 
ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationVariableDefsTest(
+              setupCacheEntryTestBasic, false, ImmutableSet.of("test_type_2"));
+        });
   }
 
   Consumer<CqlSession> setupCacheEntryTestCollection =
@@ -325,13 +333,19 @@ public class PreparedStatementCachingIT {
 
   @Test
   public void 
should_invalidate_cache_entry_on_collection_udt_change_result_set() {
-    invalidationResultSetTest(setupCacheEntryTestCollection, 
ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationResultSetTest(setupCacheEntryTestCollection, 
ImmutableSet.of("test_type_2"));
+        });
   }
 
   @Test
   public void 
should_invalidate_cache_entry_on_collection_udt_change_variable_defs() {
-    invalidationVariableDefsTest(
-        setupCacheEntryTestCollection, true, ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationVariableDefsTest(
+              setupCacheEntryTestCollection, true, 
ImmutableSet.of("test_type_2"));
+        });
   }
 
   Consumer<CqlSession> setupCacheEntryTestTuple =
@@ -346,12 +360,19 @@ public class PreparedStatementCachingIT {
 
   @Test
   public void should_invalidate_cache_entry_on_tuple_udt_change_result_set() {
-    invalidationResultSetTest(setupCacheEntryTestTuple, 
ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationResultSetTest(setupCacheEntryTestTuple, 
ImmutableSet.of("test_type_2"));
+        });
   }
 
   @Test
   public void 
should_invalidate_cache_entry_on_tuple_udt_change_variable_defs() {
-    invalidationVariableDefsTest(setupCacheEntryTestTuple, false, 
ImmutableSet.of("test_type_2"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationVariableDefsTest(
+              setupCacheEntryTestTuple, false, ImmutableSet.of("test_type_2"));
+        });
   }
 
   Consumer<CqlSession> setupCacheEntryTestNested =
@@ -366,14 +387,20 @@ public class PreparedStatementCachingIT {
 
   @Test
   public void should_invalidate_cache_entry_on_nested_udt_change_result_set() {
-    invalidationResultSetTest(
-        setupCacheEntryTestNested, ImmutableSet.of("test_type_2", 
"test_type_4"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationResultSetTest(
+              setupCacheEntryTestNested, ImmutableSet.of("test_type_2", 
"test_type_4"));
+        });
   }
 
   @Test
   public void 
should_invalidate_cache_entry_on_nested_udt_change_variable_defs() {
-    invalidationVariableDefsTest(
-        setupCacheEntryTestNested, false, ImmutableSet.of("test_type_2", 
"test_type_4"));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          invalidationVariableDefsTest(
+              setupCacheEntryTestNested, false, ImmutableSet.of("test_type_2", 
"test_type_4"));
+        });
   }
 
   /* ========================= Infrastructure copied from PreparedStatementIT 
========================= */
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/reactive/DefaultReactiveResultSetIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/reactive/DefaultReactiveResultSetIT.java
index cfb6a56fa..c00cf064e 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/reactive/DefaultReactiveResultSetIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/cql/reactive/DefaultReactiveResultSetIT.java
@@ -32,6 +32,7 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
 import com.datastax.oss.driver.api.core.cql.PreparedStatement;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.categories.ParallelizableTests;
 import com.datastax.oss.driver.internal.core.cql.EmptyColumnDefinitions;
@@ -64,20 +65,23 @@ public class DefaultReactiveResultSetIT {
   @BeforeClass
   public static void initialize() {
     CqlSession session = sessionRule.session();
-    session.execute("DROP TABLE IF EXISTS test_reactive_read");
-    session.execute("DROP TABLE IF EXISTS test_reactive_write");
-    session.checkSchemaAgreement();
-    session.execute(
-        SimpleStatement.builder(
-                "CREATE TABLE test_reactive_read (pk int, cc int, v int, 
PRIMARY KEY ((pk), cc))")
-            .setExecutionProfile(sessionRule.slowProfile())
-            .build());
-    session.execute(
-        SimpleStatement.builder(
-                "CREATE TABLE test_reactive_write (pk int, cc int, v int, 
PRIMARY KEY ((pk), cc))")
-            .setExecutionProfile(sessionRule.slowProfile())
-            .build());
-    session.checkSchemaAgreement();
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          session.execute("DROP TABLE IF EXISTS test_reactive_read");
+          session.execute("DROP TABLE IF EXISTS test_reactive_write");
+          session.checkSchemaAgreement();
+          session.execute(
+              SimpleStatement.builder(
+                      "CREATE TABLE test_reactive_read (pk int, cc int, v int, 
PRIMARY KEY ((pk), cc))")
+                  .setExecutionProfile(sessionRule.slowProfile())
+                  .build());
+          session.execute(
+              SimpleStatement.builder(
+                      "CREATE TABLE test_reactive_write (pk int, cc int, v 
int, PRIMARY KEY ((pk), cc))")
+                  .setExecutionProfile(sessionRule.slowProfile())
+                  .build());
+          session.checkSchemaAgreement();
+        });
     for (int i = 0; i < 1000; i++) {
       session.execute(
           SimpleStatement.builder("INSERT INTO test_reactive_read (pk, cc, v) 
VALUES (0, ?, ?)")
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/DescribeIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/DescribeIT.java
index d8239f318..9fbf5e355 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/DescribeIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/DescribeIT.java
@@ -28,6 +28,7 @@ import 
com.datastax.oss.driver.api.core.config.DefaultDriverOption;
 import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata;
 import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
 import com.datastax.oss.driver.categories.ParallelizableTests;
@@ -224,15 +225,17 @@ public class DescribeIT {
 
   private static void setupDatabase() {
     List<String> statements = STATEMENT_SPLITTER.splitToList(scriptContents);
-
-    // Skip the first statement (CREATE KEYSPACE), we already have a keyspace
-    for (int i = 1; i < statements.size(); i++) {
-      String statement = statements.get(i);
-      try {
-        SESSION_RULE.session().execute(statement);
-      } catch (Exception e) {
-        fail("Error executing statement %s (%s)", statement, e);
-      }
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          // Skip the first statement (CREATE KEYSPACE), we already have a 
keyspace
+          for (int i = 1; i < statements.size(); i++) {
+            String statement = statements.get(i);
+            try {
+              SESSION_RULE.session().execute(statement);
+            } catch (Exception e) {
+              fail("Error executing statement %s (%s)", statement, e);
+            }
+          }
+        });
   }
 }
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/SchemaIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/SchemaIT.java
index 6495b451d..805b2d970 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/SchemaIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/SchemaIT.java
@@ -278,6 +278,20 @@ public class SchemaIT {
                   + "    total bigint,\n"
                   + "    unit text,\n"
                   + "    PRIMARY KEY (keyspace_name, table_name, task_id)\n"
+                  + "); */",
+              // Cassandra 5.0
+              "/* VIRTUAL TABLE system_views.sstable_tasks (\n"
+                  + "    keyspace_name text,\n"
+                  + "    table_name text,\n"
+                  + "    task_id timeuuid,\n"
+                  + "    completion_ratio double,\n"
+                  + "    kind text,\n"
+                  + "    progress bigint,\n"
+                  + "    sstables int,\n"
+                  + "    target_directory text,\n"
+                  + "    total bigint,\n"
+                  + "    unit text,\n"
+                  + "    PRIMARY KEY (keyspace_name, table_name, task_id)\n"
                   + "); */");
       // ColumnMetadata is as expected
       ColumnMetadata cm = tm.getColumn("progress").get();
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/type/codec/registry/CodecRegistryIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/type/codec/registry/CodecRegistryIT.java
index 2f9a0872b..74472e8ba 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/core/type/codec/registry/CodecRegistryIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/core/type/codec/registry/CodecRegistryIT.java
@@ -38,6 +38,7 @@ import com.datastax.oss.driver.api.core.type.codec.TypeCodecs;
 import 
com.datastax.oss.driver.api.core.type.codec.registry.MutableCodecRegistry;
 import com.datastax.oss.driver.api.core.type.reflect.GenericType;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionUtils;
 import com.datastax.oss.driver.categories.ParallelizableTests;
@@ -78,35 +79,39 @@ public class CodecRegistryIT {
 
   @BeforeClass
   public static void createSchema() {
-    // table with simple primary key, single cell.
-    SESSION_RULE
-        .session()
-        .execute(
-            SimpleStatement.builder("CREATE TABLE IF NOT EXISTS test (k text 
primary key, v int)")
-                .setExecutionProfile(SESSION_RULE.slowProfile())
-                .build());
-    // table with map value
-    SESSION_RULE
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS test2 (k0 text, k1 int, v 
map<int,text>, primary key (k0, k1))")
-                .setExecutionProfile(SESSION_RULE.slowProfile())
-                .build());
-    // table with UDT
-    SESSION_RULE
-        .session()
-        .execute(
-            SimpleStatement.builder("CREATE TYPE IF NOT EXISTS coordinates (x 
int, y int)")
-                .setExecutionProfile(SESSION_RULE.slowProfile())
-                .build());
-    SESSION_RULE
-        .session()
-        .execute(
-            SimpleStatement.builder(
-                    "CREATE TABLE IF NOT EXISTS test3 (k0 text, k1 int, v 
map<text,frozen<coordinates>>, primary key (k0, k1))")
-                .setExecutionProfile(SESSION_RULE.slowProfile())
-                .build());
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          // table with simple primary key, single cell.
+          SESSION_RULE
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test (k text primary 
key, v int)")
+                      .setExecutionProfile(SESSION_RULE.slowProfile())
+                      .build());
+          // table with map value
+          SESSION_RULE
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test2 (k0 text, k1 int, 
v map<int,text>, primary key (k0, k1))")
+                      .setExecutionProfile(SESSION_RULE.slowProfile())
+                      .build());
+          // table with UDT
+          SESSION_RULE
+              .session()
+              .execute(
+                  SimpleStatement.builder("CREATE TYPE IF NOT EXISTS 
coordinates (x int, y int)")
+                      .setExecutionProfile(SESSION_RULE.slowProfile())
+                      .build());
+          SESSION_RULE
+              .session()
+              .execute(
+                  SimpleStatement.builder(
+                          "CREATE TABLE IF NOT EXISTS test3 (k0 text, k1 int, 
v map<text,frozen<coordinates>>, primary key (k0, k1))")
+                      .setExecutionProfile(SESSION_RULE.slowProfile())
+                      .build());
+        });
   }
 
   // A simple codec that allows float values to be used for cassandra int 
column type.
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteIT.java 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteIT.java
index 8918e6020..0acdbeae5 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteIT.java
@@ -38,11 +38,10 @@ import 
com.datastax.oss.driver.api.mapper.annotations.Insert;
 import com.datastax.oss.driver.api.mapper.annotations.Mapper;
 import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
-import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.CustomCcmRule;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
-import com.datastax.oss.driver.categories.ParallelizableTests;
 import 
com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
@@ -51,18 +50,18 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 
-@Category(ParallelizableTests.class)
+// Do not run LWT tests in parallel because they may interfere. Tests operate 
on the same row.
 @BackendRequirement(
     type = BackendType.CASSANDRA,
     minInclusive = "3.0",
     description = ">= in WHERE clause not supported in legacy versions")
 public class DeleteIT extends InventoryITBase {
 
-  private static final CcmRule CCM_RULE = CcmRule.getInstance();
+  private static CustomCcmRule CCM_RULE =
+      
CustomCcmRule.builder().withCassandraConfiguration("enable_sasi_indexes", 
"true").build();
 
   private static final SessionRule<CqlSession> SESSION_RULE = 
SessionRule.builder(CCM_RULE).build();
 
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteReactiveIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteReactiveIT.java
index 928fbd6fb..3a418c736 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteReactiveIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/DeleteReactiveIT.java
@@ -24,6 +24,7 @@ import 
com.datastax.dse.driver.api.core.cql.reactive.ReactiveRow;
 import com.datastax.dse.driver.api.mapper.reactive.MappedReactiveResultSet;
 import com.datastax.oss.driver.api.core.CqlIdentifier;
 import com.datastax.oss.driver.api.core.CqlSession;
+import com.datastax.oss.driver.api.core.Version;
 import com.datastax.oss.driver.api.core.cql.SimpleStatement;
 import com.datastax.oss.driver.api.mapper.annotations.Dao;
 import com.datastax.oss.driver.api.mapper.annotations.DaoFactory;
@@ -34,28 +35,35 @@ import 
com.datastax.oss.driver.api.mapper.annotations.Insert;
 import com.datastax.oss.driver.api.mapper.annotations.Mapper;
 import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
-import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.CcmBridge;
+import com.datastax.oss.driver.api.testinfra.ccm.CustomCcmRule;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
-import com.datastax.oss.driver.categories.ParallelizableTests;
 import io.reactivex.Flowable;
 import java.util.UUID;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.experimental.categories.Category;
 import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 
-@Category(ParallelizableTests.class)
+// Do not run LWT tests in parallel because they may interfere. Tests operate 
on the same row.
 public class DeleteReactiveIT extends InventoryITBase {
 
-  private static CcmRule ccmRule = CcmRule.getInstance();
+  private static CustomCcmRule ccmRule = 
configureCcm(CustomCcmRule.builder()).build();
 
   private static SessionRule<CqlSession> sessionRule = 
SessionRule.builder(ccmRule).build();
 
   @ClassRule public static TestRule chain = 
RuleChain.outerRule(ccmRule).around(sessionRule);
 
+  private static CustomCcmRule.Builder configureCcm(CustomCcmRule.Builder 
builder) {
+    if (!CcmBridge.DSE_ENABLEMENT
+        && CcmBridge.VERSION.nextStable().compareTo(Version.V4_0_0) >= 0) {
+      builder.withCassandraConfiguration("enable_sasi_indexes", true);
+    }
+    return builder;
+  }
+
   private static DseProductDao dao;
 
   @BeforeClass
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/EntityPolymorphismIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/EntityPolymorphismIT.java
index 08b806af6..3e532e97c 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/EntityPolymorphismIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/EntityPolymorphismIT.java
@@ -47,6 +47,7 @@ import 
com.datastax.oss.driver.api.mapper.annotations.Transient;
 import com.datastax.oss.driver.api.mapper.annotations.Update;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.categories.ParallelizableTests;
 import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableList;
@@ -83,22 +84,27 @@ public class EntityPolymorphismIT {
   @BeforeClass
   public static void setup() {
     CqlSession session = SESSION_RULE.session();
-    for (String query :
-        ImmutableList.of(
-            "CREATE TYPE point2d (\"X\" int, \"Y\" int)",
-            "CREATE TYPE point3d (\"X\" int, \"Y\" int, \"Z\" int)",
-            "CREATE TABLE circles (circle_id uuid PRIMARY KEY, center2d 
frozen<point2d>, radius "
-                + "double, tags set<text>)",
-            "CREATE TABLE rectangles (rect_id uuid PRIMARY KEY, bottom_left 
frozen<point2d>, top_right frozen<point2d>, tags set<text>)",
-            "CREATE TABLE squares (square_id uuid PRIMARY KEY, bottom_left 
frozen<point2d>, top_right frozen<point2d>, tags set<text>)",
-            "CREATE TABLE spheres (sphere_id uuid PRIMARY KEY, center3d 
frozen<point3d>, radius "
-                + "double, tags set<text>)",
-            "CREATE TABLE devices (device_id uuid PRIMARY KEY, name text)",
-            "CREATE TABLE tracked_devices (device_id uuid PRIMARY KEY, name 
text, location text)",
-            "CREATE TABLE simple_devices (id uuid PRIMARY KEY, in_use 
boolean)")) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(SESSION_RULE.slowProfile()).build());
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query :
+              ImmutableList.of(
+                  "CREATE TYPE point2d (\"X\" int, \"Y\" int)",
+                  "CREATE TYPE point3d (\"X\" int, \"Y\" int, \"Z\" int)",
+                  "CREATE TABLE circles (circle_id uuid PRIMARY KEY, center2d 
frozen<point2d>, radius "
+                      + "double, tags set<text>)",
+                  "CREATE TABLE rectangles (rect_id uuid PRIMARY KEY, 
bottom_left frozen<point2d>, top_right frozen<point2d>, tags set<text>)",
+                  "CREATE TABLE squares (square_id uuid PRIMARY KEY, 
bottom_left frozen<point2d>, top_right frozen<point2d>, tags set<text>)",
+                  "CREATE TABLE spheres (sphere_id uuid PRIMARY KEY, center3d 
frozen<point3d>, radius "
+                      + "double, tags set<text>)",
+                  "CREATE TABLE devices (device_id uuid PRIMARY KEY, name 
text)",
+                  "CREATE TABLE tracked_devices (device_id uuid PRIMARY KEY, 
name text, location text)",
+                  "CREATE TABLE simple_devices (id uuid PRIMARY KEY, in_use 
boolean)")) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(SESSION_RULE.slowProfile())
+                    .build());
+          }
+        });
     mapper = new EntityPolymorphismIT_TestMapperBuilder(session).build();
   }
 
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/ImmutableEntityIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/ImmutableEntityIT.java
index 555b02c02..bdfe92a23 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/ImmutableEntityIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/ImmutableEntityIT.java
@@ -42,6 +42,7 @@ import 
com.datastax.oss.driver.api.mapper.annotations.PropertyStrategy;
 import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.categories.ParallelizableTests;
 import java.util.Objects;
@@ -70,10 +71,15 @@ public class ImmutableEntityIT extends InventoryITBase {
   public static void setup() {
     CqlSession session = SESSION_RULE.session();
 
-    for (String query : createStatements(CCM_RULE)) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(SESSION_RULE.slowProfile()).build());
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query : createStatements(CCM_RULE)) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(SESSION_RULE.slowProfile())
+                    .build());
+          }
+        });
 
     UserDefinedType dimensions2d =
         session
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/InventoryITBase.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/InventoryITBase.java
index 75ceee1f2..2be025b37 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/InventoryITBase.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/InventoryITBase.java
@@ -22,7 +22,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids;
 import com.datastax.oss.driver.api.mapper.annotations.ClusteringColumn;
 import com.datastax.oss.driver.api.mapper.annotations.Entity;
 import com.datastax.oss.driver.api.mapper.annotations.PartitionKey;
-import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.BaseCcmRule;
 import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableList;
 import java.util.List;
 import java.util.Objects;
@@ -58,7 +58,7 @@ public abstract class InventoryITBase {
   protected static ProductSale MP3_DOWNLOAD_SALE_1 =
       new ProductSale(MP3_DOWNLOAD.getId(), DATE_3, 7, 
Uuids.startOf(915192000), 0.99, 12);
 
-  protected static List<String> createStatements(CcmRule ccmRule) {
+  protected static List<String> createStatements(BaseCcmRule ccmRule) {
     ImmutableList.Builder<String> builder =
         ImmutableList.<String>builder()
             .add(
@@ -92,13 +92,13 @@ public abstract class InventoryITBase {
   private static final Version MINIMUM_SASI_VERSION = Version.parse("3.4.0");
   private static final Version BROKEN_SASI_VERSION = Version.parse("6.8.0");
 
-  protected static boolean isSasiBroken(CcmRule ccmRule) {
+  protected static boolean isSasiBroken(BaseCcmRule ccmRule) {
     Optional<Version> dseVersion = ccmRule.getDseVersion();
     // creating SASI indexes is broken in DSE 6.8.0
     return dseVersion.isPresent() && 
dseVersion.get().compareTo(BROKEN_SASI_VERSION) == 0;
   }
 
-  protected static boolean supportsSASI(CcmRule ccmRule) {
+  protected static boolean supportsSASI(BaseCcmRule ccmRule) {
     return ccmRule.getCassandraVersion().compareTo(MINIMUM_SASI_VERSION) >= 0;
   }
 
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/NestedUdtIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/NestedUdtIT.java
index 43d41a9c9..d61b6f6e6 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/NestedUdtIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/NestedUdtIT.java
@@ -41,6 +41,7 @@ import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.annotations.SetEntity;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -119,27 +120,32 @@ public class NestedUdtIT {
   public static void setup() {
     CqlSession session = SESSION_RULE.session();
 
-    for (String query :
-        ImmutableList.of(
-            "CREATE TYPE type1(s1 text, s2 text)",
-            "CREATE TYPE type2(i1 int, i2 int)",
-            "CREATE TYPE type1_partial(s1 text)",
-            "CREATE TYPE type2_partial(i1 int)",
-            "CREATE TABLE container(id uuid PRIMARY KEY, "
-                + "list frozen<list<type1>>, "
-                + "map1 frozen<map<text, list<type1>>>, "
-                + "map2 frozen<map<type1, set<list<type2>>>>,"
-                + "map3 frozen<map<type1, map<text, set<type2>>>>"
-                + ")",
-            "CREATE TABLE container_partial(id uuid PRIMARY KEY, "
-                + "list frozen<list<type1_partial>>, "
-                + "map1 frozen<map<text, list<type1_partial>>>, "
-                + "map2 frozen<map<type1_partial, set<list<type2_partial>>>>,"
-                + "map3 frozen<map<type1_partial, map<text, 
set<type2_partial>>>>"
-                + ")")) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(SESSION_RULE.slowProfile()).build());
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query :
+              ImmutableList.of(
+                  "CREATE TYPE type1(s1 text, s2 text)",
+                  "CREATE TYPE type2(i1 int, i2 int)",
+                  "CREATE TYPE type1_partial(s1 text)",
+                  "CREATE TYPE type2_partial(i1 int)",
+                  "CREATE TABLE container(id uuid PRIMARY KEY, "
+                      + "list frozen<list<type1>>, "
+                      + "map1 frozen<map<text, list<type1>>>, "
+                      + "map2 frozen<map<type1, set<list<type2>>>>,"
+                      + "map3 frozen<map<type1, map<text, set<type2>>>>"
+                      + ")",
+                  "CREATE TABLE container_partial(id uuid PRIMARY KEY, "
+                      + "list frozen<list<type1_partial>>, "
+                      + "map1 frozen<map<text, list<type1_partial>>>, "
+                      + "map2 frozen<map<type1_partial, 
set<list<type2_partial>>>>,"
+                      + "map3 frozen<map<type1_partial, map<text, 
set<type2_partial>>>>"
+                      + ")")) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(SESSION_RULE.slowProfile())
+                    .build());
+          }
+        });
 
     UserDefinedType type1Partial =
         session
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectCustomWhereClauseIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectCustomWhereClauseIT.java
index e2a0f1e99..3df1ccd21 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectCustomWhereClauseIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectCustomWhereClauseIT.java
@@ -35,6 +35,7 @@ import com.datastax.oss.driver.api.mapper.annotations.Insert;
 import com.datastax.oss.driver.api.mapper.annotations.Mapper;
 import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendRequirement;
 import com.datastax.oss.driver.api.testinfra.requirement.BackendType;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
@@ -72,10 +73,15 @@ public class SelectCustomWhereClauseIT extends 
InventoryITBase {
 
     CqlSession session = SESSION_RULE.session();
 
-    for (String query : createStatements(CCM_RULE)) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(SESSION_RULE.slowProfile()).build());
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query : createStatements(CCM_RULE)) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(SESSION_RULE.slowProfile())
+                    .build());
+          }
+        });
 
     InventoryMapper inventoryMapper =
         new SelectCustomWhereClauseIT_InventoryMapperBuilder(session).build();
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectReactiveIT.java
 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectReactiveIT.java
index 0ea07e552..79e4d2b33 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectReactiveIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/SelectReactiveIT.java
@@ -34,6 +34,7 @@ import com.datastax.oss.driver.api.mapper.annotations.Mapper;
 import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.categories.ParallelizableTests;
 import io.reactivex.Flowable;
@@ -61,10 +62,15 @@ public class SelectReactiveIT extends InventoryITBase {
   public static void setup() {
     CqlSession session = sessionRule.session();
 
-    for (String query : createStatements(ccmRule)) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(sessionRule.slowProfile()).build());
-    }
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query : createStatements(ccmRule)) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(sessionRule.slowProfile())
+                    .build());
+          }
+        });
 
     DseInventoryMapper inventoryMapper =
         new SelectReactiveIT_DseInventoryMapperBuilder(session).build();
diff --git 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/UpdateIT.java 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/UpdateIT.java
index 27b4d6e9d..3fac733c9 100644
--- 
a/integration-tests/src/test/java/com/datastax/oss/driver/mapper/UpdateIT.java
+++ 
b/integration-tests/src/test/java/com/datastax/oss/driver/mapper/UpdateIT.java
@@ -37,6 +37,7 @@ import com.datastax.oss.driver.api.mapper.annotations.Select;
 import com.datastax.oss.driver.api.mapper.annotations.Update;
 import com.datastax.oss.driver.api.mapper.entity.saving.NullSavingStrategy;
 import com.datastax.oss.driver.api.testinfra.ccm.CcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.session.SessionRule;
 import com.datastax.oss.driver.categories.ParallelizableTests;
 import 
com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures;
@@ -65,14 +66,18 @@ public class UpdateIT extends InventoryITBase {
   @BeforeClass
   public static void setup() {
     CqlSession session = SESSION_RULE.session();
-
-    for (String query : createStatements(CCM_RULE)) {
-      session.execute(
-          
SimpleStatement.builder(query).setExecutionProfile(SESSION_RULE.slowProfile()).build());
-    }
-    session.execute(
-        SimpleStatement.newInstance("CREATE TABLE only_p_k(id uuid PRIMARY 
KEY)")
-            .setExecutionProfile(SESSION_RULE.slowProfile()));
+    SchemaChangeSynchronizer.withLock(
+        () -> {
+          for (String query : createStatements(CCM_RULE)) {
+            session.execute(
+                SimpleStatement.builder(query)
+                    .setExecutionProfile(SESSION_RULE.slowProfile())
+                    .build());
+          }
+          session.execute(
+              SimpleStatement.newInstance("CREATE TABLE only_p_k(id uuid 
PRIMARY KEY)")
+                  .setExecutionProfile(SESSION_RULE.slowProfile()));
+        });
 
     inventoryMapper = new UpdateIT_InventoryMapperBuilder(session).build();
     dao = inventoryMapper.productDao(SESSION_RULE.keyspace());
diff --git 
a/osgi-tests/src/test/java/com/datastax/oss/driver/internal/osgi/support/CcmStagedReactor.java
 
b/osgi-tests/src/test/java/com/datastax/oss/driver/internal/osgi/support/CcmStagedReactor.java
index 8a520488e..8b1409308 100644
--- 
a/osgi-tests/src/test/java/com/datastax/oss/driver/internal/osgi/support/CcmStagedReactor.java
+++ 
b/osgi-tests/src/test/java/com/datastax/oss/driver/internal/osgi/support/CcmStagedReactor.java
@@ -81,7 +81,7 @@ public class CcmStagedReactor extends 
AllConfinedStagedReactor {
     if (running) {
       LOGGER.info("Stopping CCM");
       CCM_BRIDGE.stop();
-      CCM_BRIDGE.remove();
+      CCM_BRIDGE.close();
       running = false;
       LOGGER.info("CCM stopped");
     }
diff --git a/pom.xml b/pom.xml
index 082daeb35..94311719e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -991,6 +991,17 @@ limitations under the License.]]></inlineHeader>
         <jdk>[11,)</jdk>
       </activation>
     </profile>
+    <profile>
+      <!-- workarounds for running tests with JDK14 -->
+      <id>test-jdk-14</id>
+      <activation>
+        <jdk>[14,)</jdk>
+      </activation>
+      <properties>
+        <!-- for DriverBlockHoundIntegrationIT when using JDK 13+, see 
https://github.com/reactor/BlockHound/issues/33 -->
+        
<blockhound.argline>-XX:+AllowRedefinitionToAddDeleteMethods</blockhound.argline>
+      </properties>
+    </profile>
     <profile>
       <!-- workarounds for running tests with JDK17 -->
       <id>test-jdk-17</id>
diff --git 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/BaseCcmRule.java
 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/BaseCcmRule.java
index b8b684ee5..65210acd2 100644
--- 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/BaseCcmRule.java
+++ 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/BaseCcmRule.java
@@ -38,7 +38,7 @@ public abstract class BaseCcmRule extends 
CassandraResourceRule {
             new Thread(
                 () -> {
                   try {
-                    ccmBridge.remove();
+                    ccmBridge.close();
                   } catch (Exception e) {
                     // silently remove as may have already been removed.
                   }
@@ -53,7 +53,7 @@ public abstract class BaseCcmRule extends 
CassandraResourceRule {
 
   @Override
   protected void after() {
-    ccmBridge.remove();
+    ccmBridge.close();
   }
 
   @Override
diff --git 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java
 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java
index 98739e771..995513e39 100644
--- 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java
+++ 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java
@@ -197,9 +197,10 @@ public class CcmBridge implements AutoCloseable {
   }
 
   private String getCcmVersionString(Version version) {
-    // for 4.0 pre-releases, the CCM version string needs to be "4.0-alpha1" 
or "4.0-alpha2"
-    // Version.toString() always adds a patch value, even if it's not 
specified when parsing.
-    if (version.getMajor() == 4
+    // for 4.0 or 5.0 pre-releases, the CCM version string needs to be 
"4.0-alpha1", "4.0-alpha2" or
+    // "5.0-beta1" Version.toString() always adds a patch value, even if it's 
not specified when
+    // parsing.
+    if (version.getMajor() >= 4
         && version.getMinor() == 0
         && version.getPatch() == 0
         && version.getPreReleaseLabels() != null) {
@@ -292,8 +293,7 @@ public class CcmBridge implements AutoCloseable {
   public void start() {
     if (started.compareAndSet(false, true)) {
       List<String> cmdAndArgs = Lists.newArrayList("start", jvmArgs, 
"--wait-for-binary-proto");
-      overrideJvmVersionForDseWorkloads()
-          .ifPresent(jvmVersion -> 
cmdAndArgs.add(String.format("--jvm_version=%d", jvmVersion)));
+      updateJvmVersion(cmdAndArgs);
       try {
         execute(cmdAndArgs.toArray(new String[0]));
       } catch (RuntimeException re) {
@@ -324,9 +324,13 @@ public class CcmBridge implements AutoCloseable {
 
   public void start(int n) {
     List<String> cmdAndArgs = Lists.newArrayList("node" + n, "start");
+    updateJvmVersion(cmdAndArgs);
+    execute(cmdAndArgs.toArray(new String[0]));
+  }
+
+  private void updateJvmVersion(List<String> cmdAndArgs) {
     overrideJvmVersionForDseWorkloads()
         .ifPresent(jvmVersion -> 
cmdAndArgs.add(String.format("--jvm_version=%d", jvmVersion)));
-    execute(cmdAndArgs.toArray(new String[0]));
   }
 
   public void stop(int n) {
@@ -423,7 +427,9 @@ public class CcmBridge implements AutoCloseable {
 
   @Override
   public void close() {
-    remove();
+    if (created.compareAndSet(true, false)) {
+      remove();
+    }
   }
 
   /**
diff --git 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/SchemaChangeSynchronizer.java
 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/SchemaChangeSynchronizer.java
new file mode 100644
index 000000000..093d1d3f9
--- /dev/null
+++ 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/SchemaChangeSynchronizer.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.datastax.oss.driver.api.testinfra.ccm;
+
+import java.util.concurrent.Semaphore;
+
+/**
+ * Running multiple parallel integration tests may fail due to query timeout 
when trying to apply
+ * several schema changes at once. Limit concurrently executed DDLs to 5.
+ */
+public class SchemaChangeSynchronizer {
+  private static final Semaphore lock = new Semaphore(5);
+
+  public static void withLock(Runnable callback) {
+    try {
+      lock.acquire();
+      try {
+        callback.run();
+      } finally {
+        lock.release();
+      }
+    } catch (InterruptedException e) {
+      Thread.currentThread().interrupt();
+      throw new RuntimeException("Thread interrupted wile waiting to obtain 
DDL lock", e);
+    }
+  }
+}
diff --git 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionRule.java
 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionRule.java
index ce3903bcf..5396e5c6c 100644
--- 
a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionRule.java
+++ 
b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/session/SessionRule.java
@@ -29,6 +29,7 @@ import 
com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener;
 import com.datastax.oss.driver.api.core.session.Session;
 import com.datastax.oss.driver.api.testinfra.CassandraResourceRule;
 import com.datastax.oss.driver.api.testinfra.ccm.BaseCcmRule;
+import com.datastax.oss.driver.api.testinfra.ccm.SchemaChangeSynchronizer;
 import com.datastax.oss.driver.api.testinfra.simulacron.SimulacronRule;
 import java.util.Objects;
 import java.util.Optional;
@@ -195,7 +196,10 @@ public class SessionRule<SessionT extends Session> extends 
ExternalResource {
               ScriptGraphStatement.SYNC);
     }
     if (keyspace != null) {
-      SessionUtils.dropKeyspace(session, keyspace, slowProfile);
+      SchemaChangeSynchronizer.withLock(
+          () -> {
+            SessionUtils.dropKeyspace(session, keyspace, slowProfile);
+          });
     }
     session.close();
   }


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

Reply via email to