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

Gaetan Boismal
13.59.2016 48deac6f808690e620a5444398c938dc8ef2a970
OPENDJ-3002 Fix upgrade to 4.0.0-OEM

With this commit, upgrades to 4.0.0-OEM version are now supported.
Add an UpgradeTask to target from versions >= 3.0.0 and converts all JE
backends to PDB.
5 files modified
214 ■■■■■ changed files
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java 163 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java 7 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java 16 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java 24 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/messages/org/opends/messages/tool.properties 4 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/Upgrade.java
@@ -43,6 +43,7 @@
import static org.opends.server.tools.upgrade.UpgradeTasks.*;
import static org.opends.server.tools.upgrade.UpgradeUtils.batDirectory;
import static org.opends.server.tools.upgrade.UpgradeUtils.binDirectory;
import static org.opends.server.tools.upgrade.UpgradeUtils.instanceContainsJeBackends;
import static org.opends.server.tools.upgrade.UpgradeUtils.libDirectory;
import static org.opends.server.util.StaticUtils.*;
@@ -63,6 +64,9 @@
  /** The error exit code value. */
  static final int EXIT_CODE_ERROR = 1;
  private static final String LOCAL_DB_BACKEND_OBJECT_CLASS = "ds-cfg-local-db-backend";
  private static final String JE_BACKEND_OBJECT_CLASS = "ds-cfg-je-backend";
  /** If the upgrade contains some post upgrade tasks to do. */
  private static boolean hasPostUpgradeTask;
@@ -467,64 +471,9 @@
          }
        },
        deleteFile(new File(libDirectory, "je.jar")),
        requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get(), NO,
                renameLocalDBBackendDirectories(),
                // Convert JE backends to PDB backends.
                modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY.get(),
                        "(objectclass=ds-cfg-local-db-backend)",
                        "delete: objectclass",
                        "objectclass: ds-cfg-local-db-backend",
                        "-",
                        "add: objectclass",
                        "objectclass: ds-cfg-pluggable-backend",
                        "objectclass: ds-cfg-pdb-backend",
                        "-",
                        "replace: ds-cfg-java-class",
                        "ds-cfg-java-class: org.opends.server.backends.pdb.PDBBackend",
                        "-",
                        "delete: ds-cfg-preload-time-limit",
                        "-",
                        "delete: ds-cfg-import-thread-count",
                        "-",
                        "delete: ds-cfg-import-queue-size",
                        "-",
                        "delete: ds-cfg-db-txn-write-no-sync",
                        "-",
                        "delete: ds-cfg-db-run-cleaner",
                        "-",
                        "delete: ds-cfg-db-cleaner-min-utilization",
                        "-",
                        "delete: ds-cfg-db-evictor-lru-only",
                        "-",
                        "delete: ds-cfg-db-evictor-core-threads",
                        "-",
                        "delete: ds-cfg-db-evictor-max-threads",
                        "-",
                        "delete: ds-cfg-db-evictor-keep-alive",
                        "-",
                        "delete: ds-cfg-db-evictor-nodes-per-scan",
                        "-",
                        "delete: ds-cfg-db-log-file-max",
                        "-",
                        "delete: ds-cfg-db-log-filecache-size",
                        "-",
                        "delete: ds-cfg-db-logging-file-handler-on",
                        "-",
                        "delete: ds-cfg-db-logging-level",
                        "-",
                        "delete: ds-cfg-db-checkpointer-bytes-interval",
                        "-",
                        "delete: ds-cfg-db-checkpointer-wakeup-interval",
                        "-",
                        "delete: ds-cfg-db-num-lock-tables",
                        "-",
                        "delete: ds-cfg-db-num-cleaner-threads",
                        "-",
                        "delete: ds-cfg-je-property",
                        "-",
                        "delete: ds-cfg-subordinate-indexes-enabled",
                        "-"
                ),
        requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get("3.0.0"), NO,
                renameLocalDBBackendDirectories(LOCAL_DB_BACKEND_OBJECT_CLASS),
                convertJEBackendsToPDBBackends(LOCAL_DB_BACKEND_OBJECT_CLASS),
                // Convert JE backend indexes to PDB backend indexes.
                modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_3_SUMMARY.get(),
                        "(objectclass=ds-cfg-local-db-index)",
@@ -639,10 +588,9 @@
        deleteConfigEntry(INFO_UPGRADE_TASK_CONFIGURATION_BACKEND_NOT_CONFIGURABLE.get(),
            "dn: ds-cfg-backend-id=config,cn=Backends,cn=config"));
    /**
     * All upgrades will refresh the server configuration schema and generate a new upgrade folder.
     */
    /** All upgrades will refresh the server configuration schema and generate a new upgrade folder. */
    registerLast(
        performOEMMigrationIfNeeded(),
        copySchemaFile("02-config.ldif"),
        updateConfigUpgradeFolder(),
        postUpgradeRebuildIndexes());
@@ -650,6 +598,99 @@
    // @formatter:on
  }
  /** If the upgraded version is OEM, migrates local-db backends to PDB, see OPENDJ-3002 **/
  private static UpgradeTask performOEMMigrationIfNeeded() {
    return conditionalUpgradeTasks(
        isOemVersionAndNewerThan3dot0(),
        deleteFile(new File(libDirectory, "je.jar")),
        deleteFile(new File(libDirectory, "opendj-je-backend.jar")),
        conditionalUpgradeTasks(
            new UpgradeCondition() {
                @Override
                public boolean shouldPerformUpgradeTasks(final UpgradeContext context) throws ClientException {
                    return instanceContainsJeBackends();
                }
            },
            requireConfirmation(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY.get("4.0.0"), NO,
                    renameLocalDBBackendDirectories(JE_BACKEND_OBJECT_CLASS),
                    convertJEBackendsToPDBBackends(JE_BACKEND_OBJECT_CLASS))
        )
    );
  }
  private static UpgradeCondition isOemVersionAndNewerThan3dot0() {
    return new UpgradeCondition() {
        @Override
        public boolean shouldPerformUpgradeTasks(UpgradeContext context) throws ClientException {
            return isOEMVersion()
                && context.getFromVersion().isNewerThan(BuildVersion.valueOf("3.0.0"));
        }
        @Override
        public String toString() {
            return "is OEM version and from version >= 3.0.0";
        }
    };
  }
    private static UpgradeTask convertJEBackendsToPDBBackends(final String objectClass) {
    return modifyConfigEntry(INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY.get(),
        "(objectclass=" + objectClass + ")",
        "delete: objectclass",
        "objectclass: " + objectClass,
        "-",
        "add: objectclass",
        "objectclass: ds-cfg-pluggable-backend",
        "objectclass: ds-cfg-pdb-backend",
        "-",
        "replace: ds-cfg-java-class",
        "ds-cfg-java-class: org.opends.server.backends.pdb.PDBBackend",
        "-",
        "delete: ds-cfg-preload-time-limit",
        "-",
        "delete: ds-cfg-import-thread-count",
        "-",
        "delete: ds-cfg-import-queue-size",
        "-",
        "delete: ds-cfg-db-txn-write-no-sync",
        "-",
        "delete: ds-cfg-db-run-cleaner",
        "-",
        "delete: ds-cfg-db-cleaner-min-utilization",
        "-",
        "delete: ds-cfg-db-evictor-lru-only",
        "-",
        "delete: ds-cfg-db-evictor-core-threads",
        "-",
        "delete: ds-cfg-db-evictor-max-threads",
        "-",
        "delete: ds-cfg-db-evictor-keep-alive",
        "-",
        "delete: ds-cfg-db-evictor-nodes-per-scan",
        "-",
        "delete: ds-cfg-db-log-file-max",
        "-",
        "delete: ds-cfg-db-log-filecache-size",
        "-",
        "delete: ds-cfg-db-logging-file-handler-on",
        "-",
        "delete: ds-cfg-db-logging-level",
        "-",
        "delete: ds-cfg-db-checkpointer-bytes-interval",
        "-",
        "delete: ds-cfg-db-checkpointer-wakeup-interval",
        "-",
        "delete: ds-cfg-db-num-lock-tables",
        "-",
        "delete: ds-cfg-db-num-cleaner-threads",
        "-",
        "delete: ds-cfg-je-property",
        "-",
        "delete: ds-cfg-subordinate-indexes-enabled",
        "-"
    );
  }
  /**
   * Returns a list containing all the tasks which are required in order to upgrade
   * from {@code fromVersion} to {@code toVersion}.
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeTasks.java
@@ -1033,8 +1033,11 @@
  /**
   * Creates backups of the local DB backends directories by renaming adding them a ".bak" suffix.
   *  e.g "userRoot" would become "userRoot.bak"
   *
   *  @param backendObjectClass
   *          The backend object class name.
   */
  static UpgradeTask renameLocalDBBackendDirectories()
  static UpgradeTask renameLocalDBBackendDirectories(final String backendObjectClass)
  {
    return new AbstractUpgradeTask()
    {
@@ -1045,7 +1048,7 @@
      {
        try
        {
          Filter filter = Filter.equality("objectclass", "ds-cfg-local-db-backend");
          Filter filter = Filter.equality("objectclass", backendObjectClass);
          SearchRequest findLocalDBBackends = Requests.newSearchRequest(DN.rootDN(), SearchScope.WHOLE_SUBTREE, filter);
          try (final EntryReader jeBackends = searchConfigFile(findLocalDBBackends))
          {
opendj-server-legacy/src/main/java/org/opends/server/tools/upgrade/UpgradeUtils.java
@@ -766,6 +766,22 @@
    return indexesToRebuild;
  }
  /** Returns {@code true} if the installed instance contains at least one JE backend. */
  static boolean instanceContainsJeBackends()
  {
    final SearchRequest sr = Requests.newSearchRequest(
            "", SearchScope.WHOLE_SUBTREE, "(objectclass=ds-cfg-je-backend)", "dn");
    try (final EntryReader entryReader = searchConfigFile(sr))
    {
      return entryReader.hasNext();
    }
    catch (final IOException unlikely)
    {
      logger.error(ERR_UPGRADE_READING_CONF_FILE.get(unlikely.getMessage()));
      return true;
    }
  }
  /** Prevent instantiation. */
  private UpgradeUtils()
  {
opendj-server-legacy/src/main/java/org/opends/server/util/BuildVersion.java
@@ -278,4 +278,28 @@
    }
    return Utils.joinAsString(".", major, minor, point);
  }
  /**
   * Returns {@code true} if the version is newer than the provided version.
   *
   * @param version
   *          The version to be compared
   * @return {@code true} if the version is newer than the provided version.
   */
  public boolean isNewerThan(final BuildVersion version)
  {
    return this.compareTo(version) >= 0;
  }
  /**
   * Returns {@code true} if the version is older than the provided version.
   *
   * @param version
   *          The version to be compared
   * @return {@code true} if the version is older than the provided version.
   */
  public boolean isOlderThan(final BuildVersion version)
  {
    return this.compareTo(version) <= 0;
  }
}
opendj-server-legacy/src/messages/org/opends/messages/tool.properties
@@ -2599,12 +2599,12 @@
SUPPLEMENT_DESCRIPTION_BACKEND_TOOL_SUBCMD_LIST_INDEX_STATUS_20016=\
  <xinclude:include href="variablelist-backendstat-index-status.xml" />
INFO_INSTALLDS_BACKEND_TYPE_USED_20017=Backend Type: %s
INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY_20018=WARNING: OpenDJ 3.0.0 OEM Edition removes support for the \
INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_1_SUMMARY_20018=WARNING: OpenDJ %s OEM Edition removes support for the \
 Berkeley JE backend.\n\nThe upgrade tool will reconfigure all JE \
 backends as PDB backends.\n\nAfter the upgrade the new PDB backend(s) \
 will be empty. It is therefore very strongly recommended that any data that was \
 in the JE backends be exported to LDIF so that it can be re-imported once the \
 upgrade completes.\n\n
 upgrade completes
INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_2_SUMMARY_20019=Reconfiguring local-db backends to PDB backends
INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_3_SUMMARY_20020=Reconfiguring local-db backend indexes to PDB backend indexes
INFO_UPGRADE_TASK_LOCAL_DB_TO_PDB_4_SUMMARY_20021=Reconfiguring local-db backend VLV indexes to PDB backend VLV indexes