X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fmdsal-trace%2Fdom-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Ftrace%2Fclosetracker%2Fimpl%2FCloseTrackedTrait.java;h=f96daaa425566f328540b1268f95ae1af08bd798;hb=b4bf55727093657662d8c16a50fa85f87978a586;hp=f76eeb17c60136f3587b58ff5ae03ed4b37ec673;hpb=0792888092341cbb7db5f851a5e3bcbca9609e73;p=controller.git diff --git a/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java b/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java index f76eeb17c6..f96daaa425 100644 --- a/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java +++ b/opendaylight/md-sal/mdsal-trace/dom-impl/src/main/java/org/opendaylight/controller/md/sal/trace/closetracker/impl/CloseTrackedTrait.java @@ -7,9 +7,10 @@ */ package org.opendaylight.controller.md.sal.trace.closetracker.impl; -import java.time.Instant; -import java.util.Objects; -import javax.annotation.Nullable; +import static java.util.Objects.requireNonNull; + +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import org.eclipse.jdt.annotation.Nullable; /** * Implementation of {@link CloseTracked} which can be used as a field in @@ -23,27 +24,30 @@ import javax.annotation.Nullable; */ public class CloseTrackedTrait> implements CloseTracked { - private final Instant created; + // NB: It's important that we keep a Throwable here, and not directly the StackTraceElement[] ! + // This is because creating a new Throwable() is a lot less expensive in terms of runtime overhead + // than actually calling its getStackTrace(), which we can delay until we really need to. + // see also e.g. https://stackoverflow.com/a/26122232/421602 private final @Nullable Throwable allocationContext; private final CloseTrackedRegistry closeTrackedRegistry; + private final CloseTracked realCloseTracked; - public CloseTrackedTrait(CloseTrackedRegistry transactionChainRegistry) { - this.created = Instant.now(); + @SuppressFBWarnings(value = "NP_STORE_INTO_NONNULL_FIELD", justification = "SpotBugs and JDT annotations") + public CloseTrackedTrait(CloseTrackedRegistry transactionChainRegistry, CloseTracked realCloseTracked) { if (transactionChainRegistry.isDebugContextEnabled()) { - this.allocationContext = new Throwable("allocated at"); + // NB: We're NOT doing the (expensive) getStackTrace() here just yet (only below) + // TODO When we're on Java 9, then instead use the new java.lang.StackWalker API.. + this.allocationContext = new Throwable(); } else { this.allocationContext = null; } - this.closeTrackedRegistry = Objects.requireNonNull(transactionChainRegistry, "transactionChainRegistry"); + this.realCloseTracked = requireNonNull(realCloseTracked, "realCloseTracked"); + this.closeTrackedRegistry = requireNonNull(transactionChainRegistry, "transactionChainRegistry"); this.closeTrackedRegistry.add(this); } @Override - public Instant getObjectCreated() { - return created; - } - - @Override + @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS") public StackTraceElement[] getAllocationContextStackTrace() { return allocationContext != null ? allocationContext.getStackTrace() : null; } @@ -52,4 +56,9 @@ public class CloseTrackedTrait> implements CloseTracke closeTrackedRegistry.remove(this); } + @Override + public CloseTracked getRealCloseTracked() { + return realCloseTracked; + } + }