From 588dc06eb8b5a7678128e9f0c0421fc391b14bce Mon Sep 17 00:00:00 2001 From: Yuki Morishita Date: Wed, 16 Sep 2015 08:36:50 -0500 Subject: [PATCH] Fix NPE in nodetool compactionhistory patch by Pierre N. and yukim; reviewed by yukim for CASSANDRA-9758 --- CHANGES.txt | 1 + .../apache/cassandra/utils/FBUtilities.java | 16 ++++++++++++++-- .../cassandra/utils/FBUtilitiesTest.java | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 12523bed5b..278773967b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.10 + * Fix NPE in nodetool compactionhistory (CASSANDRA-9758) * (Pig) support BulkOutputFormat as a URL parameter (CASSANDRA-7410) * BATCH statement is broken in cqlsh (CASSANDRA-10272) * Added configurable warning threshold for GC duration (CASSANDRA-8907) diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 214f2f5b87..f866610b1d 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -28,7 +28,6 @@ import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.text.NumberFormat; import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -36,6 +35,9 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.zip.Checksum; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import com.google.common.base.Joiner; import com.google.common.collect.AbstractIterator; import org.apache.cassandra.io.util.FileUtils; @@ -472,8 +474,18 @@ public class FBUtilities return s; } - public static String toString(Map map) + /** + * Make straing out of the given {@code Map}. + * + * @param map Map to make string. + * @return String representation of all entries in the map, + * where key and value pair is concatenated with ':'. + */ + @Nonnull + public static String toString(@Nullable Map map) { + if (map == null) + return ""; Joiner.MapJoiner joiner = Joiner.on(", ").withKeyValueSeparator(":"); return joiner.join(map); } diff --git a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java index adf3763e9a..c82bcc963b 100644 --- a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java +++ b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java @@ -27,6 +27,11 @@ import java.nio.charset.StandardCharsets; import com.google.common.primitives.Ints; import org.junit.Test; +import java.util.Map; +import java.util.TreeMap; + +import static org.junit.Assert.assertEquals; + public class FBUtilitiesTest { @Test @@ -70,6 +75,20 @@ public class FBUtilitiesTest } } + @Test + public void testToString() + { + // null turns to empty string + assertEquals("", FBUtilities.toString(null)); + Map map = new TreeMap<>(); + // empty map turns to empty string + assertEquals("", FBUtilities.toString(map)); + map.put("aaa", "bbb"); + assertEquals("aaa:bbb", FBUtilities.toString(map)); + map.put("ccc", "ddd"); + assertEquals("aaa:bbb, ccc:ddd", FBUtilities.toString(map)); + } + @Test(expected=CharacterCodingException.class) public void testDecode() throws IOException {