diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-03-06 09:48:54 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-03-06 09:48:54 +0100 |
commit | 9dd4c4880b42dd17c3bbaf1662eee9d8bbcad748 (patch) | |
tree | f9e8639fd015093c033c189bc00c94a2bac2087b | |
parent | 351903b75e5cf8feaa6606c139ee56e1caeccd23 (diff) |
Shutdown renderer threads on deconstruct
10 files changed, 56 insertions, 22 deletions
diff --git a/component/src/main/java/com/yahoo/component/Component.java b/component/src/main/java/com/yahoo/component/Component.java index e19993d657d..00538889049 100644 --- a/component/src/main/java/com/yahoo/component/Component.java +++ b/component/src/main/java/com/yahoo/component/Component.java @@ -13,8 +13,9 @@ package com.yahoo.component; public interface Component extends Comparable<Component> { /** Initializes this. Always called from a constructor or the framework. Do not call. */ - public void initId(ComponentId id); + void initId(ComponentId id); /** Returns the id of this component */ - public ComponentId getId(); + ComponentId getId(); + } diff --git a/container-core/src/main/java/com/yahoo/container/ConfigHack.java b/container-core/src/main/java/com/yahoo/container/ConfigHack.java index 49965d0621d..b4900649cd2 100644 --- a/container-core/src/main/java/com/yahoo/container/ConfigHack.java +++ b/container-core/src/main/java/com/yahoo/container/ConfigHack.java @@ -14,6 +14,7 @@ import com.yahoo.container.config.StatisticsEmitter; * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> */ public final class ConfigHack { + private volatile StatisticsEmitter statisticsEmitter = new StatisticsEmitter(); public static final String TILED_TEMPLATE = "tiled"; @@ -26,4 +27,5 @@ public final class ConfigHack { public void setStatisticsEmitter(StatisticsEmitter statisticsEmitter) { this.statisticsEmitter = statisticsEmitter; } + } diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/LoggingRequestHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/LoggingRequestHandler.java index af478748eeb..6ec978d39a3 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/LoggingRequestHandler.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/LoggingRequestHandler.java @@ -25,7 +25,7 @@ import java.util.concurrent.Executor; * A request handler base class extending the features of * ThreadedHttpRequestHandler with access logging. * - * @author <a href="mailto:steinar@yahoo-inc.com">Steinar Knutsen</a> + * @author Steinar Knutsen */ public abstract class LoggingRequestHandler extends ThreadedHttpRequestHandler { diff --git a/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java b/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java index 3980ec80423..b54757cac50 100644 --- a/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java +++ b/container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java @@ -114,6 +114,8 @@ public abstract class AsynchronousSectionedRenderer<RESPONSE extends Response> e // We should complete any work we have already started so use an unbounded queue. // The executor SHOULD be reused across all instances having the same prototype private final Executor renderingExecutor; + // The executor may either be created (and thus owned) by this, or passed by injection + private final boolean renderingExecutorIsOwned; private static ThreadPoolExecutor createExecutor() { int threadCount = Runtime.getRuntime().availableProcessors(); @@ -150,7 +152,14 @@ public abstract class AsynchronousSectionedRenderer<RESPONSE extends Response> e */ public AsynchronousSectionedRenderer(Executor executor) { isInitialized = false; - renderingExecutor = executor==null ? createExecutor() : executor; + if (executor == null) { + renderingExecutor = createExecutor(); + renderingExecutorIsOwned = true; + } + else { + renderingExecutor = executor; + renderingExecutorIsOwned = false; + } } /** @@ -184,7 +193,7 @@ public abstract class AsynchronousSectionedRenderer<RESPONSE extends Response> e @Override public void deconstruct() { super.deconstruct(); - if (renderingExecutor instanceof ThreadPoolExecutor) + if (renderingExecutorIsOwned && renderingExecutor instanceof ThreadPoolExecutor) shutdown((ThreadPoolExecutor) renderingExecutor); } diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java index 733e0aa43d9..09b48242c1e 100644 --- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java +++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java @@ -208,8 +208,13 @@ public class SearchHandler extends LoggingRequestHandler { executor, accessLog, queryProfileConfig, searchers); } - private void setupSearchChainRegistry(final ComponentRegistry<Searcher> searchers, - final ChainsConfig chainsConfig) { + @Override + protected void destroy() { + super.destroy(); + rendererRegistry.deconstruct(); + } + + private void setupSearchChainRegistry(ComponentRegistry<Searcher> searchers, ChainsConfig chainsConfig) { ChainsModel chainsModel = ChainsModelBuilder.buildFromConfig(chainsConfig); ChainsConfigurer.prepareChainRegistry(searchChainRegistry, chainsModel, searchers); searchChainRegistry.freeze(); diff --git a/container-search/src/main/java/com/yahoo/search/rendering/RendererRegistry.java b/container-search/src/main/java/com/yahoo/search/rendering/RendererRegistry.java index c1b15ecbbc2..a05661abc2b 100644 --- a/container-search/src/main/java/com/yahoo/search/rendering/RendererRegistry.java +++ b/container-search/src/main/java/com/yahoo/search/rendering/RendererRegistry.java @@ -26,6 +26,9 @@ public final class RendererRegistry extends ComponentRegistry<com.yahoo.processi public static final ComponentId xmlRendererId = ComponentId.fromString("DefaultRenderer"); public static final ComponentId jsonRendererId = ComponentId.fromString("JsonRenderer"); public static final ComponentId defaultRendererId = jsonRendererId; + + private final ComponentId tiledRendererId; + private final ComponentId pageRendererId; /** Creates a registry containing the built-in renderers only */ public RendererRegistry() { @@ -65,19 +68,29 @@ public final class RendererRegistry extends ComponentRegistry<com.yahoo.processi for (Renderer renderer : renderers) register(renderer.getId(), renderer); - // add legacy "templates" converted to renderers - addTemplateSet(new TiledTemplateSet()); - addTemplateSet(new PageTemplateSet()); + // add legacy "templates" converted to renderers // TODO: Remove on Vespa 7 + tiledRendererId = addTemplateSet(new TiledTemplateSet()); + pageRendererId = addTemplateSet(new PageTemplateSet()); freeze(); } + + /** Must be called when use of this is discontinued to free the resources it has allocated */ + public void deconstruct() { + // deconstruct the renderers which was created by this + getRenderer(jsonRendererId.toSpecification()).deconstruct(); + getRenderer(xmlRendererId.toSpecification()).deconstruct(); + getRenderer(tiledRendererId.toSpecification()).deconstruct(); + getRenderer(pageRendererId.toSpecification()).deconstruct(); + } @SuppressWarnings({"deprecation", "unchecked"}) - private void addTemplateSet(UserTemplate<?> templateSet) { + private ComponentId addTemplateSet(UserTemplate<?> templateSet) { Renderer renderer = new SearchRendererAdaptor(templateSet); ComponentId rendererId = new ComponentId(templateSet.getName()); renderer.initId(rendererId); register(rendererId, renderer); + return rendererId; } /** diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/AbstractResource.java b/jdisc_core/src/main/java/com/yahoo/jdisc/AbstractResource.java index 9862e574009..3ed10170420 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/AbstractResource.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/AbstractResource.java @@ -18,7 +18,7 @@ import java.util.logging.Logger; * all subclasses of {@link RequestHandler}, {@link ClientProvider} and {@link ServerProvider}. Once the reference count * of this resource reaches zero, the {@link #destroy()} method is called.</p> * - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen */ public abstract class AbstractResource implements SharedResource { diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/SharedResource.java b/jdisc_core/src/main/java/com/yahoo/jdisc/SharedResource.java index 4552ba3fe3a..16af346c4f3 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/SharedResource.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/SharedResource.java @@ -23,11 +23,12 @@ import com.yahoo.jdisc.service.ServerProvider; * in terms of resource ownership. You retain a resource to prevent it from being destroyed while you are using it, and * you release a resource once you are done using it.</p> * - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen */ public interface SharedResource { - public static final String SYSTEM_PROPERTY_NAME_DEBUG = "jdisc.debug.resources"; - public static final boolean DEBUG = Boolean.valueOf(System.getProperty(SYSTEM_PROPERTY_NAME_DEBUG)); + + String SYSTEM_PROPERTY_NAME_DEBUG = "jdisc.debug.resources"; + boolean DEBUG = Boolean.valueOf(System.getProperty(SYSTEM_PROPERTY_NAME_DEBUG)); /** * <p>Increments the reference count of this resource. You call this method to prevent an object from being @@ -51,4 +52,5 @@ public interface SharedResource { * @see ResourceReference */ void release(); + } diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/AbstractRequestHandler.java b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/AbstractRequestHandler.java index 9bc934cf724..86f0d115379 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/AbstractRequestHandler.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/AbstractRequestHandler.java @@ -25,7 +25,7 @@ import com.yahoo.jdisc.Response; * } * </pre> * - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * @author Simon Thoresen */ public abstract class AbstractRequestHandler extends com.yahoo.jdisc.AbstractResource implements RequestHandler { @@ -33,4 +33,5 @@ public abstract class AbstractRequestHandler extends com.yahoo.jdisc.AbstractRes public void handleTimeout(Request request, ResponseHandler responseHandler) { Response.dispatchTimeout(responseHandler); } + } diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/RequestHandler.java b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/RequestHandler.java index 3fc3dbb8a82..24d6902228e 100644 --- a/jdisc_core/src/main/java/com/yahoo/jdisc/handler/RequestHandler.java +++ b/jdisc_core/src/main/java/com/yahoo/jdisc/handler/RequestHandler.java @@ -13,12 +13,12 @@ import com.yahoo.jdisc.application.UriPattern; import java.util.concurrent.TimeUnit; /** - * <p>This interface defines a component that is capable of acting as a handler for a {@link Request}. To activate a + * This interface defines a component that is capable of acting as a handler for a {@link Request}. To activate a * RequestHandler it must be {@link BindingRepository#bind(String, Object) bound} to a {@link UriPattern} within a * {@link ContainerBuilder}, and that builder must be {@link ContainerActivator#activateContainer(ContainerBuilder) - * activated}.</p> -* - * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a> + * activated}. + * + * @author Simon Thoresen */ public interface RequestHandler extends SharedResource { @@ -39,7 +39,7 @@ public interface RequestHandler extends SharedResource { * @return The ContentChannel to write the Request content to. Notice that the ContentChannel itself also holds a * Container reference, so failure to close this will prevent the Container from ever shutting down. */ - public ContentChannel handleRequest(Request request, ResponseHandler handler); + ContentChannel handleRequest(Request request, ResponseHandler handler); /** * <p>This method is called by the {@link Container} when a {@link Request} that was previously accepted by {@link @@ -58,5 +58,6 @@ public interface RequestHandler extends SharedResource { * @param handler The handler to pass the timeout {@link Response} to. * @see Response#dispatchTimeout(ResponseHandler) */ - public void handleTimeout(Request request, ResponseHandler handler); + void handleTimeout(Request request, ResponseHandler handler); + } |