Files
scylladb/test/cluster/test_create_table_during_node_shutdown.py
Andrei Chekun cc5ac75d73 test.py: remove deprecated skip_mode decorator
Finishing the deprecation of the skip_mode function in favor of
pytest.mark.skip_mode. This PR is only cleaning and migrating leftover tests
that are still used and old way of skip_mode.

Closes scylladb/scylladb#28299
2026-01-25 18:17:27 +02:00

46 lines
2.0 KiB
Python

#
# Copyright (C) 2025-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
import asyncio
import pytest
from test.pylib.manager_client import ManagerClient
from test.cluster.util import new_test_keyspace, reconnect_driver
@pytest.mark.asyncio
@pytest.mark.skip_mode(mode='release', reason="error injections aren't enabled in release mode")
async def test_create_table_notification_deadlock_with_shutdown(manager: ManagerClient):
"""
Execute a CREATE TABLE query during node shutdown and reproduce a deadlock between
the create table notification and unregistering listeners.
Reproduces scylladb/scylladb#27364
"""
server = await manager.server_add()
cql = manager.get_cql()
async with new_test_keyspace(manager, "") as ks:
pause_in_notif_injection = "pause_in_allocate_tablets_for_new_table"
await manager.api.enable_injection(server.ip_addr, pause_in_notif_injection, one_shot=True)
# Start creating the table asynchronously. it will wait at the injection point during the notification.
cql.run_async(f"CREATE TABLE {ks}.t (pk int primary key, v int)")
log = await manager.server_open_log(server.server_id)
mark = await log.mark()
# Start shutting down the node. it will wait while unregistering a listener because there is
# a notification running that holds the lock of the migration listeners vector.
stop_task = asyncio.create_task(manager.server_stop_gracefully(server.server_id))
await log.wait_for('Shutting down native transport server', timeout=60, from_mark=mark)
await asyncio.sleep(1)
# Now continue to run the nested notification. Since there is a waiter, it may deadlock when
# reading the migration listeners vector.
await manager.api.message_injection(server.ip_addr, pause_in_notif_injection)
await stop_task
# reconnect for dropping the keyspace
await manager.server_start(server.server_id)
await reconnect_driver(manager)