summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2020-09-21 18:46:50 +0200
committerJon Marius Venstad <venstad@gmail.com>2020-09-21 18:46:50 +0200
commit8197457af4b0c0cfc88dc3c26b8667e7b004a60a (patch)
treeafca23c1cd7604276061cbafaf68358e90b8a670 /container-core
parentedae2586a4b7927ab9a1771441f46b81b779b0dd (diff)
Move laziness down to avoid initialising MessageBusDocumentAccess unless _used_
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java109
1 files changed, 88 insertions, 21 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java b/container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java
index cd6a2fc8b12..78653a81e58 100644
--- a/container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java
+++ b/container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java
@@ -4,51 +4,118 @@ import com.google.inject.Inject;
import com.yahoo.component.AbstractComponent;
import com.yahoo.container.di.componentgraph.Provider;
import com.yahoo.document.config.DocumentmanagerConfig;
+import com.yahoo.document.select.parser.ParseException;
+import com.yahoo.documentapi.AsyncParameters;
+import com.yahoo.documentapi.AsyncSession;
import com.yahoo.documentapi.DocumentAccess;
+import com.yahoo.documentapi.DocumentAccessParams;
+import com.yahoo.documentapi.SubscriptionParameters;
+import com.yahoo.documentapi.SubscriptionSession;
+import com.yahoo.documentapi.SyncParameters;
+import com.yahoo.documentapi.SyncSession;
+import com.yahoo.documentapi.VisitorDestinationParameters;
+import com.yahoo.documentapi.VisitorDestinationSession;
+import com.yahoo.documentapi.VisitorParameters;
+import com.yahoo.documentapi.VisitorSession;
import com.yahoo.documentapi.messagebus.MessageBusDocumentAccess;
import com.yahoo.documentapi.messagebus.MessageBusParams;
import com.yahoo.documentapi.messagebus.loadtypes.LoadTypeSet;
import com.yahoo.vespa.config.content.LoadTypeConfig;
/**
- * Has a lazily populated reference to a {@link MessageBusDocumentAccess}.
+ * Lets a lazily initialised DocumentAccess forwarding to a real MessageBusDocumentAccess be injected in containers.
*
* @author jonmv
*/
public class MessageBusDocumentAccessProvider extends AbstractComponent implements Provider<DocumentAccess> {
- private final DocumentmanagerConfig documentmanagerConfig;
- private final LoadTypeConfig loadTypeConfig;
- private final Object monitor = new Object();
- private boolean shutDown = false;
- private DocumentAccess access = null;
+ private final DocumentAccess access;
@Inject
+ // TODO jonmv: Have Slobrok and RPC config injected as well.
public MessageBusDocumentAccessProvider(DocumentmanagerConfig documentmanagerConfig, LoadTypeConfig loadTypeConfig) {
- this.documentmanagerConfig = documentmanagerConfig;
- this.loadTypeConfig = loadTypeConfig;
+ this.access = new LazyForwardingMessageBusDocumentAccess(documentmanagerConfig, loadTypeConfig);
}
@Override
public DocumentAccess get() {
- synchronized (monitor) {
- if (access == null) {
- if (shutDown)
- throw new IllegalStateException("This document access has been shut down");
-
- access = new MessageBusDocumentAccess((MessageBusParams) new MessageBusParams(new LoadTypeSet(loadTypeConfig)).setDocumentmanagerConfig(documentmanagerConfig));
- }
- return access;
- }
+ return access;
}
@Override
public void deconstruct() {
- synchronized (monitor) {
- shutDown = true;
- if (access != null)
- access.shutdown();
+ access.shutdown();
+ }
+
+
+ private static class LazyForwardingMessageBusDocumentAccess extends DocumentAccess {
+
+ private final DocumentmanagerConfig documentmanagerConfig;
+ private final LoadTypeConfig loadTypeConfig;
+ private final Object monitor = new Object();
+
+ private DocumentAccess delegate = null;
+ private boolean shutDown = false;
+
+ public LazyForwardingMessageBusDocumentAccess(DocumentmanagerConfig documentmanagerConfig,
+ LoadTypeConfig loadTypeConfig) {
+ super(new DocumentAccessParams().setDocumentmanagerConfig(documentmanagerConfig));
+ this.documentmanagerConfig = documentmanagerConfig;
+ this.loadTypeConfig = loadTypeConfig;
}
+
+ private DocumentAccess delegate() {
+ synchronized (monitor) {
+ if (delegate == null) {
+ if (shutDown)
+ throw new IllegalStateException("This document access has been shut down");
+
+ delegate = new MessageBusDocumentAccess((MessageBusParams) new MessageBusParams(new LoadTypeSet(loadTypeConfig)).setDocumentmanagerConfig(documentmanagerConfig));
+ }
+ return delegate;
+ }
+ }
+
+ @Override
+ public void shutdown() {
+ synchronized (monitor) {
+ super.shutdown();
+ shutDown = true;
+ if (delegate != null)
+ delegate.shutdown();
+ }
+ }
+
+ @Override
+ public SyncSession createSyncSession(SyncParameters parameters) {
+ return delegate().createSyncSession(parameters);
+ }
+
+ @Override
+ public AsyncSession createAsyncSession(AsyncParameters parameters) {
+ return delegate().createAsyncSession(parameters);
+ }
+
+ @Override
+ public VisitorSession createVisitorSession(VisitorParameters parameters) throws ParseException {
+ return delegate().createVisitorSession(parameters);
+ }
+
+ @Override
+ public VisitorDestinationSession createVisitorDestinationSession(VisitorDestinationParameters parameters) {
+ return delegate().createVisitorDestinationSession(parameters);
+ }
+
+ @Override
+ public SubscriptionSession createSubscription(SubscriptionParameters parameters) {
+ return delegate().createSubscription(parameters);
+ }
+
+ @Override
+ public SubscriptionSession openSubscription(SubscriptionParameters parameters) {
+ return delegate().openSubscription(parameters);
+ }
+
}
}