From dc0ed0bba9d2adc1f3bee8558746560fbdb0f8a8 Mon Sep 17 00:00:00 2001 From: Kristen Kozak Date: Mon, 18 Dec 2017 22:21:10 -0800 Subject: Add more null annotations (issue #359). This commit adds some Nullable annotations that are required by the Checker Framework, but it doesn't change any other code. It also suppresses some Error Prone and FindBugs warnings that conflict with the Checker Framework, since the three tools use different algorithms. --- .../main/java/io/opencensus/tags/TagContext.java | 3 ++- .../main/java/io/opencensus/trace/SpanContext.java | 3 ++- api/src/main/java/io/opencensus/trace/SpanId.java | 3 ++- api/src/main/java/io/opencensus/trace/Status.java | 5 +++-- api/src/main/java/io/opencensus/trace/TraceId.java | 3 ++- .../java/io/opencensus/trace/TraceOptions.java | 3 ++- .../opencensus/contrib/zpages/ZPageHandlers.java | 2 ++ .../stackdriver/StackdriverStatsExporter.java | 1 + .../trace/stackdriver/StackdriverExporter.java | 2 ++ .../exporter/trace/zipkin/ZipkinExporter.java | 2 ++ findbugs-exclude.xml | 4 ++++ gradle/errorprone/experimental_suggestions | 5 ++++- .../impl/internal/DisruptorEventQueue.java | 4 +++- .../opencensus/implcore/stats/MutableViewData.java | 4 +++- .../implcore/tags/CurrentTagContextUtils.java | 2 -- .../opencensus/implcore/tags/TagContextImpl.java | 3 ++- .../opencensus/implcore/trace/SpanBuilderImpl.java | 12 +++++------ .../io/opencensus/implcore/trace/SpanImpl.java | 23 ++++++++++++++-------- .../implcore/trace/StartEndHandlerImpl.java | 10 +++++----- .../implcore/trace/export/ExportComponentImpl.java | 4 ++-- .../trace/export/SampledSpanStoreImpl.java | 2 +- .../trace/internal/ConcurrentIntrusiveList.java | 9 ++++++--- 22 files changed, 71 insertions(+), 38 deletions(-) diff --git a/api/src/main/java/io/opencensus/tags/TagContext.java b/api/src/main/java/io/opencensus/tags/TagContext.java index 8147906b..13fde2ac 100644 --- a/api/src/main/java/io/opencensus/tags/TagContext.java +++ b/api/src/main/java/io/opencensus/tags/TagContext.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableMultiset; import com.google.common.collect.Lists; import com.google.common.collect.Multiset; import java.util.Iterator; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** @@ -59,7 +60,7 @@ public abstract class TagContext { * performance. */ @Override - public boolean equals(Object other) { + public boolean equals(@Nullable Object other) { if (!(other instanceof TagContext)) { return false; } diff --git a/api/src/main/java/io/opencensus/trace/SpanContext.java b/api/src/main/java/io/opencensus/trace/SpanContext.java index 5e88b9fd..6084c674 100644 --- a/api/src/main/java/io/opencensus/trace/SpanContext.java +++ b/api/src/main/java/io/opencensus/trace/SpanContext.java @@ -18,6 +18,7 @@ package io.opencensus.trace; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** @@ -85,7 +86,7 @@ public final class SpanContext { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == this) { return true; } diff --git a/api/src/main/java/io/opencensus/trace/SpanId.java b/api/src/main/java/io/opencensus/trace/SpanId.java index cf0c7d46..76747acf 100644 --- a/api/src/main/java/io/opencensus/trace/SpanId.java +++ b/api/src/main/java/io/opencensus/trace/SpanId.java @@ -23,6 +23,7 @@ import com.google.common.base.MoreObjects; import com.google.common.io.BaseEncoding; import java.util.Arrays; import java.util.Random; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** @@ -162,7 +163,7 @@ public final class SpanId implements Comparable { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == this) { return true; } diff --git a/api/src/main/java/io/opencensus/trace/Status.java b/api/src/main/java/io/opencensus/trace/Status.java index f34ab693..d5807ef5 100644 --- a/api/src/main/java/io/opencensus/trace/Status.java +++ b/api/src/main/java/io/opencensus/trace/Status.java @@ -249,8 +249,9 @@ public final class Status { // The canonical code of this message. private final CanonicalCode canonicalCode; + // An additional error message. - private final String description; + @Nullable private final String description; private Status(CanonicalCode canonicalCode, @Nullable String description) { this.canonicalCode = checkNotNull(canonicalCode, "canonicalCode"); @@ -304,7 +305,7 @@ public final class Status { * additional fields may be added to Status in the future. */ @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == this) { return true; } diff --git a/api/src/main/java/io/opencensus/trace/TraceId.java b/api/src/main/java/io/opencensus/trace/TraceId.java index 20f81393..2fad8949 100644 --- a/api/src/main/java/io/opencensus/trace/TraceId.java +++ b/api/src/main/java/io/opencensus/trace/TraceId.java @@ -24,6 +24,7 @@ import com.google.common.io.BaseEncoding; import io.opencensus.common.Internal; import java.util.Arrays; import java.util.Random; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** @@ -184,7 +185,7 @@ public final class TraceId implements Comparable { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == this) { return true; } diff --git a/api/src/main/java/io/opencensus/trace/TraceOptions.java b/api/src/main/java/io/opencensus/trace/TraceOptions.java index fc594853..2f57f3a7 100644 --- a/api/src/main/java/io/opencensus/trace/TraceOptions.java +++ b/api/src/main/java/io/opencensus/trace/TraceOptions.java @@ -23,6 +23,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; /** @@ -150,7 +151,7 @@ public final class TraceOptions { } @Override - public boolean equals(Object obj) { + public boolean equals(@Nullable Object obj) { if (obj == this) { return true; } diff --git a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java index 2fe2f1d5..d85c1365 100644 --- a/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java +++ b/contrib/zpages/src/main/java/io/opencensus/contrib/zpages/ZPageHandlers.java @@ -23,6 +23,7 @@ import io.opencensus.trace.Tracing; import java.io.IOException; import java.net.InetSocketAddress; import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; @@ -71,6 +72,7 @@ public final class ZPageHandlers { private static final Object monitor = new Object(); @GuardedBy("monitor") + @Nullable private static HttpServer server; /** diff --git a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java index 0c95208f..c2277fba 100644 --- a/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java +++ b/exporters/stats/stackdriver/src/main/java/io/opencensus/exporter/stats/stackdriver/StackdriverStatsExporter.java @@ -61,6 +61,7 @@ public final class StackdriverStatsExporter { private final Thread workerThread; @GuardedBy("monitor") + @Nullable private static StackdriverStatsExporter exporter = null; private static final Duration ZERO = Duration.create(0, 0); diff --git a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverExporter.java b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverExporter.java index 05c8e1c1..339d78bb 100644 --- a/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverExporter.java +++ b/exporters/trace/stackdriver/src/main/java/io/opencensus/exporter/trace/stackdriver/StackdriverExporter.java @@ -26,6 +26,7 @@ import io.opencensus.trace.Tracing; import io.opencensus.trace.export.SpanExporter; import io.opencensus.trace.export.SpanExporter.Handler; import java.io.IOException; +import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; /** @@ -46,6 +47,7 @@ public final class StackdriverExporter { private static final Object monitor = new Object(); @GuardedBy("monitor") + @Nullable private static Handler handler = null; /** diff --git a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporter.java b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporter.java index b5d33a9c..9ddd66bc 100644 --- a/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporter.java +++ b/exporters/trace/zipkin/src/main/java/io/opencensus/exporter/trace/zipkin/ZipkinExporter.java @@ -22,6 +22,7 @@ import com.google.common.annotations.VisibleForTesting; import io.opencensus.trace.Tracing; import io.opencensus.trace.export.SpanExporter; import io.opencensus.trace.export.SpanExporter.Handler; +import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import zipkin2.Span; import zipkin2.codec.SpanBytesEncoder; @@ -46,6 +47,7 @@ public final class ZipkinExporter { private static final Object monitor = new Object(); @GuardedBy("monitor") + @Nullable private static Handler handler = null; private ZipkinExporter() {} diff --git a/findbugs-exclude.xml b/findbugs-exclude.xml index ef950976..9a9c563c 100644 --- a/findbugs-exclude.xml +++ b/findbugs-exclude.xml @@ -17,5 +17,9 @@ + + + + diff --git a/gradle/errorprone/experimental_suggestions b/gradle/errorprone/experimental_suggestions index 1330b843..c330674c 100644 --- a/gradle/errorprone/experimental_suggestions +++ b/gradle/errorprone/experimental_suggestions @@ -1,6 +1,9 @@ # FieldMissingNullable is turned off due to # https://github.com/google/error-prone/issues/823. +# ReturnMissingNullable is turned off because it +# conflicts with Checker Framework null analysis. + errorProneExperimentalSuggestions = \ -Xep:ConstantField:ERROR,\ -Xep:EmptySetMultibindingContributions:ERROR,\ @@ -16,7 +19,7 @@ errorProneExperimentalSuggestions = \ -Xep:PrivateConstructorForNoninstantiableModuleTest:ERROR,\ -Xep:PrivateConstructorForUtilityClass:ERROR,\ -Xep:RemoveUnusedImports:ERROR,\ --Xep:ReturnMissingNullable:ERROR,\ +-Xep:ReturnMissingNullable:OFF,\ -Xep:ThrowsUncheckedException:ERROR,\ -Xep:UngroupedOverloads:ERROR,\ -Xep:UnnecessarySetDefault:ERROR,\ diff --git a/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java b/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java index a9e25d13..8b15c37b 100644 --- a/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java +++ b/impl/src/main/java/io/opencensus/impl/internal/DisruptorEventQueue.java @@ -25,6 +25,7 @@ import com.lmax.disruptor.dsl.ProducerType; import io.opencensus.implcore.internal.DaemonThreadFactory; import io.opencensus.implcore.internal.EventQueue; import java.util.concurrent.Executors; +import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; /** @@ -144,7 +145,7 @@ public final class DisruptorEventQueue implements EventQueue { // An event in the {@link EventQueue}. Just holds a reference to an EventQueue.Entry. private static final class DisruptorEvent { - private Entry entry = null; + @Nullable private Entry entry; // Sets the EventQueueEntry associated with this DisruptorEvent. void setEntry(Entry entry) { @@ -152,6 +153,7 @@ public final class DisruptorEventQueue implements EventQueue { } // Returns the EventQueueEntry associated with this DisruptorEvent. + @Nullable Entry getEntry() { return entry; } diff --git a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java index 559502bb..2c545aff 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java +++ b/impl_core/src/main/java/io/opencensus/implcore/stats/MutableViewData.java @@ -62,6 +62,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import javax.annotation.Nullable; /** A mutable version of {@link ViewData}, used for recording stats and start/end time. */ abstract class MutableViewData { @@ -69,7 +70,8 @@ abstract class MutableViewData { private static final long MILLIS_PER_SECOND = 1000L; private static final long NANOS_PER_MILLI = 1000 * 1000; - @VisibleForTesting static final TagValue UNKNOWN_TAG_VALUE = null; + @Nullable @VisibleForTesting static final TagValue UNKNOWN_TAG_VALUE = null; + @VisibleForTesting static final Timestamp ZERO_TIMESTAMP = Timestamp.create(0, 0); private final View view; diff --git a/impl_core/src/main/java/io/opencensus/implcore/tags/CurrentTagContextUtils.java b/impl_core/src/main/java/io/opencensus/implcore/tags/CurrentTagContextUtils.java index 1a4ef81b..e6bb12f5 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/tags/CurrentTagContextUtils.java +++ b/impl_core/src/main/java/io/opencensus/implcore/tags/CurrentTagContextUtils.java @@ -20,7 +20,6 @@ import io.grpc.Context; import io.opencensus.common.Scope; import io.opencensus.tags.TagContext; import io.opencensus.tags.unsafe.ContextUtils; -import javax.annotation.Nullable; /** * Utility methods for accessing the {@link TagContext} contained in the {@link io.grpc.Context}. @@ -34,7 +33,6 @@ final class CurrentTagContextUtils { * * @return the {@code TagContext} from the current context. */ - @Nullable static TagContext getCurrentTagContext() { return ContextUtils.TAG_CONTEXT_KEY.get(); } diff --git a/impl_core/src/main/java/io/opencensus/implcore/tags/TagContextImpl.java b/impl_core/src/main/java/io/opencensus/implcore/tags/TagContextImpl.java index 177ce639..f7a8ff82 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/tags/TagContextImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/tags/TagContextImpl.java @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @Immutable @@ -50,7 +51,7 @@ public final class TagContextImpl extends TagContext { } @Override - public boolean equals(Object other) { + public boolean equals(@Nullable Object other) { // Directly compare the tags when both objects are TagContextImpls, for efficiency. if (other instanceof TagContextImpl) { return getTags().equals(((TagContextImpl) other).getTags()); diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java index 80f904d6..45cf4261 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanBuilderImpl.java @@ -43,19 +43,19 @@ final class SpanBuilderImpl extends SpanBuilder { private final Options options; private final String name; - private final Span parent; - private final SpanContext remoteParentSpanContext; - private Sampler sampler; + @Nullable private final Span parent; + @Nullable private final SpanContext remoteParentSpanContext; + @Nullable private Sampler sampler; private List parentLinks = Collections.emptyList(); - private Boolean recordEvents; + @Nullable private Boolean recordEvents; private SpanImpl startSpanInternal( @Nullable SpanContext parent, @Nullable Boolean hasRemoteParent, String name, - Sampler sampler, + @Nullable Sampler sampler, List parentLinks, - Boolean recordEvents, + @Nullable Boolean recordEvents, @Nullable TimestampConverter timestampConverter) { TraceParams activeTraceParams = options.traceConfig.getActiveTraceParams(); Random random = options.randomHandler.current(); diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java index 11d81747..c0682603 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/SpanImpl.java @@ -55,9 +55,9 @@ public final class SpanImpl extends Span implements Element { private static final Logger logger = Logger.getLogger(Tracer.class.getName()); // The parent SpanId of this span. Null if this is a root span. - private final SpanId parentSpanId; + @Nullable private final SpanId parentSpanId; // True if the parent is on a different process. - private final Boolean hasRemoteParent; + @Nullable private final Boolean hasRemoteParent; // Active trace params when the Span was created. private final TraceParams traceParams; // Handler called when the span starts and ends. @@ -68,24 +68,29 @@ public final class SpanImpl extends Span implements Element { private final Clock clock; // The time converter used to convert nano time to Timestamp. This is needed because Java has // millisecond granularity for Timestamp and tracing events are recorded more often. - private final TimestampConverter timestampConverter; + @Nullable private final TimestampConverter timestampConverter; // The start time of the span. Set when the span is created iff the RECORD_EVENTS options is // set, otherwise 0. private final long startNanoTime; // Set of recorded attributes. DO NOT CALL any other method that changes the ordering of events. @GuardedBy("this") + @Nullable private AttributesWithCapacity attributes; // List of recorded annotations. @GuardedBy("this") + @Nullable private TraceEvents> annotations; // List of recorded network events. @GuardedBy("this") + @Nullable private TraceEvents> networkEvents; // List of recorded links to parent and child spans. @GuardedBy("this") + @Nullable private TraceEvents links; // The status of the span. Set when the span is ended iff the RECORD_EVENTS options is set. @GuardedBy("this") + @Nullable private Status status; // The end time of the span. Set when the span is ended iff the RECORD_EVENTS options is set, // otherwise 0. @@ -99,8 +104,8 @@ public final class SpanImpl extends Span implements Element { private boolean sampleToLocalSpanStore; // Pointers for the ConcurrentIntrusiveList$Element. Guarded by the ConcurrentIntrusiveList. - private SpanImpl next = null; - private SpanImpl prev = null; + @Nullable private SpanImpl next = null; + @Nullable private SpanImpl prev = null; /** * Creates and starts a span with the given configuration. @@ -424,7 +429,7 @@ public final class SpanImpl extends Span implements Element { } private static SpanData.TimedEvents createTimedEvents( - TraceEvents> events, TimestampConverter timestampConverter) { + TraceEvents> events, @Nullable TimestampConverter timestampConverter) { if (events == null) { return SpanData.TimedEvents.create(Collections.>emptyList(), 0); } @@ -436,22 +441,24 @@ public final class SpanImpl extends Span implements Element { } @Override + @Nullable public SpanImpl getNext() { return next; } @Override - public void setNext(SpanImpl element) { + public void setNext(@Nullable SpanImpl element) { next = element; } @Override + @Nullable public SpanImpl getPrev() { return prev; } @Override - public void setPrev(SpanImpl element) { + public void setPrev(@Nullable SpanImpl element) { prev = element; } diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java index fdb6147c..e22a86bd 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/StartEndHandlerImpl.java @@ -33,8 +33,8 @@ import javax.annotation.concurrent.ThreadSafe; @ThreadSafe public final class StartEndHandlerImpl implements StartEndHandler { private final SpanExporterImpl spanExporter; - private final RunningSpanStoreImpl runningSpanStore; - private final SampledSpanStoreImpl sampledSpanStore; + @Nullable private final RunningSpanStoreImpl runningSpanStore; + @Nullable private final SampledSpanStoreImpl sampledSpanStore; private final EventQueue eventQueue; // true if any of (runningSpanStore OR sampledSpanStore) are different than null, which // means the spans with RECORD_EVENTS should be enqueued in the queue. @@ -78,7 +78,7 @@ public final class StartEndHandlerImpl implements StartEndHandler { // An EventQueue entry that records the start of the span event. private static final class SpanStartEvent implements EventQueue.Entry { private final SpanImpl span; - private final RunningSpanStoreImpl activeSpansExporter; + @Nullable private final RunningSpanStoreImpl activeSpansExporter; SpanStartEvent(SpanImpl span, @Nullable RunningSpanStoreImpl activeSpansExporter) { this.span = span; @@ -96,9 +96,9 @@ public final class StartEndHandlerImpl implements StartEndHandler { // An EventQueue entry that records the end of the span event. private static final class SpanEndEvent implements EventQueue.Entry { private final SpanImpl span; - private final RunningSpanStoreImpl runningSpanStore; + @Nullable private final RunningSpanStoreImpl runningSpanStore; private final SpanExporterImpl spanExporter; - private final SampledSpanStoreImpl sampledSpanStore; + @Nullable private final SampledSpanStoreImpl sampledSpanStore; SpanEndEvent( SpanImpl span, diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/ExportComponentImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/ExportComponentImpl.java index 26c9004a..9f17039c 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/ExportComponentImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/ExportComponentImpl.java @@ -30,8 +30,8 @@ public final class ExportComponentImpl extends ExportComponent { private static final Duration EXPORTER_SCHEDULE_DELAY = Duration.create(5, 0); private final SpanExporterImpl spanExporter; - private final RunningSpanStoreImpl runningSpanStore; - private final SampledSpanStoreImpl sampledSpanStore; + @Nullable private final RunningSpanStoreImpl runningSpanStore; + @Nullable private final SampledSpanStoreImpl sampledSpanStore; @Override public SpanExporterImpl getSpanExporter() { diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java index 60b1433c..0fad80fb 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/export/SampledSpanStoreImpl.java @@ -208,7 +208,7 @@ public final class SampledSpanStoreImpl extends SampledSpanStore { return errorBucketSummaries; } - private List getErrorSamples(CanonicalCode code, int maxSpansToReturn) { + private List getErrorSamples(@Nullable CanonicalCode code, int maxSpansToReturn) { ArrayList output = new ArrayList(maxSpansToReturn); if (code != null) { getErrorBucket(code).getSamples(maxSpansToReturn, output); diff --git a/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java b/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java index ef0b2664..a1210b00 100644 --- a/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java +++ b/impl_core/src/main/java/io/opencensus/implcore/trace/internal/ConcurrentIntrusiveList.java @@ -22,6 +22,7 @@ import io.opencensus.implcore.trace.internal.ConcurrentIntrusiveList.Element; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; /** @@ -60,7 +61,7 @@ import javax.annotation.concurrent.ThreadSafe; @ThreadSafe public final class ConcurrentIntrusiveList> { private int size = 0; - private T head = null; + @Nullable private T head = null; public ConcurrentIntrusiveList() {} @@ -151,6 +152,7 @@ public final class ConcurrentIntrusiveList> { * * @return a reference to the next element in the list. */ + @Nullable T getNext(); /** @@ -158,13 +160,14 @@ public final class ConcurrentIntrusiveList> { * * @param element the reference to the next element in the list. */ - void setNext(T element); + void setNext(@Nullable T element); /** * Returns a reference to the previous element in the list. * * @return a reference to the previous element in the list. */ + @Nullable T getPrev(); /** @@ -172,6 +175,6 @@ public final class ConcurrentIntrusiveList> { * * @param element the reference to the previous element in the list. */ - void setPrev(T element); + void setPrev(@Nullable T element); } } -- cgit v1.2.3