From 230fe8e64722ac02dbf8cdafb7d4fef120726dd7 Mon Sep 17 00:00:00 2001 From: Abe Ratnofsky Date: Fri, 4 Feb 2022 11:15:42 -0800 Subject: [PATCH] Include Git SHA in --verbose flag for nodetool version Patch by Abe Ratnofsky; review by Brandon Williams, Caleb Rackliffe, Michael Semb Wever and Stefan Miklosovic for CASSANDRA-17753 --- .build/build-git.xml | 54 +++++++++++++++++++ CHANGES.txt | 1 + build.xml | 7 ++- conf/cassandra.yaml | 1 + .../cassandra/service/StorageService.java | 7 +++ .../service/StorageServiceMBean.java | 6 +++ .../org/apache/cassandra/tools/NodeProbe.java | 5 ++ .../cassandra/tools/nodetool/Version.java | 9 +++- .../apache/cassandra/utils/FBUtilities.java | 25 +++++++-- .../distributed/test/NodeToolTest.java | 14 +++++ 10 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 .build/build-git.xml diff --git a/.build/build-git.xml b/.build/build-git.xml new file mode 100644 index 0000000000..03b5ca7f5b --- /dev/null +++ b/.build/build-git.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + git.sha=${git.sha} + + + + + + + + + + Repository state is dirty + ${git.diffstat} + + diff --git a/CHANGES.txt b/CHANGES.txt index a51b81d926..5a4dcba477 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.2 + * Include Git SHA in --verbose flag for nodetool version (CASSANDRA-17753) * Update Byteman to 4.0.20 and Jacoco to 0.8.8 (CASSANDRA-16413) * Add memtable option among possible tab completions for a table (CASSANDRA-17982) * Adds a trie-based memtable implementation (CASSANDRA-17240) diff --git a/build.xml b/build.xml index 88ffc8836b..ffb107c7b1 100644 --- a/build.xml +++ b/build.xml @@ -438,11 +438,12 @@ - + + @@ -485,7 +486,7 @@ - @@ -695,6 +696,7 @@ + @@ -1972,4 +1974,5 @@ + diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml index 93a581b058..17c994bbb1 100644 --- a/conf/cassandra.yaml +++ b/conf/cassandra.yaml @@ -1881,3 +1881,4 @@ drop_compact_storage_enabled: false # heartbeat_file: /var/lib/cassandra/data/cassandra-heartbeat # excluded_keyspaces: # comma separated list of keyspaces to exclude from the check # excluded_tables: # comma separated list of keyspace.table pairs to exclude from the check + diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java index 1d0ccc0866..b4022ba8a7 100644 --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@ -788,6 +788,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE public synchronized void initServer(int schemaTimeoutMillis, int ringTimeoutMillis) throws ConfigurationException { logger.info("Cassandra version: {}", FBUtilities.getReleaseVersionString()); + logger.info("Git SHA: {}", FBUtilities.getGitSHA()); logger.info("CQL version: {}", QueryProcessor.CQL_VERSION); logger.info("Native protocol supported versions: {} (default: {})", StringUtils.join(ProtocolVersion.supportedVersions(), ", "), ProtocolVersion.CURRENT); @@ -3659,6 +3660,12 @@ public class StorageService extends NotificationBroadcasterSupport implements IE return FBUtilities.getReleaseVersionString(); } + @Override + public String getGitSHA() + { + return FBUtilities.getGitSHA(); + } + 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 da77fcf286..101c9a3ebf 100644 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@ -102,6 +102,12 @@ public interface StorageServiceMBean extends NotificationEmitter */ public String getReleaseVersion(); + /** + * Fetch a string representation of the Cassandra git SHA. + * @return A string representation of the Cassandra git SHA. + */ + public String getGitSHA(); + /** * 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 b1336ddd5d..9da34350f4 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -780,6 +780,11 @@ public class NodeProbe implements AutoCloseable return ssProxy.getReleaseVersion(); } + public String getGitSHA() + { + return ssProxy.getGitSHA(); + } + 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 f95907a5cc..6556a04627 100644 --- a/src/java/org/apache/cassandra/tools/nodetool/Version.java +++ b/src/java/org/apache/cassandra/tools/nodetool/Version.java @@ -18,16 +18,23 @@ package org.apache.cassandra.tools.nodetool; import io.airlift.airline.Command; - +import io.airlift.airline.Option; import org.apache.cassandra.tools.NodeProbe; import org.apache.cassandra.tools.NodeTool.NodeToolCmd; @Command(name = "version", description = "Print cassandra version") public class Version extends NodeToolCmd { + @Option(title = "verbose", + name = {"-v", "--verbose"}, + description = "Include additional information") + private boolean verbose = false; + @Override public void execute(NodeProbe probe) { probe.output().out.println("ReleaseVersion: " + probe.getReleaseVersion()); + if (verbose) + probe.output().out.println("GitSHA: " + probe.getGitSHA()); } } diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 02666ac6cb..c279e8b54c 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -106,6 +106,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"; public static final BigInteger TWO = new BigInteger("2"); private static final String DEFAULT_TRIGGER_DIR = "triggers"; @@ -422,26 +423,42 @@ public class FBUtilities return previousReleaseVersionString; } - public static String getReleaseVersionString() + private static Properties getVersionProperties() { try (InputStream in = FBUtilities.class.getClassLoader().getResourceAsStream("org/apache/cassandra/config/version.properties")) { if (in == null) { - return System.getProperty("cassandra.releaseVersion", UNKNOWN_RELEASE_VERSION); + return null; } Properties props = new Properties(); props.load(in); - return props.getProperty("CassandraVersion"); + return props; } catch (Exception e) { JVMStabilityInspector.inspectThrowable(e); logger.warn("Unable to load version.properties", e); - return "debug version"; + return null; } } + public static String getReleaseVersionString() + { + Properties props = getVersionProperties(); + if (props == null) + return System.getProperty("cassandra.releaseVersion", UNKNOWN_RELEASE_VERSION); + return props.getProperty("CassandraVersion"); + } + + public static String getGitSHA() + { + Properties props = getVersionProperties(); + if (props == null) + return System.getProperty("cassandra.gitSHA", UNKNOWN_GIT_SHA); + return props.getProperty("GitSHA", UNKNOWN_GIT_SHA); + } + public static String getReleaseVersionMajor() { String releaseVersion = FBUtilities.getReleaseVersionString(); diff --git a/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java b/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java index 486d9f5618..24a65e3d4e 100644 --- a/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java +++ b/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java @@ -133,4 +133,18 @@ public class NodeToolTest extends TestBaseImpl ringResult.asserts().stdoutContains("Heap Memory"); } } + + @Test + public void testVersionIncludesGitSHAWhenVerbose() throws Throwable + { + NODE.nodetoolResult("version") + .asserts() + .success() + .stdoutNotContains("GitSHA:"); + + NODE.nodetoolResult("version", "--verbose") + .asserts() + .success() + .stdoutContains("GitSHA:"); + } }