diff --git a/src/java/org/apache/cassandra/config/AccordSpec.java b/src/java/org/apache/cassandra/config/AccordSpec.java index e76745a233..ab80ec4b32 100644 --- a/src/java/org/apache/cassandra/config/AccordSpec.java +++ b/src/java/org/apache/cassandra/config/AccordSpec.java @@ -69,4 +69,5 @@ public class AccordSpec * default transactional mode for tables created by this node when no transactional mode has been specified in the DDL */ public TransactionalMode default_transactional_mode = TransactionalMode.off; + public boolean ephemeralReadEnabled = false; } diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java index a75e6cb88c..e32496a172 100644 --- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java @@ -5810,4 +5810,9 @@ public class DatabaseDescriptor { conf.paxos_repair_race_wait = paxosRepairRaceWait; } + + public static boolean getAccordEphemeralReadEnabledEnabled() + { + return conf.accord.ephemeralReadEnabled; + } } diff --git a/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java b/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java index 208b9590f4..46e94293b0 100644 --- a/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/TransactionStatement.java @@ -332,8 +332,10 @@ public class TransactionStatement implements CQLStatement.CompositeCQLStatement, List reads = createNamedReads(options, state, ImmutableMap.of(), keySet::add); Keys txnKeys = toKeys(keySet); TxnRead read = createTxnRead(reads, txnKeys, null); - Txn.Kind kind = txnKeys.size() == 1 && transactionalModeForSingleKey(txnKeys) == TransactionalMode.full - ? EphemeralRead : Read; + Txn.Kind kind = txnKeys.size() == 1 + && transactionalModeForSingleKey(txnKeys) == TransactionalMode.full + && DatabaseDescriptor.getAccordEphemeralReadEnabledEnabled() + ? EphemeralRead : Read; return new Txn.InMemory(kind, txnKeys, read, TxnQuery.ALL, null); } else diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index dc78f99531..59b39f5ee3 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -2053,7 +2053,7 @@ public class StorageProxy implements StorageProxyMBean consistencyLevel = transactionalMode.readCLForStrategy(consistencyLevel); TxnRead read = TxnRead.createSerialRead(readCommand, consistencyLevel); Invariants.checkState(read.keys().size() == 1, "Ephemeral reads are only strict-serializable for single partition reads"); - Txn txn = new Txn.InMemory(transactionalMode == TransactionalMode.full ? EphemeralRead : Read, read.keys(), read, TxnQuery.ALL, null); + Txn txn = new Txn.InMemory(transactionalMode == TransactionalMode.full && DatabaseDescriptor.getAccordEphemeralReadEnabledEnabled() ? EphemeralRead : Read, read.keys(), read, TxnQuery.ALL, null); IAccordService accordService = AccordService.instance(); TxnResult txnResult = accordService.coordinate(txn, consistencyLevel, requestTime); if (txnResult.kind() == retry_new_protocol)