From d1c222d9bd4bbf94536bf8262c85f4551a34e416 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 26 Jan 2025 16:17:55 +0800 Subject: [PATCH] config: specialize config_from_string() for sstring Specialize config_from_string() for sstring to resolve lexical_cast stream state parsing limitation. This enables correct handling of empty string configurations, such as setting an empty value in CQL: ```cql UPDATE system.config SET value='' WHERE name='allowed_repair_based_node_ops'; ``` Previous implementation using boost::lexical_cast would fail due to EOF stream state, incorrectly rejecting valid empty string conversions. Fixes scylladb/scylladb#22491 Signed-off-by: Kefu Chai Closes scylladb/scylladb#22492 --- db/config.cc | 7 +++++++ test/boost/virtual_table_test.cc | 7 +++++++ utils/config_file_impl.hh | 3 +++ 3 files changed, 17 insertions(+) diff --git a/db/config.cc b/db/config.cc index 65eca08626..8a3495d434 100644 --- a/db/config.cc +++ b/db/config.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -115,6 +116,12 @@ config_from_string(std::string_view value) { } } +template <> +sstring +config_from_string(std::string_view value) { + return sstring(value); +} + template <> const config_type& config_type_for() { static config_type ct("bool", value_to_json); diff --git a/test/boost/virtual_table_test.cc b/test/boost/virtual_table_test.cc index d8a3e589e5..df39568dc6 100644 --- a/test/boost/virtual_table_test.cc +++ b/test/boost/virtual_table_test.cc @@ -95,6 +95,13 @@ SEASTAR_THREAD_TEST_CASE(test_system_config_table_update) { }).get(); } +SEASTAR_THREAD_TEST_CASE(test_system_config_table_set_empty) { + do_with_cql_env_thread([] (cql_test_env& env) { + env.execute_cql(format("UPDATE system.config SET value = '' WHERE name = 'allowed_repair_based_node_ops';")).get(); + BOOST_REQUIRE_EQUAL(env.local_db().get_config().allowed_repair_based_node_ops(), sstring()); + }).get(); +} + SEASTAR_THREAD_TEST_CASE(test_system_config_table_no_live_update) { do_with_cql_env_thread([] (cql_test_env& env) { BOOST_REQUIRE_THROW( diff --git a/utils/config_file_impl.hh b/utils/config_file_impl.hh index 18909cfe0f..7fb0a2d624 100644 --- a/utils/config_file_impl.hh +++ b/utils/config_file_impl.hh @@ -27,6 +27,9 @@ T config_from_string(std::string_view string_representation) { template <> bool config_from_string(std::string_view string_representation); +template <> +sstring config_from_string(std::string_view string_representation); + } namespace YAML {