summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java4
-rw-r--r--filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileDistributionConnectionPool.java43
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);
+ }
+
+}