Files
scylladb/test/cluster/test_query_rebounce.py
Artsiom Mishuta d1198f8318 test.py: rename topology_custom folder to cluster
rename topology_custom folder to cluster
as it contains not only topology test cases
2025-03-04 10:32:44 +01:00

65 lines
2.2 KiB
Python

#
# Copyright (C) 2024-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
import asyncio
import pytest
import logging
import time
from test.pylib.internal_types import IPAddress
from test.pylib.manager_client import ManagerClient
from test.pylib.rest_client import inject_error
from test.cluster.util import new_test_keyspace
logger = logging.getLogger(__name__)
@pytest.mark.asyncio
async def test_query_rebounce(manager: ManagerClient):
"""
Issue https://github.com/scylladb/scylladb/issues/15465.
Test emulating several LWT(Lightweight Transaction) query rebounces. Currently, the code
that processes queries does not expect that a query may be rebounced more than once.
It was impossible with the VNodes, but with intruduction of the Tablets, data can be moved
between shards by the balancer thus a query can be rebounced to different shards multiple times.
1) Create a keyspace and a table.
2) Insert some data.
3) Inject an error to force a rebounce 2 times.
4) Update the data with a LWT query. The update will fail on this step with the current implementation.
5) Check the result of update.
"""
cmdline = [
'--logger-log-level', 'raft=trace',
]
servers = await manager.servers_add(1, cmdline=cmdline)
servers = await manager.running_servers()
cql = manager.get_cql()
async with new_test_keyspace(manager, "with replication = {'class': 'SimpleStrategy', 'replication_factor': 1} and tablets = {'enabled': false};") as ks:
await cql.run_async(f"create table {ks}.lwt (a int, b int, primary key(a));")
await cql.run_async(f"insert into {ks}.lwt (a,b ) values (1, 10);")
await cql.run_async(f"insert into {ks}.lwt (a,b ) values (2, 20);")
errs = [manager.api.enable_injection(s.ip_addr, "forced_bounce_to_shard_counter", one_shot=False,
parameters={'value': '2'})
for s in servers]
await asyncio.gather(*errs)
await cql.run_async(f"update {ks}.lwt set b = 11 where a = 1 if b = 10;")
rows = await cql.run_async(f"select b from {ks}.lwt where a = 1;")
assert rows[0].b == 11