Remove 4.0 upgrade paths and related 4.0 tests

patch by Stefan Miklosovic; reviewed by Michael Semb Wever for CASSANDRA-21324
This commit is contained in:
Stefan Miklosovic 2026-04-22 13:04:43 +02:00
parent e8cfd1acff
commit 50960a2e7e
No known key found for this signature in database
GPG Key ID: 32F35CB2F546D93E
26 changed files with 28 additions and 585 deletions

View File

@ -203,7 +203,7 @@ _build_all_dtest_jars() {
[ "${java_version}" -eq 11 ] && export CASSANDRA_USE_JDK11=true
pushd ${TMP_DIR}/cassandra-dtest-jars >/dev/null
for branch in cassandra-4.0 cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk ; do
for branch in cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk ; do
git clean -qxdff && git reset --hard HEAD || echo "failed to reset/clean ${TMP_DIR}/cassandra-dtest-jars… continuing…"
git checkout --quiet $branch
dtest_jar_version=$(grep 'property\s*name=\"base.version\"' build.xml |sed -ne 's/.*value=\"\([^"]*\)\".*/\1/p')

View File

@ -5045,7 +5045,7 @@ jobs:
cd ~/cassandra
mkdir ~/dtest_jars
git remote add apache https://github.com/apache/cassandra.git
for branch in cassandra-4.0 cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
for branch in cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
# check out the correct cassandra version:
git remote set-branches --add apache '$branch'
git fetch --depth 1 apache $branch

View File

@ -5045,7 +5045,7 @@ jobs:
cd ~/cassandra
mkdir ~/dtest_jars
git remote add apache https://github.com/apache/cassandra.git
for branch in cassandra-4.0 cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
for branch in cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
# check out the correct cassandra version:
git remote set-branches --add apache '$branch'
git fetch --depth 1 apache $branch

View File

@ -5045,7 +5045,7 @@ jobs:
cd ~/cassandra
mkdir ~/dtest_jars
git remote add apache https://github.com/apache/cassandra.git
for branch in cassandra-4.0 cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
for branch in cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
# check out the correct cassandra version:
git remote set-branches --add apache '$branch'
git fetch --depth 1 apache $branch

View File

@ -2824,7 +2824,7 @@ commands:
cd ~/cassandra
mkdir ~/dtest_jars
git remote add apache https://github.com/apache/cassandra.git
for branch in cassandra-4.0 cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
for branch in cassandra-4.1 cassandra-5.0 cassandra-6.0 trunk; do
# check out the correct cassandra version:
git remote set-branches --add apache '$branch'
git fetch --depth 1 apache $branch

View File

@ -1,321 +0,0 @@
# 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.
#
#
---
repaired_data_tracking_for_range_reads_enabled: "java.lang.Boolean"
block_for_peers_timeout_in_secs: "java.lang.Integer"
flush_compression: "org.apache.cassandra.config.Config.FlushCompression"
audit_logging_options:
audit_logs_dir: "java.lang.String"
included_users: "java.lang.String"
logger:
class_name: "java.lang.String"
parameters: "java.util.Map"
excluded_categories: "java.lang.String"
roll_cycle: "java.lang.String"
enabled: "java.lang.Boolean"
included_categories: "java.lang.String"
max_archive_retries: "java.lang.Integer"
excluded_keyspaces: "java.lang.String"
archive_command: "java.lang.String"
included_keyspaces: "java.lang.String"
max_log_size: "java.lang.Long"
allow_nodetool_archive_command: "java.lang.Boolean"
block: "java.lang.Boolean"
excluded_users: "java.lang.String"
max_queue_weight: "java.lang.Integer"
cdc_total_space_in_mb: "java.lang.Integer"
internode_application_send_queue_reserve_global_capacity_in_bytes: "java.lang.Integer"
row_cache_save_period: "java.lang.Integer"
snapshot_links_per_second: "java.lang.Long"
disk_optimization_estimate_percentile: "java.lang.Double"
hinted_handoff_disabled_datacenters: "java.util.Set"
cdc_enabled: "java.lang.Boolean"
read_request_timeout_in_ms: "java.lang.Long"
internode_application_receive_queue_reserve_global_capacity_in_bytes: "java.lang.Integer"
credentials_validity_in_ms: "java.lang.Integer"
memtable_heap_space_in_mb: "java.lang.Integer"
commitlog_sync: "org.apache.cassandra.config.Config.CommitLogSync"
user_defined_function_warn_timeout: "java.lang.Long"
tracetype_repair_ttl: "java.lang.Integer"
concurrent_materialized_view_writes: "java.lang.Integer"
commitlog_total_space_in_mb: "java.lang.Integer"
hints_directory: "java.lang.String"
native_transport_max_concurrent_connections_per_ip: "java.lang.Long"
internode_socket_send_buffer_size_in_bytes: "java.lang.Integer"
rpc_interface_prefer_ipv6: "java.lang.Boolean"
check_for_duplicate_rows_during_compaction: "java.lang.Boolean"
internode_socket_receive_buffer_size_in_bytes: "java.lang.Integer"
user_function_timeout_policy: "org.apache.cassandra.config.Config.UserFunctionTimeoutPolicy"
counter_write_request_timeout_in_ms: "java.lang.Long"
roles_update_interval_in_ms: "java.lang.Integer"
memtable_allocation_type: "org.apache.cassandra.config.Config.MemtableAllocationType"
trickle_fsync_interval_in_kb: "java.lang.Integer"
enable_transient_replication: "java.lang.Boolean"
key_cache_size_in_mb: "java.lang.Long"
tombstone_warn_threshold: "java.lang.Integer"
column_index_cache_size_in_kb: "java.lang.Integer"
full_query_logging_options:
log_dir: "java.lang.String"
archive_command: "java.lang.String"
max_log_size: "java.lang.Long"
allow_nodetool_archive_command: "java.lang.Boolean"
block: "java.lang.Boolean"
roll_cycle: "java.lang.String"
max_queue_weight: "java.lang.Integer"
max_archive_retries: "java.lang.Integer"
table_count_warn_threshold: "java.lang.Integer"
write_request_timeout_in_ms: "java.lang.Long"
internode_tcp_user_timeout_in_ms: "java.lang.Integer"
auto_optimise_inc_repair_streams: "java.lang.Boolean"
commitlog_sync_batch_window_in_ms: "java.lang.Double"
disk_failure_policy: "org.apache.cassandra.config.Config.DiskFailurePolicy"
tombstone_failure_threshold: "java.lang.Integer"
validation_preview_purge_head_start_in_sec: "java.lang.Integer"
max_mutation_size_in_kb: "java.lang.Integer"
initial_token: "java.lang.String"
batch_size_warn_threshold_in_kb: "java.lang.Integer"
dynamic_snitch_badness_threshold: "java.lang.Double"
index_summary_capacity_in_mb: "java.lang.Long"
allocate_tokens_for_local_replication_factor: "java.lang.Integer"
counter_cache_keys_to_save: "java.lang.Integer"
disk_optimization_page_cross_chance: "java.lang.Double"
listen_on_broadcast_address: "java.lang.Boolean"
internode_application_receive_queue_reserve_endpoint_capacity_in_bytes: "java.lang.Integer"
row_cache_class_name: "java.lang.String"
gc_warn_threshold_in_ms: "java.lang.Integer"
disk_optimization_strategy: "org.apache.cassandra.config.Config.DiskOptimizationStrategy"
hinted_handoff_throttle_in_kb: "java.lang.Integer"
otc_backlog_expiration_interval_ms: "java.lang.Integer"
counter_cache_save_period: "java.lang.Integer"
keyspace_count_warn_threshold: "java.lang.Integer"
hints_flush_period_in_ms: "java.lang.Integer"
role_manager: "java.lang.String"
block_for_peers_in_remote_dcs: "java.lang.Boolean"
repair_command_pool_size: "java.lang.Integer"
column_index_size_in_kb: "java.lang.Integer"
memtable_offheap_space_in_mb: "java.lang.Integer"
data_file_directories: "java.util.List"
native_transport_max_frame_size_in_mb: "java.lang.Integer"
index_summary_resize_interval_in_minutes: "java.lang.Integer"
enable_user_defined_functions: "java.lang.Boolean"
max_hint_window_in_ms: "java.lang.Integer"
seed_provider:
class_name: "java.lang.String"
parameters: "java.util.Map"
check_for_duplicate_rows_during_reads: "java.lang.Boolean"
key_cache_migrate_during_compaction: "java.lang.Boolean"
network_authorizer: "java.lang.String"
batchlog_replay_throttle_in_kb: "java.lang.Integer"
enable_scripted_user_defined_functions: "java.lang.Boolean"
internode_application_send_queue_reserve_endpoint_capacity_in_bytes: "java.lang.Integer"
commitlog_compression:
class_name: "java.lang.String"
parameters: "java.util.Map"
broadcast_address: "java.lang.String"
credentials_update_interval_in_ms: "java.lang.Integer"
snapshot_before_compaction: "java.lang.Boolean"
back_pressure_strategy:
class_name: "java.lang.String"
parameters: "java.util.Map"
prepared_statements_cache_size_mb: "java.lang.Long"
native_transport_port_ssl: "java.lang.Integer"
allocate_tokens_for_keyspace: "java.lang.String"
diagnostic_events_enabled: "java.lang.Boolean"
storage_port: "java.lang.Integer"
counter_cache_size_in_mb: "java.lang.Long"
repair_request_timeout_in_ms: "java.lang.Long"
dynamic_snitch_reset_interval_in_ms: "java.lang.Integer"
tracetype_query_ttl: "java.lang.Integer"
autocompaction_on_startup_enabled: "java.lang.Boolean"
commit_failure_policy: "org.apache.cassandra.config.Config.CommitFailurePolicy"
concurrent_writes: "java.lang.Integer"
range_request_timeout_in_ms: "java.lang.Long"
dynamic_snitch_update_interval_in_ms: "java.lang.Integer"
hinted_handoff_enabled: "java.lang.Boolean"
internode_application_receive_queue_capacity_in_bytes: "java.lang.Integer"
automatic_sstable_upgrade: "java.lang.Boolean"
max_value_size_in_mb: "java.lang.Integer"
memtable_flush_writers: "java.lang.Integer"
otc_coalescing_strategy: "java.lang.String"
snapshot_on_repaired_data_mismatch: "java.lang.Boolean"
commitlog_max_compression_buffers_in_pool: "java.lang.Integer"
internode_application_send_queue_capacity_in_bytes: "java.lang.Integer"
roles_cache_max_entries: "java.lang.Integer"
native_transport_max_negotiable_protocol_version: "java.lang.Integer"
start_native_transport: "java.lang.Boolean"
ssl_storage_port: "java.lang.Integer"
cluster_name: "java.lang.String"
incremental_backups: "java.lang.Boolean"
key_cache_save_period: "java.lang.Integer"
windows_timer_interval: "java.lang.Integer"
rpc_interface: "java.lang.String"
repair_session_space_in_mb: "java.lang.Integer"
row_cache_keys_to_save: "java.lang.Integer"
repair_command_pool_full_strategy: "org.apache.cassandra.config.Config.RepairCommandPoolFullStrategy"
inter_dc_stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
client_encryption_options:
optional: "java.lang.Boolean"
store_type: "java.lang.String"
cipher_suites: "java.util.List"
enabled: "java.lang.Boolean"
require_endpoint_verification: "java.lang.Boolean"
accepted_protocols: "java.util.List"
keystore_password: "java.lang.String"
protocol: "java.lang.String"
require_client_auth: "java.lang.Boolean"
truststore_password: "java.lang.String"
keystore: "java.lang.String"
truststore: "java.lang.String"
algorithm: "java.lang.String"
concurrent_validations: "java.lang.Integer"
ideal_consistency_level: "org.apache.cassandra.db.ConsistencyLevel"
consecutive_message_errors_threshold: "java.lang.Integer"
trickle_fsync: "java.lang.Boolean"
reject_repair_compaction_threshold: "java.lang.Integer"
max_streaming_retries: "java.lang.Integer"
native_transport_flush_in_batches_legacy: "java.lang.Boolean"
rpc_address: "java.lang.String"
file_cache_enabled: "java.lang.Boolean"
cdc_raw_directory: "java.lang.String"
num_tokens: "java.lang.Integer"
repaired_data_tracking_for_partition_reads_enabled: "java.lang.Boolean"
enable_drop_compact_storage: "java.lang.Boolean"
commitlog_directory: "java.lang.String"
unlogged_batch_across_partitions_warn_threshold: "java.lang.Integer"
auto_bootstrap: "java.lang.Boolean"
authorizer: "java.lang.String"
sstable_preemptive_open_interval_in_mb: "java.lang.Integer"
broadcast_rpc_address: "java.lang.String"
listen_interface_prefer_ipv6: "java.lang.Boolean"
repair_session_max_tree_depth: "java.lang.Integer"
auto_optimise_preview_repair_streams: "java.lang.Boolean"
concurrent_compactors: "java.lang.Integer"
buffer_pool_use_heap_if_exhausted: "java.lang.Boolean"
local_system_data_file_directory: "java.lang.String"
stream_entire_sstables: "java.lang.Boolean"
corrupted_tombstone_strategy: "org.apache.cassandra.config.Config.CorruptedTombstoneStrategy"
listen_address: "java.lang.String"
rpc_keepalive: "java.lang.Boolean"
allow_extra_insecure_udfs: "java.lang.Boolean"
request_timeout_in_ms: "java.lang.Long"
disk_access_mode: "org.apache.cassandra.config.Config.DiskAccessMode"
concurrent_counter_writes: "java.lang.Integer"
row_cache_size_in_mb: "java.lang.Long"
cas_contention_timeout_in_ms: "java.lang.Long"
min_free_space_per_drive_in_mb: "java.lang.Integer"
cross_node_timeout: "java.lang.Boolean"
dynamic_snitch: "java.lang.Boolean"
permissions_validity_in_ms: "java.lang.Integer"
phi_convict_threshold: "java.lang.Double"
native_transport_max_threads: "java.lang.Integer"
permissions_update_interval_in_ms: "java.lang.Integer"
authenticator: "java.lang.String"
allow_insecure_udfs: "java.lang.Boolean"
cache_load_timeout_seconds: "java.lang.Integer"
concurrent_replicates: "java.lang.Integer"
commitlog_sync_period_in_ms: "java.lang.Integer"
auto_optimise_full_repair_streams: "java.lang.Boolean"
internode_max_message_size_in_bytes: "java.lang.Integer"
native_transport_max_concurrent_requests_in_bytes: "java.lang.Long"
compaction_large_partition_warning_threshold_mb: "java.lang.Integer"
enable_user_defined_functions_threads: "java.lang.Boolean"
native_transport_allow_older_protocols: "java.lang.Boolean"
otc_coalescing_enough_coalesced_messages: "java.lang.Integer"
slow_query_log_timeout_in_ms: "java.lang.Long"
report_unconfirmed_repaired_data_mismatches: "java.lang.Boolean"
use_offheap_merkle_trees: "java.lang.Boolean"
concurrent_materialized_view_builders: "java.lang.Integer"
server_encryption_options:
enable_legacy_ssl_storage_port: "java.lang.Boolean"
optional: "java.lang.Boolean"
store_type: "java.lang.String"
cipher_suites: "java.util.List"
enabled: "java.lang.Boolean"
require_endpoint_verification: "java.lang.Boolean"
accepted_protocols: "java.util.List"
keystore_password: "java.lang.String"
protocol: "java.lang.String"
require_client_auth: "java.lang.Boolean"
internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
truststore_password: "java.lang.String"
keystore: "java.lang.String"
truststore: "java.lang.String"
algorithm: "java.lang.String"
max_hints_delivery_threads: "java.lang.Integer"
native_transport_idle_timeout_in_ms: "java.lang.Long"
saved_caches_directory: "java.lang.String"
max_concurrent_automatic_sstable_upgrades: "java.lang.Integer"
file_cache_round_up: "java.lang.Boolean"
streaming_keep_alive_period_in_secs: "java.lang.Integer"
enable_sasi_indexes: "java.lang.Boolean"
gc_log_threshold_in_ms: "java.lang.Integer"
snapshot_on_duplicate_row_detection: "java.lang.Boolean"
commitlog_sync_group_window_in_ms: "java.lang.Double"
internode_compression: "org.apache.cassandra.config.Config.InternodeCompression"
otc_coalescing_window_us: "java.lang.Integer"
credentials_cache_max_entries: "java.lang.Integer"
periodic_commitlog_sync_lag_block_in_ms: "java.lang.Integer"
enable_materialized_views: "java.lang.Boolean"
roles_validity_in_ms: "java.lang.Integer"
networking_cache_size_in_mb: "java.lang.Integer"
native_transport_port: "java.lang.Integer"
permissions_cache_max_entries: "java.lang.Integer"
stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
hints_compression:
class_name: "java.lang.String"
parameters: "java.util.Map"
commitlog_periodic_queue_size: "java.lang.Integer"
force_new_prepared_statement_behaviour: "java.lang.Boolean"
back_pressure_enabled: "java.lang.Boolean"
cdc_free_space_check_interval_ms: "java.lang.Integer"
transparent_data_encryption_options:
cipher: "java.lang.String"
chunk_length_kb: "java.lang.Integer"
iv_length: "java.lang.Integer"
key_alias: "java.lang.String"
key_provider:
class_name: "java.lang.String"
parameters: "java.util.Map"
enabled: "java.lang.Boolean"
initial_range_tombstone_list_allocation_size: "java.lang.Integer"
partitioner: "java.lang.String"
listen_interface: "java.lang.String"
user_defined_function_fail_timeout: "java.lang.Long"
file_cache_size_in_mb: "java.lang.Integer"
inter_dc_tcp_nodelay: "java.lang.Boolean"
internode_authenticator: "java.lang.String"
key_cache_keys_to_save: "java.lang.Integer"
commitlog_segment_size_in_mb: "java.lang.Integer"
replica_filtering_protection:
cached_rows_fail_threshold: "java.lang.Integer"
cached_rows_warn_threshold: "java.lang.Integer"
internode_tcp_connect_timeout_in_ms: "java.lang.Integer"
native_transport_max_concurrent_requests_in_bytes_per_ip: "java.lang.Long"
range_tombstone_list_growth_factor: "java.lang.Double"
native_transport_max_concurrent_connections: "java.lang.Long"
memtable_cleanup_threshold: "java.lang.Float"
concurrent_reads: "java.lang.Integer"
streaming_connections_per_host: "java.lang.Integer"
truncate_request_timeout_in_ms: "java.lang.Long"
auto_snapshot: "java.lang.Boolean"
native_transport_receive_queue_capacity_in_bytes: "java.lang.Integer"
internode_streaming_tcp_user_timeout_in_ms: "java.lang.Integer"
batch_size_fail_threshold_in_kb: "java.lang.Integer"
compaction_throughput_mb_per_sec: "java.lang.Integer"
max_hints_file_size_in_mb: "java.lang.Integer"
endpoint_snitch: "java.lang.String"

View File

@ -373,12 +373,6 @@ public class InstanceConfig implements IInstanceConfig
config.remove("node_proximity");
config.set("endpoint_snitch", "org.apache.cassandra.distributed.impl.DistributedTestSnitch");
// 4.0+ has seed_provider without port
if (version.compareTo(UpgradeTestBase.v40) >= 0)
return config;
config.set("seed_provider", new ParameterizedClass(SimpleSeedProvider.class.getName(),
Collections.singletonMap("seeds", "127.0.0.1")));
return config;
}

View File

@ -35,7 +35,7 @@ public class BatchUpgradeTest extends UpgradeTestBase
.nodes(2)
.nodesToUpgrade(2)
.withConfig(c -> c.with(Feature.GOSSIP))
.upgradesToCurrentFrom(v40).setup((cluster) -> {
.upgradesToCurrentFrom(v41).setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".users (" +
"userid uuid PRIMARY KEY," +
"firstname ascii," +

View File

@ -35,7 +35,7 @@ public class CompactStorageColumnDeleteTest extends UpgradeTestBase
.nodes(2)
.nodesToUpgrade(2)
.withConfig(c -> c.with(Feature.GOSSIP))
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck)) WITH COMPACT STORAGE");
})

View File

@ -35,7 +35,7 @@ public class CompactStorageHiddenColumnTest extends UpgradeTestBase
.nodes(2)
.nodesToUpgrade(2)
.withConfig(c -> c.with(Feature.GOSSIP))
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, PRIMARY KEY (pk, ck)) WITH COMPACT STORAGE");
})

View File

@ -35,7 +35,7 @@ public class CompactStorageImplicitNullInClusteringTest extends UpgradeTestBase
.nodes(2)
.nodesToUpgrade(2)
.withConfig(c -> c.with(Feature.GOSSIP))
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck1 int, ck2 int, v int, PRIMARY KEY (pk, ck1, ck2)) WITH COMPACT STORAGE");
})

View File

@ -35,7 +35,7 @@ public class CompactStoragePagingTest extends UpgradeTestBase
.nodes(2)
.nodesToUpgrade(2)
.withConfig(c -> c.with(Feature.GOSSIP))
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck)) WITH COMPACT STORAGE");
for (int i = 1; i < 10; i++)

View File

@ -1,33 +0,0 @@
/*
* 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 org.apache.cassandra.distributed.upgrade;
import com.vdurmont.semver4j.Semver;
/**
* {@link CompactStoragePagingWithProtocolTester} for v40 -> CURRENT upgrade path.
*/
public class CompactStoragePagingWithProtocolV40Test extends CompactStoragePagingWithProtocolTester
{
@Override
protected Semver initialVersion()
{
return v40;
}
}

View File

@ -40,8 +40,6 @@ public class CompactionHistorySystemTableUpgradeTest extends UpgradeTestBase
new TestCase()
.nodes(1)
.nodesToUpgrade(1)
// all upgrades from v40 to current, excluding v50 -> v51
.singleUpgradeToCurrentFrom(v40)
.singleUpgradeToCurrentFrom(v41)
.withConfig(c -> c.with(Feature.GOSSIP))
.setup((cluster) -> {

View File

@ -34,7 +34,6 @@ import org.apache.cassandra.distributed.shared.Versions;
import static org.apache.cassandra.config.ConfigCompatibilityTest.TEST_DIR;
import static org.apache.cassandra.config.ConfigCompatibilityTest.dump;
import static org.apache.cassandra.config.ConfigCompatibilityTest.toTree;
import static org.apache.cassandra.distributed.upgrade.UpgradeTestBase.v40;
import static org.apache.cassandra.distributed.upgrade.UpgradeTestBase.v41;
import static org.apache.cassandra.distributed.upgrade.UpgradeTestBase.v50;
@ -47,7 +46,7 @@ public class ConfigCompatibilityTestGenerate
{
ICluster.setup();
Versions versions = Versions.find();
for (Semver version : Arrays.asList(v40, v41, v50))
for (Semver version : Arrays.asList(v41, v50))
{
File path = new File(TEST_DIR, "version=" + version + ".yml");
path.getParentFile().mkdirs();

View File

@ -1,33 +0,0 @@
/*
* 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 org.apache.cassandra.distributed.upgrade;
import org.junit.Test;
/**
* {@link MixedModeIndexTestBase} for upgrades from 4.0.
*/
public class MixedModeIndexV40Test extends MixedModeIndexTestBase
{
@Test
public void testIndex() throws Throwable
{
testIndex(v40);
}
}

View File

@ -104,7 +104,7 @@ public class MixedModeMessageForwardTest extends UpgradeTestBase
.withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
.withBuilder(b -> b.withRacks(numDCs, 1, nodesPerDc))
.nodes(numDCs * nodesPerDc)
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup(cluster -> {
cluster.schemaChange("ALTER KEYSPACE " + KEYSPACE +
" WITH replication = {'class': 'NetworkTopologyStrategy', " + ntsArgs + " };");

View File

@ -33,22 +33,12 @@ public class MixedModePaxosTTLTest extends UpgradeTestBase
/**
* Tests the mixed mode paxos loop bug in CASSANDRA-20514
*
* CEP-14 changed the ttl behavior of legacy paxos state to expire based off the ballot time of the operation being
* persisted, not the time a commit is persisted. This eliminated the race addressed by CASSANDRA-12043, and so the
* check it added to the most recent commit prepare logic was removed.
*
* When operating in mixed mode though, this can still be a problem. If a 4.1 or higher node is coordinating a paxos
* operation with 2 or more replicas on 4.0 or lower, this race becomes a problem again. You need 3 things to make
* this an infinite loop
* 1. a 4.1 node coordinating a paxos operation with 2x 4.0 replicas
* 2. replica A) a 4.0 node returns a most recent commit for a ballot that's could have been ttld
* 3. replica B) a 4.0 node has ttl'd that mrc AND converted the ttld cells into tombstones
*
* The 4.1 coordinator receives the mrc from replica A, but since it no longer disregards missing most recent commits
* past the ttl window, it sends the "missing" commit to replica B. Since replica B now has a tombstone for that mrc,
* and tombstones win when reconciled with live cells, even ones with ttls, the commit is a noop and it continues
* to report nothing for its mrc value when the coordinator restarts the prepare phase. This loops until the query
* times out.
* Regression test for mixed-mode paxos with ttl'd legacy paxos state. CEP-14 made legacy paxos
* state expire off the ballot time rather than the commit-persist time, which eliminated the race
* addressed by CASSANDRA-12043 and let that check be removed. Historically, a post-CEP-14
* coordinator paired with pre-CEP-14 replicas could hit an infinite prepare loop when a tombstoned
* most-recent-commit on one replica shadowed the coordinator's resend. This test keeps the
* scenario covered for current upgrade paths.
*/
@Test
public void legacyExpiredStateTest() throws Throwable
@ -61,7 +51,7 @@ public class MixedModePaxosTTLTest extends UpgradeTestBase
.withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK).set("cas_contention_timeout", "500ms"))
.nodes(3)
.nodesToUpgrade(1)
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup(cluster -> {
cluster.schemaChange(format("CREATE KEYSPACE %s WITH REPLICATION={'class': 'SimpleStrategy', 'replication_factor': '2'}", keyspace));
cluster.schemaChange(format("CREATE TABLE %s.%s (k int primary key, v int) " +

View File

@ -52,24 +52,12 @@ public abstract class MixedModePaxosTestBase extends UpgradeTestBase
/**
* Tests the mixed mode loop bug in CASSANDRA-20493
* <p>
* Paxos uses a 'zero' ballot in place of null when it doesn't find a ballot in system.paxos. CEP-14 changed the lsb
* of the zero ballot uuid from the TimeUUID.MIN_CLOCK_SEQ_AND_NODE value of 0x8080808080808080 (-9187201950435737472)
* to 0. It also removed the check added in CASSANDRA-12043, since the way it read and filtered ttld paxos data had
* been improved.
* <p>
* In mixed mode with a 4.0 or lower replica and a 4.1 and higher paxos coordinator, and in the absence of existing
* paxos metadata for the key being queried, the prepare phase will interpret the mismatched zero ballots as the
* 4.0 and lower nodes having missed the most recent commit and will attempt to update them using the 4.1 zero ballot
* and empty partition update.
* <p>
* In cases where this is the first paxos operation on a key, or the previously ttl'd paxos data on disk had been purged,
* this would just add a retry step as it updated the 4.0 and lower hosts with its zero ballot.
* <p>
* On nodes where there was ttl'd paxos data though, the ttl'd data on disk would shadow this update. This would
* happen because paxos commits are recorded to system.paxos using the ballot timestamp as the write timestamp, so
* the more recent write updating the commit with timestamp 0 would be shadowed by the now ttld write with a real
* timestamp. When the prepare phase restarted it would again get the old zero value and cause the prepare phase to
* get into an infinite loop.
* Regression test for mixed-mode paxos with TTL'd paxos data on disk. CEP-14 changed the lsb of the
* zero ballot uuid from TimeUUID.MIN_CLOCK_SEQ_AND_NODE (0x8080808080808080) to 0 and removed the
* CASSANDRA-12043 check; the historical concern was that pre-CEP-14 replicas paired with newer
* coordinators could get stuck in an infinite prepare loop when ttl'd system.paxos data shadowed
* the coordinator's zero-ballot update. This test keeps the scenario covered for current upgrade
* paths.
*/
private void ttldPaxosStateTest(boolean legacyAware, boolean upgradeAware) throws Throwable
{
@ -81,7 +69,7 @@ public abstract class MixedModePaxosTestBase extends UpgradeTestBase
.withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
.nodes(2)
.nodesToUpgrade(1)
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.setup(cluster -> {
cluster.schemaChange(format("CREATE TABLE %s.%s (k int primary key, v int) " +
"WITH gc_grace_seconds=%s", keyspace, table, gcGrace));

View File

@ -44,9 +44,7 @@ public class MixedModeRepairTest extends UpgradeTestBase
public static final String SELECT = withKeyspace("SELECT * FROM %s.t WHERE k=?");
/**
* Test that repairs fail during a major upgrade. If the repaired node is >= 4.0 thanks to CASSANDRA-13944 there
* will be an informative message. Otherwise, if the repaired node is below 4.0, there won't be such an informative
* message and the repair will take very long to timeout.
* Test that repairs fail during a major upgrade with an informative message (CASSANDRA-13944).
*/
@Test
public void testRepairDuringMajorUpgrade() throws Throwable
@ -54,7 +52,7 @@ public class MixedModeRepairTest extends UpgradeTestBase
new UpgradeTestBase.TestCase()
.nodes(2)
.nodesToUpgrade(UPGRADED_NODE)
.upgradesToCurrentFrom(v40)
.upgradesToCurrentFrom(v41)
.withConfig(config -> config.with(NETWORK, GOSSIP).set("storage_compatibility_mode", "CASSANDRA_4"))
.setup(cluster -> {
cluster.schemaChange(CREATE_TABLE);

View File

@ -111,8 +111,6 @@ public abstract class MixedModeTTLOverflowUpgradeTestBase extends UpgradeTestBas
new TestCase()
.nodes(2)
.nodesToUpgradeOrdered(1, 2)
// all upgrades from v40 to current, excluding v50 -> v51
.singleUpgradeToCurrentFrom(v40)
.singleUpgradeToCurrentFrom(v41)
.withConfig(c -> c.with(Feature.GOSSIP).set("storage_compatibility_mode", "CASSANDRA_4"))
.setup(cluster -> {

View File

@ -53,8 +53,6 @@ public class MixedModeWritetimeOrTTLTest extends UpgradeTestBase
new TestCase()
.nodes(2)
.nodesToUpgradeOrdered(1, 2)
// all upgrades from v40 to current, excluding v50 -> v51
.singleUpgradeToCurrentFrom(v40)
.singleUpgradeToCurrentFrom(v41)
.withConfig(c -> c.with(Feature.GOSSIP))
.setup(cluster -> {

View File

@ -1,63 +0,0 @@
/*
* 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 org.apache.cassandra.distributed.upgrade;
import java.util.function.Consumer;
import org.junit.Test;
import org.apache.cassandra.distributed.api.ConsistencyLevel;
import org.apache.cassandra.distributed.api.Feature;
import org.apache.cassandra.distributed.api.IInstanceConfig;
public class Pre40MessageFilterTest extends UpgradeTestBase
{
public void reserializePre40RequestPaxosTest(Consumer<IInstanceConfig> configConsumer) throws Throwable
{
new UpgradeTestBase.TestCase()
.nodes(2)
.withConfig(configConsumer)
.nodesToUpgrade(1)
.upgradesToCurrentFrom(v40)
.setup((cluster) -> {
cluster.filters().outbound().allVerbs().messagesMatching((f,t,m) -> false).drop();
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl(pk,ck,v) VALUES (1, 1, 1) IF NOT EXISTS",
ConsistencyLevel.QUORUM,
1);
})
.runAfterNodeUpgrade((cluster, node) -> {
cluster.coordinator(node).execute("UPDATE " + KEYSPACE + ".tbl SET v = ? WHERE pk = ? AND ck = ? IF v = ?",
ConsistencyLevel.QUORUM,
2, 1, 1, 1);
}).run();
}
@Test
public void reserializePre40RequestPaxosWithoutNetworkTest() throws Throwable
{
reserializePre40RequestPaxosTest(config -> config.with(Feature.GOSSIP));
}
@Test
public void reserializePre40RequestPaxosWithNetworkTest() throws Throwable
{
reserializePre40RequestPaxosTest(config -> config.with(Feature.NETWORK, Feature.GOSSIP));
}
}

View File

@ -1,53 +0,0 @@
/*
* 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 org.apache.cassandra.distributed.upgrade;
import org.junit.Test;
import org.apache.cassandra.distributed.api.Feature;
import static org.apache.cassandra.net.Verb.VALIDATION_REQ;
public class RepairRequestTimeoutUpgradeTest extends UpgradeTestBase
{
@Test
public void simpleUpgradeWithNetworkAndGossipTest() throws Throwable
{
new TestCase()
.nodes(2)
.nodesToUpgrade(1)
.withConfig((cfg) -> cfg.with(Feature.NETWORK, Feature.GOSSIP).set("repair_request_timeout_in_ms", 1000))
.upgrades(v40, v41)
.setup((cluster) -> {
cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
for (int i = 0; i < 10; i++)
cluster.get(i % 2 + 1).executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES ("+i+", 1, 1)");
cluster.forEach(i -> i.flush(KEYSPACE));
})
.runAfterNodeUpgrade((cluster, node) -> {
cluster.filters().verbs(VALIDATION_REQ.id).drop();
cluster.get(2).nodetoolResult("repair", KEYSPACE, "-full").asserts().failure();
cluster.filters().reset();
for (int i = 10; i < 20; i++)
cluster.get(i % 2 + 1).executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES ("+i+", 1, 1)");
cluster.forEach(i -> i.flush(KEYSPACE));
cluster.get(1).nodetoolResult("repair", KEYSPACE, "-full").asserts().success();
}).run();
}
}

View File

@ -95,7 +95,6 @@ public class UpgradeTestBase extends DistributedTestBase
public void run(UpgradeableCluster cluster, int node) throws Throwable;
}
public static final Semver v40 = new Semver("4.0-alpha1", SemverType.LOOSE);
public static final Semver v41 = new Semver("4.1-alpha1", SemverType.LOOSE);
public static final Semver v42 = new Semver("4.2-alpha1", SemverType.LOOSE);
public static final Semver v50 = new Semver("5.0-alpha1", SemverType.LOOSE);
@ -103,13 +102,6 @@ public class UpgradeTestBase extends DistributedTestBase
public static final Semver v70 = new Semver("7.0-alpha1", SemverType.LOOSE);
protected static final SimpleGraph<Semver> SUPPORTED_UPGRADE_PATHS = new SimpleGraph.Builder<Semver>()
// 40 edges are here temporarily
// until we resolve CASSANDRA-21324
.addEdge(v40, v41)
.addEdge(v40, v50)
.addEdge(v40, v60)
.addEdge(v40, v70)
/////
.addEdge(v41, v50)
.addEdge(v41, v60)
.addEdge(v41, v70)

View File

@ -143,15 +143,6 @@ public class ConfigCompatibilityTest
diff(TEST_DIR + "/version=3.11.0.yml", ALLOW_LIST, EXPECTED_FOR_50);
}
@Test
public void diff_4_0() throws IOException
{
diff(TEST_DIR + "/version=4.0-alpha1.yml", ImmutableSet.<String>builder()
.addAll(WINDOWS)
.addAll(ALLOW_LIST)
.build(), EXPECTED_FOR_50);
}
@Test
public void diff_4_1() throws IOException
{