diff --git a/Jenkinsfile-datastax b/Jenkinsfile-datastax
index 9e7b92bed4f..c6d2624a58d 100644
--- a/Jenkinsfile-datastax
+++ b/Jenkinsfile-datastax
@@ -220,67 +220,61 @@ pipeline {
''')
choice(
name: 'ADHOC_BUILD_AND_EXECUTE_TESTS_SERVER_VERSION',
- choices: ['2.1', // Legacy Apache CassandraⓇ
- '2.2', // Legacy Apache CassandraⓇ
- '3.0', // Previous Apache CassandraⓇ
- '3.11', // Current Apache CassandraⓇ
- '4.0', // Development Apache CassandraⓇ
- 'dse-5.1', // Legacy DataStax Enterprise
- 'dse-6.0', // Previous DataStax Enterprise
- 'dse-6.7', // Previous DataStax Enterprise
- 'dse-6.8.0', // Current DataStax Enterprise
+ choices: ['4.0',
+ '4.1',
+ '5.0',
+ 'dse-5.1.35',
+ 'dse-6.0.18',
+ 'dse-6.7.17',
+ 'dse-6.8.30',
+ 'dse-6.9.0',
+ 'hcd-1.0.0',
'ALL'],
description: '''Apache Cassandra® or DataStax Enterprise server version to use for adhoc BUILD-AND-EXECUTE-TESTS builds
- | Choice |
- Description |
-
-
- | 2.1 |
- Apache Cassandra® v2.1.x |
+ 4.0 |
+ Apache Cassandra® v4.0.x |
- | 2.2 |
- Apache Cassandra® v2.2.x |
+ 4.1 |
+ Apache Cassandra® v4.1.x |
- | 3.0 |
- Apache Cassandra® v3.0.x |
+ 5.0 |
+ Apache Cassandra® v5.0.x |
- | 3.11 |
- Apache Cassandra® v3.11.x |
+ dse-5.1.35 |
+ DataStax Enterprise v5.1.35 |
- | 4.0 |
- Apache Cassandra® v4.x (CURRENTLY UNDER DEVELOPMENT) |
+ dse-6.0.18 |
+ DataStax Enterprise v6.0.18 |
- | dse-5.1 |
- DataStax Enterprise v5.1.x |
+ dse-6.7.17 |
+ DataStax Enterprise v6.7.17 |
- | dse-6.0 |
- DataStax Enterprise v6.0.x |
+ dse-6.8.30 |
+ DataStax Enterprise v6.8.30 |
- | dse-6.7 |
- DataStax Enterprise v6.7.x |
+ dse-6.9.0 |
+ DataStax Enterprise v6.9.0 |
- | dse-6.8.0 |
- DataStax Enterprise v6.8.0 |
+ hcd-1.0.0 |
+ DataStax HCD v1.0.0 |
''')
choice(
name: 'ADHOC_BUILD_AND_EXECUTE_TESTS_JABBA_VERSION',
- choices: ['zulu@1.6', // Zulu JDK 1.6
- 'zulu@1.7', // Zulu JDK 1.7
- '1.8', // Oracle JDK version 1.8 (current default)
- 'openjdk@1.11'], // OpenJDK version 11
+ choices: ['1.8',
+ 'openjdk@1.11'],
description: '''JDK version to use for TESTING when running adhoc BUILD-AND-EXECUTE-TESTS builds. All builds will use JDK8 for building the driver
@@ -289,14 +283,6 @@ pipeline {
| Choice |
Description |
-
- | zulu@1.6 |
- Zulu JDK version 1.6 |
-
-
- | zulu@1.7 |
- Zulu JDK version 1.7 |
-
| 1.8 |
Oracle JDK version 1.8 (Used for compiling regardless of choice) |
@@ -341,7 +327,7 @@ pipeline {
}
environment {
- OS_VERSION = 'ubuntu/jammy64/java-driver'
+ OS_VERSION = 'ubuntu/focal64/java-driver'
JABBA_SHELL = '/usr/lib/jabba/jabba.sh'
CCM_ENVIRONMENT_SHELL = '/usr/local/bin/ccm_environment.sh'
}
@@ -367,8 +353,9 @@ pipeline {
axes {
axis {
name 'SERVER_VERSION'
- values '3.11', // Current Apache CassandraⓇ
- '4.0' // Development Apache CassandraⓇ
+ values '4.0',
+ '4.1',
+ '5.0'
}
}
@@ -474,14 +461,15 @@ pipeline {
axes {
axis {
name 'SERVER_VERSION'
- values '2.1', // Legacy Apache CassandraⓇ
- '3.0', // Previous Apache CassandraⓇ
- '3.11', // Current Apache CassandraⓇ
- '4.0', // Development Apache CassandraⓇ
- 'dse-5.1', // Legacy DataStax Enterprise
- 'dse-6.0', // Previous DataStax Enterprise
- 'dse-6.7', // Previous DataStax Enterprise
- 'dse-6.8.0' // Current DataStax Enterprise
+ values '4.0',
+ '4.1',
+ '5.0',
+ 'dse-5.1.35',
+ 'dse-6.0.18',
+ 'dse-6.7.17',
+ 'dse-6.8.30',
+ 'dse-6.9.0',
+ 'hcd-1.0.0'
}
}
when {
diff --git a/driver-core/pom.xml b/driver-core/pom.xml
index 45aff62c17d..c1e1de9c392 100644
--- a/driver-core/pom.xml
+++ b/driver-core/pom.xml
@@ -76,7 +76,7 @@
- org.lz4
+ at.yawk.lz4
lz4-java
true
diff --git a/driver-core/src/main/java/com/datastax/driver/core/VersionNumber.java b/driver-core/src/main/java/com/datastax/driver/core/VersionNumber.java
index debf049ce9b..5b8ea3600e5 100644
--- a/driver-core/src/main/java/com/datastax/driver/core/VersionNumber.java
+++ b/driver-core/src/main/java/com/datastax/driver/core/VersionNumber.java
@@ -21,6 +21,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -39,6 +40,17 @@ public class VersionNumber implements Comparable {
"(\\d+)\\.(\\d+)(\\.\\d+)?(\\.\\d+)?([~\\-]\\w[.\\w]*(?:\\-\\w[.\\w]*)*)?(\\+[.\\w]+)?";
private static final Pattern pattern = Pattern.compile(VERSION_REGEXP);
+ public static final VersionNumber V1_0_0 = Objects.requireNonNull(parse("1.0.0"));
+ public static final VersionNumber V2_1_0 = Objects.requireNonNull(parse("2.1.0"));
+ public static final VersionNumber V2_2_0 = Objects.requireNonNull(parse("2.2.0"));
+ public static final VersionNumber V3_0_0 = Objects.requireNonNull(parse("3.0.0"));
+ public static final VersionNumber V4_0_0 = Objects.requireNonNull(parse("4.0.0"));
+ public static final VersionNumber V4_1_0 = Objects.requireNonNull(parse("4.1.0"));
+ public static final VersionNumber V5_0_0 = Objects.requireNonNull(parse("5.0.0"));
+ public static final VersionNumber V6_7_0 = Objects.requireNonNull(parse("6.7.0"));
+ public static final VersionNumber V6_8_0 = Objects.requireNonNull(parse("6.8.0"));
+ public static final VersionNumber V6_9_0 = Objects.requireNonNull(parse("6.9.0"));
+
private final int major;
private final int minor;
private final int patch;
diff --git a/driver-core/src/test/java/com/datastax/driver/core/CCMBridge.java b/driver-core/src/test/java/com/datastax/driver/core/CCMBridge.java
index 5070e673070..fb0198f5204 100644
--- a/driver-core/src/test/java/com/datastax/driver/core/CCMBridge.java
+++ b/driver-core/src/test/java/com/datastax/driver/core/CCMBridge.java
@@ -682,11 +682,54 @@ public void decommission(int n) {
@Override
public void updateConfig(Map configs) {
- StringBuilder confStr = new StringBuilder();
+ VersionNumber cassandraVersion = getCassandraVersion();
for (Map.Entry entry : configs.entrySet()) {
- confStr.append(entry.getKey()).append(":").append(entry.getValue()).append(" ");
+
+ String originalKey = entry.getKey();
+ Object originalValue = entry.getValue();
+
+ String updateString = String.join(
+ ":",
+ getConfigKey(originalKey, originalValue, cassandraVersion),
+ getConfigValue(originalKey, originalValue, cassandraVersion));
+ execute(
+ CCM_COMMAND + " updateconf %s",
+ updateString);
}
- execute(CCM_COMMAND + " updateconf " + confStr);
+ }
+
+ private static String IN_MS_STR = "_in_ms";
+ private static int IN_MS_STR_LENGTH = IN_MS_STR.length();
+ private static String ENABLE_STR = "enable_";
+ private static int ENABLE_STR_LENGTH = ENABLE_STR.length();
+ private static String IN_KB_STR = "_in_kb";
+ private static int IN_KB_STR_LENGTH = IN_KB_STR.length();
+
+ private static String getConfigKey(
+ String originalKey, Object originalValue, VersionNumber cassandraVersion) {
+
+ // At least for now we won't support substitutions on nested keys. This requires an extra
+ // traversal of the string
+ // but we'll live with that for now
+ if (originalKey.contains(".")) return originalKey;
+ if (cassandraVersion.compareTo(VersionNumber.V4_1_0) < 0) return originalKey;
+ if (originalKey.endsWith(IN_MS_STR))
+ return originalKey.substring(0, originalKey.length() - IN_MS_STR_LENGTH);
+ if (originalKey.startsWith(ENABLE_STR))
+ return originalKey.substring(ENABLE_STR_LENGTH) + "_enabled";
+ if (originalKey.endsWith(IN_KB_STR))
+ return originalKey.substring(0, originalKey.length() - IN_KB_STR_LENGTH);
+ return originalKey;
+ }
+
+ private static String getConfigValue(
+ String originalKey, Object originalValue, VersionNumber cassandraVersion) {
+
+ String originalValueStr = originalValue.toString();
+ if (cassandraVersion.compareTo(VersionNumber.V4_1_0) < 0) return originalValueStr;
+ if (originalKey.endsWith(IN_MS_STR)) return originalValueStr + "ms";
+ if (originalKey.endsWith(IN_KB_STR)) return originalValueStr + "KiB";
+ return originalValueStr;
}
@Override
@@ -1081,11 +1124,11 @@ public CCMBridge build() {
if (!dse) {
if (isMaterializedViewsDisabledByDefault(cassandraVersion)) {
// enable materialized views
- cassandraConfiguration.put("enable_materialized_views", true);
+ cassandraConfiguration.put(getConfigKey("enable_materialized_views",true,cassandraVersion), true);
}
if (isSasiConfigEnablementRequired(cassandraVersion)) {
// enable SASI indexing in config (disabled by default in C* 4.0)
- cassandraConfiguration.put("enable_sasi_indexes", true);
+ cassandraConfiguration.put(getConfigKey("enable_sasi_indexes",true,cassandraVersion), true);
}
}
final CCMBridge ccm =
diff --git a/driver-core/src/test/java/com/datastax/driver/core/CCMTestsSupport.java b/driver-core/src/test/java/com/datastax/driver/core/CCMTestsSupport.java
index 8e8add392e6..400860d3707 100644
--- a/driver-core/src/test/java/com/datastax/driver/core/CCMTestsSupport.java
+++ b/driver-core/src/test/java/com/datastax/driver/core/CCMTestsSupport.java
@@ -29,7 +29,6 @@
import com.datastax.driver.core.CreateCCM.TestMode;
import com.datastax.driver.core.exceptions.InvalidQueryException;
import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.io.Closer;
import com.google.common.util.concurrent.Uninterruptibles;
@@ -75,14 +74,6 @@ public class CCMTestsSupport {
private static final List TEST_GROUPS =
Lists.newArrayList("isolated", "short", "long", "stress", "duration");
- // A mapping of cassandra.yaml config options to their version requirements.
- // If a config is passed containing one of these options and the version requirement cannot be met
- // the option is simply filtered.
- private static final Map configVersionRequirements =
- ImmutableMap.builder()
- .put("enable_user_defined_functions", VersionNumber.parse("2.2.0"))
- .build();
-
private static class ReadOnlyCCMAccess implements CCMAccess {
private final CCMAccess delegate;
@@ -386,21 +377,6 @@ private void addConfigOptions(String[] conf, Map config) {
if (tokens.length != 2) fail("Wrong configuration option: " + aConf);
String key = tokens[0];
String value = tokens[1];
- // If we've detected a property with a version requirement, skip it if the version
- // requirement
- // cannot be met.
- if (configVersionRequirements.containsKey(key)) {
- VersionNumber requirement = configVersionRequirements.get(key);
- if (version != null && version.compareTo(requirement) < 0) {
- LOGGER.debug(
- "Skipping inclusion of '{}' in cassandra.yaml since it requires >= C* {} and {} "
- + "was detected.",
- aConf,
- requirement,
- version);
- continue;
- }
- }
config.put(key, value);
}
}
diff --git a/driver-core/src/test/java/com/datastax/driver/core/ExportAsStringTest.java b/driver-core/src/test/java/com/datastax/driver/core/ExportAsStringTest.java
index 934bfba791f..7486e633067 100644
--- a/driver-core/src/test/java/com/datastax/driver/core/ExportAsStringTest.java
+++ b/driver-core/src/test/java/com/datastax/driver/core/ExportAsStringTest.java
@@ -34,7 +34,6 @@
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
-@CassandraVersion("2.0")
@CCMConfig(config = "enable_user_defined_functions:true")
public class ExportAsStringTest extends CCMTestsSupport {
diff --git a/driver-core/src/test/java/com/datastax/driver/core/TableMetadataTest.java b/driver-core/src/test/java/com/datastax/driver/core/TableMetadataTest.java
index 88717c72dd5..cf2a38bd461 100644
--- a/driver-core/src/test/java/com/datastax/driver/core/TableMetadataTest.java
+++ b/driver-core/src/test/java/com/datastax/driver/core/TableMetadataTest.java
@@ -299,15 +299,38 @@ public void should_parse_compact_table_with_multiple_clustering_columns() {
public void should_parse_table_options() {
VersionNumber version = ccm().getCassandraVersion();
VersionNumber dseVersion = ccm().getDSEVersion();
- boolean isRealCassandra4 =
- version.getMajor() > 3
- && (dseVersion == null || dseVersion.compareTo(VersionNumber.parse("6.8")) >= 0);
+ boolean isOSSCassandra5 =
+ version.getMajor() > 4 && dseVersion == null;
// given
String cql;
- // Cassandra 4.0 +
- if (isRealCassandra4) {
+ // Cassandra 5.0.x
+ if (isOSSCassandra5) {
+ cql =
+ String.format(
+ "CREATE TABLE %s.with_options (\n"
+ + " k text,\n"
+ + " c1 int,\n"
+ + " c2 int,\n"
+ + " i int,\n"
+ + " PRIMARY KEY (k, c1, c2)\n"
+ + ") WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC)\n"
+ + " AND additional_write_policy = '99p'\n"
+ + " AND read_repair = 'BLOCKING'\n"
+ + " AND speculative_retry = '99.9p'\n"
+ + " AND gc_grace_seconds = 42\n"
+ + " AND bloom_filter_fp_chance = 0.01\n"
+ + " AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 10 }\n"
+ + " AND comment = 'My awesome table'\n"
+ + " AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'sstable_size_in_mb' : 15 }\n"
+ + " AND compression = { 'class' : 'org.apache.cassandra.io.compress.SnappyCompressor', 'chunk_length_in_kb' : 128 }\n"
+ + " AND crc_check_chance = 0.5\n" // available from C* 3.0
+ + " AND memtable_flush_period_in_ms = 1000;",
+ keyspace);
+ }
+ // Cassandra 4.0.x or 4.1.x
+ else {
cql =
String.format(
"CREATE TABLE %s.with_options (\n"
@@ -329,76 +352,6 @@ public void should_parse_table_options() {
+ " AND crc_check_chance = 0.5\n" // available from C* 3.0
+ " AND memtable_flush_period_in_ms = 1000;",
keyspace);
-
- // Cassandra 3.0 +
- } else if (version.compareTo(VersionNumber.parse("3.0")) >= 0) {
- cql =
- String.format(
- "CREATE TABLE %s.with_options (\n"
- + " k text,\n"
- + " c1 int,\n"
- + " c2 int,\n"
- + " i int,\n"
- + " PRIMARY KEY (k, c1, c2)\n"
- + ") WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC)\n"
- + " AND read_repair_chance = 0.5\n"
- + " AND dclocal_read_repair_chance = 0.6\n"
- + " AND speculative_retry = '99.9PERCENTILE'\n"
- // replicate_on_write not supported anymore in 3.0
- + " AND gc_grace_seconds = 42\n"
- + " AND bloom_filter_fp_chance = 0.01\n"
- // older caching formats not supported anymore in 3.0
- + " AND caching = { 'keys' : 'ALL', 'rows_per_partition' : 10 }\n"
- + " AND comment = 'My awesome table'\n"
- + " AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'sstable_size_in_mb' : 15 }\n"
- + " AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor', 'chunk_length_kb' : 128 }\n"
- + " AND crc_check_chance = 0.5\n" // available from C* 3.0
- + " AND memtable_flush_period_in_ms = 1000;",
- keyspace);
-
- // Cassandra 2.0 +
- } else if (version.getMajor() > 1) {
- cql =
- String.format(
- "CREATE TABLE %s.with_options (\n"
- + " k text,\n"
- + " c1 int,\n"
- + " c2 int,\n"
- + " i int,\n"
- + " PRIMARY KEY (k, c1, c2)\n"
- + ") WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC)\n"
- + " AND read_repair_chance = 0.5\n"
- + " AND dclocal_read_repair_chance = 0.6\n"
- + " AND replicate_on_write = true\n"
- + " AND gc_grace_seconds = 42\n"
- + " AND bloom_filter_fp_chance = 0.01\n"
- + " AND caching = 'ALL'\n"
- + " AND comment = 'My awesome table'\n"
- + " AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'sstable_size_in_mb' : 15 }\n"
- + " AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor', 'chunk_length_kb' : 128 }\n"
- + " AND memtable_flush_period_in_ms = 1000;",
- keyspace);
- // older versions
- } else {
- cql =
- String.format(
- "CREATE TABLE %s.with_options (\n"
- + " k text,\n"
- + " c1 int,\n"
- + " c2 int,\n"
- + " i int,\n"
- + " PRIMARY KEY (k, c1, c2)\n"
- + ") WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC)\n"
- + " AND read_repair_chance = 0.5\n"
- + " AND dclocal_read_repair_chance = 0.6\n"
- + " AND replicate_on_write = true\n"
- + " AND gc_grace_seconds = 42\n"
- + " AND bloom_filter_fp_chance = 0.01\n"
- + " AND caching = 'ALL'\n"
- + " AND comment = 'My awesome table'\n"
- + " AND compaction = { 'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'sstable_size_in_mb' : 15 }\n"
- + " AND compression = { 'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor', 'chunk_length_kb' : 128 };",
- keyspace);
}
// when
@@ -431,36 +384,33 @@ public void should_parse_table_options() {
.hasType(cint());
assertThat(table);
- // Cassandra 4.0 +
- if (isRealCassandra4) {
-
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching()).contains(entry("rows_per_partition", "10"));
- assertThat(table.getOptions().getCompaction())
+ assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
+ assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
+ assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
+ assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
+ assertThat(table.getOptions().getCaching()).contains(entry("rows_per_partition", "10"));
+ assertThat(table.getOptions().getCompaction())
.contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
+ assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
+ assertThat(table.getOptions().getCompression())
.contains(
entry(
"class",
"org.apache.cassandra.io.compress.SnappyCompressor")); // sstable_compression
- // becomes class
- assertThat(table.getOptions().getCompression())
+ // becomes class
+ assertThat(table.getOptions().getCompression())
.contains(entry("chunk_length_in_kb", "128")); // note the "in" prefix
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
- assertThat(table.getOptions().getSpeculativeRetry())
+ assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
+ assertThat(table.getOptions().getSpeculativeRetry())
.isEqualTo(dseVersion == null ? "99.9p" : "99.9PERCENTILE");
- assertThat(table.getOptions().getIndexInterval()).isNull();
- assertThat(table.getOptions().getMinIndexInterval()).isEqualTo(128);
- assertThat(table.getOptions().getMaxIndexInterval()).isEqualTo(2048);
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // default
- assertThat(table.getOptions().getCrcCheckChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getExtensions()).isEmpty(); // default
- assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
- assertThat(table.asCQLQuery())
+ assertThat(table.getOptions().getIndexInterval()).isNull();
+ assertThat(table.getOptions().getMinIndexInterval()).isEqualTo(128);
+ assertThat(table.getOptions().getMaxIndexInterval()).isEqualTo(2048);
+ assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // default
+ assertThat(table.getOptions().getCrcCheckChance()).isEqualTo(0.5);
+ assertThat(table.getOptions().getExtensions()).isEmpty(); // default
+ assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
+ assertThat(table.asCQLQuery())
.contains("additional_write_policy = '99p'")
.contains("read_repair = 'BLOCKING'")
.contains("gc_grace_seconds = 42")
@@ -485,250 +435,6 @@ public void should_parse_table_options() {
.contains("memtable_flush_period_in_ms = 1000")
.doesNotContain(" index_interval")
.doesNotContain("replicate_on_write");
- // Cassandra 3.8 +
- } else if (version.compareTo(VersionNumber.parse("3.8")) >= 0) {
-
- assertThat(table.getOptions().getReadRepairChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getLocalReadRepairChance()).isEqualTo(0.6);
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching()).contains(entry("rows_per_partition", "10"));
- assertThat(table.getOptions().getCompaction())
- .contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
- .contains(
- entry(
- "class",
- "org.apache.cassandra.io.compress.SnappyCompressor")); // sstable_compression
- // becomes class
- assertThat(table.getOptions().getCompression())
- .contains(entry("chunk_length_in_kb", "128")); // note the "in" prefix
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
- assertThat(table.getOptions().getSpeculativeRetry()).isEqualTo("99.9PERCENTILE");
- assertThat(table.getOptions().getIndexInterval()).isNull();
- assertThat(table.getOptions().getMinIndexInterval()).isEqualTo(128);
- assertThat(table.getOptions().getMaxIndexInterval()).isEqualTo(2048);
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // default
- assertThat(table.getOptions().getCrcCheckChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getExtensions()).isEmpty(); // default
- assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
- assertThat(table.asCQLQuery())
- .contains("read_repair_chance = 0.5")
- .contains("dclocal_read_repair_chance = 0.6")
- .contains("gc_grace_seconds = 42")
- .contains("bloom_filter_fp_chance = 0.01")
- .contains("comment = 'My awesome table'")
- .contains("'keys' : 'ALL'")
- .contains("'rows_per_partition' : 10")
- .contains("'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'")
- .contains("'sstable_size_in_mb' : 15")
- .contains(
- "'class' : 'org.apache.cassandra.io.compress.SnappyCompressor'") // sstable_compression becomes class
- .contains("'chunk_length_in_kb' : 128") // note the "in" prefix
- .contains("default_time_to_live = 0")
- .contains("speculative_retry = '99.9PERCENTILE'")
- .contains("min_index_interval = 128")
- .contains("max_index_interval = 2048")
- .contains("crc_check_chance = 0.5")
- .contains("cdc = false")
- .contains("memtable_flush_period_in_ms = 1000")
- .doesNotContain(" index_interval")
- .doesNotContain("replicate_on_write");
- // Cassandra 3.0 +
- } else if (version.compareTo(VersionNumber.parse("3.0")) >= 0) {
-
- assertThat(table.getOptions().getReadRepairChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getLocalReadRepairChance()).isEqualTo(0.6);
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching()).contains(entry("rows_per_partition", "10"));
- assertThat(table.getOptions().getCompaction())
- .contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
- .contains(
- entry(
- "class",
- "org.apache.cassandra.io.compress.SnappyCompressor")); // sstable_compression
- // becomes class
- assertThat(table.getOptions().getCompression())
- .contains(entry("chunk_length_in_kb", "128")); // note the "in" prefix
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
- assertThat(table.getOptions().getSpeculativeRetry()).isEqualTo("99.9PERCENTILE");
- assertThat(table.getOptions().getIndexInterval()).isNull();
- assertThat(table.getOptions().getMinIndexInterval()).isEqualTo(128);
- assertThat(table.getOptions().getMaxIndexInterval()).isEqualTo(2048);
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // default
- assertThat(table.getOptions().getCrcCheckChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getExtensions()).isEmpty(); // default
- assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
- assertThat(table.asCQLQuery())
- .contains("read_repair_chance = 0.5")
- .contains("dclocal_read_repair_chance = 0.6")
- .contains("gc_grace_seconds = 42")
- .contains("bloom_filter_fp_chance = 0.01")
- .contains("comment = 'My awesome table'")
- .contains("'keys' : 'ALL'")
- .contains("'rows_per_partition' : 10")
- .contains("'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'")
- .contains("'sstable_size_in_mb' : 15")
- .contains(
- "'class' : 'org.apache.cassandra.io.compress.SnappyCompressor'") // sstable_compression becomes class
- .contains("'chunk_length_in_kb' : 128") // note the "in" prefix
- .contains("default_time_to_live = 0")
- .contains("speculative_retry = '99.9PERCENTILE'")
- .contains("min_index_interval = 128")
- .contains("max_index_interval = 2048")
- .contains("crc_check_chance = 0.5")
- .contains("memtable_flush_period_in_ms = 1000")
- .doesNotContain(" index_interval")
- .doesNotContain("replicate_on_write")
- .doesNotContain("cdc"); // 3.8+
-
- // Cassandra 2.1 and 2.2
- } else if (version.getMajor() == 2 && version.getMinor() > 0) {
-
- // With 2.1 we have different options, the caching option changes and replicate_on_write
- // disappears
- assertThat(table.getOptions().getReadRepairChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getLocalReadRepairChance()).isEqualTo(0.6);
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching()).contains(entry("rows_per_partition", "ALL"));
- assertThat(table.getOptions().getCompaction())
- .contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
- .contains(
- entry("sstable_compression", "org.apache.cassandra.io.compress.SnappyCompressor"));
- assertThat(table.getOptions().getCompression()).contains(entry("chunk_length_kb", "128"));
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
- assertThat(table.getOptions().getSpeculativeRetry()).isEqualTo("99.0PERCENTILE");
- assertThat(table.getOptions().getIndexInterval()).isNull();
- assertThat(table.getOptions().getMinIndexInterval()).isEqualTo(128);
- assertThat(table.getOptions().getMaxIndexInterval()).isEqualTo(2048);
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // default
- assertThat(table.getOptions().getExtensions()).isEmpty();
- assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
- assertThat(table.asCQLQuery())
- .contains("read_repair_chance = 0.5")
- .contains("dclocal_read_repair_chance = 0.6")
- .contains("gc_grace_seconds = 42")
- .contains("bloom_filter_fp_chance = 0.01")
- .contains("comment = 'My awesome table'")
- .contains("'keys' : 'ALL'")
- .contains("'rows_per_partition' : 'ALL'")
- .contains("'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'")
- .contains("'sstable_size_in_mb' : 15")
- .contains("'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor'")
- .contains("'chunk_length_kb' : 128")
- .contains("default_time_to_live = 0")
- .contains("speculative_retry = '99.0PERCENTILE'")
- .contains("min_index_interval = 128")
- .contains("max_index_interval = 2048")
- .contains("memtable_flush_period_in_ms = 1000")
- .doesNotContain(" index_interval")
- .doesNotContain("replicate_on_write")
- .doesNotContain("cdc");
-
- // Cassandra 2.0
- } else if (version.getMajor() == 2 && version.getMinor() == 0) {
-
- assertThat(table.getOptions().getReadRepairChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getLocalReadRepairChance()).isEqualTo(0.6);
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching())
- .doesNotContain(entry("rows_per_partition", "ALL")); // 2.1 +
- assertThat(table.getOptions().getCompaction())
- .contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
- .contains(
- entry("sstable_compression", "org.apache.cassandra.io.compress.SnappyCompressor"));
- assertThat(table.getOptions().getCompression()).contains(entry("chunk_length_kb", "128"));
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0);
- assertThat(table.getOptions().getSpeculativeRetry()).isEqualTo("99.0PERCENTILE"); // default
- assertThat(table.getOptions().getIndexInterval()).isEqualTo(128);
- assertThat(table.getOptions().getMinIndexInterval()).isNull();
- assertThat(table.getOptions().getMaxIndexInterval()).isNull();
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // explicitly set
- assertThat(table.getOptions().getExtensions()).isEmpty();
- assertThat(table.getOptions().getMemtableFlushPeriodInMs()).isEqualTo(1000);
- assertThat(table.asCQLQuery())
- .contains("read_repair_chance = 0.5")
- .contains("dclocal_read_repair_chance = 0.6")
- .contains("gc_grace_seconds = 42")
- .contains("bloom_filter_fp_chance = 0.01")
- .contains("comment = 'My awesome table'")
- .contains("caching = 'ALL'")
- .contains("'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'")
- .contains("'sstable_size_in_mb' : 15")
- .contains("'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor'")
- .contains("'chunk_length_kb' : 128")
- .contains("replicate_on_write = true")
- .contains("index_interval = 128")
- .contains("speculative_retry = '99.0PERCENTILE'")
- .contains("default_time_to_live = 0")
- .contains("memtable_flush_period_in_ms = 1000")
- .doesNotContain("min_index_interval") // 2.1 +
- .doesNotContain("max_index_interval") // 2.1 +
- .doesNotContain("cdc");
-
- // Cassandra 1.2
- } else {
-
- assertThat(table.getOptions().getReadRepairChance()).isEqualTo(0.5);
- assertThat(table.getOptions().getLocalReadRepairChance()).isEqualTo(0.6);
- assertThat(table.getOptions().getGcGraceInSeconds()).isEqualTo(42);
- assertThat(table.getOptions().getBloomFilterFalsePositiveChance()).isEqualTo(0.01);
- assertThat(table.getOptions().getComment()).isEqualTo("My awesome table");
- assertThat(table.getOptions().getCaching()).contains(entry("keys", "ALL"));
- assertThat(table.getOptions().getCaching())
- .doesNotContain(entry("rows_per_partition", "ALL")); // 2.1 +
- assertThat(table.getOptions().getCompaction())
- .contains(entry("class", "org.apache.cassandra.db.compaction.LeveledCompactionStrategy"));
- assertThat(table.getOptions().getCompaction()).contains(entry("sstable_size_in_mb", "15"));
- assertThat(table.getOptions().getCompression())
- .contains(
- entry("sstable_compression", "org.apache.cassandra.io.compress.SnappyCompressor"));
- assertThat(table.getOptions().getCompression()).contains(entry("chunk_length_kb", "128"));
- assertThat(table.getOptions().getDefaultTimeToLive()).isEqualTo(0); // default
- assertThat(table.getOptions().getSpeculativeRetry()).isEqualTo("NONE"); // default
- assertThat(table.getOptions().getIndexInterval()).isNull();
- assertThat(table.getOptions().getMinIndexInterval()).isNull();
- assertThat(table.getOptions().getMaxIndexInterval()).isNull();
- assertThat(table.getOptions().getReplicateOnWrite()).isTrue(); // explicitly set
- assertThat(table.getOptions().getExtensions()).isEmpty();
- assertThat(table.asCQLQuery())
- .contains("read_repair_chance = 0.5")
- .contains("dclocal_read_repair_chance = 0.6")
- .contains("gc_grace_seconds = 42")
- .contains("bloom_filter_fp_chance = 0.01")
- .contains("comment = 'My awesome table'")
- .contains("caching = 'ALL'")
- .contains("'class' : 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'")
- .contains("'sstable_size_in_mb' : 15")
- .contains("'sstable_compression' : 'org.apache.cassandra.io.compress.SnappyCompressor'")
- .contains("'chunk_length_kb' : 128")
- .contains("replicate_on_write = true")
- .doesNotContain("index_interval") // 2.0
- .doesNotContain("min_index_interval") // 2.1 +
- .doesNotContain("max_index_interval") // 2.1 +
- .doesNotContain("speculative_retry") // 2.0 +
- .doesNotContain("default_time_to_live") // 2.0 +
- .doesNotContain("cdc")
- .doesNotContain("memtable_flush_period_in_ms"); // 2.0 +
- }
// Also check that the generated CQL is valid and creates an identical table
session().execute("DROP TABLE " + table.getName());
diff --git a/driver-core/src/test/java/com/datastax/driver/core/VirtualTableMetadataTest.java b/driver-core/src/test/java/com/datastax/driver/core/VirtualTableMetadataTest.java
index 55b99cdf93b..a0e5525a677 100644
--- a/driver-core/src/test/java/com/datastax/driver/core/VirtualTableMetadataTest.java
+++ b/driver-core/src/test/java/com/datastax/driver/core/VirtualTableMetadataTest.java
@@ -51,7 +51,7 @@ public void should_parse_virtual_metadata() {
assertThat(tm).isNotNull();
assertThat(tm.getName()).isEqualTo("clients");
assertThat(tm.isVirtual()).isTrue();
- assertThat(tm.getColumns().size()).isEqualTo(12);
+ assertThat(tm.getColumns().size()).isEqualTo(expectedColumnCount());
assertThat(tm.getPartitionKey().size()).isEqualTo(1);
assertThat(tm.getPartitionKey().get(0).getName()).isEqualTo("address");
assertThat(tm.getClusteringColumns().size()).isEqualTo(1);
@@ -63,12 +63,7 @@ public void should_parse_virtual_metadata() {
assertThat(tm.getId()).isEqualTo(new UUID(0L, 0L));
assertThat(tm.getOptions()).isNull();
assertThat(tm.getKeyspace()).isEqualTo(km);
- assertThat(tm.asCQLQuery())
- .isEqualTo(
- "/* VIRTUAL TABLE system_views.clients (address inet, port int, "
- + "connection_stage text, driver_name text, driver_version text, hostname text, protocol_version int, "
- + "request_count bigint, ssl_cipher_suite text, ssl_enabled boolean, ssl_protocol text, username text, "
- + "PRIMARY KEY (address, port)) */");
+ assertThat(tm.asCQLQuery()).isEqualTo(expectedCQLQuery());
// ColumnMetadata is as expected
ColumnMetadata cm = tm.getColumn("driver_name");
assertThat(cm).isNotNull();
@@ -76,4 +71,30 @@ public void should_parse_virtual_metadata() {
assertThat(cm.getType()).isEqualTo(DataType.text());
assertThat(cm.getName()).isEqualTo("driver_name");
}
+
+ private int expectedColumnCount() {
+ if (isCassandraVersionOrHigher("5.0.0"))
+ return 14;
+ if (isCassandraVersionOrHigher("4.1.0"))
+ return 13;
+ return 12;
+ }
+
+ private String expectedCQLQuery() {
+ if (isCassandraVersionOrHigher("5.0.0"))
+ return "/* VIRTUAL TABLE system_views.clients (address inet, port int, client_options frozen