65 lines
2.2 KiB
Python
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
|