From e7a85a48c2ff778a33609b18a53b885623cb3795 Mon Sep 17 00:00:00 2001 From: Sun Tan Date: Tue, 6 Feb 2018 15:01:15 +0000 Subject: [PATCH] Copying MDC context in every async calls that go through ThreadLocalPropagateContext.wrap method --- .../commons/lang/concurrent/CopyThreadLocalCallable.java | 8 ++++++++ .../commons/lang/concurrent/CopyThreadLocalRunnable.java | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalCallable.java b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalCallable.java index 879da5711655..9574741fe6da 100644 --- a/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalCallable.java +++ b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalCallable.java @@ -10,27 +10,35 @@ */ package org.eclipse.che.commons.lang.concurrent; +import java.util.Map; import java.util.concurrent.Callable; +import org.slf4j.MDC; /** @author andrew00x */ class CopyThreadLocalCallable implements Callable { private final Callable wrapped; private final ThreadLocalPropagateContext.ThreadLocalState threadLocalState; + private Map currentMdcState; CopyThreadLocalCallable(Callable wrapped) { // Called from main thread. Copy the current values of all the ThreadLocal variables which // registered in ThreadLocalPropagateContext. this.wrapped = wrapped; this.threadLocalState = ThreadLocalPropagateContext.currentThreadState(); + this.currentMdcState = MDC.getCopyOfContextMap(); } @Override public T call() throws Exception { try { threadLocalState.propagate(); + if (currentMdcState != null) { + MDC.setContextMap(currentMdcState); + } return wrapped.call(); } finally { threadLocalState.cleanup(); + MDC.clear(); } } diff --git a/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalRunnable.java b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalRunnable.java index 4bc92e84d758..49cbfc38e34a 100644 --- a/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalRunnable.java +++ b/core/commons/che-core-commons-lang/src/main/java/org/eclipse/che/commons/lang/concurrent/CopyThreadLocalRunnable.java @@ -10,25 +10,34 @@ */ package org.eclipse.che.commons.lang.concurrent; +import java.util.Map; +import org.slf4j.MDC; + /** @author andrew00x */ class CopyThreadLocalRunnable implements Runnable { private final Runnable wrapped; private final ThreadLocalPropagateContext.ThreadLocalState threadLocalState; + private Map currentMdcState; CopyThreadLocalRunnable(Runnable wrapped) { // Called from main thread. Copy the current values of all the ThreadLocal variables which // registered in ThreadLocalPropagateContext. this.wrapped = wrapped; this.threadLocalState = ThreadLocalPropagateContext.currentThreadState(); + this.currentMdcState = MDC.getCopyOfContextMap(); } @Override public void run() { try { threadLocalState.propagate(); + if (currentMdcState != null) { + MDC.setContextMap(currentMdcState); + } wrapped.run(); } finally { threadLocalState.cleanup(); + MDC.clear(); } }