mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
03.34.2016 40723b2f1f0143d5cd284c537c91398b88a1e561
OPENDJ-3037 On startup, bulk register matching rules to reduce jitter

After startup, only 36 schemas are now created, compared to 700 before this commit.
5 files modified
142 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java 3 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/MatchingRuleConfigManager.java 5 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java 77 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java 54 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/tasks/AddSchemaFileTaskTestCase.java 3 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/guitools/controlpanel/util/RemoteSchemaLoader.java
@@ -16,6 +16,7 @@
 */
package org.opends.guitools.controlpanel.util;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -145,7 +146,7 @@
                                                                .implementation(impl)
                                                                .addToSchema().toSchema().getMatchingRule(oid);
    }
    schema.registerMatchingRule(matchingRule, true);
    schema.registerMatchingRules(Arrays.asList(matchingRule), true);
  }
  private void registerSchemaAttr(final CustomSearchResult csr, final String schemaAttr) throws DirectoryException
opendj-server-legacy/src/main/java/org/opends/server/core/MatchingRuleConfigManager.java
@@ -186,10 +186,7 @@
      throws InitializationException, DirectoryException
  {
    MatchingRuleFactory<?> factory = loadMatchingRuleFactory(className, configuration, true);
    for (MatchingRule matchingRule: factory.getMatchingRules())
    {
      DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    }
    DirectoryServer.getSchema().registerMatchingRules(factory.getMatchingRules(), false);
    matchingRuleFactories.put(configuration.dn(),factory);
  }
opendj-server-legacy/src/main/java/org/opends/server/types/Schema.java
@@ -16,6 +16,7 @@
 */
package org.opends.server.types;
import static org.forgerock.opendj.ldap.ResultCode.*;
import static org.forgerock.opendj.ldap.schema.CoreSchema.*;
import static org.forgerock.opendj.ldap.schema.SchemaOptions.*;
import static org.opends.messages.BackendMessages.*;
@@ -1058,13 +1059,11 @@
    return schemaNG.getMatchingRule(nameOrOid);
  }
  /**
   * Registers the provided matching rule definition with this schema.
   * Registers the provided matching rule definitions with this schema.
   *
   * @param matchingRule
   *          The matching rule to register with this schema.
   * @param matchingRules
   *          The matching rules to register with this schema.
   * @param overwriteExisting
   *          Indicates whether to overwrite an existing mapping if there are
   *          any conflicts (i.e., another matching rule with the same OID or
@@ -1073,40 +1072,30 @@
   *           If a conflict is encountered and the
   *           {@code overwriteExisting} flag is set to {@code false}
   */
  public void registerMatchingRule(final MatchingRule matchingRule, final boolean overwriteExisting)
         throws DirectoryException
  public void registerMatchingRules(Collection<MatchingRule> matchingRules, boolean overwriteExisting)
      throws DirectoryException
  {
    exclusiveLock.lock();
    try
    {
      if (!overwriteExisting)
      {
        // check all names of the matching rules because it is not checked by SDK schema
        for (String name : matchingRule.getNames())
        {
          if (schemaNG.hasMatchingRule(name))
          {
            Collection<MatchingRule> conflictingRules = schemaNG.getMatchingRulesWithName(name);
            // there should be only one
            MatchingRule conflictingRule = conflictingRules.iterator().next();
            LocalizableMessage message =
                ERR_SCHEMA_CONFLICTING_MR_NAME.get(matchingRule.getOID(), name, conflictingRule.getOID());
            throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION, message);
          }
        }
        // Not checked by SDK schema
        checkNoConflictingMatchingRuleNames(matchingRules);
      }
      // now register the matching rule
      SchemaBuilder builder = new SchemaBuilder(schemaNG);
      MatchingRule.Builder b = builder.buildMatchingRule(matchingRule);
      if (overwriteExisting)
      for (MatchingRule matchingRule : matchingRules)
      {
        b.addToSchemaOverwrite();
      }
      else
      {
        b.addToSchema();
        MatchingRule.Builder b = builder.buildMatchingRule(matchingRule);
        if (overwriteExisting)
        {
          b.addToSchemaOverwrite();
        }
        else
        {
          b.addToSchema();
        }
      }
      switchSchema(builder.toSchema());
    }
@@ -1120,6 +1109,36 @@
    }
  }
  private void checkNoConflictingMatchingRuleNames(Collection<MatchingRule> matchingRules) throws DirectoryException
  {
    final Map<String, MatchingRule> rules = new HashMap<>();
    for (MatchingRule matchingRule : matchingRules)
    {
      for (String name : matchingRule.getNames())
      {
        if (schemaNG.hasMatchingRule(name))
        {
          // there should be only one
          MatchingRule conflictingRule = schemaNG.getMatchingRulesWithName(name).iterator().next();
          throw conflictingMatchingRuleName(name, matchingRule, conflictingRule);
        }
        MatchingRule conflictingRule = rules.get(name);
        if (conflictingRule != null)
        {
          throw conflictingMatchingRuleName(name, matchingRule, conflictingRule);
        }
        rules.put(name, matchingRule);
      }
    }
  }
  private DirectoryException conflictingMatchingRuleName(
      String name, MatchingRule matchingRule, MatchingRule conflictingRule)
  {
    return new DirectoryException(CONSTRAINT_VIOLATION,
        ERR_SCHEMA_CONFLICTING_MR_NAME.get(matchingRule.getOID(), name, conflictingRule.getOID()));
  }
  /**
   * Deregisters the provided matching rule definition with this schema.
   *
opendj-server-legacy/src/test/java/org/opends/server/backends/SchemaBackendTestCase.java
@@ -846,8 +846,8 @@
  @Test
  public void testAddAttributeTypeObsoleteEMR() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddATObsoleteEMRMatch", "1.3.6.1.4.1.26027.1.999.20", true);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddATObsoleteEMRMatch", "1.3.6.1.4.1.26027.1.999.20", true);
    try
    {
@@ -1189,8 +1189,8 @@
  @Test
  public void testRemoveAttributeTypeReferencedByMRU() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testRemoveATRefByMRUMatch", "1.3.6.1.4.1.26027.1.999.17", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testRemoveATRefByMRUMatch", "1.3.6.1.4.1.26027.1.999.17", false);
    try
    {
@@ -3695,8 +3695,8 @@
  @Test
  public void testAddMatchingRuleUseSuccessful() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.10", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.10", false);
    try
    {
@@ -3730,8 +3730,8 @@
  @Test
  public void testAddMatchingRuleUseToAltSchemaFile() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUToAltSchemaFileMatch", "1.3.6.1.4.1.26027.1.999.18", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUToAltSchemaFileMatch", "1.3.6.1.4.1.26027.1.999.18", false);
    try
    {
@@ -3775,8 +3775,8 @@
  @Test
  public void testReplaceMatchingRuleUseSuccessful() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testReplaceMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.11", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testReplaceMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.11", false);
    try
    {
@@ -3817,8 +3817,8 @@
  @Test
  public void testRemoveAndAddMatchingRuleUse() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testRemoveAndAddMRUMatch", "1.3.6.1.4.1.26027.1.999.12", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testRemoveAndAddMRUMatch", "1.3.6.1.4.1.26027.1.999.12", false);
    try
    {
@@ -3865,8 +3865,8 @@
  @Test
  public void testAddMatchingRuleUseMRConflict() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUMRConflictMatch", "1.3.6.1.4.1.26027.1.999.14", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUMRConflictMatch", "1.3.6.1.4.1.26027.1.999.14", false);
    try
    {
@@ -3935,8 +3935,8 @@
  @Test
  public void testAddMatchingRuleUseAttributeTypeUndefined() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUATUndefinedMatch", "1.3.6.1.4.1.26027.1.999.16", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUATUndefinedMatch", "1.3.6.1.4.1.26027.1.999.16", false);
    try
    {
@@ -3969,8 +3969,7 @@
  public void testAddMatchingRuleUseAttributeTypeMultipleUndefined() throws Exception
  {
    MatchingRule matchingRule =
        getMatchingRule("testAddMRUATMultipleUndefinedMatch", "1.3.6.1.4.1.26027.1.999.19", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
        registerNewMatchingRule("testAddMRUATMultipleUndefinedMatch", "1.3.6.1.4.1.26027.1.999.19", false);
    try
    {
@@ -4010,8 +4009,8 @@
  @Test
  public void testAddMatchingRuleUseObsoleteMatchingRule() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUObsoleteMRMatch", "1.3.6.1.4.1.26027.1.999.21", true);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUObsoleteMRMatch", "1.3.6.1.4.1.26027.1.999.21", true);
    try
    {
@@ -4042,8 +4041,8 @@
  @Test
  public void testAddMatchingRuleUseObsoleteAttributeType() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testAddMRUObsoleteATMatch", "1.3.6.1.4.1.26027.1.999.22", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testAddMRUObsoleteATMatch", "1.3.6.1.4.1.26027.1.999.22", false);
    try
    {
@@ -4071,6 +4070,13 @@
    }
  }
  private MatchingRule registerNewMatchingRule(String name, String oid, boolean obsolete) throws DirectoryException
  {
    MatchingRule matchingRule = getMatchingRule(name, oid, obsolete);
    DirectoryServer.getSchema().registerMatchingRules(Arrays.asList(matchingRule), false);
    return matchingRule;
  }
  private void runModify(String[] args, String ldifContent, ResultCode expectedRC)
  {
    runModify(args, ldifContent, null, expectedRC);
@@ -4111,8 +4117,8 @@
  @Test
  public void testRemoveMatchingRuleUseSuccessful() throws Exception
  {
    MatchingRule matchingRule = getMatchingRule("testRemoveMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.13", false);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    MatchingRule matchingRule =
        registerNewMatchingRule("testRemoveMRUSuccessfulMatch", "1.3.6.1.4.1.26027.1.999.13", false);
    try
    {
opendj-server-legacy/src/test/java/org/opends/server/tasks/AddSchemaFileTaskTestCase.java
@@ -21,6 +21,7 @@
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.forgerock.opendj.ldap.DN;
@@ -80,7 +81,7 @@
        .addToSchema()
        .toSchema()
        .getMatchingRule(oid);
    DirectoryServer.getSchema().registerMatchingRule(matchingRule, false);
    DirectoryServer.getSchema().registerMatchingRules(Arrays.asList(matchingRule), false);
    matchingRulesToRemove.add(matchingRule);
  }