From bdd0b764db07c56464b4a1312c77156c36476713 Mon Sep 17 00:00:00 2001 From: Piotr Szymaniak Date: Wed, 22 Apr 2026 11:54:03 +0200 Subject: [PATCH 1/2] alternator: Graduate Alternator Streams from experimental Alternator Streams were experimental until 2026.2, when they became GA. Stop requiring `--experimental-features=alternator-streams` by: - Removing ALTERNATOR_STREAMS from the experimental feature enum - Mapping "alternator-streams" to UNUSED for backward compatibility - Removing the gating that disabled the ALTERNATOR_STREAMS gossip feature when the experimental flag was absent - Removing the runtime guard that rejected StreamSpecification requests without the feature flag - Updating config_test to reflect the new UNUSED mapping The gms::feature alternator_streams is kept for rolling upgrade compatibility with older nodes. Fixes SCYLLADB-1680 (cherry picked from commit 870013b4377f3fc6aa253f2d24d3f214d4e5e70c) --- alternator/streams.cc | 4 ---- db/config.cc | 2 +- db/config.hh | 1 - init.cc | 3 --- test/boost/config_test.cc | 12 ++---------- 5 files changed, 3 insertions(+), 19 deletions(-) diff --git a/alternator/streams.cc b/alternator/streams.cc index 398e66cbf9..6f29d95ad4 100644 --- a/alternator/streams.cc +++ b/alternator/streams.cc @@ -1508,10 +1508,6 @@ bool executor::add_stream_options(const rjson::value& stream_specification, sche } if (stream_enabled->GetBool()) { - if (!sp.features().alternator_streams) { - throw api_error::validation("StreamSpecification: alternator streams feature not enabled in cluster."); - } - cdc::options opts; opts.enabled(true); opts.tablet_merge_blocked(true); diff --git a/db/config.cc b/db/config.cc index cc412c9562..9049c954eb 100644 --- a/db/config.cc +++ b/db/config.cc @@ -1921,7 +1921,7 @@ std::map db::experimental_feature {"lwt", feature::UNUSED}, {"udf", feature::UDF}, {"cdc", feature::UNUSED}, - {"alternator-streams", feature::ALTERNATOR_STREAMS}, + {"alternator-streams", feature::UNUSED}, {"alternator-ttl", feature::UNUSED }, {"consistent-topology-changes", feature::UNUSED}, {"broadcast-tables", feature::BROADCAST_TABLES}, diff --git a/db/config.hh b/db/config.hh index 04e080af0c..cfa33362fb 100644 --- a/db/config.hh +++ b/db/config.hh @@ -115,7 +115,6 @@ struct experimental_features_t { enum class feature { UNUSED, UDF, - ALTERNATOR_STREAMS, BROADCAST_TABLES, KEYSPACE_STORAGE_OPTIONS, STRONGLY_CONSISTENT_TABLES, diff --git a/init.cc b/init.cc index 24ddaaa277..05a5326871 100644 --- a/init.cc +++ b/init.cc @@ -87,9 +87,6 @@ std::set get_disabled_features_from_db_config(const db::config& cfg, st } } - if (!cfg.check_experimental(db::experimental_features_t::feature::ALTERNATOR_STREAMS)) { - disabled.insert("ALTERNATOR_STREAMS"s); - } if (!cfg.check_experimental(db::experimental_features_t::feature::KEYSPACE_STORAGE_OPTIONS)) { disabled.insert("KEYSPACE_STORAGE_OPTIONS"s); } diff --git a/test/boost/config_test.cc b/test/boost/config_test.cc index 7be59e3003..5863f9af9d 100644 --- a/test/boost/config_test.cc +++ b/test/boost/config_test.cc @@ -876,7 +876,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_cdc) { BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::UNUSED}); BOOST_CHECK(cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -888,7 +887,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_unused) { BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::UNUSED}); BOOST_CHECK(cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -900,7 +898,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_udf) { BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::UDF}); BOOST_CHECK(!cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -909,10 +906,9 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_alternator_streams) { auto cfg_ptr = std::make_unique(); config& cfg = *cfg_ptr; cfg.read_from_yaml("experimental_features:\n - alternator-streams\n", throw_on_error); - BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::ALTERNATOR_STREAMS}); - BOOST_CHECK(!cfg.check_experimental(ef::UNUSED)); + BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::UNUSED}); + BOOST_CHECK(cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -924,7 +920,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_broadcast_tables) { BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::BROADCAST_TABLES}); BOOST_CHECK(!cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(cfg.check_experimental(ef::BROADCAST_TABLES)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); @@ -937,7 +932,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_keyspace_storage_options) { BOOST_CHECK_EQUAL(cfg.experimental_features(), features{ef::KEYSPACE_STORAGE_OPTIONS}); BOOST_CHECK(!cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -949,7 +943,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_multiple) { BOOST_CHECK_EQUAL(cfg.experimental_features(), (features{ef::UNUSED, ef::UNUSED, ef::UNUSED})); BOOST_CHECK(cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); return make_ready_future(); } @@ -964,7 +957,6 @@ SEASTAR_TEST_CASE(test_parse_experimental_features_invalid) { BOOST_REQUIRE_NE(msg.find("line 2, column 7"), msg.npos); BOOST_CHECK(!cfg.check_experimental(ef::UNUSED)); BOOST_CHECK(!cfg.check_experimental(ef::UDF)); - BOOST_CHECK(!cfg.check_experimental(ef::ALTERNATOR_STREAMS)); BOOST_CHECK(!cfg.check_experimental(ef::KEYSPACE_STORAGE_OPTIONS)); }); return make_ready_future(); From a82a24ff1431e472a23129491188d9bbaac92a6f Mon Sep 17 00:00:00 2001 From: Piotr Szymaniak Date: Wed, 22 Apr 2026 11:54:34 +0200 Subject: [PATCH 2/2] test: Stop providing alternator-streams experimental flag Now that alternator-streams is no longer an experimental feature, stop passing it in test configurations. (cherry picked from commit 9a86044c636a421a84edfcdf54aaf338343b2fc0) --- test/alternator/run | 5 ----- test/alternator/test_config.yaml | 1 - test/pylib/scylla_cluster.py | 1 - 3 files changed, 7 deletions(-) diff --git a/test/alternator/run b/test/alternator/run index 7edb451026..72b9297378 100755 --- a/test/alternator/run +++ b/test/alternator/run @@ -70,11 +70,6 @@ def run_alternator_cmd(pid, dir): # now that this parameter is used also by CQL's per-row TTL. #'--alternator-ttl-period-in-seconds', '0.5', '--alternator-allow-system-table-write=1', - # Allow testing experimental features. Following issue #9467, we need - # to add here specific experimental features as they are introduced. - # We only list here Alternator-specific experimental features - CQL - # ones are listed in test/cqlpy/run.py. - '--experimental-features=alternator-streams', # this is required by test_streams.py test_parent_filtering and test_get_records_with_alternating_tablets_count # setting the value using scylla_config_temporary won't work, because the value is read # at the start and then periodically with `tablet-load-stats-refresh-interval-in-seconds` diff --git a/test/alternator/test_config.yaml b/test/alternator/test_config.yaml index 73b44f8283..79dc364540 100644 --- a/test/alternator/test_config.yaml +++ b/test/alternator/test_config.yaml @@ -15,7 +15,6 @@ extra_scylla_config_options: { experimental_features: [ udf, - alternator-streams, keyspace-storage-options ], alternator_port: 8000, diff --git a/test/pylib/scylla_cluster.py b/test/pylib/scylla_cluster.py index 971cd2e1e8..09352a6596 100644 --- a/test/pylib/scylla_cluster.py +++ b/test/pylib/scylla_cluster.py @@ -109,7 +109,6 @@ def make_scylla_conf(mode: str, workdir: pathlib.Path, host_addr: str, seed_addr # to add here specific experimental features as they are introduced. 'enable_user_defined_functions': True, 'experimental_features': ['udf', - 'alternator-streams', 'broadcast-tables', 'keyspace-storage-options', 'views-with-tablets'],