From dfd1e99fd11f8952abd6799871647a30808eca98 Mon Sep 17 00:00:00 2001 From: Jacek Lewandowski Date: Mon, 9 Oct 2023 15:05:57 +0200 Subject: [PATCH] CEP-15: Add Accord configuration stub Patch by Jacek Lewandowski; reviewed by David Capwell for CASSANDRA-18221 --- conf/cassandra.yaml | 16 +++++-- modules/accord | 2 +- .../apache/cassandra/config/AccordSpec.java | 30 +++++++++++++ .../org/apache/cassandra/config/Config.java | 8 +--- .../cassandra/config/DatabaseDescriptor.java | 43 ++++++++++--------- .../apache/cassandra/config/DurationSpec.java | 6 +++ .../cql3/statements/TransactionStatement.java | 2 +- .../service/accord/AccordConfiguration.java | 40 +++++++++++++++++ .../service/accord/AccordService.java | 12 ++++-- test/conf/cassandra-mtls.yaml | 3 +- test/conf/cassandra-murmur.yaml | 3 +- test/conf/cassandra-old.yaml | 3 +- .../cassandra-pem-jks-sslcontextfactory.yaml | 3 +- ...slcontextfactory-invalidconfiguration.yaml | 3 +- .../conf/cassandra-pem-sslcontextfactory.yaml | 3 +- test/conf/cassandra-seeds.yaml | 3 +- ...slcontextfactory-invalidconfiguration.yaml | 3 +- test/conf/cassandra-sslcontextfactory.yaml | 3 +- test/conf/cassandra.yaml | 8 +++- .../distributed/impl/InstanceConfig.java | 16 +++++-- .../test/accord/AccordBootstrapTest.java | 2 +- .../test/accord/AccordFeatureFlagTest.java | 11 +++-- .../config/DatabaseDescriptorRefTest.java | 24 ++++++----- .../config/YamlConfigurationLoaderTest.java | 6 +-- 24 files changed, 181 insertions(+), 72 deletions(-) create mode 100644 src/java/org/apache/cassandra/config/AccordSpec.java create mode 100644 src/java/org/apache/cassandra/service/accord/AccordConfiguration.java diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 89582a23de..a507dcd943 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -2199,9 +2199,6 @@ drop_compact_storage_enabled: false # Whether or not USE is allowed. This is enabled by default to avoid failure on upgrade. #use_statements_enabled: true -# Enables the execution of Accord (multi-key) transactions on this node. -accord_transactions_enabled: false - # When the client triggers a protocol exception or unknown issue (Cassandra bug) we increment # a client metric showing this; this logic will exclude specific subnets from updating these # metrics @@ -2651,3 +2648,16 @@ accord_transactions_enabled: false # compatibility mode would no longer toggle behaviors as when it was running in the UPGRADING mode. # storage_compatibility_mode: NONE + +#accord: +# # Enables the execution of Accord (multi-key) transactions on this node. +# enabled: false +# +# # Journal directory for Accord +# journal_directory: +# +# # The number of Accord shards on this node; -1 means use the number of cores +# shard_count: -1 +# +# # Progress log scheduling delay +# progress_log_schedule_delay: 1s diff --git a/modules/accord b/modules/accord index 0419858bd1..5ffe3d504b 160000 --- a/modules/accord +++ b/modules/accord @@ -1 +1 @@ -Subproject commit 0419858bd1f6761f08fd1369477f7c142f5bbb4f +Subproject commit 5ffe3d504bb5aa1ff1c2b96d817791e40f7ced0f diff --git a/src/java/org/apache/cassandra/config/AccordSpec.java b/src/java/org/apache/cassandra/config/AccordSpec.java new file mode 100644 index 0000000000..b025d561b6 --- /dev/null +++ b/src/java/org/apache/cassandra/config/AccordSpec.java @@ -0,0 +1,30 @@ +/* + * 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.config; + +public class AccordSpec +{ + public volatile boolean enabled = false; + + public volatile String journal_directory; + + public volatile OptionaldPositiveInt shard_count = OptionaldPositiveInt.UNDEFINED; + + public volatile DurationSpec.IntSecondsBound progress_log_schedule_delay = new DurationSpec.IntSecondsBound(1); +} diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java index 704dda8aa9..d23abdccff 100644 --- a/src/java/org/apache/cassandra/config/Config.java +++ b/src/java/org/apache/cassandra/config/Config.java @@ -398,9 +398,6 @@ public class Config public DataStorageSpec.IntMebibytesBound commitlog_total_space; public CommitLogSync commitlog_sync; - // Accord Journal - public String accord_journal_directory; - @Replaces(oldName = "commitlog_sync_group_window_in_ms", converter = Converters.MILLIS_DURATION_DOUBLE, deprecated = true) public DurationSpec.IntMillisecondsBound commitlog_sync_group_window = new DurationSpec.IntMillisecondsBound("0ms"); @Replaces(oldName = "commitlog_sync_period_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true) @@ -627,9 +624,6 @@ public class Config public volatile boolean use_statements_enabled = true; - public boolean accord_transactions_enabled = false; - public OptionaldPositiveInt accord_shard_count = OptionaldPositiveInt.UNDEFINED; - /** * Optionally disable asynchronous UDF execution. * Disabling asynchronous UDF execution also implicitly disables the security-manager! @@ -1184,6 +1178,8 @@ public class Config */ public ParameterizedClass default_compaction = null; + public final AccordSpec accord = new AccordSpec(); + public static Supplier getOverrideLoadConfig() { return overrideLoadConfig; diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index d251d3ef63..8912803564 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -718,13 +718,14 @@ public class DatabaseDescriptor conf.commitlog_directory = storagedirFor("commitlog"); } + if (conf.accord.journal_directory == null) initializeCommitLogDiskAccessMode(); if (commitLogWriteDiskAccessMode != conf.commitlog_disk_access_mode) logger.info("commitlog_disk_access_mode resolved to: {}", commitLogWriteDiskAccessMode); - if (conf.accord_journal_directory == null) + if (conf.accord.journal_directory == null) { - conf.accord_journal_directory = storagedirFor("accord_journal"); + conf.accord.journal_directory = storagedirFor("accord_journal"); } if (conf.hints_directory == null) @@ -802,8 +803,8 @@ public class DatabaseDescriptor throw new ConfigurationException("local_system_data_file_directory must not be the same as any data_file_directories", false); if (datadir.equals(conf.commitlog_directory)) throw new ConfigurationException("commitlog_directory must not be the same as any data_file_directories", false); - if (datadir.equals(conf.accord_journal_directory)) - throw new ConfigurationException("accord_journal_directory must not be the same as any data_file_directories", false); + if (datadir.equals(conf.accord.journal_directory)) + throw new ConfigurationException("accord.journal_directory must not be the same as any data_file_directories", false); if (datadir.equals(conf.hints_directory)) throw new ConfigurationException("hints_directory must not be the same as any data_file_directories", false); if (datadir.equals(conf.saved_caches_directory)) @@ -819,8 +820,8 @@ public class DatabaseDescriptor { if (conf.local_system_data_file_directory.equals(conf.commitlog_directory)) throw new ConfigurationException("local_system_data_file_directory must not be the same as the commitlog_directory", false); - if (conf.local_system_data_file_directory.equals(conf.accord_journal_directory)) - throw new ConfigurationException("local_system_data_file_directory must not be the same as the accord_journal_directory", false); + if (conf.local_system_data_file_directory.equals(conf.accord.journal_directory)) + throw new ConfigurationException("local_system_data_file_directory must not be the same as the accord.journal_directory", false); if (conf.local_system_data_file_directory.equals(conf.saved_caches_directory)) throw new ConfigurationException("local_system_data_file_directory must not be the same as the saved_caches_directory", false); if (conf.local_system_data_file_directory.equals(conf.hints_directory)) @@ -833,17 +834,17 @@ public class DatabaseDescriptor FBUtilities.prettyPrintMemory(freeBytes)); } - if (conf.commitlog_directory.equals(conf.accord_journal_directory)) - throw new ConfigurationException("accord_journal_directory must not be the same as the commitlog_directory", false); + if (conf.commitlog_directory.equals(conf.accord.journal_directory)) + throw new ConfigurationException("accord.journal_directory must not be the same as the commitlog_directory", false); if (conf.commitlog_directory.equals(conf.hints_directory)) throw new ConfigurationException("hints_directory must not be the same as the commitlog_directory", false); if (conf.commitlog_directory.equals(conf.saved_caches_directory)) throw new ConfigurationException("saved_caches_directory must not be the same as the commitlog_directory", false); - if (conf.accord_journal_directory.equals(conf.hints_directory)) - throw new ConfigurationException("hints_directory must not be the same as the accord_journal_directory", false); - if (conf.accord_journal_directory.equals(conf.saved_caches_directory)) - throw new ConfigurationException("saved_caches_directory must not be the same as the accord_journal_directory", false); + if (conf.accord.journal_directory.equals(conf.hints_directory)) + throw new ConfigurationException("hints_directory must not be the same as the accord.journal_directory", false); + if (conf.accord.journal_directory.equals(conf.saved_caches_directory)) + throw new ConfigurationException("saved_caches_directory must not be the same as the accord.journal_directory", false); if (conf.hints_directory.equals(conf.saved_caches_directory)) throw new ConfigurationException("saved_caches_directory must not be the same as the hints_directory", false); @@ -1145,7 +1146,7 @@ public class DatabaseDescriptor if (conf.audit_logging_options != null) setAuditLoggingOptions(conf.audit_logging_options); - if (conf.legacy_paxos_strategy == Config.LegacyPaxosStrategy.accord && !conf.accord_transactions_enabled) + if (conf.legacy_paxos_strategy == Config.LegacyPaxosStrategy.accord && !conf.accord.enabled) throw new ConfigurationException(NO_ACCORD_PAXOS_STRATEGY_WITH_ACCORD_DISABLED_MESSAGE); } @@ -2140,9 +2141,9 @@ public class DatabaseDescriptor throw new ConfigurationException("commitlog_directory must be specified", false); FileUtils.createDirectory(conf.commitlog_directory); - if (conf.accord_journal_directory == null) - throw new ConfigurationException("accord_journal_directory must be specified", false); - FileUtils.createDirectory(conf.accord_journal_directory); + if (conf.accord.journal_directory == null) + throw new ConfigurationException("accord.journal_directory must be specified", false); + FileUtils.createDirectory(conf.accord.journal_directory); if (conf.hints_directory == null) throw new ConfigurationException("hints_directory must be specified", false); @@ -3049,12 +3050,12 @@ public class DatabaseDescriptor public static String getAccordJournalDirectory() { - return conf.accord_journal_directory; + return conf.accord.journal_directory; } public static void setAccordJournalDirectory(String path) { - conf.accord_journal_directory = path; + conf.accord.journal_directory = path; } public static Config.FlushCompression getFlushCompression() @@ -5218,17 +5219,17 @@ public class DatabaseDescriptor public static boolean getAccordTransactionsEnabled() { - return conf.accord_transactions_enabled; + return conf.accord.enabled; } public static void setAccordTransactionsEnabled(boolean b) { - conf.accord_transactions_enabled = b; + conf.accord.enabled = b; } public static int getAccordShardCount() { - return conf.accord_shard_count.or(DatabaseDescriptor::getAvailableProcessors); + return conf.accord.shard_count.or(DatabaseDescriptor::getAvailableProcessors); } public static boolean getForceNewPreparedStatementBehaviour() diff --git a/src/java/org/apache/cassandra/config/DurationSpec.java b/src/java/org/apache/cassandra/config/DurationSpec.java index bf0fc21334..01a7d70b5f 100644 --- a/src/java/org/apache/cassandra/config/DurationSpec.java +++ b/src/java/org/apache/cassandra/config/DurationSpec.java @@ -17,6 +17,7 @@ */ package org.apache.cassandra.config; +import java.time.Duration; import java.util.Arrays; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -137,6 +138,11 @@ public abstract class DurationSpec return unit; } + public Duration toDuration() + { + return Duration.of(quantity(), unit().toChronoUnit()); + } + /** * @param symbol the time unit symbol * @return the time unit associated to the specified symbol diff --git a/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java b/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java index fa7250f969..e56fd1ec1d 100644 --- a/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java @@ -99,7 +99,7 @@ public class TransactionStatement implements CQLStatement.CompositeCQLStatement, public static final String NO_TIMESTAMPS_IN_UPDATES_MESSAGE = "Updates within transactions may not specify custom timestamps; %s statement %s"; public static final String EMPTY_TRANSACTION_MESSAGE = "Transaction contains no reads or writes"; public static final String SELECT_REFS_NEED_COLUMN_MESSAGE = "SELECT references must specify a column."; - public static final String TRANSACTIONS_DISABLED_MESSAGE = "Accord transactions are disabled. (See accord_transactions_enabled in cassandra.yaml)"; + public static final String TRANSACTIONS_DISABLED_MESSAGE = "Accord transactions are disabled. (See accord.enabled in cassandra.yaml)"; public static final String ILLEGAL_RANGE_QUERY_MESSAGE = "Range queries are not allowed for reads within a transaction; %s %s"; static class NamedSelect diff --git a/src/java/org/apache/cassandra/service/accord/AccordConfiguration.java b/src/java/org/apache/cassandra/service/accord/AccordConfiguration.java new file mode 100644 index 0000000000..a17a9fc844 --- /dev/null +++ b/src/java/org/apache/cassandra/service/accord/AccordConfiguration.java @@ -0,0 +1,40 @@ +/* + * 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.service.accord; + +import java.time.Duration; + +import accord.config.LocalConfig; +import org.apache.cassandra.config.Config; + +public class AccordConfiguration implements LocalConfig +{ + private final Config config; + + public AccordConfiguration(Config config) + { + this.config = config; + } + + @Override + public Duration getProgressLogScheduleDelay() + { + return config.accord.progress_log_schedule_delay.toDuration(); + } +} diff --git a/src/java/org/apache/cassandra/service/accord/AccordService.java b/src/java/org/apache/cassandra/service/accord/AccordService.java index 95ef73f0e7..2a4ed5a2a7 100644 --- a/src/java/org/apache/cassandra/service/accord/AccordService.java +++ b/src/java/org/apache/cassandra/service/accord/AccordService.java @@ -31,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import accord.api.Result; +import accord.config.LocalConfig; import accord.coordinate.Preempted; import accord.coordinate.Timeout; import accord.impl.AbstractConfigurationService; @@ -105,6 +106,7 @@ public class AccordService implements IAccordService, Shutdownable private final AccordDataStore dataStore; private final AccordJournal journal; private final AccordVerbHandler verbHandler; + private final LocalConfig configuration; private static final IAccordService NOOP_SERVICE = new IAccordService() { @@ -117,13 +119,13 @@ public class AccordService implements IAccordService, Shutdownable @Override public TxnData coordinate(Txn txn, ConsistencyLevel consistencyLevel) { - throw new UnsupportedOperationException("No accord transaction should be executed when accord_transactions_enabled = false in cassandra.yaml"); + throw new UnsupportedOperationException("No accord transaction should be executed when accord.enabled = false in cassandra.yaml"); } @Override public long currentEpoch() { - throw new UnsupportedOperationException("Cannot return epoch when accord_transactions_enabled = false in cassandra.yaml"); + throw new UnsupportedOperationException("Cannot return epoch when accord.enabled = false in cassandra.yaml"); } @Override @@ -132,7 +134,7 @@ public class AccordService implements IAccordService, Shutdownable @Override public TopologyManager topology() { - throw new UnsupportedOperationException("Cannot return topology when accord_transactions_enabled = false in cassandra.yaml"); + throw new UnsupportedOperationException("Cannot return topology when accord.enabled = false in cassandra.yaml"); } @Override @@ -227,6 +229,7 @@ public class AccordService implements IAccordService, Shutdownable this.scheduler = new AccordScheduler(); this.dataStore = new AccordDataStore(); this.journal = new AccordJournal(); + this.configuration = new AccordConfiguration(DatabaseDescriptor.getRawConfig()); this.node = new Node(localId, messageSink, this::handleLocalMessage, @@ -240,7 +243,8 @@ public class AccordService implements IAccordService, Shutdownable scheduler, SizeOfIntersectionSorter.SUPPLIER, SimpleProgressLog::new, - AccordCommandStores.factory(journal)); + AccordCommandStores.factory(journal), + configuration); this.nodeShutdown = toShutdownable(node); this.verbHandler = new AccordVerbHandler<>(node, configService, journal); } diff --git a/test/conf/cassandra-mtls.yaml b/test/conf/cassandra-mtls.yaml index 356d3e918d..e80c2ac296 100644 --- a/test/conf/cassandra-mtls.yaml +++ b/test/conf/cassandra-mtls.yaml @@ -25,7 +25,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal cdc_raw_directory: build/test/cassandra/cdc_raw cdc_enabled: false hints_directory: build/test/cassandra/hints @@ -88,3 +87,5 @@ authenticator: class_name : org.apache.cassandra.auth.MutualTlsAuthenticator parameters : validator_class_name: org.apache.cassandra.auth.SpiffeCertificateValidator +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-murmur.yaml b/test/conf/cassandra-murmur.yaml index c3f7442aa6..75a208e5fa 100644 --- a/test/conf/cassandra-murmur.yaml +++ b/test/conf/cassandra-murmur.yaml @@ -8,7 +8,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal cdc_raw_directory: build/test/cassandra/cdc_raw cdc_enabled: false hints_directory: build/test/cassandra/hints @@ -43,3 +42,5 @@ user_defined_functions_enabled: true scripted_user_defined_functions_enabled: false sasi_indexes_enabled: true materialized_views_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-old.yaml b/test/conf/cassandra-old.yaml index 0cda4138d7..000df1148f 100644 --- a/test/conf/cassandra-old.yaml +++ b/test/conf/cassandra-old.yaml @@ -9,7 +9,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size_in_mb: 5 commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -57,3 +56,5 @@ internode_send_buff_size_in_bytes: 5 internode_recv_buff_size_in_bytes: 5 max_hint_window_in_ms: 10800000 cache_load_timeout_seconds: 35 +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-pem-jks-sslcontextfactory.yaml b/test/conf/cassandra-pem-jks-sslcontextfactory.yaml index 0e8a83f0aa..5c27c7b9f9 100644 --- a/test/conf/cassandra-pem-jks-sslcontextfactory.yaml +++ b/test/conf/cassandra-pem-jks-sslcontextfactory.yaml @@ -27,7 +27,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -150,3 +149,5 @@ stream_throughput_outbound: 24MiB/s sasi_indexes_enabled: true materialized_views_enabled: true file_cache_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml b/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml index a3146b79ab..58c2e9293a 100644 --- a/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml +++ b/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml @@ -27,7 +27,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -147,3 +146,5 @@ stream_throughput_outbound: 24MiB/s sasi_indexes_enabled: true materialized_views_enabled: true file_cache_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-pem-sslcontextfactory.yaml b/test/conf/cassandra-pem-sslcontextfactory.yaml index d382d9d64b..ef68105e94 100644 --- a/test/conf/cassandra-pem-sslcontextfactory.yaml +++ b/test/conf/cassandra-pem-sslcontextfactory.yaml @@ -27,7 +27,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -151,3 +150,5 @@ stream_throughput_outbound: 24MiB/s sasi_indexes_enabled: true materialized_views_enabled: true file_cache_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-seeds.yaml b/test/conf/cassandra-seeds.yaml index 3a0fbf1831..1049e27fa8 100644 --- a/test/conf/cassandra-seeds.yaml +++ b/test/conf/cassandra-seeds.yaml @@ -9,7 +9,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal cdc_raw_directory: build/test/cassandra/cdc_raw cdc_enabled: false hints_directory: build/test/cassandra/hints @@ -42,3 +41,5 @@ row_cache_class_name: org.apache.cassandra.cache.OHCProvider row_cache_size: 16MiB user_defined_functions_enabled: true scripted_user_defined_functions_enabled: false +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml b/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml index 6f83ec3341..26db768f5c 100644 --- a/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml +++ b/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml @@ -27,7 +27,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -81,3 +80,5 @@ stream_throughput_outbound: 23841858MiB/s sasi_indexes_enabled: true materialized_views_enabled: true file_cache_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra-sslcontextfactory.yaml b/test/conf/cassandra-sslcontextfactory.yaml index a570bdf5f6..153d2f9245 100644 --- a/test/conf/cassandra-sslcontextfactory.yaml +++ b/test/conf/cassandra-sslcontextfactory.yaml @@ -27,7 +27,6 @@ commitlog_sync: periodic commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -84,3 +83,5 @@ stream_throughput_outbound: 23841858MiB/s sasi_indexes_enabled: true materialized_views_enabled: true file_cache_enabled: true +accord: + journal_directory: build/test/cassandra/accord_journal diff --git a/test/conf/cassandra.yaml b/test/conf/cassandra.yaml index c0e732cec2..e78416c883 100644 --- a/test/conf/cassandra.yaml +++ b/test/conf/cassandra.yaml @@ -10,7 +10,6 @@ commitlog_sync_period: 10s commitlog_segment_size: 5MiB commitlog_directory: build/test/cassandra/commitlog commitlog_disk_access_mode: legacy -accord_journal_directory: build/test/cassandra/accord_journal # commitlog_compression: # - class_name: LZ4Compressor cdc_raw_directory: build/test/cassandra/cdc_raw @@ -57,7 +56,6 @@ file_cache_enabled: true full_query_logging_options: allow_nodetool_archive_command: true auto_hints_cleanup_enabled: true -accord_transactions_enabled: true heap_dump_path: build/test dump_heap_on_uncaught_exception: false @@ -116,3 +114,9 @@ memtable: class_name: TrieMemtable # Note: keep the memtable configuration at the end of the file, so that the default mapping can be changed without # duplicating the whole section above. + +accord: + enabled: true + journal_directory: build/test/cassandra/accord_journal + shard_count: 4 + progress_log_schedule_delay: 1s diff --git a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java index 66bd85689e..4d0741679c 100644 --- a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java +++ b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java @@ -31,6 +31,8 @@ import java.util.function.Function; import com.vdurmont.semver4j.Semver; import org.apache.cassandra.config.CassandraRelevantProperties; +import org.apache.cassandra.config.AccordSpec; +import org.apache.cassandra.config.OptionaldPositiveInt; import org.apache.cassandra.distributed.api.Feature; import org.apache.cassandra.distributed.api.IInstanceConfig; import org.apache.cassandra.distributed.shared.NetworkTopology; @@ -72,7 +74,7 @@ public class InstanceConfig implements IInstanceConfig String commitlog_directory, String hints_directory, String cdc_raw_directory, - String accord_journal_directory, + AccordSpec accord, Collection initial_token, int storage_port, int native_transport_port, @@ -93,7 +95,10 @@ public class InstanceConfig implements IInstanceConfig .set("commitlog_directory", commitlog_directory) .set("hints_directory", hints_directory) .set("cdc_raw_directory", cdc_raw_directory) - .set("accord_journal_directory", accord_journal_directory) + .set("accord.enabled", accord.enabled) + .set("accord.journal_directory", accord.journal_directory) + .set("accord.shard_count", accord.shard_count.toString()) + .set("accord.progress_log_schedule_delay", accord.progress_log_schedule_delay.toString()) .set("partitioner", "org.apache.cassandra.dht.Murmur3Partitioner") .set("start_native_transport", true) .set("concurrent_writes", 2) @@ -115,7 +120,6 @@ public class InstanceConfig implements IInstanceConfig // required settings for dtest functionality .set("diagnostic_events_enabled", true) .set("auto_bootstrap", false) - .set("accord_transactions_enabled", true) // capacities that are based on `totalMemory` that should be fixed size .set("index_summary_capacity", "50MiB") .set("counter_cache_size", "50MiB") @@ -318,6 +322,10 @@ public class InstanceConfig implements IInstanceConfig int datadirCount) { int seedNode = provisionStrategy.seedNodeNum(); + AccordSpec accordSpec = new AccordSpec(); + accordSpec.enabled = true; + accordSpec.journal_directory = String.format("%s/node%d/accord_journal", root, nodeNum); + accordSpec.shard_count = new OptionaldPositiveInt(4); return new InstanceConfig(nodeNum, networkTopology, provisionStrategy.ipAddress(nodeNum), @@ -331,7 +339,7 @@ public class InstanceConfig implements IInstanceConfig String.format("%s/node%d/commitlog", root, nodeNum), String.format("%s/node%d/hints", root, nodeNum), String.format("%s/node%d/cdc", root, nodeNum), - String.format("%s/node%d/accord_journal", root, nodeNum), + accordSpec, tokens, provisionStrategy.storagePort(nodeNum), provisionStrategy.nativeTransportPort(nodeNum), diff --git a/test/distributed/org/apache/cassandra/distributed/test/accord/AccordBootstrapTest.java b/test/distributed/org/apache/cassandra/distributed/test/accord/AccordBootstrapTest.java index cd202fc729..377a919940 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/accord/AccordBootstrapTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/accord/AccordBootstrapTest.java @@ -174,7 +174,7 @@ public class AccordBootstrapTest extends TestBaseImpl .withoutVNodes() .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(expandedNodeCount)) .withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(expandedNodeCount, "dc0", "rack0")) - .withConfig(config -> config.set("accord_shard_count", 2).with(NETWORK, GOSSIP)) + .withConfig(config -> config.set("accord.shard_count", 2).with(NETWORK, GOSSIP)) .start()) { long initialMax = maxEpoch(cluster); diff --git a/test/distributed/org/apache/cassandra/distributed/test/accord/AccordFeatureFlagTest.java b/test/distributed/org/apache/cassandra/distributed/test/accord/AccordFeatureFlagTest.java index e4bf7ccb7c..06b44805b3 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/accord/AccordFeatureFlagTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/accord/AccordFeatureFlagTest.java @@ -25,8 +25,6 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.cassandra.schema.Schema; -import org.assertj.core.api.Assertions; import org.junit.Test; import org.apache.cassandra.db.virtual.AccordVirtualTables; @@ -39,14 +37,15 @@ import org.apache.cassandra.distributed.api.IIsolatedExecutor; import org.apache.cassandra.distributed.test.TestBaseImpl; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.schema.Schema; import org.apache.cassandra.service.accord.AccordService; import org.apache.cassandra.utils.AssertionUtils; - -import static org.junit.Assert.assertEquals; +import org.assertj.core.api.Assertions; import static org.apache.cassandra.config.DatabaseDescriptor.NO_ACCORD_PAXOS_STRATEGY_WITH_ACCORD_DISABLED_MESSAGE; import static org.apache.cassandra.cql3.statements.TransactionStatement.TRANSACTIONS_DISABLED_MESSAGE; import static org.apache.cassandra.schema.SchemaConstants.ACCORD_KEYSPACE_NAME; +import static org.junit.Assert.assertEquals; public class AccordFeatureFlagTest extends TestBaseImpl { @@ -55,7 +54,7 @@ public class AccordFeatureFlagTest extends TestBaseImpl { try (Cluster cluster = init(Cluster.build(1) .withoutVNodes() - .withConfig(c -> c.with(Feature.NETWORK).set("accord_transactions_enabled", "false")) + .withConfig(c -> c.with(Feature.NETWORK).set("accord.enabled", "false")) .start())) { cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (k int, c int, v int, primary key (k, c))"); @@ -91,7 +90,7 @@ public class AccordFeatureFlagTest extends TestBaseImpl try (Cluster cluster = Cluster.build(1) .withoutVNodes() .withConfig(c -> c.with(Feature.NETWORK) - .set("accord_transactions_enabled", "false") + .set("accord.enabled", "false") .set("legacy_paxos_strategy", "accord")).createWithoutStarting()) { diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java index e7b808cceb..a3f9d2325f 100644 --- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java +++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java @@ -72,11 +72,12 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.auth.Cacheable", "org.apache.cassandra.auth.IAuthenticator", "org.apache.cassandra.auth.IAuthorizer", - "org.apache.cassandra.auth.IInternodeAuthenticator", "org.apache.cassandra.auth.ICIDRAuthorizer", "org.apache.cassandra.auth.ICIDRAuthorizer$CIDRAuthorizerMode", + "org.apache.cassandra.auth.IInternodeAuthenticator", "org.apache.cassandra.auth.INetworkAuthorizer", "org.apache.cassandra.auth.IRoleManager", + "org.apache.cassandra.config.AccordSpec", "org.apache.cassandra.config.CassandraRelevantProperties", "org.apache.cassandra.config.CassandraRelevantProperties$PropertyConverter", "org.apache.cassandra.config.Config", @@ -129,8 +130,8 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.config.DurationSpec$IntMillisecondsBound", "org.apache.cassandra.config.DurationSpec$IntMinutesBound", "org.apache.cassandra.config.DurationSpec$IntSecondsBound", - "org.apache.cassandra.config.DurationSpec$LongMillisecondsBound", "org.apache.cassandra.config.DurationSpec$LongMicrosecondsBound", + "org.apache.cassandra.config.DurationSpec$LongMillisecondsBound", "org.apache.cassandra.config.DurationSpec$LongNanosecondsBound", "org.apache.cassandra.config.DurationSpec$LongSecondsBound", "org.apache.cassandra.config.EncryptionOptions", @@ -151,24 +152,24 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.config.ParameterizedClass", "org.apache.cassandra.config.RepairConfig", "org.apache.cassandra.config.RepairRetrySpec", + "org.apache.cassandra.config.ReplicaFilteringProtectionOptions", "org.apache.cassandra.config.RetrySpec", "org.apache.cassandra.config.RetrySpec$MaxAttempt", "org.apache.cassandra.config.RetrySpec$Type", - "org.apache.cassandra.config.ReplicaFilteringProtectionOptions", "org.apache.cassandra.config.StartupChecksOptions", + "org.apache.cassandra.config.StartupChecksOptions", + "org.apache.cassandra.config.StorageAttachedIndexOptions", + "org.apache.cassandra.config.SubnetGroups", "org.apache.cassandra.config.SubnetGroups", "org.apache.cassandra.config.TrackWarnings", + "org.apache.cassandra.config.TrackWarnings", + "org.apache.cassandra.config.TransparentDataEncryptionOptions", "org.apache.cassandra.config.TransparentDataEncryptionOptions", "org.apache.cassandra.config.YamlConfigurationLoader", "org.apache.cassandra.config.YamlConfigurationLoader$CustomConstructor", + "org.apache.cassandra.config.YamlConfigurationLoader$CustomConstructor", "org.apache.cassandra.config.YamlConfigurationLoader$PropertiesChecker", "org.apache.cassandra.config.YamlConfigurationLoader$PropertiesChecker$1", - "org.apache.cassandra.config.YamlConfigurationLoader$CustomConstructor", - "org.apache.cassandra.config.TransparentDataEncryptionOptions", - "org.apache.cassandra.config.StartupChecksOptions", - "org.apache.cassandra.config.SubnetGroups", - "org.apache.cassandra.config.TrackWarnings", - "org.apache.cassandra.config.StorageAttachedIndexOptions", "org.apache.cassandra.db.ConsistencyLevel", "org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager", "org.apache.cassandra.db.commitlog.CommitLog", @@ -236,9 +237,9 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.io.sstable.format.SSTableReaderLoadingBuilder", "org.apache.cassandra.io.sstable.format.SSTableReaderWithFilter", "org.apache.cassandra.io.sstable.format.SSTableReaderWithFilter$Builder", - "org.apache.cassandra.io.sstable.format.SortedTableReaderLoadingBuilder", "org.apache.cassandra.io.sstable.format.SSTableWriter", "org.apache.cassandra.io.sstable.format.SSTableWriter$Builder", + "org.apache.cassandra.io.sstable.format.SortedTableReaderLoadingBuilder", "org.apache.cassandra.io.sstable.format.SortedTableWriter", "org.apache.cassandra.io.sstable.format.SortedTableWriter$Builder", "org.apache.cassandra.io.sstable.format.Version", @@ -282,6 +283,7 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.locator.SeedProvider", "org.apache.cassandra.locator.SimpleSeedProvider", "org.apache.cassandra.locator.SnitchAdapter", + "org.apache.cassandra.security.AbstractCryptoProvider", "org.apache.cassandra.security.EncryptionContext", "org.apache.cassandra.security.ISslContextFactory", "org.apache.cassandra.security.SSLFactory", @@ -296,12 +298,12 @@ public class DatabaseDescriptorRefTest "org.apache.cassandra.utils.LocalizeString", "org.apache.cassandra.utils.SystemInfo", "org.apache.cassandra.utils.Pair", + "org.apache.cassandra.utils.StorageCompatibilityMode", "org.apache.cassandra.utils.binlog.BinLogOptions", "org.apache.cassandra.utils.concurrent.RefCounted", "org.apache.cassandra.utils.concurrent.SelfRefCounted", "org.apache.cassandra.utils.concurrent.Transactional", "org.apache.cassandra.utils.concurrent.UncheckedInterruptedException", - "org.apache.cassandra.utils.StorageCompatibilityMode" }; static final Set checkedClasses = new HashSet<>(Arrays.asList(validClasses)); diff --git a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java index bbc7bf2c82..372619d145 100644 --- a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java +++ b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java @@ -436,11 +436,11 @@ public class YamlConfigurationLoaderTest { Config c = fromType(type, "available_processors", 4); assertThat(c.available_processors).isEqualTo(new OptionaldPositiveInt(4)); - assertThat(c.accord_shard_count).isEqualTo(OptionaldPositiveInt.UNDEFINED); + assertThat(c.accord.shard_count).isEqualTo(OptionaldPositiveInt.UNDEFINED); - c = fromType(type, "available_processors", 3, "accord_shard_count", 1); + c = fromType(type, "available_processors", 3, "accord.shard_count", 1); assertThat(c.available_processors).isEqualTo(new OptionaldPositiveInt(3)); - assertThat(c.accord_shard_count).isEqualTo(new OptionaldPositiveInt(1)); + assertThat(c.accord.shard_count).isEqualTo(new OptionaldPositiveInt(1)); } }