From 47416a8eefb6f0f5586b0042e224bd4f952f8559 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 13 Feb 2020 14:56:47 -0800 Subject: [PATCH] Reduces scope copies when desired context is already current (#1558) --- .../reactor/ScopePassingSpanSubscriber.java | 4 +++- .../reactor/ScopePassingSpanSubscriberTests.java | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java index 2e24dc278..a1b587052 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java @@ -54,7 +54,9 @@ final class ScopePassingSpanSubscriber implements SpanSubscription, Scanna this.subscriber = subscriber; this.currentTraceContext = currentTraceContext; this.parent = parent; - this.context = parent != null ? ctx.put(TraceContext.class, parent) : ctx; + this.context = parent != null + && !parent.equals(ctx.getOrDefault(TraceContext.class, null)) + ? ctx.put(TraceContext.class, parent) : ctx; if (log.isTraceEnabled()) { log.trace("Parent span [" + parent + "], context [" + this.context + "]"); } diff --git a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java index 13427635a..65023e5da 100644 --- a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java +++ b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java @@ -138,6 +138,18 @@ public class ScopePassingSpanSubscriberTests { then((String) subscriber.currentContext().get("foo")).isEqualTo("bar"); } + /** + * This ensures when the desired context is in the reactor context we don't copy it. + */ + @Test + public void should_not_redundantly_copy_context() { + Context initial = Context.of(TraceContext.class, context); + ScopePassingSpanSubscriber subscriber = new ScopePassingSpanSubscriber<>(null, + initial, this.currentTraceContext, context); + + then(initial).isSameAs(subscriber.currentContext()); + } + @Test public void should_set_empty_context_when_context_is_null() { ScopePassingSpanSubscriber subscriber = new ScopePassingSpanSubscriber<>(null,