summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--component/src/main/java/com/yahoo/component/Component.java5
-rw-r--r--container-core/src/main/java/com/yahoo/container/ConfigHack.java2
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/LoggingRequestHandler.java2
-rw-r--r--container-core/src/main/java/com/yahoo/processing/rendering/AsynchronousSectionedRenderer.java13
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java9
-rw-r--r--container-search/src/main/java/com/yahoo/search/rendering/RendererRegistry.java21
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/AbstractResource.java2
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/SharedResource.java8
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/handler/AbstractRequestHandler.java3
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/handler/RequestHandler.java13
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);
+
}