Merge 'Add tablet enforcing option' from Benny Halevy

This series add a new config option: `tablets_mode_for_new_keyspaces` that replaces the existing
`enable_tablets` option. It can be set to the following values:
    disabled: New keyspaces use vnodes by default, unless enabled by the tablets={'enabled':true} option
    enabled:  New keyspaces use tablets by default, unless disabled by the tablets={'disabled':true} option
    enforced: New keyspaces must use tablets. Tablets cannot be disabled using the CREATE KEYSPACE option

`tablets_mode_for_new_keyspaces=disabled` or `tablets_mode_for_new_keyspaces=enabled` control whether
tablets are disabled or enabled by default for new keyspaces, respectively.
In either cases, tablets can be opted-in or out using the `tablets={'enabled':...}`
keyspace option, when the keyspace is created.

`tablets_mode_for_new_keyspaces=enforced` enables tablets by default for new keyspaces,
like `tablets_mode_for_new_keyspaces=enabled`.
However, it does not allow to opt-out when creating
new keyspaces by setting `tablets = {'enabled': false}`

Refs scylladb/scylla-enterprise#4355

* Requires backport to 2025.1

Closes scylladb/scylladb#22273

* github.com:scylladb/scylladb:
  boost/tablets_test: verify failure to create keyspace with tablets and non network replication strategy
  tablets: enforce tablets using tablets_mode_for_new_keyspaces=enforced config option
  db/config: add tablets_mode_for_new_keyspaces option
This commit is contained in:
Botond Dénes
2025-04-03 16:32:18 +03:00
51 changed files with 220 additions and 107 deletions

View File

@@ -19,5 +19,5 @@ extra_scylla_config_options:
alternator_timeout_in_ms: 30000,
alternator_ttl_period_in_seconds: 0.5,
alternator_streams_time_window_s: 0,
enable_tablets: True
tablets_mode_for_new_keyspaces: enabled
}

View File

@@ -121,7 +121,7 @@ SEASTAR_TEST_CASE(test_commitlog_cleanups) {
auto cfg = cql_test_config();
cfg.db_config->auto_snapshot.set(false);
cfg.db_config->commitlog_sync.set("batch");
cfg.db_config->enable_tablets.set(true);
cfg.db_config->tablets_mode_for_new_keyspaces.set(db::tablets_mode_t::mode::enabled);
cfg.initial_tablets = 1;
return do_with_cql_env_thread([](cql_test_env& e) {
@@ -173,7 +173,7 @@ SEASTAR_TEST_CASE(test_commitlog_cleanup_record_gc) {
auto cfg = cql_test_config();
cfg.db_config->auto_snapshot.set(false);
cfg.db_config->commitlog_sync.set("batch");
cfg.db_config->enable_tablets.set(true);
cfg.db_config->tablets_mode_for_new_keyspaces.set(db::tablets_mode_t::mode::enabled);
cfg.initial_tablets = 1;
return do_with_cql_env_thread([](cql_test_env& e) {

View File

@@ -5892,7 +5892,7 @@ SEASTAR_TEST_CASE(test_setting_synchronous_updates_property) {
static
cql_test_config tablet_cql_test_config() {
cql_test_config c;
c.db_config->enable_tablets.set(true);
c.db_config->tablets_mode_for_new_keyspaces.set(db::tablets_mode_t::mode::enabled);
return c;
}

View File

@@ -179,7 +179,7 @@ SEASTAR_TEST_CASE(test_partitioned_sstable_set_bytes_on_disk) {
SEASTAR_TEST_CASE(test_tablet_sstable_set_copy_ctor) {
// enable tablets, to get access to tablet_storage_group_manager
cql_test_config cfg;
cfg.db_config->enable_tablets(true);
cfg.db_config->tablets_mode_for_new_keyspaces(db::tablets_mode_t::mode::enabled);
return do_with_cql_env_thread([&](cql_test_env& env) {
env.execute_cql("CREATE KEYSPACE test_tablet_sstable_set_copy_ctor"

View File

@@ -9,6 +9,7 @@
#include <seastar/core/shard_id.hh>
#include <seastar/coroutine/as_future.hh>
#undef SEASTAR_TESTING_MAIN
#include <seastar/testing/test_case.hh>
#include "test/lib/random_utils.hh"
@@ -82,10 +83,10 @@ void verify_tablet_metadata_update(cql_test_env& env, tablet_metadata& tm, std::
}
static
cql_test_config tablet_cql_test_config(bool enable_tablets = true) {
cql_test_config tablet_cql_test_config(db::tablets_mode_t::mode enable_tablets = db::tablets_mode_t::mode::enabled) {
cql_test_config c;
c.db_config->enable_tablets(enable_tablets);
if (enable_tablets) {
c.db_config->tablets_mode_for_new_keyspaces(enable_tablets);
if (c.db_config->enable_tablets_by_default()) {
c.initial_tablets = 2;
}
return c;
@@ -3826,7 +3827,7 @@ SEASTAR_TEST_CASE(test_cleanup_of_deallocated_tablet) {
namespace {
future<> test_create_keyspace(sstring ks_name, std::optional<bool> tablets_opt, const cql_test_config& cfg, uint64_t initial_tablets = 0) {
future<> test_create_keyspace(sstring ks_name, std::optional<bool> tablets_opt, const cql_test_config& cfg, uint64_t initial_tablets = 0, sstring replication_strategy = "NetworkTopologyStrategy") {
co_await do_with_cql_env_thread([&] (cql_test_env& e) {
sstring extra;
if (tablets_opt) {
@@ -3840,7 +3841,7 @@ future<> test_create_keyspace(sstring ks_name, std::optional<bool> tablets_opt,
extra = " and tablets = { 'enabled' : false }";
}
}
auto q = format("create keyspace {} with replication = {{ 'class' : 'NetworkTopologyStrategy', 'replication_factor' : 1 }}{};", ks_name, extra);
auto q = format("create keyspace {} with replication = {{ 'class' : '{}', 'replication_factor' : 1 }}{};", ks_name, replication_strategy, extra);
testlog.debug("{}", q);
e.execute_cql(q).get();
BOOST_REQUIRE(e.local_db().has_keyspace(ks_name));
@@ -3851,7 +3852,7 @@ future<> test_create_keyspace(sstring ks_name, std::optional<bool> tablets_opt,
testlog.debug("shard table_count={}", count);
return count;
}, int64_t(0), std::plus<int64_t>()).get();
if (tablets_opt.value_or(cfg.db_config->enable_tablets())) {
if (tablets_opt.value_or(cfg.db_config->enable_tablets_by_default())) {
if (initial_tablets) {
BOOST_REQUIRE_EQUAL(total, initial_tablets);
} else {
@@ -3866,10 +3867,10 @@ future<> test_create_keyspace(sstring ks_name, std::optional<bool> tablets_opt,
}
// Test that tablets can be explicitly enabled
// when creating a keyspace when the `enable_tablets`
// configuration option is set to `false`.
// when creating a keyspace when the `tablets_mode_for_new_keyspaces`
// configuration option is set to `disabled`.
SEASTAR_TEST_CASE(test_explicit_tablets_enable) {
auto cfg = tablet_cql_test_config(false);
auto cfg = tablet_cql_test_config(db::tablets_mode_t::mode::disabled);
// By default tablets are disabled
co_await test_create_keyspace("test_default_settings", std::nullopt, cfg);
@@ -3880,13 +3881,21 @@ SEASTAR_TEST_CASE(test_explicit_tablets_enable) {
// Tablets can also be explicitly disabled for a new keyspace
co_await test_create_keyspace("test_explictly_disabled", false, cfg);
// Replication strategies that do not support tablets cannot be used when tablets are explicitly enabled
for (const auto& [rs_desc, rs_type] : db::replication_strategy_restriction_t::map()) {
if (rs_type != locator::replication_strategy_type::network_topology) {
auto f = co_await coroutine::as_future(test_create_keyspace("test_unsupported_replication_strategy", true, cfg, 0, rs_desc));
BOOST_REQUIRE_THROW(f.get(), exceptions::configuration_exception);
}
}
}
// Test that tablets can be explicitly disabled
// when creating a keyspace when the `enable_tablets`
// configuration option is set to `true`.
// when creating a keyspace when the `tablets_mode_for_new_keyspaces`
// configuration option is set to `enabled`.
SEASTAR_TEST_CASE(test_explicit_tablets_disable) {
auto cfg = tablet_cql_test_config(true);
auto cfg = tablet_cql_test_config(db::tablets_mode_t::mode::enabled);
// By default tablets are enabled
co_await test_create_keyspace("test_default_settings", std::nullopt, cfg);
@@ -3899,6 +3908,28 @@ SEASTAR_TEST_CASE(test_explicit_tablets_disable) {
co_await test_create_keyspace("test_explictly_enabled_128", true, cfg, 128);
}
// Test that when tablets they cannot be explicitly disabled
// when creating a keyspace when the `enable_tablets`
// configuration option is set to `force`.
SEASTAR_TEST_CASE(test_enforce_tablets) {
auto cfg = tablet_cql_test_config(db::tablets_mode_t::mode::enforced);
// By default tablets are enabled
co_await test_create_keyspace("test_default_settings", std::nullopt, cfg);
// Tablets cannot be explicitly disabled for a new keyspace
auto f = co_await coroutine::as_future(test_create_keyspace("test_not_explictly_disabled", false, cfg));
BOOST_REQUIRE_THROW(f.get(), exceptions::configuration_exception);
// Replication strategies that do not support tablets cannot be used when tablets are explicitly enabled
for (const auto& [rs_desc, rs_type] : db::replication_strategy_restriction_t::map()) {
if (rs_type != locator::replication_strategy_type::network_topology) {
auto f = co_await coroutine::as_future(test_create_keyspace("test_unsupported_replication_strategy", true, cfg, 0, rs_desc));
BOOST_REQUIRE_THROW(f.get(), exceptions::configuration_exception);
}
}
}
SEASTAR_TEST_CASE(test_recognition_of_deprecated_name_for_resize_transition) {
using transition_state = service::topology::transition_state;
BOOST_REQUIRE_EQUAL(service::transition_state_from_string("tablet split finalization"), transition_state::tablet_split_finalization);

View File

@@ -149,7 +149,7 @@ async def check_auth_v2_works(manager: ManagerClient, hosts):
@pytest.mark.asyncio
async def test_auth_v2_migration(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {**auth_config, 'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {**auth_config, 'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to

View File

@@ -62,7 +62,7 @@ async def test_service_levels_snapshot(manager: ManagerClient):
@pytest.mark.asyncio
async def test_service_levels_upgrade(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {**auth_config, 'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {**auth_config, 'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to
@@ -385,7 +385,7 @@ async def test_workload_prioritization_upgrade(manager: ManagerClient):
'authenticator': 'AllowAllAuthenticator',
'authorizer': 'AllowAllAuthorizer',
'force_gossip_topology_changes': True,
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
'error_injections_at_startup': [
{
'name': 'suppress_features',

View File

@@ -29,7 +29,7 @@ logger = logging.getLogger(__name__)
@pytest.mark.asyncio
@skip_mode('release', 'error injections are not supported in release mode')
async def test_mv_tablets_empty_ip(manager: ManagerClient):
cfg = {'enable_tablets': True}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(4, config = cfg)
cql = manager.get_cql()

View File

@@ -29,7 +29,7 @@ logger = logging.getLogger(__name__)
@skip_mode('release', "error injections aren't enabled in release mode")
async def test_mv_admission_control_exception(manager: ManagerClient) -> None:
node_count = 2
config = {'error_injections_at_startup': ['view_update_limit', 'update_backlog_immediately'], 'enable_tablets': True}
config = {'error_injections_at_startup': ['view_update_limit', 'update_backlog_immediately'], 'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(node_count, config=config)
cql, hosts = await manager.get_ready_cql(servers)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1} AND tablets = {'initial': 1}") as ks:
@@ -67,8 +67,8 @@ async def test_mv_admission_control_exception(manager: ManagerClient) -> None:
@skip_mode('release', "error injections aren't enabled in release mode")
async def test_mv_retried_writes_reach_all_replicas(manager: ManagerClient) -> None:
node_count = 4
servers = await manager.servers_add(node_count - 1, config={'error_injections_at_startup': ['update_backlog_immediately'], 'enable_tablets': True})
server = await manager.server_add(config={'error_injections_at_startup': ['view_update_limit', 'delay_before_remote_view_update', 'update_backlog_immediately'], 'enable_tablets': True})
servers = await manager.servers_add(node_count - 1, config={'error_injections_at_startup': ['update_backlog_immediately'], 'tablets_mode_for_new_keyspaces': 'enabled'})
server = await manager.server_add(config={'error_injections_at_startup': ['view_update_limit', 'delay_before_remote_view_update', 'update_backlog_immediately'], 'tablets_mode_for_new_keyspaces': 'enabled'})
cql, hosts = await manager.get_ready_cql(servers)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 3} AND tablets = {'initial': 1}") as ks:

View File

@@ -27,7 +27,7 @@ logger = logging.getLogger(__name__)
async def test_view_backlog_increased_after_write(manager: ManagerClient) -> None:
node_count = 2
# Use a higher smp to make it more likely that the writes go to a different shard than the coordinator.
servers = await manager.servers_add(node_count, cmdline=['--smp', '5'], config={'error_injections_at_startup': ['never_finish_remote_view_updates'], 'enable_tablets': True})
servers = await manager.servers_add(node_count, cmdline=['--smp', '5'], config={'error_injections_at_startup': ['never_finish_remote_view_updates'], 'tablets_mode_for_new_keyspaces': 'enabled'})
cql = manager.get_cql()
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1} AND tablets = {'initial': 1}") as ks:
await cql.run_async(f"CREATE TABLE {ks}.tab (base_key int, view_key int, v text, PRIMARY KEY (base_key, view_key))")
@@ -57,7 +57,7 @@ async def test_view_backlog_increased_after_write(manager: ManagerClient) -> Non
@skip_mode('release', "error injections aren't enabled in release mode")
async def test_gossip_same_backlog(manager: ManagerClient) -> None:
node_count = 2
servers = await manager.servers_add(node_count, config={'error_injections_at_startup': ['view_update_limit', 'update_backlog_immediately'], 'enable_tablets': True})
servers = await manager.servers_add(node_count, config={'error_injections_at_startup': ['view_update_limit', 'update_backlog_immediately'], 'tablets_mode_for_new_keyspaces': 'enabled'})
cql, hosts = await manager.get_ready_cql(servers)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1} AND tablets = {'initial': 1}") as ks:
await cql.run_async(f"CREATE TABLE {ks}.tab (key int, c int, v text, PRIMARY KEY (key, c))")
@@ -102,7 +102,7 @@ async def test_gossip_same_backlog(manager: ManagerClient) -> None:
async def test_configurable_mv_control_flow_delay(manager: ManagerClient) -> None:
node_count = 2
servers = await manager.servers_add(node_count,
config={'error_injections_at_startup': ['update_backlog_immediately', 'view_update_limit', 'skip_updating_local_backlog_via_view_update_backlog_broker'], 'enable_tablets': True},
config={'error_injections_at_startup': ['update_backlog_immediately', 'view_update_limit', 'skip_updating_local_backlog_via_view_update_backlog_broker'], 'tablets_mode_for_new_keyspaces': 'enabled'},
cmdline=['--smp=1'])
cql, hosts = await manager.get_ready_cql(servers)
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1} AND tablets = {'initial': 1}") as ks:

View File

@@ -29,7 +29,7 @@ async def test_mv_read_concurrency(manager: ManagerClient) -> None:
# Disable cache to make reads use the read concurrency semaphore.
# Tests remove the rcs multiplier by default, here we use a slightly smaller one (1 instead of default 2) to hit the issue faster.
cfg = {
'enable_tablets': True,
'tablets_mode_for_new_keyspaces': 'enabled',
'enable_cache': False,
'reader_concurrency_semaphore_serialize_limit_multiplier': 1,
'view_update_reader_concurrency_semaphore_serialize_limit_multiplier': 1,
@@ -100,7 +100,7 @@ async def test_mv_read_memory(manager: ManagerClient) -> None:
# and we increase the kill limit. Without the view update read before write admission, the test exceeds even the increased limit.
# With the admission, the memory usage should stay within the limits and cause no errors.
cfg = {
'enable_tablets': True,
'tablets_mode_for_new_keyspaces': 'enabled',
'enable_cache': False,
'view_update_reader_concurrency_semaphore_serialize_limit_multiplier': 2,
'view_update_reader_concurrency_semaphore_kill_limit_multiplier': 10

View File

@@ -31,7 +31,7 @@ logger = logging.getLogger(__name__)
@skip_mode('release', 'error injections are not supported in release mode')
async def test_mv_topology_change(manager: ManagerClient):
cfg = {'force_gossip_topology_changes': True,
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
'error_injections_at_startup': ['delay_before_get_view_natural_endpoint']}
servers = [await manager.server_add(config=cfg) for _ in range(3)]
@@ -97,7 +97,7 @@ async def test_mv_topology_change(manager: ManagerClient):
@pytest.mark.asyncio
@skip_mode('release', 'error injections are not supported in release mode')
async def test_mv_update_on_pending_replica(manager: ManagerClient, intranode):
cfg = {'enable_tablets': True}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled'}
cmd = ['--smp', '2']
servers = [await manager.server_add(config=cfg, cmdline=cmd)]

View File

@@ -6,7 +6,7 @@ extra_scylla_config_options:
authenticator: AllowAllAuthenticator
authorizer: AllowAllAuthorizer
enable_user_defined_functions: False
enable_tablets: True
tablets_mode_for_new_keyspaces: enabled
run_first:
- test_raft_recovery_stuck
- test_raft_recovery_basic

View File

@@ -21,7 +21,7 @@ async def test_boot_after_ip_change(manager: ManagerClient) -> None:
"""
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
logger.info(f"Booting initial cluster")
servers = [await manager.server_add(config=cfg) for _ in range(2)]
await wait_for_token_ring_and_group0_consistency(manager, time.time() + 30)

View File

@@ -27,7 +27,7 @@ logger = logging.getLogger(__name__)
)
@pytest.mark.asyncio
async def test_change_replication_factor_1_to_0(request: pytest.FixtureRequest, manager: ManagerClient, use_tablets: bool) -> None:
CONFIG = {"endpoint_snitch": "GossipingPropertyFileSnitch", "enable_tablets": str(use_tablets)}
CONFIG = {"endpoint_snitch": "GossipingPropertyFileSnitch", "tablets_mode_for_new_keyspaces": "enabled" if use_tablets else "disabled"}
logger.info("Creating a new cluster")
for i in range(2):
await manager.server_add(
@@ -79,7 +79,7 @@ async def test_change_replication_factor_1_to_0(request: pytest.FixtureRequest,
)
@pytest.mark.asyncio
async def test_change_replication_factor_1_to_0_and_decommission(request: pytest.FixtureRequest, manager: ManagerClient, use_tablets: bool) -> None:
CONFIG = {"endpoint_snitch": "GossipingPropertyFileSnitch", "enable_tablets": str(use_tablets)}
CONFIG = {"endpoint_snitch": "GossipingPropertyFileSnitch", "tablets_mode_for_new_keyspaces": "enabled" if use_tablets else "disabled"}
logger.info("Creating a new cluster")
for i in range(2):
await manager.server_add(

View File

@@ -28,7 +28,7 @@ async def test_different_group0_ids(manager: ManagerClient):
"""
# Consistent topology changes are disabled to use repair based node operations.
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
scylla_a = await manager.server_add(config = cfg)
scylla_b = await manager.server_add(start=False, config = cfg)
await manager.server_start(scylla_b.server_id, seeds=[scylla_b.ip_addr])

View File

@@ -21,7 +21,7 @@ def workdir():
async def test_file_streaming_respects_encryption(request, manager: ManagerClient, workdir):
cfg = {
'enable_tablets': True,
'tablets_mode_for_new_keyspaces': 'enabled',
}
cmdline = ['--smp=1']

View File

@@ -61,7 +61,7 @@ def all_hints_metrics(metrics: ScyllaMetrics) -> list[str]:
@pytest.mark.asyncio
@pytest.mark.parametrize("tablets_enabled", [True, False])
async def test_fence_writes(request, manager: ManagerClient, tablets_enabled: bool):
cfg = {'enable_tablets' : tablets_enabled}
cfg = {'tablets_mode_for_new_keyspaces' : 'enabled' if tablets_enabled else 'disabled'}
logger.info("Bootstrapping first two nodes")
servers = await manager.servers_add(2, config=cfg)

View File

@@ -12,7 +12,7 @@ async def test_gossip_boot(manager: ManagerClient):
cfg = {'error_injections_at_startup': ['gossiper_replicate_sleep'],
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg, timeout=60) for _ in range(3)]
logs = [await manager.server_open_log(s.server_id) for s in servers]

View File

@@ -125,7 +125,7 @@ async def test_schema_versioning_with_recovery(manager: ManagerClient):
"""
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
logger.info("Booting cluster")
servers = [await manager.server_add(config=cfg) for _ in range(3)]
cql = manager.get_cql()
@@ -295,7 +295,7 @@ async def test_upgrade(manager: ManagerClient):
# to simulate a non-Raft cluster.
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
logger.info("Booting cluster")
servers = [await manager.server_add(config=cfg) for _ in range(2)]
cql = manager.get_cql()

View File

@@ -36,7 +36,7 @@ async def test_raft_fix_broken_snapshot(manager: ManagerClient):
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
'error_injections_at_startup': ['raft_sys_table_storage::bootstrap/init_index_0']}
srv = await manager.server_add(config=cfg)
cql = manager.get_cql()

View File

@@ -22,7 +22,7 @@ async def test_raft_recovery_basic(request, manager: ManagerClient):
# This test uses the gossip-based recovery procedure.
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
cmd = ['--logger-log-level', 'raft=trace']
servers = [await manager.server_add(config=cfg, cmdline=cmd) for _ in range(3)]

View File

@@ -32,7 +32,7 @@ async def test_recovery_after_majority_loss(request, manager: ManagerClient):
"""
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg) for _ in range(3)]
logging.info("Waiting until driver connects to every server")

View File

@@ -40,7 +40,7 @@ async def test_recover_stuck_raft_recovery(request, manager: ManagerClient):
"""
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg) for _ in range(3)]
srv1, *others = servers

View File

@@ -48,7 +48,7 @@ async def test_raft_recovery_user_data(manager: ManagerClient, remove_dead_nodes
# CQL requests.
cfg = {
'endpoint_snitch': 'GossipingPropertyFileSnitch',
'enable_tablets': True,
'tablets_mode_for_new_keyspaces': 'enabled',
'failure_detector_timeout_in_ms': 2000,
}
property_file_dc1 = {'dc': 'dc1', 'rack': 'rack1'}

View File

@@ -225,7 +225,7 @@ async def test_batchlog_flush_in_repair_without_cache(manager):
@pytest.mark.asyncio
@skip_mode('release', 'error injections are not supported in release mode')
async def test_repair_abort(manager):
cfg = {'enable_tablets': True}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled'}
await manager.server_add(config=cfg)
await manager.server_add(config=cfg)
servers = await manager.running_servers()
@@ -264,7 +264,7 @@ async def test_repair_abort(manager):
@skip_mode('release', 'error injections are not supported in release mode')
async def test_keyspace_drop_during_data_sync_repair(manager):
cfg = {
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
'error_injections_at_startup': ['get_keyspace_erms_throw_no_such_keyspace']
}
await manager.server_add(config=cfg)

View File

@@ -27,7 +27,7 @@ async def test_replace_ignore_nodes(manager: ManagerClient) -> None:
"""
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
logger.info(f"Booting initial cluster")
servers = [await manager.server_add(config=cfg) for _ in range(7)]
s2_id = await manager.get_host_id(servers[2].server_id)

View File

@@ -8,5 +8,5 @@ async def test_drop_table_during_streaming_receiver_side(manager: ManagerClient)
'enable_repair_based_node_ops': False,
'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False
'tablets_mode_for_new_keyspaces': 'disabled'
}) for _ in range(2)]

View File

@@ -32,7 +32,7 @@ logger = logging.getLogger(__name__)
@pytest.mark.asyncio
async def test_tablet_replication_factor_enough_nodes(manager: ManagerClient):
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(2, config=cfg)
cql = manager.get_cql()
@@ -50,7 +50,7 @@ async def test_tablet_replication_factor_enough_nodes(manager: ManagerClient):
@pytest.mark.asyncio
async def test_tablet_scaling_option_is_respected(manager: ManagerClient):
# 32 is high enough to ensure we demand more tablets than the default choice.
cfg = {'enable_tablets': True, 'tablets_initial_scale_factor': 32}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled', 'tablets_initial_scale_factor': 32}
servers = await manager.servers_add(1, config=cfg, cmdline=['--smp', '2'])
cql = manager.get_cql()
@@ -65,7 +65,7 @@ async def test_tablet_scaling_option_is_respected(manager: ManagerClient):
@pytest.mark.asyncio
async def test_tablet_cannot_decommision_below_replication_factor(manager: ManagerClient):
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(4, config=cfg)
logger.info("Creating table")
@@ -94,7 +94,7 @@ async def test_tablet_cannot_decommision_below_replication_factor(manager: Manag
async def test_reshape_with_tablets(manager: ManagerClient):
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
server = (await manager.servers_add(1, config=cfg, cmdline=['--smp', '1']))[0]
logger.info("Creating table")
@@ -131,7 +131,7 @@ async def test_reshape_with_tablets(manager: ManagerClient):
@pytest.mark.parametrize("direction", ["up", "down", "none"])
@pytest.mark.asyncio
async def test_tablet_rf_change(manager: ManagerClient, direction):
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(3, config=cfg)
for s in servers:
await manager.api.disable_tablet_balancing(s.ip_addr)
@@ -198,7 +198,7 @@ async def test_tablet_mutation_fragments_unowned_partition(manager: ManagerClien
"""Check that MUTATION_FRAGMENTS() queries handle the case when a partition
not owned by the node is attempted to be read."""
cfg = {'enable_user_defined_functions': False,
'enable_tablets': True }
'tablets_mode_for_new_keyspaces': 'enabled' }
servers = await manager.servers_add(3, config=cfg)
cql = manager.get_cql()
@@ -223,7 +223,7 @@ async def test_tablet_mutation_fragments_unowned_partition(manager: ManagerClien
# See also cqlpy/test_tablets.py::test_alter_tablet_keyspace_rf for basic scenarios tested
@pytest.mark.asyncio
async def test_multidc_alter_tablets_rf(request: pytest.FixtureRequest, manager: ManagerClient) -> None:
config = {"endpoint_snitch": "GossipingPropertyFileSnitch", "enable_tablets": "true"}
config = {"endpoint_snitch": "GossipingPropertyFileSnitch", "tablets_mode_for_new_keyspaces": "enabled"}
logger.info("Creating a new cluster of 2 nodes in 1st DC and 2 nodes in 2nd DC")
# we have to have at least 2 nodes in each DC if we want to try setting RF to 2 in each DC
@@ -269,7 +269,7 @@ async def test_multidc_alter_tablets_rf(request: pytest.FixtureRequest, manager:
# from is migrated away.
@pytest.mark.asyncio
async def test_saved_readers_tablet_migration(manager: ManagerClient, build_mode):
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
if build_mode != "release":
cfg['error_injections_at_startup'] = [{'name': 'querier-cache-ttl-seconds', 'value': 999999999}]
@@ -341,7 +341,7 @@ async def test_saved_readers_tablet_migration(manager: ManagerClient, build_mode
@skip_mode('release', 'error injections are not supported in release mode')
async def test_read_of_pending_replica_during_migration(manager: ManagerClient, with_cache):
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
cmdline = [
'--logger-log-level', 'storage_service=debug',
'--logger-log-level', 'raft_topology=debug',
@@ -408,7 +408,7 @@ async def test_read_of_pending_replica_during_migration(manager: ManagerClient,
@pytest.mark.parametrize("replication_strategy", ["NetworkTopologyStrategy", "SimpleStrategy", "EverywhereStrategy", "LocalStrategy"])
@pytest.mark.asyncio
async def test_keyspace_creation_cql_vs_config_sanity(manager: ManagerClient, with_tablets, replication_strategy):
cfg = {'enable_tablets': with_tablets}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled' if with_tablets else 'disabled'}
server = await manager.server_add(config=cfg)
cql = manager.get_cql()
@@ -445,13 +445,13 @@ async def test_keyspace_creation_cql_vs_config_sanity(manager: ManagerClient, wi
@pytest.mark.asyncio
async def test_tablets_and_gossip_topology_changes_are_incompatible(manager: ManagerClient):
cfg = {"enable_tablets": True, "force_gossip_topology_changes": True}
cfg = {"tablets_mode_for_new_keyspaces": "enabled", "force_gossip_topology_changes": True}
with pytest.raises(Exception, match="Failed to add server"):
await manager.server_add(config=cfg)
@pytest.mark.asyncio
async def test_tablets_disabled_with_gossip_topology_changes(manager: ManagerClient):
cfg = {"enable_tablets": False, "force_gossip_topology_changes": True}
cfg = {"tablets_mode_for_new_keyspaces": "disabled", "force_gossip_topology_changes": True}
await manager.server_add(config=cfg)
cql = manager.get_cql()
async with new_test_keyspace(manager, "WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 1}") as ks_name:
@@ -476,7 +476,7 @@ async def test_tablet_streaming_with_unbuilt_view(manager: ManagerClient):
4) Once migration completes, the view should have the correct number of rows
"""
logger.info("Starting Node 1")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
cmdline = [
'--logger-log-level', 'storage_service=debug',
'--logger-log-level', 'raft_topology=debug',
@@ -532,7 +532,7 @@ async def test_tablet_streaming_with_staged_sstables(manager: ManagerClient):
6) Once migration completes, the view should have the correct number of rows
"""
logger.info("Starting Node 1")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
cmdline = [
'--logger-log-level', 'storage_service=debug',
'--logger-log-level', 'raft_topology=debug',
@@ -605,7 +605,7 @@ async def test_orphaned_sstables_on_startup(manager: ManagerClient):
7) Attempting to start node1 should fail as it now has an 'orphaned' sstable
"""
logger.info("Starting Node 1")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
cmdline = [
'--logger-log-level', 'storage_service=debug',
'--logger-log-level', 'raft_topology=debug',

View File

@@ -844,7 +844,7 @@ async def test_tablet_cleanup_failure(manager: ManagerClient):
@pytest.mark.asyncio
async def test_tablet_resharding(manager: ManagerClient):
cmdline = ['--smp=3']
config = {'enable_tablets': True}
config = {'tablets_mode_for_new_keyspaces': 'enabled'}
servers = await manager.servers_add(1, cmdline=cmdline)
server = servers[0]

View File

@@ -21,7 +21,7 @@ logger = logging.getLogger(__name__)
@skip_mode('release', 'error injections are not supported in release mode')
async def test_alter_dropped_tablets_keyspace(manager: ManagerClient) -> None:
config = {
'enable_tablets': 'true'
'tablets_mode_for_new_keyspaces': 'enabled'
}
logger.info("starting a node (the leader)")
@@ -72,7 +72,7 @@ async def test_alter_dropped_tablets_keyspace(manager: ManagerClient) -> None:
@skip_mode('release', 'error injections are not supported in release mode')
async def test_alter_tablets_keyspace_concurrent_modification(manager: ManagerClient) -> None:
config = {
'enable_tablets': 'true'
'tablets_mode_for_new_keyspaces': 'enabled'
}
logger.info("starting a node (the leader)")

View File

@@ -23,7 +23,7 @@ logger = logging.getLogger(__name__)
@pytest.mark.asyncio
async def test_tablet_transition_sanity(manager: ManagerClient, action):
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
host_ids = []
servers = []
@@ -105,7 +105,7 @@ async def test_node_failure_during_tablet_migration(manager: ManagerClient, fail
pytest.skip('Failing source during target cleanup is pointless')
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True, 'failure_detector_timeout_in_ms': 2000}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled', 'failure_detector_timeout_in_ms': 2000}
host_ids = []
servers = []
@@ -249,7 +249,7 @@ async def test_node_failure_during_tablet_migration(manager: ManagerClient, fail
@pytest.mark.asyncio
async def test_tablet_back_and_forth_migration(manager: ManagerClient):
logger.info("Bootstrapping cluster")
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
host_ids = []
servers = []
@@ -299,7 +299,7 @@ async def test_tablet_back_and_forth_migration(manager: ManagerClient):
async def test_staging_backlog_is_preserved_with_file_based_streaming(manager: ManagerClient):
logger.info("Bootstrapping cluster")
# the error injection will halt view updates from staging, allowing migration to transfer the view update backlog.
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True,
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled',
'error_injections_at_startup': ['view_update_generator_consume_staging_sstable']}
servers = [await manager.server_add(config=cfg)]

View File

@@ -53,7 +53,7 @@ async def remove_error_on(manager: ManagerClient, error_name: str, servers: list
@pytest.mark.asyncio
@skip_mode('release', 'error injections are not supported in release mode')
async def test_tablet_drain_failure_during_decommission(manager: ManagerClient):
cfg = {'enable_user_defined_functions': False, 'enable_tablets': True}
cfg = {'enable_user_defined_functions': False, 'tablets_mode_for_new_keyspaces': 'enabled'}
servers = [await manager.server_add(config=cfg) for _ in range(3)]
logs = [await manager.server_open_log(srv.server_id) for srv in servers]

View File

@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
@pytest.mark.parametrize("tablets_enabled", [True, False])
async def test_topology_ops(request, manager: ManagerClient, tablets_enabled: bool):
"""Test basic topology operations using the topology coordinator."""
cfg = {'enable_tablets' : tablets_enabled}
cfg = {'tablets_mode_for_new_keyspaces': 'enabled' if tablets_enabled else 'disabled'}
rf = 3
num_nodes = rf
if tablets_enabled:

View File

@@ -25,7 +25,7 @@ async def test_topology_ops_encrypted(request, manager: ManagerClient, tablets_e
d.mkdir()
k = d / "system_key"
k.write_text('AES/CBC/PKCS5Padding:128:ApvJEoFpQmogvam18bb54g==')
cfg = {'enable_tablets' : tablets_enabled,
cfg = {'tablets_mode_for_new_keyspaces': 'enabled' if tablets_enabled else 'disabled',
'user_info_encryption': {'enabled': True, 'key_provider': 'LocalFileSystemKeyProviderFactory'},
'system_key_directory': d.as_posix()}
rf = 3

View File

@@ -28,7 +28,7 @@ async def test_remove_garbage_group0_members(manager: ManagerClient):
# 4 servers, one dead
cfg = {'enable_user_defined_functions': False,
'force_gossip_topology_changes': True,
'enable_tablets': False}
'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg) for _ in range(4)]
# Make sure that the driver has connected to all nodes, and they see each other as NORMAL

View File

@@ -22,7 +22,7 @@ async def test_topology_upgrade_basic(request, build_mode: str, manager: Manager
# First, force the first node to start in legacy mode
cfg = {
'force_gossip_topology_changes': True,
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
'ring_delay_ms': 15000 if build_mode == 'debug' else 5000,
}

View File

@@ -31,7 +31,7 @@ async def test_topology_upgrade_not_stuck_after_recent_removal(request, manager:
# First, force the nodes to start in legacy mode due to the error injection
cfg = {
'force_gossip_topology_changes': True,
'enable_tablets': False,
'tablets_mode_for_new_keyspaces': 'disabled',
}
logging.info("Creating a two node cluster")

View File

@@ -45,7 +45,7 @@ async def test_topology_upgrade_stuck(request, manager: ManagerClient):
"""
# First, force the first node to start in legacy mode
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg) for _ in range(5)]
to_be_upgraded_node, to_be_isolated_node, *to_be_shutdown_nodes = servers

View File

@@ -24,7 +24,7 @@ logger = logging.getLogger(__name__)
async def test_truncate_while_migration(manager: ManagerClient):
logger.info('Bootstrapping cluster')
cfg = { 'enable_tablets': True,
cfg = { 'tablets_mode_for_new_keyspaces': 'enabled',
'error_injections_at_startup': ['migration_streaming_wait']
}
@@ -76,7 +76,7 @@ async def get_raft_leader_and_log(manager: ManagerClient, servers):
async def test_truncate_with_concurrent_drop(manager: ManagerClient):
logger.info('Bootstrapping cluster')
cfg = { 'enable_tablets': True,
cfg = { 'tablets_mode_for_new_keyspaces': 'enabled',
'error_injections_at_startup': ['truncate_table_wait']
}
@@ -127,7 +127,7 @@ async def test_truncate_with_concurrent_drop(manager: ManagerClient):
async def test_truncate_while_node_restart(manager: ManagerClient):
logger.info('Bootstrapping cluster')
cfg = { 'enable_tablets': True }
cfg = { 'tablets_mode_for_new_keyspaces': 'enabled' }
servers = []
servers.append(await manager.server_add(config=cfg))
@@ -175,7 +175,7 @@ async def test_truncate_while_node_restart(manager: ManagerClient):
async def test_truncate_with_coordinator_crash(manager: ManagerClient):
logger.info('Bootstrapping cluster')
cfg = { 'enable_tablets': True }
cfg = { 'tablets_mode_for_new_keyspaces': 'enabled' }
servers = []
servers.append(await manager.server_add(config=cfg))
@@ -221,7 +221,7 @@ async def test_truncate_with_coordinator_crash(manager: ManagerClient):
async def test_truncate_while_truncate_already_waiting(manager: ManagerClient):
logger.info('Bootstrapping cluster')
cfg = { 'enable_tablets': True,
cfg = { 'tablets_mode_for_new_keyspaces': 'enabled',
'error_injections_at_startup': ['migration_streaming_wait']
}

View File

@@ -196,7 +196,7 @@ async def test_view_build_status_snapshot(manager: ManagerClient):
@pytest.mark.asyncio
async def test_view_build_status_migration_to_v2(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to
@@ -248,7 +248,7 @@ async def test_view_build_status_migration_to_v2(request, manager: ManagerClient
@pytest.mark.asyncio
async def test_view_build_status_migration_to_v2_with_write_during_migration(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to
@@ -306,7 +306,7 @@ async def test_view_build_status_migration_to_v2_with_write_during_migration(req
@pytest.mark.asyncio
async def test_view_build_status_migration_to_v2_barrier(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to
@@ -424,7 +424,7 @@ async def test_view_build_status_with_replace_node(manager: ManagerClient):
@pytest.mark.asyncio
async def test_view_build_status_migration_to_v2_with_cleanup(request, manager: ManagerClient):
# First, force the first node to start in legacy mode
cfg = {'force_gossip_topology_changes': True, 'enable_tablets': False}
cfg = {'force_gossip_topology_changes': True, 'tablets_mode_for_new_keyspaces': 'disabled'}
servers = [await manager.server_add(config=cfg)]
# Enable raft-based node operations for subsequent nodes - they should fall back to

View File

@@ -27,11 +27,11 @@ async def test_zero_token_nodes_topology_ops(manager: ManagerClient, tablets_ena
logging.info('Trying to add a zero-token server in the gossip-based topology')
await manager.server_add(config={'join_ring': False,
'force_gossip_topology_changes': True,
'enable_tablets': False},
'tablets_mode_for_new_keyspaces': 'disabled'},
expected_error='the raft-based topology is disabled')
normal_cfg = {'enable_tablets': tablets_enabled}
zero_token_cfg = {'enable_tablets': tablets_enabled, 'join_ring': False}
normal_cfg = {'tablets_mode_for_new_keyspaces': 'enabled' if tablets_enabled else 'disabled'}
zero_token_cfg = {'tablets_mode_for_new_keyspaces': 'enabled' if tablets_enabled else 'disabled', 'join_ring': False}
logging.info('Adding the first server')
server_a = await manager.server_add(config=normal_cfg)

View File

@@ -579,7 +579,7 @@ int scylla_simple_query_main(int argc, char** argv) {
db_cfg->enable_cache(enable_cache);
cql_test_config cfg(db_cfg);
if (app.configuration().contains("tablets")) {
cfg.db_config->enable_tablets.set(true);
cfg.db_config->tablets_mode_for_new_keyspaces.set(db::tablets_mode_t::mode::enabled);
cfg.initial_tablets = app.configuration()["initial-tablets"].as<unsigned>();
}
set_from_cli("audit", app, cfg.db_config->audit);

View File

@@ -39,7 +39,7 @@ static const size_t MiB = 1 << 20;
static
cql_test_config tablet_cql_test_config() {
cql_test_config c;
c.db_config->enable_tablets.set(true);
c.db_config->tablets_mode_for_new_keyspaces.set(db::tablets_mode_t::mode::enabled);
return c;
}