diff options
-rw-r--r-- | config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java | 4 | ||||
-rw-r--r-- | filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileDistributionConnectionPool.java | 43 |
2 files changed, 45 insertions, 2 deletions
diff --git a/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java b/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java index 14385cbc90e..f6708a1432c 100644 --- a/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java +++ b/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java @@ -95,11 +95,11 @@ public class JRTConnectionPool implements ConnectionPool { return pickNewConnectionRandomly(getSources()); } - private JRTConnection pickNewConnectionRandomly(List<JRTConnection> sources) { + protected JRTConnection pickNewConnectionRandomly(List<JRTConnection> sources) { return sources.get(ThreadLocalRandom.current().nextInt(0, sources.size())); } - List<JRTConnection> getSources() { + protected List<JRTConnection> getSources() { List<JRTConnection> ret; synchronized (connections) { ret = new ArrayList<>(connections.values()); diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileDistributionConnectionPool.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileDistributionConnectionPool.java new file mode 100644 index 00000000000..3a03e6a87d5 --- /dev/null +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileDistributionConnectionPool.java @@ -0,0 +1,43 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.filedistribution; + +import com.yahoo.config.subscription.ConfigSourceSet; +import com.yahoo.jrt.Supervisor; +import com.yahoo.vespa.config.Connection; +import com.yahoo.vespa.config.JRTConnection; +import com.yahoo.vespa.config.JRTConnectionPool; + +import java.util.List; + + +/** + * A pool of JRT connections to a set of file distribution source (one or more config servers). + * Used by file distribution clients, where the source that can serve a file reference might be + * different for each file reference (unlike config requests, where all requests should be served by the same source). + * A new connection is chosen randomly when calling {#link {@link #switchConnection(Connection failingConnection)}}. + * Unlike JRTConnectionPool there is no state that holds the 'current' connection, a new connection is picked + * randomly if {@link #getCurrent()} is called. + * + * @author hmusum + */ +public class FileDistributionConnectionPool extends JRTConnectionPool { + + public FileDistributionConnectionPool(ConfigSourceSet sourceSet, Supervisor supervisor) { + super(sourceSet, supervisor); + } + + @Override + public synchronized JRTConnection getCurrent() { + return pickNewConnectionRandomly(getSources()); + } + + @Override + public synchronized JRTConnection switchConnection(Connection failingConnection) { + if (getSources().size() <= 1) return getCurrent(); + + List<JRTConnection> sourceCandidates = getSources(); + sourceCandidates.remove(failingConnection); + return pickNewConnectionRandomly(sourceCandidates); + } + +} |