This is an automated email from the ASF dual-hosted git repository.
mck pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 78deb3e Implement Virtual Table exposing Cassandra relevant system
properties.
78deb3e is described below
commit 78deb3e6df31e81f1da40a09d7c40f3d4557ff75
Author: Mick Semb Wever <[email protected]>
AuthorDate: Mon Mar 2 14:15:47 2020 +0100
Implement Virtual Table exposing Cassandra relevant system properties.
patch by Mick Semb Wever; reviewed by Chris Lohfink for CASSANDRA-15616
---
.../db/virtual/SystemPropertiesTable.java | 111 +++++++++++++++++++++
.../cassandra/db/virtual/SystemViewsKeyspace.java | 1 +
.../db/virtual/SystemPropertiesTableTest.java | 85 ++++++++++++++++
3 files changed, 197 insertions(+)
diff --git
a/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
b/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
new file mode 100644
index 0000000..864b11b
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/SystemPropertiesTable.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.db.virtual;
+
+import java.util.Set;
+
+import com.google.common.collect.Sets;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class SystemPropertiesTable extends AbstractVirtualTable
+{
+ private static final String NAME = "name";
+ private static final String VALUE = "value";
+
+ private static final Set<String> CASSANDRA_RELEVANT_PROPERTIES =
Sets.newHashSet(
+ // base jvm properties
+ "java.home",
+ "java.io.tmpdir",
+ "java.library.path",
+ "java.security.egd",
+ "java.version",
+ "java.vm.name",
+ "line.separator",
+ "os.arch",
+ "os.name",
+ "user.home",
+ "sun.arch.data.model",
+ // jmx properties
+ "java.rmi.server.hostname",
+ "com.sun.management.jmxremote.authenticate",
+ "com.sun.management.jmxremote.rmi.port",
+ "com.sun.management.jmxremote.ssl",
+ "com.sun.management.jmxremote.ssl.need.client.auth",
+ "com.sun.management.jmxremote.access.file",
+ "com.sun.management.jmxremote.password.file",
+ "com.sun.management.jmxremote.port",
+ "com.sun.management.jmxremote.ssl.enabled.protocols",
+ "com.sun.management.jmxremote.ssl.enabled.cipher.suites",
+ "mx4jaddress",
+ "mx4jport",
+ // cassandra properties (without the "cassandra." prefix)
+ "cassandra-foreground",
+ "cassandra-pidfile",
+ "default.provide.overlapping.tombstones",
+ "org.apache.cassandra.disable_mbean_registration"
+ );
+
+ SystemPropertiesTable(String keyspace)
+ {
+ super(TableMetadata.builder(keyspace, "system_properties")
+ .comment("Cassandra relevant system properties")
+ .kind(TableMetadata.Kind.VIRTUAL)
+ .partitioner(new
LocalPartitioner(UTF8Type.instance))
+ .addPartitionKeyColumn(NAME, UTF8Type.instance)
+ .addRegularColumn(VALUE, UTF8Type.instance)
+ .build());
+ }
+
+ public DataSet data()
+ {
+ SimpleDataSet result = new SimpleDataSet(metadata());
+
+ System.getProperties().stringPropertyNames()
+ .stream()
+ .filter(SystemPropertiesTable::isCassandraRelevant)
+ .forEach(name -> addRow(result, name,
System.getProperty(name)));
+
+ return result;
+ }
+
+ @Override
+ public DataSet data(DecoratedKey partitionKey)
+ {
+ SimpleDataSet result = new SimpleDataSet(metadata());
+ String name = UTF8Type.instance.compose(partitionKey.getKey());
+ if (isCassandraRelevant(name))
+ addRow(result, name, System.getProperty(name));
+
+ return result;
+ }
+
+ static boolean isCassandraRelevant(String name)
+ {
+ return name.startsWith(Config.PROPERTY_PREFIX) ||
CASSANDRA_RELEVANT_PROPERTIES.contains(name);
+ }
+
+ private static void addRow(SimpleDataSet result, String name, String value)
+ {
+ result.row(name).column(VALUE, value);
+ }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
index abcdf87..0805fcf 100644
--- a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
+++ b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
@@ -31,6 +31,7 @@ public final class SystemViewsKeyspace extends VirtualKeyspace
.add(new CachesTable(NAME))
.add(new ClientsTable(NAME))
.add(new SettingsTable(NAME))
+ .add(new SystemPropertiesTable(NAME))
.add(new SSTableTasksTable(NAME))
.add(new ThreadPoolsTable(NAME))
.add(new InternodeOutboundTable(NAME))
diff --git
a/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
new file mode 100644
index 0000000..ef952e8
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.virtual;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import org.apache.cassandra.cql3.CQLTester;
+
+public class SystemPropertiesTableTest extends CQLTester
+{
+ private static final String KS_NAME = "vts";
+
+ private SystemPropertiesTable table;
+
+ @BeforeClass
+ public static void setUpClass()
+ {
+ CQLTester.setUpClass();
+ }
+
+ @Before
+ public void config()
+ {
+ table = new SystemPropertiesTable(KS_NAME);
+ VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME,
ImmutableList.of(table)));
+ }
+
+ @Test
+ public void testSelectAll() throws Throwable
+ {
+ ResultSet result = executeNet("SELECT * FROM vts.system_properties");
+
+ for (Row r : result)
+ Assert.assertEquals(System.getProperty(r.getString("name")),
r.getString("value"));
+ }
+
+ @Test
+ public void testSelectPartition() throws Throwable
+ {
+ List<String> properties = System.getProperties()
+ .stringPropertyNames()
+ .stream()
+ .filter(name ->
SystemPropertiesTable.isCassandraRelevant(name))
+ .collect(Collectors.toList());
+
+ for (String property : properties)
+ {
+ String q = "SELECT * FROM vts.system_properties WHERE name = '" +
property + '\'';
+ assertRowsNet(executeNet(q), new Object[] {property,
System.getProperty(property)});
+ }
+ }
+
+ @Test
+ public void testSelectEmpty() throws Throwable
+ {
+ String q = "SELECT * FROM vts.system_properties WHERE name = 'EMPTY'";
+ assertRowsNet(executeNet(q));
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]