You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2015/04/14 19:06:43 UTC

svn commit: r1673471 - in /lucene/dev/branches/branch_5x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/cloud/ solr/core/src/java/org/apache/solr/core/ solr/core/src/java/org/apache/solr/handler/ solr/core/src/java/org/apache/solr/handler/admi...

Author: shalin
Date: Tue Apr 14 17:06:42 2015
New Revision: 1673471

URL: http://svn.apache.org/r1673471
Log:
SOLR-7381: MDC keys are now exposed in thread names automatically so that a thread dump can give hints on what the thread was doing

Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ZkContainer.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
    lucene/dev/branches/branch_5x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/ExecutorUtil.java

Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Tue Apr 14 17:06:42 2015
@@ -81,7 +81,9 @@ Other Changes
 * SOLR-7381: Improve logging by adding node name in MDC in SolrCloud mode and adding MDC to
   all thread pools. A new MDCAwareThreadPoolExecutor is introduced and usages of
   Executors#newFixedThreadPool, #newSingleThreadExecutor, #newCachedThreadPool as well as
-  ThreadPoolExecutor directly is now forbidden in Solr. (shalin)
+  ThreadPoolExecutor directly is now forbidden in Solr. MDC keys are now exposed in thread
+  names automatically so that a thread dump can give hints on what the thread was doing.
+  (shalin)
 
 * SOLR-7384: Fix spurious failures in FullSolrCloudDistribCmdsTest. (shalin)
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/cloud/OverseerAutoReplicaFailoverThread.java Tue Apr 14 17:06:42 2015
@@ -33,6 +33,7 @@ import org.apache.solr.core.CloudConfig;
 import org.apache.solr.update.UpdateShardHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import java.io.Closeable;
 import java.util.ArrayList;
@@ -245,14 +246,19 @@ public class OverseerAutoReplicaFailover
       // need an async request - full shard goes down leader election
       final String coreName = badReplica.replica.getStr(ZkStateReader.CORE_NAME_PROP);
       log.debug("submit call to {}", createUrl);
-      updateExecutor.submit(new Callable<Boolean>() {
-        
-        @Override
-        public Boolean call() {
-          return createSolrCore(collection, createUrl, dataDir, ulogDir, coreNodeName, coreName);
-        }
-      });
-      
+      MDC.put("OverseerAutoReplicaFailoverThread.createUrl", createUrl);
+      try {
+        updateExecutor.submit(new Callable<Boolean>() {
+
+          @Override
+          public Boolean call() {
+            return createSolrCore(collection, createUrl, dataDir, ulogDir, coreNodeName, coreName);
+          }
+        });
+      } finally {
+        MDC.remove("OverseerAutoReplicaFailoverThread.createUrl");
+      }
+
       // wait to see state for core we just created
       boolean success = ClusterStateUtil.waitToSeeLiveReplica(zkStateReader, collection, coreNodeName, createUrl, 30000);
       if (!success) {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ZkContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ZkContainer.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ZkContainer.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/ZkContainer.java Tue Apr 14 17:06:42 2015
@@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeoutException;
 
+import org.apache.log4j.MDC;
 import org.apache.solr.cloud.CurrentCoreDescriptorProvider;
 import org.apache.solr.cloud.SolrZkServer;
 import org.apache.solr.cloud.ZkController;
@@ -36,11 +37,14 @@ import org.apache.solr.common.cloud.Repl
 import org.apache.solr.common.cloud.ZkConfigManager;
 import org.apache.solr.common.cloud.ZooKeeperException;
 import org.apache.solr.common.util.ExecutorUtil;
+import org.apache.solr.logging.MDCUtils;
 import org.apache.solr.util.DefaultSolrThreadFactory;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
+
 public class ZkContainer {
   protected static Logger log = LoggerFactory.getLogger(ZkContainer.class);
   
@@ -195,14 +199,19 @@ public class ZkContainer {
             SolrException.log(log, "", e);
           }
         }
-      
+
     };
     
     if (zkController != null) {
-      if (background) {
-        coreZkRegister.execute(thread);
-      } else {
-        thread.run();
+      MDCUtils.setCore(core.getName());
+      try {
+        if (background) {
+          coreZkRegister.execute(thread);
+        } else {
+          thread.run();
+        }
+      } finally {
+        MDC.remove(CORE_NAME_PROP);
       }
     }
   }

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java Tue Apr 14 17:06:42 2015
@@ -90,6 +90,7 @@ import org.apache.solr.util.RefCounted;
 import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import static org.apache.solr.common.params.CommonParams.NAME;
 
@@ -427,8 +428,17 @@ public class ReplicationHandler extends
     }
 
     RestoreCore restoreCore = new RestoreCore(core, location, name);
-    restoreFuture = restoreExecutor.submit(restoreCore);
-    currentRestoreName = name;
+    try {
+      MDC.put("RestoreCore.core", core.getName());
+      MDC.put("RestoreCore.backupLocation", location);
+      MDC.put("RestoreCore.backupName", name);
+      restoreFuture = restoreExecutor.submit(restoreCore);
+      currentRestoreName = name;
+    } finally {
+      MDC.remove("RestoreCore.core");
+      MDC.remove("RestoreCore.backupLocation");
+      MDC.remove("RestoreCore.backupName");
+    }
   }
 
   private NamedList<Object> getRestoreStatus() {

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Tue Apr 14 17:06:42 2015
@@ -84,6 +84,7 @@ import org.apache.solr.util.RefCounted;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import static org.apache.solr.common.cloud.DocCollection.DOC_ROUTER;
 import static org.apache.solr.common.params.CommonParams.NAME;
@@ -191,7 +192,16 @@ public class CoreAdminHandler extends Re
       handleRequestInternal(req, rsp, action);
     } else {
       ParallelCoreAdminHandlerThread parallelHandlerThread = new ParallelCoreAdminHandlerThread(req, rsp, action, taskObject);
-      parallelExecutor.execute(parallelHandlerThread);
+      try {
+        MDC.put("CoreAdminHandler.asyncId", taskId);
+        if (action != null) {
+          MDC.put("CoreAdminHandler.action", action.name());
+        }
+        parallelExecutor.execute(parallelHandlerThread);
+      } finally {
+        MDC.remove("CoreAdminHandler.asyncId");
+        MDC.remove("CoreAdminHandler.action");
+      }
     }
   }
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java Tue Apr 14 17:06:42 2015
@@ -60,6 +60,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
+import org.slf4j.MDC;
 
 public class HttpShardHandler extends ShardHandler {
 
@@ -239,7 +240,18 @@ public class HttpShardHandler extends Sh
       }
     };
 
-    pending.add( completionService.submit(task) );
+    try {
+      if (shard != null)  {
+        MDC.put("ShardRequest.shards", shard);
+      }
+      if (urls != null && !urls.isEmpty())  {
+        MDC.put("ShardRequest.urlList", urls.toString());
+      }
+      pending.add( completionService.submit(task) );
+    } finally {
+      MDC.remove("ShardRequest.shards");
+      MDC.remove("ShardRequest.urlList");
+    }
   }
   
   /**

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java Tue Apr 14 17:06:42 2015
@@ -72,6 +72,7 @@ import org.apache.solr.update.VersionInf
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -933,7 +934,12 @@ public class DistributedUpdateProcessor
               maxTries,
               cloudDesc.getCoreNodeName()); // core node name of current leader
       ExecutorService executor = coreContainer.getUpdateShardHandler().getUpdateExecutor();
-      executor.execute(lirThread);
+      try {
+        MDC.put("DistributedUpdateProcessor.replicaUrlToRecover", error.req.node.getNodeProps().getCoreUrl());
+        executor.execute(lirThread);
+      } finally {
+        MDC.remove("DistributedUpdateProcessor.replicaUrlToRecover");
+      }
     }
 
     if (replicationTracker != null) {

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java Tue Apr 14 17:06:42 2015
@@ -54,6 +54,7 @@ import org.apache.solr.common.util.StrUt
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import java.io.IOException;
 import java.net.ConnectException;
@@ -110,7 +111,7 @@ public class CloudSolrClient extends Sol
   private boolean parallelUpdates = true;
   private ExecutorService threadPool = ExecutorUtil
       .newMDCAwareCachedThreadPool(new SolrjNamedThreadFactory(
-          "CloudSolrServer ThreadPool"));
+          "CloudSolrClient ThreadPool"));
   private String idField = "id";
   public static final String STATE_VERSION = "_stateVer_";
   private final Set<String> NON_ROUTABLE_PARAMS;
@@ -591,12 +592,17 @@ public class CloudSolrClient extends Sol
       for (final Map.Entry<String, LBHttpSolrClient.Req> entry : routes.entrySet()) {
         final String url = entry.getKey();
         final LBHttpSolrClient.Req lbRequest = entry.getValue();
-        responseFutures.put(url, threadPool.submit(new Callable<NamedList<?>>() {
-          @Override
-          public NamedList<?> call() throws Exception {
-            return lbClient.request(lbRequest).getResponse();
-          }
-        }));
+        try {
+          MDC.put("CloudSolrClient.url", url);
+          responseFutures.put(url, threadPool.submit(new Callable<NamedList<?>>() {
+            @Override
+            public NamedList<?> call() throws Exception {
+              return lbClient.request(lbRequest).getResponse();
+            }
+          }));
+        } finally {
+          MDC.remove("CloudSolrClient.url");
+        }
       }
 
       for (final Map.Entry<String, Future<NamedList<?>>> entry: responseFutures.entrySet()) {

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/ConcurrentUpdateSolrClient.java Tue Apr 14 17:06:42 2015
@@ -42,6 +42,7 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.common.util.SolrjNamedThreadFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -343,9 +344,14 @@ public class ConcurrentUpdateSolrClient
           if (runners.isEmpty() || (queue.remainingCapacity() < queue.size() && runners.size() < threadCount))
           {
             // We need more runners, so start a new one.
-            Runner r = new Runner();
-            runners.add(r);
-            scheduler.execute(r);
+            MDC.put("ConcurrentUpdateSolrClient.url", client.getBaseURL());
+            try {
+              Runner r = new Runner();
+              runners.add(r);
+              scheduler.execute(r);
+            } finally {
+              MDC.remove("ConcurrentUpdateSolrClient.url");
+            }
           } else {
             // break out of the retry loop if we added the element to the queue
             // successfully, *and*
@@ -402,9 +408,14 @@ public class ConcurrentUpdateSolrClient
           if (queueSize > 0) {
             log.warn("No more runners, but queue still has "+
               queueSize+" adding more runners to process remaining requests on queue");
-            Runner r = new Runner();
-            runners.add(r);
-            scheduler.execute(r);
+            MDC.put("ConcurrentUpdateSolrClient.url", client.getBaseURL());
+            try {
+              Runner r = new Runner();
+              runners.add(r);
+              scheduler.execute(r);
+            } finally {
+              MDC.remove("ConcurrentUpdateSolrClient.url");
+            }
           }
         }
       }

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java Tue Apr 14 17:06:42 2015
@@ -57,6 +57,7 @@ import org.apache.solr.common.util.Named
 import org.apache.solr.common.util.SolrjNamedThreadFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -262,6 +263,7 @@ public class HttpSolrClient extends Solr
     final HttpRequestBase method = createMethod(request, null);
     ExecutorService pool = ExecutorUtil.newMDCAwareFixedThreadPool(1, new SolrjNamedThreadFactory("httpUriRequest"));
     try {
+      MDC.put("HttpSolrClient.url", baseUrl);
       mrr.future = pool.submit(new Callable<NamedList<Object>>(){
 
         @Override
@@ -271,6 +273,7 @@ public class HttpSolrClient extends Solr
  
     } finally {
       pool.shutdown();
+      MDC.remove("HttpSolrClient.url");
     }
     assert method != null;
     mrr.httpUriRequest = method;

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/impl/LBHttpSolrClient.java Tue Apr 14 17:06:42 2015
@@ -27,6 +27,7 @@ import org.apache.solr.common.params.Sol
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SolrjNamedThreadFactory;
 import org.apache.solr.common.SolrException;
+import org.slf4j.MDC;
 
 import java.io.IOException;
 import java.lang.ref.WeakReference;
@@ -320,11 +321,16 @@ public class LBHttpSolrClient extends So
         continue;
       }
       rsp.server = serverStr;
-      HttpSolrClient client = makeSolrClient(serverStr);
-
-      ex = doRequest(client, req, rsp, isUpdate, false, null);
-      if (ex == null) {
-        return rsp; // SUCCESS
+      try {
+        MDC.put("LBHttpSolrClient.url", serverStr);
+        HttpSolrClient client = makeSolrClient(serverStr);
+
+        ex = doRequest(client, req, rsp, isUpdate, false, null);
+        if (ex == null) {
+          return rsp; // SUCCESS
+        }
+      } finally {
+        MDC.remove("LBHttpSolrClient.url");
       }
     }
 

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/ExecutorUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/ExecutorUtil.java?rev=1673471&r1=1673470&r2=1673471&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/ExecutorUtil.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/util/ExecutorUtil.java Tue Apr 14 17:06:42 2015
@@ -106,6 +106,8 @@ public class ExecutorUtil {
 
   public static class MDCAwareThreadPoolExecutor extends ThreadPoolExecutor {
 
+    private static final int MAX_THREAD_NAME_LEN = 512;
+
     public MDCAwareThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
       super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
     }
@@ -125,12 +127,18 @@ public class ExecutorUtil {
     @Override
     public void execute(final Runnable command) {
       final Map<String, String> submitterContext = MDC.getCopyOfContextMap();
+      String ctxStr = submitterContext != null && !submitterContext.isEmpty() ?
+          submitterContext.toString().replace("/", "//") : "";
+      final String submitterContextStr = ctxStr.length() <= MAX_THREAD_NAME_LEN ? ctxStr : ctxStr.substring(0, MAX_THREAD_NAME_LEN);
       super.execute(new Runnable() {
         @Override
         public void run() {
           Map<String, String> threadContext = MDC.getCopyOfContextMap();
-          if (submitterContext != null) {
+          final Thread currentThread = Thread.currentThread();
+          final String oldName = currentThread.getName();
+          if (submitterContext != null && !submitterContext.isEmpty()) {
             MDC.setContextMap(submitterContext);
+            currentThread.setName(oldName + "-processing-" + submitterContextStr);
           } else {
             MDC.clear();
           }
@@ -142,6 +150,7 @@ public class ExecutorUtil {
             } else {
               MDC.clear();
             }
+            currentThread.setName(oldName);
           }
         }
       });