diff options
7 files changed, 76 insertions, 5 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index 87e8f16f88c..d63987f6c07 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -181,6 +181,7 @@ public abstract class ContainerCluster<CONTAINER extends Container> addSimpleComponent(com.yahoo.metrics.simple.jdisc.JdiscMetricsFactory.class.getName(), null, MetricProperties.BUNDLE_SYMBOLIC_NAME); addSimpleComponent("com.yahoo.container.jdisc.state.StateMonitor"); addSimpleComponent("com.yahoo.container.jdisc.ContainerThreadFactory"); + addSimpleComponent(com.yahoo.container.core.documentapi.MessageBusDocumentAccessProvider.class.getName()); addSimpleComponent("com.yahoo.container.handler.VipStatus"); addSimpleComponent(com.yahoo.container.handler.ClustersStatus.class.getName()); addJaxProviders(); 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 new file mode 100644 index 00000000000..c3cd78e4da9 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/core/documentapi/MessageBusDocumentAccessProvider.java @@ -0,0 +1,55 @@ +package com.yahoo.container.core.documentapi; + +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.documentapi.DocumentAccess; +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}. + * + * @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; + + @Inject + public MessageBusDocumentAccessProvider(DocumentmanagerConfig documentmanagerConfig, LoadTypeConfig loadTypeConfig) { + this.documentmanagerConfig = documentmanagerConfig; + this.loadTypeConfig = loadTypeConfig; + } + + @Override + public DocumentAccess get() { + synchronized (monitor) { + if (access == null) { + access = new MessageBusDocumentAccess((MessageBusParams) new MessageBusParams(new LoadTypeSet(loadTypeConfig)).setDocumentmanagerConfig(documentmanagerConfig)); + if (shutDown) + access.shutdown(); + } + return access; + } + } + + @Override + public void deconstruct() { + synchronized (monitor) { + if ( ! shutDown) { + shutDown = true; + if (access != null) + access.shutdown(); + } + } + } + +} diff --git a/container-core/src/main/java/com/yahoo/container/core/documentapi/package-info.java b/container-core/src/main/java/com/yahoo/container/core/documentapi/package-info.java new file mode 100644 index 00000000000..de524237499 --- /dev/null +++ b/container-core/src/main/java/com/yahoo/container/core/documentapi/package-info.java @@ -0,0 +1,5 @@ +// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +@ExportPackage +package com.yahoo.container.core.documentapi; + +import com.yahoo.osgi.annotation.ExportPackage; diff --git a/documentapi/abi-spec.json b/documentapi/abi-spec.json index a28ce1ee6db..6f5e6d66e2a 100644 --- a/documentapi/abi-spec.json +++ b/documentapi/abi-spec.json @@ -354,6 +354,7 @@ "methods": [ "public void <init>(long, boolean)", "public boolean wasFound()", + "public boolean isSuccess()", "public int hashCode()", "public boolean equals(java.lang.Object)", "public java.lang.String toString()" @@ -561,6 +562,7 @@ "methods": [ "public void <init>(long, boolean)", "public boolean wasFound()", + "public boolean isSuccess()", "public int hashCode()", "public boolean equals(java.lang.Object)", "public java.lang.String toString()" diff --git a/documentapi/src/main/java/com/yahoo/documentapi/DocumentAccess.java b/documentapi/src/main/java/com/yahoo/documentapi/DocumentAccess.java index 308eafcd596..7a9818ba4fd 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/DocumentAccess.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/DocumentAccess.java @@ -27,9 +27,9 @@ import com.yahoo.config.subscription.ConfigSubscriber; * <p>This class is the factory for creating the four session types mentioned above.</p> * * <p>There may be multiple implementations of the document api classes. If - * default configuration is sufficient, use the {@link #createDefault} method to - * return a running document access. Note that there are running threads within - * an access object, so you must shut it down when done.</p> + * default configuration is sufficient, simply inject a {@code DocumentAccess} to + * obtain a running document access. If you instead create a concrete implementation, note that + * there are running threads within an access object, so you must shut it down when done.</p> * * <p>An implementation of the Document Api may support just a subset of the * access types defined in this interface. For example, some document diff --git a/documentapi/src/main/java/com/yahoo/documentapi/RemoveResponse.java b/documentapi/src/main/java/com/yahoo/documentapi/RemoveResponse.java index 502588a3d5f..2a7c6f45d95 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/RemoveResponse.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/RemoveResponse.java @@ -12,7 +12,7 @@ public class RemoveResponse extends Response { private final boolean wasFound; public RemoveResponse(long requestId, boolean wasFound) { - super(requestId); + super(requestId, null, wasFound ? Outcome.SUCCESS : Outcome.NOT_FOUND); this.wasFound = wasFound; } @@ -21,6 +21,10 @@ public class RemoveResponse extends Response { } @Override + // TODO: fix this when/if NOT_FOUND is no longer a success. + public boolean isSuccess() { return super.isSuccess() || outcome() == Outcome.NOT_FOUND; } + + @Override public int hashCode() { return super.hashCode() + Boolean.valueOf(wasFound).hashCode(); } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/UpdateResponse.java b/documentapi/src/main/java/com/yahoo/documentapi/UpdateResponse.java index 96bf58c1e64..aca34a92a30 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/UpdateResponse.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/UpdateResponse.java @@ -12,7 +12,7 @@ public class UpdateResponse extends Response { private final boolean wasFound; public UpdateResponse(long requestId, boolean wasFound) { - super(requestId); + super(requestId, null, wasFound ? Outcome.SUCCESS : Outcome.NOT_FOUND); this.wasFound = wasFound; } @@ -21,6 +21,10 @@ public class UpdateResponse extends Response { } @Override + // TODO: fix this when/if NOT_FOUND is no longer a success. + public boolean isSuccess() { return super.isSuccess() || outcome() == Outcome.NOT_FOUND; } + + @Override public int hashCode() { return super.hashCode() + Boolean.valueOf(wasFound).hashCode(); } |