Files
scylladb/test/cluster/test_raft_cluster_features.py
Gleb Natapov 08268eee3f topology: disable force-gossip-topology-changes option
The patch marks force-gossip-topology-changes as deprecated and removes
tests that use it. There is one test (test_different_group0_ids) which
is marked as xfail instead since it looks like gossiper mode was used
there as a way to easily achieve a certain state, so more investigation
is needed if the tests can be fixed to use raft mode instead.

Closes scylladb/scylladb#28383
2026-02-02 09:56:32 +01:00

86 lines
3.5 KiB
Python

#
# Copyright (C) 2023-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
"""
Tests that are specific to the raft-based cluster feature implementation.
"""
import asyncio
import time
from test.pylib.manager_client import ManagerClient
from test.pylib.util import wait_for_cql_and_get_hosts, wait_for_feature
from test.cluster import test_cluster_features
import pytest
@pytest.mark.asyncio
async def test_rolling_upgrade_happy_path(manager: ManagerClient) -> None:
await manager.servers_add(3, auto_rack_dc="dc1")
await test_cluster_features.test_rolling_upgrade_happy_path(manager)
@pytest.mark.asyncio
async def test_downgrade_after_partial_upgrade(manager: ManagerClient) -> None:
await manager.servers_add(3, auto_rack_dc="dc1")
await test_cluster_features.test_downgrade_after_partial_upgrade(manager)
@pytest.mark.asyncio
async def test_joining_old_node_fails(manager: ManagerClient) -> None:
await manager.servers_add(3, auto_rack_dc="dc1")
await test_cluster_features.test_joining_old_node_fails(manager)
@pytest.mark.asyncio
async def test_downgrade_after_successful_upgrade_fails(manager: ManagerClient) -> None:
await manager.servers_add(3, auto_rack_dc="dc1")
await test_cluster_features.test_downgrade_after_successful_upgrade_fails(manager)
@pytest.mark.asyncio
async def test_partial_upgrade_can_be_finished_with_removenode(manager: ManagerClient) -> None:
await manager.servers_add(3, auto_rack_dc="dc1")
await test_cluster_features.test_partial_upgrade_can_be_finished_with_removenode(manager)
@pytest.mark.asyncio
async def test_cannot_disable_cluster_feature_after_all_declare_support(manager: ManagerClient) -> None:
"""Upgrade all nodes to support the test cluster feature, but suppress
the topology coordinator and prevent it from enabling the feature.
Try to downgrade one of the nodes - it should fail because of the
missing feature. Unblock the topology coordinator, restart the node
and observe that the feature was enabled.
"""
servers = await manager.servers_add(3, auto_rack_dc="dc1")
# Rolling restart so that all nodes support the feature - but do not
# allow enabling yet
for srv in servers:
await manager.server_update_config(srv.server_id, 'error_injections_at_startup', [
'raft_topology_suppress_enabling_features',
'features_enable_test_feature',
])
await manager.server_restart(srv.server_id)
# Try to downgrade one node
await manager.server_update_config(servers[0].server_id, 'error_injections_at_startup', [])
await manager.server_stop(servers[0].server_id)
await manager.server_start(servers[0].server_id,
expected_error="Feature 'TEST_ONLY_FEATURE' was previously supported by all nodes in the cluster")
# Unblock enabling features on nodes
for srv in servers[1:]:
await manager.api.disable_injection(srv.ip_addr, 'raft_topology_suppress_enabling_features')
# Re-enable the feature again and restart
await manager.server_update_config(servers[0].server_id, 'error_injections_at_startup', [
'features_enable_test_feature',
])
await manager.server_start(servers[0].server_id)
# Nodes should start supporting the feature
cql = cql = manager.get_cql()
hosts = await wait_for_cql_and_get_hosts(cql, servers, time.time() + 60)
await asyncio.gather(*(wait_for_feature('TEST_ONLY_FEATURE', cql, h, time.time() + 60) for h in hosts))