This is an automated email from the ASF dual-hosted git repository. smiklosovic 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 7c0a86323e Add JVM version and Cassandra build date to nodetool version -v 7c0a86323e is described below commit 7c0a86323e1486a557e9d86a3bb8b5b799fb22a6 Author: maoling <maol...@apache.org> AuthorDate: Thu Jun 20 23:44:00 2024 +0800 Add JVM version and Cassandra build date to nodetool version -v patch by Ling Mao; reviewed by Maxwell Guo, Stefan Miklosovic for CASSANDRA-19721 --- CHANGES.txt | 1 + build.xml | 15 +++- .../config/CassandraRelevantProperties.java | 1 + .../apache/cassandra/service/StorageService.java | 7 ++ .../cassandra/service/StorageServiceMBean.java | 7 ++ src/java/org/apache/cassandra/tools/NodeProbe.java | 5 ++ .../apache/cassandra/tools/nodetool/Version.java | 7 ++ .../org/apache/cassandra/utils/FBUtilities.java | 20 +++-- .../cassandra/tools/nodetool/VersionTest.java | 99 ++++++++++++++++++++++ 9 files changed, 154 insertions(+), 8 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index a44294d606..1b38765b62 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.1 + * Add JVM version and Cassandra build date to nodetool version -v (CASSANDRA-19721) * Move all disk error logic to DiskErrorsHandler to enable pluggability (CASSANDRA-20363) * Fix marking an SSTable as suspected and BufferPool leakage in case of a corrupted SSTable read during a compaction (CASSANDRA-20396) * Add missed documentation for CREATE TABLE LIKE (CASSANDRA-20401) diff --git a/build.xml b/build.xml index ccc38717d2..7b5351e203 100644 --- a/build.xml +++ b/build.xml @@ -490,15 +490,25 @@ </target> <!-- create properties file with C version --> - <target name="_createVersionPropFile" depends="_get-git-sha,set-cqlsh-version"> + <target name="_createVersionPropFile" depends="_get-git-sha,set-cqlsh-version,_set-build-date"> <taskdef name="propertyfile" classname="org.apache.tools.ant.taskdefs.optional.PropertyFile"/> <mkdir dir="${version.properties.dir}"/> <propertyfile file="${version.properties.dir}/version.properties"> <entry key="CassandraVersion" value="${version}"/> <entry key="GitSHA" value="${git.sha}"/> + <entry key="BuildDate" value="${build.date}"/> </propertyfile> </target> + <!-- set ant build date --> + <target name="_set-build-date"> + <tstamp> + <format property="build.date" pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"/> + </tstamp> + <!-- Include timezone information --> + <property name="build.date" value="${build.date}"/> + </target> + <target name="test-run" depends="jar" description="Run in test mode. Not for production use!"> <java classname="org.apache.cassandra.service.CassandraDaemon" fork="true"> @@ -735,7 +745,7 @@ The jar target makes cassandra.jar output. --> <target name="_main-jar" - depends="build" + depends="build,_get-git-sha,_set-build-date" description="Assemble Cassandra JAR files"> <mkdir dir="${build.classes.main}/META-INF" /> <copy file="LICENSE.txt" @@ -754,6 +764,7 @@ <attribute name="Implementation-Version" value="${version}"/> <attribute name="Implementation-Vendor" value="Apache"/> <attribute name="Implementation-Git-SHA" value="${git.sha}"/> + <attribute name="Implementation-Build-Date" value="${build.date}"/> <!-- </section> --> </manifest> </jar> diff --git a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java index 515bee33bb..e83dfaf53a 100644 --- a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java +++ b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java @@ -74,6 +74,7 @@ public enum CassandraRelevantProperties BROADCAST_INTERVAL_MS("cassandra.broadcast_interval_ms", "60000"), BTREE_BRANCH_SHIFT("cassandra.btree.branchshift", "5"), BTREE_FAN_FACTOR("cassandra.btree.fanfactor"), + BUILD_DATE("cassandra.buildDate"), /** Represents the maximum size (in bytes) of a serialized mutation that can be cached **/ CACHEABLE_MUTATION_SIZE_LIMIT("cassandra.cacheable_mutation_size_limit_bytes", convertToString(1_000_000)), CASSANDRA_ALLOW_SIMPLE_STRATEGY("cassandra.allow_simplestrategy"), diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 1aae64970e..d0f8711ea5 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -695,6 +695,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public synchronized void initServer() throws ConfigurationException { logger.info("Cassandra version: {}", FBUtilities.getReleaseVersionString()); + logger.info("Build Date: {}", FBUtilities.getBuildDate()); logger.info("Git SHA: {}", FBUtilities.getGitSHA()); logger.info("CQL version: {}", QueryProcessor.CQL_VERSION); logger.info("Native protocol supported versions: {} (default: {})", @@ -2385,6 +2386,12 @@ public class StorageService extends NotificationBroadcasterSupport implements IE return FBUtilities.getGitSHA(); } + @Override + public String getBuildDate() + { + return FBUtilities.getBuildDate(); + } + public String getSchemaVersion() { return Schema.instance.getVersion().toString(); diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java index 57dfcea673..dfaa436cdc 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -113,6 +113,13 @@ public interface StorageServiceMBean extends NotificationEmitter */ public String getGitSHA(); + /** + * Fetch a string representation of the Cassandra's build date. + * The format: {@code yyyy-MM-dd'T'HH:mm:ss.SSS'Z'} + * @return A string representation of the Cassandra's build date. + */ + String getBuildDate(); + /** * Fetch a string representation of the current Schema version. * @return A string representation of the Schema version. diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java index 5a6e8b3598..747da83485 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -871,6 +871,11 @@ public class NodeProbe implements AutoCloseable return ssProxy.getGitSHA(); } + public String getBuildDate() + { + return ssProxy.getBuildDate(); + } + public int getCurrentGenerationNumber() { return ssProxy.getCurrentGenerationNumber(); diff --git a/src/java/org/apache/cassandra/tools/nodetool/Version.java b/src/java/org/apache/cassandra/tools/nodetool/Version.java index 6556a04627..9b92249b3c 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Version.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Version.java @@ -22,6 +22,9 @@ import io.airlift.airline.Option; import org.apache.cassandra.tools.NodeProbe; import org.apache.cassandra.tools.NodeTool.NodeToolCmd; +import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VERSION; +import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_VM_NAME; + @Command(name = "version", description = "Print cassandra version") public class Version extends NodeToolCmd { @@ -35,6 +38,10 @@ public class Version extends NodeToolCmd { probe.output().out.println("ReleaseVersion: " + probe.getReleaseVersion()); if (verbose) + { + probe.output().out.println("BuildDate: " + probe.getBuildDate()); probe.output().out.println("GitSHA: " + probe.getGitSHA()); + probe.output().out.printf("JVM vendor/version: %s/%s%n", JAVA_VM_NAME.getString(), JAVA_VERSION.getString()); + } } } diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index d1eb0798d8..91b608d185 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -95,6 +95,7 @@ import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException; import org.objectweb.asm.Opcodes; import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_AVAILABLE_PROCESSORS; +import static org.apache.cassandra.config.CassandraRelevantProperties.BUILD_DATE; import static org.apache.cassandra.config.CassandraRelevantProperties.GIT_SHA; import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR; import static org.apache.cassandra.config.CassandraRelevantProperties.OS_NAME; @@ -113,8 +114,7 @@ public class FBUtilities } private static final Logger logger = LoggerFactory.getLogger(FBUtilities.class); - public static final String UNKNOWN_RELEASE_VERSION = "Unknown"; - public static final String UNKNOWN_GIT_SHA = "Unknown"; + private static final String UNKNOWN = "Unknown"; public static final BigInteger TWO = new BigInteger("2"); private static final String DEFAULT_TRIGGER_DIR = "triggers"; @@ -467,7 +467,7 @@ public class FBUtilities { Properties props = loadedProperties.get(); if (props == null) - return RELEASE_VERSION.getString(UNKNOWN_RELEASE_VERSION); + return RELEASE_VERSION.getString(UNKNOWN); return props.getProperty("CassandraVersion"); } @@ -475,14 +475,22 @@ public class FBUtilities { Properties props = loadedProperties.get(); if (props == null) - return GIT_SHA.getString(UNKNOWN_GIT_SHA); - return props.getProperty("GitSHA", UNKNOWN_GIT_SHA); + return GIT_SHA.getString(UNKNOWN); + return props.getProperty("GitSHA", UNKNOWN); + } + + public static String getBuildDate() + { + Properties props = loadedProperties.get(); + if (props == null) + return BUILD_DATE.getString(UNKNOWN); + return props.getProperty("BuildDate", UNKNOWN); } public static String getReleaseVersionMajor() { String releaseVersion = FBUtilities.getReleaseVersionString(); - if (FBUtilities.UNKNOWN_RELEASE_VERSION.equals(releaseVersion)) + if (FBUtilities.UNKNOWN.equals(releaseVersion)) { throw new AssertionError("Release version is unknown"); } diff --git a/test/unit/org/apache/cassandra/tools/nodetool/VersionTest.java b/test/unit/org/apache/cassandra/tools/nodetool/VersionTest.java new file mode 100644 index 0000000000..1b17fffa2a --- /dev/null +++ b/test/unit/org/apache/cassandra/tools/nodetool/VersionTest.java @@ -0,0 +1,99 @@ +/* + * 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.tools.nodetool; + +import org.junit.BeforeClass; +import org.junit.Test; + +import org.apache.cassandra.cql3.CQLTester; +import org.apache.cassandra.tools.ToolRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +public class VersionTest extends CQLTester +{ + + @BeforeClass + public static void setup() throws Exception + { + requireNetwork(); + startJMXServer(); + } + + @Test + public void testHelp() + { + ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "version"); + tool.assertOnExitCode(); + + String help = "NAME\n" + + " nodetool version - Print cassandra version\n" + + "\n" + + "SYNOPSIS\n" + + " nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + + " [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + + " [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + + " [(-u <username> | --username <username>)] version [(-v | --verbose)]\n" + + "\n" + + "OPTIONS\n" + + " -h <host>, --host <host>\n" + + " Node hostname or ip address\n" + + "\n" + + " -p <port>, --port <port>\n" + + " Remote jmx agent port number\n" + + "\n" + + " -pp, --print-port\n" + + " Operate in 4.0 mode with hosts disambiguated by port number\n" + + "\n" + + " -pw <password>, --password <password>\n" + + " Remote jmx agent password\n" + + "\n" + + " -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + + " Path to the JMX password file\n" + + "\n" + + " -u <username>, --username <username>\n" + + " Remote jmx agent username\n" + + "\n" + + " -v, --verbose\n" + + " Include additional information\n" + + "\n" + + "\n"; + assertThat(tool.getStdout()).isEqualTo(help); + } + + @Test + public void testBasic() + { + ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("version"); + tool.assertOnExitCode(); + String stdout = tool.getStdout(); + assertThat(stdout).containsPattern("ReleaseVersion:\\s+\\S+"); + } + + @Test + public void testVOption() + { + ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("version", "-v"); + tool.assertOnExitCode(); + String stdout = tool.getStdout(); + assertThat(stdout).containsPattern("ReleaseVersion:\\s+\\S+"); + assertThat(stdout).containsPattern("BuildDate:\\s+\\S+"); + assertThat(stdout).containsPattern("GitSHA:\\s+\\S+"); + assertThat(stdout).containsPattern("JVM vendor/version:\\s+\\S+"); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org