diff options
author | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2019-07-08 13:45:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-08 13:45:02 +0200 |
commit | 4074379353188270da0bb4b998e6432523162376 (patch) | |
tree | e78921146ef7235806c9183618425c5558069a5e | |
parent | a173ee16ceba9c9192b2405887905d7beed3e388 (diff) | |
parent | 2520774b35d528e06722fbd1232c4d7f91672d5f (diff) |
Merge pull request #9942 from vespa-engine/vekterli/defer-mbus-session-init-until-first-use
Defer MBus DocumentAccess creation until time of first use
-rw-r--r-- | container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsVisitor.java | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsVisitor.java b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsVisitor.java index 5288b28cad1..32b48f0f8ae 100644 --- a/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsVisitor.java +++ b/container-search/src/main/java/com/yahoo/vespa/streamingvisitors/VdsVisitor.java @@ -41,6 +41,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Logger; /** @@ -90,8 +91,16 @@ class VdsVisitor extends VisitorDataHandler implements Visitor { } private static class MessageBusVisitorSessionFactory implements VisitorSessionFactory { - private static final LoadTypeSet loadTypes = new LoadTypeSet("client"); - private static final DocumentAccess access = new MessageBusDocumentAccess(new MessageBusParams(loadTypes)); + private static final Object initMonitor = new Object(); + private static final AtomicReference<MessageBusVisitorSessionFactory> instance = new AtomicReference<>(); + + private final LoadTypeSet loadTypes; + private final DocumentAccess access; + + private MessageBusVisitorSessionFactory() { + loadTypes = new LoadTypeSet("client"); + access = new MessageBusDocumentAccess(new MessageBusParams(loadTypes)); + } @Override public VisitorSession createVisitorSession(VisitorParameters params) throws ParseException { @@ -102,10 +111,32 @@ class VdsVisitor extends VisitorDataHandler implements Visitor { public LoadTypeSet getLoadTypeSet() { return loadTypes; } + + /** + * Returns a single, shared instance of this class which is lazily created in a thread-safe + * manner the first time this method is invoked. + * + * May throw any config-related exception if subscription fails. + */ + static MessageBusVisitorSessionFactory sharedInstance() { + var ref = instance.getAcquire(); + if (ref != null) { + return ref; + } + synchronized (initMonitor) { + ref = instance.getAcquire(); + if (ref != null) { + return ref; + } + ref = new MessageBusVisitorSessionFactory(); + instance.setRelease(ref); + } + return ref; + } } public VdsVisitor(Query query, String searchCluster, Route route, String documentType) { - this(query, searchCluster, route, documentType, new MessageBusVisitorSessionFactory()); + this(query, searchCluster, route, documentType, MessageBusVisitorSessionFactory.sharedInstance()); } public VdsVisitor(Query query, String searchCluster, Route route, |