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

Reply via email to