Files
scylladb/test/cqlpy/cassandra_tests/batch_test.py
Michael Litvak 1dbf53ca29 test: enable counters tests with tablets
Enable all counters-related tests that were disabled for tablets because
counters was not supported with tablets until now.

Some tests were parametrized to run with both vnodes and tablets, and
the tablets case was skipped, in order to not lose coverage. We change
them to run with the default configuration since now counters is
supported with both vnodes and tablets, and the implementation is the
same, so there is no benefit in running them with both configurations.
2025-11-03 16:04:37 +01:00

85 lines
4.0 KiB
Python

# This file was translated from the original Java test from the Apache
# Cassandra source repository, as of commit 8d91b469afd3fcafef7ef85c10c8acc11703ba2d
#
# The original Apache Cassandra license:
#
# SPDX-License-Identifier: Apache-2.0
from .porting import *
from cassandra.query import BatchStatement, BatchType
from cassandra.protocol import InvalidRequest
def sendBatch(cql, test_keyspace, t, addCounter, addNonCounter, addClustering):
assert addCounter or addNonCounter or addClustering
with create_table(cql, test_keyspace, "(id int primary key, val text)") as table_noncounter:
with create_table(cql, test_keyspace, "(id int primary key, val counter)") as table_counter:
with create_table(cql, test_keyspace, "(id int, clustering1 int, clustering2 int, clustering3 int, val text, primary key (id, clustering1, clustering2, clustering3))") as table_clustering:
noncounter = cql.prepare(f"insert into {table_noncounter}(id, val)values(?,?)")
counter = cql.prepare(f"update {table_counter} set val = val + ? where id = ?")
clustering = cql.prepare(f"insert into {table_clustering}(id, clustering1, clustering2, clustering3, val) values(?,?,?,?,?)")
b = BatchStatement(batch_type = t)
for i in range(10):
if addNonCounter:
b.add(noncounter.bind([i, "foo"]))
if addCounter:
b.add(counter.bind([i, i]))
if addClustering:
b.add(clustering.bind([i, i, i, i, "foo"]))
cql.execute(b)
def testMixedInCounterBatch(cql, test_keyspace):
with pytest.raises(InvalidRequest):
sendBatch(cql, test_keyspace, BatchType.COUNTER, True, True, False)
def testMixedInLoggedBatch(cql, test_keyspace):
with pytest.raises(InvalidRequest):
sendBatch(cql, test_keyspace, BatchType.LOGGED, True, True, False)
def testMixedInUnLoggedBatch(cql, test_keyspace):
with pytest.raises(InvalidRequest):
sendBatch(cql, test_keyspace, BatchType.UNLOGGED, True, True, False)
def testNonCounterInCounterBatch(cql, test_keyspace):
with pytest.raises(InvalidRequest):
sendBatch(cql, test_keyspace, BatchType.COUNTER, False, True, False)
def testNonCounterInLoggedBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.LOGGED, False, True, False)
def testNonCounterInUnLoggedBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.UNLOGGED, False, True, False)
def testCounterInCounterBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.COUNTER, True, False, False)
def testCounterInUnLoggedBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.UNLOGGED, True, False, False)
def testTableWithClusteringInLoggedBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.LOGGED, False, False, True)
def testTableWithClusteringInUnLoggedBatch(cql, test_keyspace):
sendBatch(cql, test_keyspace, BatchType.UNLOGGED, False, False, True)
def testEmptyBatch(cql, test_keyspace):
cql.execute("BEGIN BATCH APPLY BATCH")
cql.execute("BEGIN UNLOGGED BATCH APPLY BATCH")
def testCounterInLoggedBatch(cql, test_keyspace):
with pytest.raises(InvalidRequest):
sendBatch(cql, test_keyspace, BatchType.LOGGED, True, False, False)
def testOversizedBatch(cql, test_keyspace):
with create_table(cql, test_keyspace, "(id int primary key, val text)") as table_noncounter:
noncounter = cql.prepare(f"insert into {table_noncounter}(id, val)values(?,?)")
with pytest.raises(InvalidRequest):
# In Scylla, the default batch_size_fail_threshold_in_kb is bigger
# so I increased the size of the string s
SIZE_FOR_FAILURE = 2500
s = "foobar" * 30
b = BatchStatement(batch_type=BatchType.UNLOGGED)
for i in range(SIZE_FOR_FAILURE):
b.add(noncounter.bind([i, s]))
cql.execute(b)