This commit is contained in:
Pedro Gordo 2026-07-29 13:35:34 +08:00 committed by GitHub
commit da3ac9d5c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 77 additions and 10 deletions

View File

@ -3202,6 +3202,21 @@ public class DatabaseDescriptor
conf.dynamic_snitch_badness_threshold = dynamicBadnessThreshold; conf.dynamic_snitch_badness_threshold = dynamicBadnessThreshold;
} }
public static boolean isDynamicSnitch()
{
return conf.dynamic_snitch;
}
public static void setDynamicSnitch(boolean enabled)
{
conf.dynamic_snitch = enabled;
}
public static void setEndpointSnitchClassName(String endpointSnitch)
{
conf.endpoint_snitch = endpointSnitch;
}
public static EncryptionOptions.ServerEncryptionOptions getInternodeMessagingEncyptionOptions() public static EncryptionOptions.ServerEncryptionOptions getInternodeMessagingEncyptionOptions()
{ {
return conf.server_encryption_options; return conf.server_encryption_options;

View File

@ -25,6 +25,8 @@ import java.util.Objects;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.apache.cassandra.audit.AuditLogManager;
import org.apache.cassandra.audit.AuditLogOptions;
import org.apache.cassandra.config.Config; import org.apache.cassandra.config.Config;
import org.apache.cassandra.config.Redacted; import org.apache.cassandra.config.Redacted;
import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.config.DatabaseDescriptor;
@ -35,6 +37,8 @@ import org.apache.cassandra.config.Replacements;
import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.db.marshal.UTF8Type; import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.dht.LocalPartitioner; import org.apache.cassandra.dht.LocalPartitioner;
import org.apache.cassandra.fql.FullQueryLogger;
import org.apache.cassandra.fql.FullQueryLoggerOptions;
import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.service.ClientWarn; import org.apache.cassandra.service.ClientWarn;
import org.yaml.snakeyaml.introspector.Property; import org.yaml.snakeyaml.introspector.Property;
@ -43,6 +47,12 @@ final class SettingsTable extends AbstractVirtualTable
{ {
private static final String NAME = "name"; private static final String NAME = "name";
private static final String VALUE = "value"; private static final String VALUE = "value";
private static final String FQL_PREFIX = "full_query_logging_options";
private static final String AUDIT_PREFIX = "audit_logging_options";
private static final Map<String, Property> FQL_PROPERTIES = ImmutableMap.copyOf(
Properties.defaultLoader().flatten(FullQueryLoggerOptions.class));
private static final Map<String, Property> AUDIT_PROPERTIES = ImmutableMap.copyOf(
Properties.defaultLoader().flatten(AuditLogOptions.class));
private static final Map<String, String> BACKWARDS_COMPATABLE_NAMES = ImmutableMap.copyOf(getBackwardsCompatableNames()); private static final Map<String, String> BACKWARDS_COMPATABLE_NAMES = ImmutableMap.copyOf(getBackwardsCompatableNames());
protected static final Map<String, Property> PROPERTIES = ImmutableMap.copyOf(getProperties()); protected static final Map<String, Property> PROPERTIES = ImmutableMap.copyOf(getProperties());
@ -87,6 +97,31 @@ final class SettingsTable extends AbstractVirtualTable
return result; return result;
} }
/**
* Returns the value to use for the given property. For FQL and audit logging properties,
* resolves from the current runtime options (which revert to yaml defaults when disabled)
* so the virtual table reflects the actual active state rather than the Config object.
*/
private Object resolveValue(Property prop)
{
String name = prop.getName();
if (name.startsWith(FQL_PREFIX + "."))
{
String subName = name.substring(FQL_PREFIX.length() + 1);
Property subProp = FQL_PROPERTIES.get(subName);
if (subProp != null)
return subProp.get(FullQueryLogger.instance.getFullQueryLoggerOptions());
}
if (name.startsWith(AUDIT_PREFIX + "."))
{
String subName = name.substring(AUDIT_PREFIX.length() + 1);
Property subProp = AUDIT_PROPERTIES.get(subName);
if (subProp != null)
return subProp.get(AuditLogManager.instance.getAuditLogOptions());
}
return prop.get(config);
}
@VisibleForTesting @VisibleForTesting
String getValue(Property prop) String getValue(Property prop)
{ {
@ -94,7 +129,7 @@ final class SettingsTable extends AbstractVirtualTable
if (maybeCredential != null) if (maybeCredential != null)
return maybeCredential.redactedValue(); return maybeCredential.redactedValue();
Object value = prop.get(config); Object value = resolveValue(prop);
if (value == null) if (value == null)
return null; return null;
@ -162,21 +197,21 @@ final class SettingsTable extends AbstractVirtualTable
{ {
Map<String, String> names = new HashMap<>(); Map<String, String> names = new HashMap<>();
// Names that dont match yaml // Names that dont match yaml
names.put("audit_logging_options_logger", "audit_logging_options.logger.class_name"); names.put(AUDIT_PREFIX + "_logger", AUDIT_PREFIX + ".logger.class_name");
names.put("server_encryption_options_client_auth", "server_encryption_options.require_client_auth"); names.put("server_encryption_options_client_auth", "server_encryption_options.require_client_auth");
names.put("server_encryption_options_endpoint_verification", "server_encryption_options.require_endpoint_verification"); names.put("server_encryption_options_endpoint_verification", "server_encryption_options.require_endpoint_verification");
names.put("server_encryption_options_legacy_ssl_storage_port", "server_encryption_options.legacy_ssl_storage_port_enabled"); names.put("server_encryption_options_legacy_ssl_storage_port", "server_encryption_options.legacy_ssl_storage_port_enabled");
names.put("server_encryption_options_protocol", "server_encryption_options.accepted_protocols"); names.put("server_encryption_options_protocol", "server_encryption_options.accepted_protocols");
// matching names // matching names
names.put("audit_logging_options_audit_logs_dir", "audit_logging_options.audit_logs_dir"); names.put(AUDIT_PREFIX + "_audit_logs_dir", AUDIT_PREFIX + ".audit_logs_dir");
names.put("audit_logging_options_enabled", "audit_logging_options.enabled"); names.put(AUDIT_PREFIX + "_enabled", AUDIT_PREFIX + ".enabled");
names.put("audit_logging_options_excluded_categories", "audit_logging_options.excluded_categories"); names.put(AUDIT_PREFIX + "_excluded_categories", AUDIT_PREFIX + ".excluded_categories");
names.put("audit_logging_options_excluded_keyspaces", "audit_logging_options.excluded_keyspaces"); names.put(AUDIT_PREFIX + "_excluded_keyspaces", AUDIT_PREFIX + ".excluded_keyspaces");
names.put("audit_logging_options_excluded_users", "audit_logging_options.excluded_users"); names.put(AUDIT_PREFIX + "_excluded_users", AUDIT_PREFIX + ".excluded_users");
names.put("audit_logging_options_included_categories", "audit_logging_options.included_categories"); names.put(AUDIT_PREFIX + "_included_categories", AUDIT_PREFIX + ".included_categories");
names.put("audit_logging_options_included_keyspaces", "audit_logging_options.included_keyspaces"); names.put(AUDIT_PREFIX + "_included_keyspaces", AUDIT_PREFIX + ".included_keyspaces");
names.put("audit_logging_options_included_users", "audit_logging_options.included_users"); names.put(AUDIT_PREFIX + "_included_users", AUDIT_PREFIX + ".included_users");
names.put("server_encryption_options_algorithm", "server_encryption_options.algorithm"); names.put("server_encryption_options_algorithm", "server_encryption_options.algorithm");
names.put("server_encryption_options_cipher_suites", "server_encryption_options.cipher_suites"); names.put("server_encryption_options_cipher_suites", "server_encryption_options.cipher_suites");
names.put("server_encryption_options_enabled", "server_encryption_options.enabled"); names.put("server_encryption_options_enabled", "server_encryption_options.enabled");

View File

@ -5963,10 +5963,14 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
// point snitch references to the new instance // point snitch references to the new instance
DatabaseDescriptor.setEndpointSnitch(newSnitch); DatabaseDescriptor.setEndpointSnitch(newSnitch);
DatabaseDescriptor.setEndpointSnitchClassName(epSnitchClassName);
for (String ks : Schema.instance.getKeyspaces()) for (String ks : Schema.instance.getKeyspaces())
{ {
Keyspace.open(ks).getReplicationStrategy().snitch = newSnitch; Keyspace.open(ks).getReplicationStrategy().snitch = newSnitch;
} }
if (dynamic != null)
DatabaseDescriptor.setDynamicSnitch(dynamic);
} }
else else
{ {

View File

@ -659,4 +659,17 @@ public class StorageServiceServerTest
System.clearProperty("cassandra.replace_address"); System.clearProperty("cassandra.replace_address");
} }
} }
@Test
public void testSnitchSettersUpdateConfig()
{
DatabaseDescriptor.setDynamicSnitch(false);
Assert.assertFalse(DatabaseDescriptor.isDynamicSnitch());
DatabaseDescriptor.setDynamicSnitch(true);
Assert.assertTrue(DatabaseDescriptor.isDynamicSnitch());
DatabaseDescriptor.setEndpointSnitchClassName("org.apache.cassandra.locator.SimpleSnitch");
Assert.assertEquals("org.apache.cassandra.locator.SimpleSnitch",
DatabaseDescriptor.getRawConfig().endpoint_snitch);
}
} }