Repository: incubator-htrace Updated Branches: refs/heads/master d7207a5ae -> d5a6cf7ea
HTRACE-40. MilliSpanDeserializer throws NumberFormatException when Span has negative Long value (Long Zhou via Colin P. McCabe) Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/d5a6cf7e Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/d5a6cf7e Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/d5a6cf7e Branch: refs/heads/master Commit: d5a6cf7eaccbfde714dc74f8c1ba2dd79056c8ac Parents: d7207a5 Author: Colin P. Mccabe <[email protected]> Authored: Wed Dec 31 12:09:37 2014 -0800 Committer: Colin P. Mccabe <[email protected]> Committed: Wed Dec 31 12:09:37 2014 -0800 ---------------------------------------------------------------------- .../java/org/apache/htrace/impl/MilliSpan.java | 11 ++++-- .../org/apache/htrace/impl/TestMilliSpan.java | 35 ++++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d5a6cf7e/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java index 77e289e..7f3e81a 100644 --- a/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java +++ b/htrace-core/src/main/java/org/apache/htrace/impl/MilliSpan.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.StringWriter; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -282,6 +283,10 @@ public class MilliSpan implements Span { return writer.toString(); } + private static long parseUnsignedLong(String s) { + return new BigInteger(s, 16).longValue(); + } + public static class MilliSpanDeserializer extends JsonDeserializer<MilliSpan> { @Override @@ -292,15 +297,15 @@ public class MilliSpan implements Span { builder.begin(root.get("b").asLong()). end(root.get("e").asLong()). description(root.get("d").asText()). - traceId(Long.parseLong(root.get("i").asText(), 16)). - spanId(Long.parseLong(root.get("s").asText(), 16)). + traceId(parseUnsignedLong(root.get("i").asText())). + spanId(parseUnsignedLong(root.get("s").asText())). processId(root.get("r").asText()); JsonNode parentsNode = root.get("p"); LinkedList<Long> parents = new LinkedList<Long>(); for (Iterator<JsonNode> iter = parentsNode.elements(); iter.hasNext(); ) { JsonNode parentIdNode = iter.next(); - parents.add(Long.parseLong(parentIdNode.asText(), 16)); + parents.add(parseUnsignedLong(parentIdNode.asText())); } builder.parents(parents); JsonNode traceInfoNode = root.get("n"); http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/d5a6cf7e/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java b/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java index 908e74e..677ec61 100644 --- a/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java +++ b/htrace-core/src/test/java/org/apache/htrace/impl/TestMilliSpan.java @@ -24,11 +24,13 @@ import org.apache.htrace.Span; import org.apache.htrace.TimelineAnnotation; import org.junit.Test; +import java.security.SecureRandom; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Random; public class TestMilliSpan { private void compareSpans(Span expected, Span got) throws Exception { @@ -93,6 +95,39 @@ public class TestMilliSpan { } @Test + public void testJsonSerializationWithNegativeLongValue() throws Exception { + MilliSpan span = new MilliSpan.Builder(). + description("foospan"). + begin(-1L). + end(-1L). + parents(new long[] { -1L }). + processId("b2404.halxg.com:8080"). + spanId(-1L). + traceId(-1L).build(); + String json = span.toJson(); + ObjectMapper mapper = new ObjectMapper(); + MilliSpan dspan = mapper.readValue(json, MilliSpan.class); + compareSpans(span, dspan); + } + + @Test + public void testJsonSerializationWithRandomLongValue() throws Exception { + Random random = new SecureRandom(); + MilliSpan span = new MilliSpan.Builder(). + description("foospan"). + begin(random.nextLong()). + end(random.nextLong()). + parents(new long[] { random.nextLong() }). + processId("b2404.halxg.com:8080"). + spanId(random.nextLong()). + traceId(random.nextLong()).build(); + String json = span.toJson(); + ObjectMapper mapper = new ObjectMapper(); + MilliSpan dspan = mapper.readValue(json, MilliSpan.class); + compareSpans(span, dspan); + } + + @Test public void testJsonSerializationWithOptionalFields() throws Exception { MilliSpan.Builder builder = new MilliSpan.Builder(). description("foospan").
