From 73858cdc49e11e8c20767ea2a66d566142956d4b Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Fri, 25 Nov 2016 17:03:09 +0000
Subject: [PATCH] Add Partition as representation of a distributed service from discovery mechanisms

---
 opendj-server-legacy/src/main/java/org/opends/server/discovery/ServiceDiscoveryMechanism.java |   14 ++++
 opendj-server-legacy/src/main/java/org/opends/server/discovery/Partition.java                 |  148 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 162 insertions(+), 0 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/discovery/Partition.java b/opendj-server-legacy/src/main/java/org/opends/server/discovery/Partition.java
new file mode 100644
index 0000000..3cd7615
--- /dev/null
+++ b/opendj-server-legacy/src/main/java/org/opends/server/discovery/Partition.java
@@ -0,0 +1,148 @@
+/*
+ * The contents of this file are subject to the terms of the Common Development and
+ * Distribution License (the License). You may not use this file except in compliance with the
+ * License.
+ *
+ * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
+ * specific language governing permission and limitations under the License.
+ *
+ * When distributing Covered Software, include this CDDL Header Notice in each file and include
+ * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
+ * Header, with the fields enclosed by brackets [] replaced by your own identifying
+ * information: "Portions Copyright [year] [name of copyright owner]".
+ *
+ * Copyright 2016 ForgeRock AS.
+ */
+package org.opends.server.discovery;
+
+import static org.forgerock.util.Utils.*;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.forgerock.util.Options;
+import org.forgerock.util.Reject;
+import org.opends.server.types.HostPort;
+
+/**
+ * Named set of servers defining a distributed service.
+ *
+ * A distribution load balancer expects data to be split up into shards referred to as "partitions",
+ * each partition exposing the same set of naming contexts, but only a sub-set of the data.
+ * For example, a distribution might have two partitions, the first containing all users whose name begins with A-M,
+ * and the second containing all users whose name begins with N-Z.
+ * Both partitions have the same naming contexts, e.g:
+ *              dc=example,dc=com - unsharded parent naming context replicated across all servers.
+ *                                  Contains data common to all partitions, such as ACIs, groups, etc
+ *    ou=people,dc=example,dc=com - sharded naming context whose content (the users) is split up according
+ *                                  to some function, e.g. consistent hashing.
+ *
+ * @see ServiceDiscoveryMechanism#getPartitions(Collection)
+ */
+public final class Partition
+{
+  /** A server from a partition. */
+  public static class Server
+  {
+    private final HostPort hostPort;
+    /** Connection options for ConnectionFactory. */
+    private final Options options;
+
+    /**
+     * Builds a server for a partition.
+     * @param hostPort
+     *          the host and port to use when contacting the server
+     * @param options
+     *          the connection options to use for connecting to the server
+     */
+    Server(HostPort hostPort, Options options)
+    {
+      Reject.ifNull(hostPort);
+      this.hostPort = hostPort;
+      this.options = Options.unmodifiableCopyOf(options);
+    }
+
+    @Override
+    public final int hashCode()
+    {
+      return hostPort.hashCode();
+    }
+
+    @Override
+    public final boolean equals(Object obj)
+    {
+      if (this == obj)
+      {
+        return true;
+      }
+      if (!(obj instanceof Server))
+      {
+        return false;
+      }
+      return hostPort.equals(((Server) obj).getHostPort());
+    }
+
+    /**
+     * Returns the host port for this server.
+     *
+     * @return the host port for this server
+     */
+    public final HostPort getHostPort()
+    {
+      return hostPort;
+    }
+
+    /**
+     * Return the connections options for this server.
+     *
+     * @return the connections options for this server.
+     */
+    public final Options getOptions()
+    {
+      return options;
+    }
+  }
+
+  private final String partitionId;
+  private final Set<Server> primaryServers;
+  private final Set<Server> secondaryServers;
+
+  Partition(String partitionId, Collection<Server> primaryServers, Collection<Server> secondaryServers)
+  {
+    this.partitionId = partitionId;
+    this.primaryServers = Collections.unmodifiableSet(new LinkedHashSet<>(primaryServers));
+    this.secondaryServers = Collections.unmodifiableSet(new LinkedHashSet<>(secondaryServers));
+  }
+
+  /**
+   * Returns the set of primary server to use.
+   *
+   * @return the set of primary server to use.
+   */
+  public Set<Server> getPrimaryServers()
+  {
+    return primaryServers;
+  }
+
+  /**
+   * Returns the set of fallback servers to use.
+   *
+   * @return the set of fallback servers to use
+   */
+  public Set<Server> getSecondaryServers()
+  {
+    return secondaryServers;
+  }
+
+  /**
+   * Returns the ID for the partition.
+   *
+   * @return the ID for the partition
+   */
+  public String getPartitionId()
+  {
+    return partitionId;
+  }
+}
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/discovery/ServiceDiscoveryMechanism.java b/opendj-server-legacy/src/main/java/org/opends/server/discovery/ServiceDiscoveryMechanism.java
index 2c3e99b..40df954 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/discovery/ServiceDiscoveryMechanism.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/discovery/ServiceDiscoveryMechanism.java
@@ -16,10 +16,13 @@
 package org.opends.server.discovery;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.DN;
 import org.forgerock.opendj.server.config.server.ServiceDiscoveryMechanismCfg;
 import org.opends.server.core.ServerContext;
 
+import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Maintains a set of {@code Partition}s keeping it up to date according to a specific
@@ -76,4 +79,15 @@
    * @param listener the listener to de-register
    */
   void deregisterChangeListener(ServiceDiscoveryChangeListener listener);
+
+  /**
+   * Returns the list of partitions.
+   * Each @see Partition will only contain servers that are known to expose the provided list of base DNs.
+   * An empty list of base DNs will result in all partitions and all servers being returned.
+   * In other words, an empty list of base DNs implies that all servers contain exactly the same base DNs.
+   *
+   * @param baseDNs the baseDNs for which to retrieve the partitions
+   * @return the partitions that can serve the provided base DNs
+   */
+  Set<Partition> getPartitions(Collection<DN> baseDNs);
 }

--
Gitblit v1.10.0