From 11bc762dc64a58413186a612d051edcb50a366df Mon Sep 17 00:00:00 2001 From: JwahoonKim Date: Mon, 4 May 2026 12:34:40 +0200 Subject: [PATCH] Fix: system_views.settings fails for map settings with non-string keys --- .../apache/cassandra/db/virtual/SettingsTable.java | 9 +++++---- .../cassandra/db/virtual/SettingsTableTest.java | 12 ++++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java index 526d7b538fe1..5e42db6532bd 100644 --- a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java +++ b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java @@ -111,15 +111,16 @@ else if (value instanceof Collection) else if (value instanceof Map) { Map map = new HashMap<>(); - for (Map.Entry entry : ((Map) value).entrySet()) + for (Map.Entry entry : ((Map) value).entrySet()) { + String key = String.valueOf(entry.getKey()); // this is done on best-effort basis as we do not have names in parameters // inherently under control as this is what a user is responsible for // when dealing with custom implementations - if (entry.getKey().endsWith("_password") || entry.getKey().equals("password")) - map.put(entry.getKey(), Redacted.REDACTED_STRING); + if (key.endsWith("_password") || key.equals("password")) + map.put(key, Redacted.REDACTED_STRING); else - map.put(entry.getKey(), entry.getValue()); + map.put(key, entry.getValue()); } return tryConstructJson(map); diff --git a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java index 66778f3e1684..59b64f3dc5f2 100644 --- a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java +++ b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java @@ -45,6 +45,7 @@ import org.apache.cassandra.cql3.CQLTester; import org.apache.cassandra.distributed.shared.WithProperties; import org.apache.cassandra.security.SSLFactory; +import org.apache.cassandra.service.StartupChecks.StartupCheckType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.yaml.snakeyaml.introspector.Property; @@ -135,6 +136,17 @@ public void testSelectEmpty() throws Throwable assertRowsNet(executeNet(q)); } + @Test + public void testStartupChecksWithEnumKeys() throws Throwable + { + Map checkDataResurrection = new LinkedHashMap<>(); + checkDataResurrection.put("enabled", true); + config.startup_checks.put(StartupCheckType.check_data_resurrection, checkDataResurrection); + + check("startup_checks", "{check_data_resurrection={enabled=true}}"); + Assert.assertFalse(executeNet("SELECT * FROM vts.settings").all().isEmpty()); + } + @Test public void testSelectOverride() throws Throwable {