[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; + } + }
