[KARAF-5437] Use named thread pools to help identifying threads

Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/180942b5
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/180942b5
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/180942b5

Branch: refs/heads/master
Commit: 180942b503dfaa0ea2818e3cce0046082de19a70
Parents: 844bacf
Author: Guillaume Nodet <[email protected]>
Authored: Fri Oct 20 11:13:01 2017 +0200
Committer: Guillaume Nodet <[email protected]>
Committed: Fri Oct 20 11:13:01 2017 +0200

----------------------------------------------------------------------
 .../karaf/features/internal/osgi/Activator.java | 14 +++++++++-
 .../internal/service/FeaturesServiceImpl.java   |  2 +-
 .../karaf/util/tracker/BaseActivator.java       | 27 ++++++++++++++++++--
 3 files changed, 39 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/180942b5/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
index 044ab68..1ac72b6 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/osgi/Activator.java
@@ -28,6 +28,12 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.felix.resolver.ResolverImpl;
 import org.apache.felix.utils.properties.Properties;
@@ -49,6 +55,7 @@ import 
org.apache.karaf.features.internal.service.FeaturesServiceImpl;
 import org.apache.karaf.features.internal.service.BundleInstallSupport;
 import org.apache.karaf.features.internal.service.BundleInstallSupportImpl;
 import org.apache.karaf.features.internal.service.StateStorage;
+import org.apache.karaf.util.ThreadUtils;
 import org.apache.karaf.util.tracker.BaseActivator;
 import org.apache.karaf.util.tracker.annotation.ProvideService;
 import org.apache.karaf.util.tracker.annotation.RequireService;
@@ -93,6 +100,7 @@ public class Activator extends BaseActivator {
     private FeaturesServiceImpl featuresService;
     private StandardManageableRegionDigraph digraphMBean;
     private BundleInstallSupport installSupport;
+    private ExecutorService executorService;
 
     public Activator() {
         // Special case here, as we don't want the activator to wait for 
current job to finish,
@@ -124,7 +132,11 @@ public class Activator extends BaseActivator {
         BundleContext systemBundleContext = 
bundleContext.getBundle(0).getBundleContext();
         ConfigurationAdmin configurationAdmin = 
getTrackedService(ConfigurationAdmin.class);
         int resolverThreads = getInt("resolverThreads", 
Runtime.getRuntime().availableProcessors());
-        Resolver resolver = new ResolverImpl(new 
Slf4jResolverLog(LoggerFactory.getLogger(ResolverImpl.class)), resolverThreads);
+        executorService = new ThreadPoolExecutor(0, resolverThreads,
+                1L, TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(),
+                ThreadUtils.namedThreadFactory("resolver"));
+        Resolver resolver = new ResolverImpl(new 
Slf4jResolverLog(LoggerFactory.getLogger(ResolverImpl.class)), executorService);
         URLStreamHandlerService mvnUrlHandler = 
getTrackedService(URLStreamHandlerService.class);
 
         if (configurationAdmin == null || mvnUrlHandler == null) {

http://git-wip-us.apache.org/repos/asf/karaf/blob/180942b5/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
index 3e38a6d..cf01a8f 100644
--- 
a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
+++ 
b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesServiceImpl.java
@@ -1003,7 +1003,7 @@ public class FeaturesServiceImpl implements 
FeaturesService, Deployer.DeployCall
     protected DownloadManager createDownloadManager() throws IOException {
         Dictionary<String, String> props = getMavenConfig();
         MavenResolver resolver = MavenResolvers.createMavenResolver(props, 
"org.ops4j.pax.url.mvn");
-        ScheduledThreadPoolExecutor executor = new 
ScheduledThreadPoolExecutor(cfg.downloadThreads);
+        ScheduledThreadPoolExecutor executor = new 
ScheduledThreadPoolExecutor(cfg.downloadThreads, 
ThreadUtils.namedThreadFactory("downloader"));
         executor.setMaximumPoolSize(cfg.downloadThreads);
         return DownloadManagers.createDownloadManager(resolver, executor, 
cfg.scheduleDelay, cfg.scheduleMaxRun);
     }

http://git-wip-us.apache.org/repos/asf/karaf/blob/180942b5/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
----------------------------------------------------------------------
diff --git 
a/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java 
b/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
index a314aba..63b2622 100644
--- a/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
+++ b/util/src/main/java/org/apache/karaf/util/tracker/BaseActivator.java
@@ -29,9 +29,11 @@ import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
@@ -43,13 +45,13 @@ import org.osgi.framework.ServiceRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BaseActivator implements BundleActivator, Runnable {
+public class BaseActivator implements BundleActivator, Runnable, ThreadFactory 
{
 
     protected final Logger logger = LoggerFactory.getLogger(getClass());
     protected BundleContext bundleContext;
 
     protected ExecutorService executor = new ThreadPoolExecutor(0, 1, 0L, 
TimeUnit.MILLISECONDS,
-            new LinkedBlockingQueue<>());
+            new LinkedBlockingQueue<>(), this);
     private AtomicBoolean scheduled = new AtomicBoolean();
 
     private long schedulerStopTimeout = TimeUnit.MILLISECONDS.convert(30, 
TimeUnit.SECONDS);
@@ -59,6 +61,17 @@ public class BaseActivator implements BundleActivator, 
Runnable {
     private ServiceRegistration managedServiceRegistration;
     private Dictionary<String, ?> configuration;
 
+    private static final AtomicInteger poolNumber = new AtomicInteger(1);
+    private final ThreadGroup group;
+    private final AtomicInteger threadNumber = new AtomicInteger(1);
+    private final String namePrefix;
+
+    public BaseActivator() {
+        SecurityManager s = System.getSecurityManager();
+        group = (s != null) ? s.getThreadGroup() : 
Thread.currentThread().getThreadGroup();
+        namePrefix = "activator-" + poolNumber.getAndIncrement() + "-thread-";
+    }
+
     public long getSchedulerStopTimeout() {
         return schedulerStopTimeout;
     }
@@ -415,4 +428,14 @@ public class BaseActivator implements BundleActivator, 
Runnable {
         }
     }
 
+    @Override
+    public Thread newThread(Runnable r) {
+        Thread t = new Thread(group, r, namePrefix + 
threadNumber.getAndIncrement(), 0);
+        if (t.isDaemon())
+            t.setDaemon(false);
+        if (t.getPriority() != Thread.NORM_PRIORITY)
+            t.setPriority(Thread.NORM_PRIORITY);
+        return t;
+    }
+
 }

Reply via email to