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

jvergara
11.55.2009 f370207cb8fe0ad9c458be62acfe9d3e4fb10d21
Fix for issue 4398 (status can be very slow: include a refresh mode)

Add a new option, where the user can specify the period (in seconds) that must be use to re-display the status of the server.
3 files modified
117 ■■■■ changed files
opends/src/messages/messages/admin_tool.properties 11 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/tools/status/StatusCli.java 67 ●●●● patch | view | raw | blame | history
opends/src/server/org/opends/server/tools/status/StatusCliArgumentParser.java 39 ●●●●● patch | view | raw | blame | history
opends/src/messages/messages/admin_tool.properties
@@ -1627,6 +1627,9 @@
MILD_ERR_CANNOT_DELETE_ATTRIBUTE_WITH_DEPENDENCIES=Attribute '%s' is optional \
 or required by the following objectClasses: %s.  You must redefine these \
 classes so that they do not depend on attribute '%s' before deleting it.
MILD_ERR_CANNOT_MODIFY_PARENT_ATTRIBUTE=Attribute '%s' is superior of the \
 following attributes: %s.  You must redefine these attributes so that they do \
 not inherit from attribute '%s' before modifying it.
INFO_CTRL_PANEL_MANAGE_SCHEMA_TITLE=Manage Schema
INFO_CTRL_PANEL_DELETE_OBJECTCLASSES_TITLE=Delete Objectclasses
INFO_CTRL_PANEL_DELETE_ATTRIBUTES_TITLE=Delete Attributes
@@ -1969,8 +1972,12 @@
INFO_CTRL_PANEL_UNSAVED_CHANGES_DIALOG_TITLE=Unsaved Changes
INFO_CTRL_PANEL_UNSAVED_CHANGES_SUMMARY=Unsaved Changes
INFO_CTRL_PANEL_UNSAVED_INDEX_CHANGES_DETAILS=Save Changes to: '%s'?
INFO_CTRL_PANEL_UNSAVED_ENTRY_CHANGES_DETAILS=Save Changes to: '%s'?
INFO_CTRL_PANEL_UNSAVED_INDEX_CHANGES_DETAILS=Save Changes to index: '%s'?
INFO_CTRL_PANEL_UNSAVED_ENTRY_CHANGES_DETAILS=Save Changes to entry: '%s'?
INFO_CTRL_PANEL_UNSAVED_ATTRIBUTE_CHANGES_DETAILS=Save Changes to attribute: \
 '%s'?
INFO_CTRL_PANEL_UNSAVED_OBJECTCLASS_CHANGES_DETAILS=Save Changes to object \
 class: '%s'?
INFO_CTRL_PANEL_DELETING_ENTRY_TITLE=Delete Entry
INFO_CTRL_PANEL_DELETING_SUBTREE_TITLE=Delete Subtree
INFO_CTRL_PANEL_DELETE_ENTRY_CONFIRMATION_DETAILS=Do you want to delete entry \
opends/src/server/org/opends/server/tools/status/StatusCli.java
@@ -62,7 +62,6 @@
import org.opends.server.admin.client.cli.DsFrameworkCliReturnCode;
import org.opends.server.admin.client.cli.SecureConnectionCliArgs;
import org.opends.server.config.ConfigException;
import org.opends.server.core.DirectoryServer;
import org.opends.messages.Message;
import org.opends.messages.MessageBuilder;
@@ -276,10 +275,6 @@
   * @return the return code (SUCCESSFUL, USER_DATA_ERROR or BUG.
   */
  public int execute(String[] args, boolean initializeServer) {
    if (initializeServer) {
      DirectoryServer.bootstrapClient();
    }
    argParser = new StatusCliArgumentParser(StatusCli.class.getName());
    try {
      argParser.initializeGlobalArguments(getOutputStream());
@@ -378,9 +373,7 @@
            return ErrorReturnCode.USER_CANCELLED_OR_DATA_ERROR.getReturnCode();
          } catch (ClientException e) {
            println(e.getMessageObject());
            // Display the information in the config file
            ServerDescriptor desc = controlInfo.getServerDescriptor();
            writeStatus(desc);
            writeStatus(controlInfo);
            return ErrorReturnCode.USER_CANCELLED_OR_DATA_ERROR.getReturnCode();
          } finally {
            if (ctx != null) {
@@ -410,10 +403,9 @@
            ctx = Utilities.getAdminDirContext(controlInfo, bindDn, bindPwd);
            controlInfo.setDirContext(ctx);
            controlInfo.regenerateDescriptor();
            ServerDescriptor desc = controlInfo.getServerDescriptor();
            writeStatus(desc);
            writeStatus(controlInfo);
            if (!desc.getExceptions().isEmpty()) {
            if (!controlInfo.getServerDescriptor().getExceptions().isEmpty()) {
              return ErrorReturnCode.ERROR_READING_CONFIGURATION_WITH_LDAP.
                getReturnCode();
            }
@@ -443,18 +435,56 @@
        } else {
          // The user did not provide authentication: just display the
          // information we can get reading the config file.
          ServerDescriptor desc = controlInfo.getServerDescriptor();
          writeStatus(desc);
          writeStatus(controlInfo);
        }
      } else {
        ServerDescriptor desc = controlInfo.getServerDescriptor();
        writeStatus(desc);
        writeStatus(controlInfo);
      }
    }
    return ErrorReturnCode.SUCCESSFUL.getReturnCode();
  }
  private void writeStatus(ControlPanelInfo controlInfo)
  {
    if (controlInfo.getServerDescriptor() == null)
    {
      controlInfo.regenerateDescriptor();
    }
    writeStatus(controlInfo.getServerDescriptor());
    int period = argParser.getRefreshPeriod();
    boolean first = true;
    while (period > 0)
    {
      long timeToSleep = period * 1000;
      if (!first)
      {
        long t1 = System.currentTimeMillis();
        controlInfo.regenerateDescriptor();
        long t2 = System.currentTimeMillis();
        timeToSleep = timeToSleep - t2 + t1;
      }
      if (timeToSleep > 0)
      {
        try
        {
          Thread.sleep(timeToSleep);
        }
        catch (Throwable t)
        {
        }
      }
      getOutputStream().println();
      getOutputStream().println(
      "          ---------------------");
      getOutputStream().println();
      writeStatus(controlInfo.getServerDescriptor());
      first = false;
    }
  }
  private void writeStatus(ServerDescriptor desc)
  {
    Message[] labels =
@@ -1294,7 +1324,7 @@
  /**
   * Wraps a message accoring to client tool console width.
   * Wraps a message according to client tool console width.
   * @param text to wrap
   * @return raw message representing wrapped string
   */
@@ -1303,4 +1333,9 @@
    return Message.raw(
        StaticUtils.wrapText(text, getCommandLineMaxLineWidth()));
  }
  private static void printTimeSince(String msg, long initTime)
  {
    System.out.println(msg+" : "+(System.currentTimeMillis() - initTime));
  }
}
opends/src/server/org/opends/server/tools/status/StatusCliArgumentParser.java
@@ -41,6 +41,7 @@
import org.opends.server.util.args.Argument;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.BooleanArgument;
import org.opends.server.util.args.IntegerArgument;
import org.opends.server.util.args.StringArgument;
/**
@@ -55,6 +56,11 @@
  // This CLI is always using the administration connector with SSL
  private final boolean alwaysSSL = true;
  /**
   * The 'refresh' argument.
   */
  private IntegerArgument refreshArg;
  /**
   * The 'scriptFriendly' argument.
   */
@@ -120,6 +126,12 @@
    setNoPropertiesFileArgument(noPropertiesFileArgument);
    initializeGlobalArguments(defaultArgs);
    refreshArg = new IntegerArgument("refresh", 'r',
        "refresh", false, true, INFO_PERIOD_PLACEHOLDER.get(),
        true, 1, false, Integer.MAX_VALUE,
        INFO_DESCRIPTION_REFRESH_PERIOD.get());
    addGlobalArgument(refreshArg, ioArgGroup);
  }
  /**
@@ -155,6 +167,33 @@
  }
  /**
   * Returns the refresh period (in seconds) specified in the command-line.
   * If no refresh period was specified, returns -1.
   * The code assumes that the attributes have been successfully parsed.
   * @return the specified refresh period in the command-line.
   */
  public int getRefreshPeriod()
  {
    if (refreshArg.isPresent())
    {
      try
      {
        return refreshArg.getIntValue();
      }
      catch (ArgumentException ae)
      {
        // Bug
        throw new IllegalStateException("Error getting value, this method "+
            "should be called after parsing the attributes: "+ae, ae);
      }
    }
    else
    {
      return -1;
    }
  }
  /**
   * Returns the bind DN explicitly provided in the command-line.
   * @return the bind DN explicitly provided in the command-line.
   * Returns <CODE>null</CODE> if no bind DN was explicitly provided.