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:");
+ }
}