diff --git a/CHANGES.txt b/CHANGES.txt
index 7b00c4af18..5c7da2adc8 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0-beta5
+ * Fix cassandra-stress JMX connection (CASSANDRA-16473)
* Avoid processing redundant application states on endpoint changes (CASSANDRA-16381)
* Prevent parent repair sessions leak (CASSANDRA-16446)
* Fix timestamp issue in SinglePartitionSliceCommandTest testPartitionD…eletionRowDeletionTie (CASSANDRA-16443)
diff --git a/build.xml b/build.xml
index 5c93897916..fee69a03cf 100644
--- a/build.xml
+++ b/build.xml
@@ -1089,6 +1089,14 @@
+
+
+
+
+
+
+
diff --git a/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java b/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
index a4058f22ee..b2afd1bf9e 100644
--- a/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
+++ b/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
@@ -21,8 +21,6 @@ package org.apache.cassandra.stress.report;
*/
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
import java.io.FileNotFoundException;
import java.util.ArrayDeque;
import java.util.ArrayList;
@@ -31,11 +29,17 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
+import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
+import java.util.stream.Collectors;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.commons.lang3.time.DurationFormatUtils;
import org.HdrHistogram.Histogram;
import org.HdrHistogram.HistogramLogWriter;
@@ -45,11 +49,12 @@ import org.apache.cassandra.stress.StressAction.OpMeasurement;
import org.apache.cassandra.stress.settings.SettingsLog.Level;
import org.apache.cassandra.stress.settings.StressSettings;
import org.apache.cassandra.stress.util.JmxCollector;
-import org.apache.cassandra.stress.util.ResultLogger;
import org.apache.cassandra.stress.util.JmxCollector.GcStats;
+import org.apache.cassandra.stress.util.ResultLogger;
import org.apache.cassandra.stress.util.Uncertainty;
import org.apache.cassandra.utils.FBUtilities;
-import org.apache.commons.lang3.time.DurationFormatUtils;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
public class StressMetrics implements MeasurementSink
{
@@ -105,7 +110,8 @@ public class StressMetrics implements MeasurementSink
totalGcStats = new JmxCollector.GcStats(0);
try
{
- gcStatsCollector = new JmxCollector(settings.node.resolveAllPermitted(settings), settings.port.jmxPort);
+ gcStatsCollector = new JmxCollector(toJmxNodes(settings.node.resolveAllPermitted(settings)),
+ settings.port.jmxPort);
}
catch (Throwable t)
{
@@ -150,7 +156,6 @@ public class StressMetrics implements MeasurementSink
stopped.await();
}
-
private void reportingLoop(final long logIntervalMillis)
{
// align report timing to the nearest second
@@ -345,6 +350,12 @@ public class StressMetrics implements MeasurementSink
public static final String[] HEADMETRICS = new String[]{"type", "total ops","op/s","pk/s","row/s","mean","med",".95",".99",".999","max","time","stderr", "errors", "gc: #", "max ms", "sum ms", "sdv ms", "mb"};
public static final String HEAD = String.format(HEADFORMAT, (Object[]) HEADMETRICS);
+ @VisibleForTesting
+ public static Set toJmxNodes(Set nodes)
+ {
+ return nodes.stream().map(n -> n.split(":")[0]).collect(Collectors.toSet());
+ }
+
private static void printHeader(String prefix, ResultLogger output)
{
output.println(prefix + HEAD);
diff --git a/tools/stress/test/unit/org/apache/cassandra/stress/settings/StressSettingsTest.java b/tools/stress/test/unit/org/apache/cassandra/stress/settings/StressSettingsTest.java
index c664aeed16..98578ef792 100644
--- a/tools/stress/test/unit/org/apache/cassandra/stress/settings/StressSettingsTest.java
+++ b/tools/stress/test/unit/org/apache/cassandra/stress/settings/StressSettingsTest.java
@@ -20,11 +20,18 @@ package org.apache.cassandra.stress.settings;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import org.junit.Test;
+import org.apache.cassandra.stress.report.StressMetrics;
+
+import static org.junit.Assert.assertEquals;
+
public class StressSettingsTest
{
@Test
@@ -36,4 +43,11 @@ public class StressSettingsTest
// Will throw if not all settings are Serializable
new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(settings);
}
+
+ @Test
+ public void test16473()
+ {
+ Set jmxNodes = StressMetrics.toJmxNodes(new HashSet(Arrays.asList("127.0.0.1:9042", "127.0.0.1")));
+ assertEquals(0, jmxNodes.stream().filter(n -> n.contains(":")).count());
+ }
}