From f3d29b204147ea21f0614eaa493ee3f3c2b2b008 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Thu, 10 Nov 2016 10:30:29 +0000
Subject: [PATCH] OPENDJ-3425: proxy support for least-requests and distribution algorithm

---
 opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Proxy.java |   34 ++++++++++++++++++++++++++--------
 1 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Proxy.java b/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Proxy.java
index 88f6b88..58ce4a1 100644
--- a/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Proxy.java
+++ b/opendj-ldap-sdk-examples/src/main/java/org/forgerock/opendj/examples/Proxy.java
@@ -28,6 +28,8 @@
 
 import org.forgerock.opendj.ldap.ConnectionFactory;
 import org.forgerock.opendj.ldap.Connections;
+import org.forgerock.opendj.ldap.ConsistentHashMap;
+import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.ldap.LDAPClientContext;
 import org.forgerock.opendj.ldap.LDAPConnectionFactory;
 import org.forgerock.opendj.ldap.LDAPListener;
@@ -57,7 +59,8 @@
  *         <remoteAddress1> <remotePort1> [<remoteAddress2> <remotePort2> ...]}
  * </pre>
  *
- * Where {@code <mode>} is one of "round-robin", "fail-over", or "affinity". The default is round-robin.
+ * Where {@code <mode>} is one of "least-requests", "fail-over", "affinity", or "distribution". The default is
+ * least-requests.
  */
 public final class Proxy {
     /**
@@ -83,7 +86,7 @@
             algorithm = getLoadBalancingAlgorithm(args[i + 1]);
             i += 2;
         } else {
-            algorithm = LoadBalancingAlgorithm.ROUND_ROBIN;
+            algorithm = LoadBalancingAlgorithm.LEAST_REQUESTS;
         }
 
         final String localAddress = args[i++];
@@ -160,26 +163,28 @@
 
     private static LoadBalancingAlgorithm getLoadBalancingAlgorithm(final String algorithmName) {
         switch (algorithmName) {
-        case "round-robin":
-            return LoadBalancingAlgorithm.ROUND_ROBIN;
+        case "least-requests":
+            return LoadBalancingAlgorithm.LEAST_REQUESTS;
         case "fail-over":
             return LoadBalancingAlgorithm.FAIL_OVER;
         case "affinity":
             return LoadBalancingAlgorithm.AFFINITY;
+        case "distribution":
+            return LoadBalancingAlgorithm.DISTRIBUTION;
         default:
             System.err.println("Unrecognized load-balancing algorithm '" + algorithmName + "'. Should be one of "
-                                       + "'round-robin', 'fail-over', or 'affinity'.");
+                                       + "'least-requests', 'fail-over', 'affinity', or 'distribution'.");
             System.exit(1);
         }
-        return LoadBalancingAlgorithm.ROUND_ROBIN; // keep compiler happy.
+        return LoadBalancingAlgorithm.LEAST_REQUESTS; // keep compiler happy.
     }
 
     private enum LoadBalancingAlgorithm {
-        ROUND_ROBIN {
+        LEAST_REQUESTS {
             @Override
             ConnectionFactory newLoadBalancer(final Collection<ConnectionFactory> factories, final Options options) {
                 // --- JCite load balancer ---
-                return Connections.newRoundRobinLoadBalancer(factories, options);
+                return Connections.newLeastRequestsLoadBalancer(factories, options);
                 // --- JCite load balancer ---
             }
         },
@@ -194,6 +199,19 @@
             ConnectionFactory newLoadBalancer(final Collection<ConnectionFactory> factories, final Options options) {
                 return Connections.newAffinityRequestLoadBalancer(factories, options);
             }
+        },
+        DISTRIBUTION {
+            @Override
+            ConnectionFactory newLoadBalancer(final Collection<ConnectionFactory> factories, final Options options) {
+                final ConsistentHashMap<ConnectionFactory> partitions = new ConsistentHashMap<>();
+                int i = 0;
+                for (final ConnectionFactory factory : factories) {
+                    partitions.put("partition-" + i++, factory);
+                }
+                return Connections.newFixedSizeDistributionLoadBalancer(DN.valueOf("ou=people,dc=example,dc=com"),
+                                                                        partitions,
+                                                                        options);
+            }
         };
 
         abstract ConnectionFactory newLoadBalancer(Collection<ConnectionFactory> factories, Options options);

--
Gitblit v1.10.0