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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]