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]