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

jvergara
19.30.2007 51411174542e32ef59b2b58b3bcabb3cddf5d9eb
Fix for issue 2317: check servers for clock difference when configuring replication
When the servers that are being replicated have a clock difference of more than 5 minutes inform the user of this. This is done in both the graphical setup and dsreplication tools.
4 files modified
95 ■■■■■ changed files
opendj-sdk/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java 16 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/messages/messages/quicksetup.properties 4 ●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java 28 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java 47 ●●●●● patch | view | raw | blame | history
opendj-sdk/opends/src/guitools/org/opends/guitools/replicationcli/ReplicationCliMain.java
@@ -84,6 +84,7 @@
import org.opends.quicksetup.ReturnCode;
import org.opends.quicksetup.event.ProgressUpdateEvent;
import org.opends.quicksetup.event.ProgressUpdateListener;
import org.opends.quicksetup.installer.Installer;
import org.opends.quicksetup.installer.InstallerHelper;
import org.opends.quicksetup.installer.PeerNotFoundException;
import org.opends.quicksetup.installer.offline.OfflineInstaller;
@@ -2738,6 +2739,21 @@
      printErrorMessage(msg);
    }
    long time1 = Utils.getServerClock(ctx1);
    long time2 = Utils.getServerClock(ctx2);
    if ((time1 != -1) && (time2 != -1))
    {
      if (Math.abs(time1 - time2) >
      (Installer.WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES * 60 * 1000))
      {
        printWarningMessage(INFO_WARNING_SERVERS_CLOCK_DIFFERENCE.get(
            ConnectionUtils.getHostPort(ctx1),
            ConnectionUtils.getHostPort(ctx2),
            String.valueOf(
                Installer.WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES)));
      }
    }
    if (ctx1 != null)
    {
      try
opendj-sdk/opends/src/messages/messages/quicksetup.properties
@@ -651,6 +651,10 @@
INFO_PROGRESS_CONFIGURING=Configuring Directory Server
INFO_PROGRESS_CONFIGURING_REPLICATION=Configuring Replication
INFO_PROGRESS_CONFIGURING_REPLICATION_REMOTE=Configuring Replication on %s
INFO_WARNING_SERVERS_CLOCK_DIFFERENCE=The clocks of servers %s and %s have a \
 difference superior to %s minutes.  Replication does not require clocks to \
 be synchronized but monitoring of replication updates between servers can be \
 difficult.
INFO_PROGRESS_COPYING_FILE=Copying file %s to %s
INFO_PROGRESS_CREATING_ADMINISTRATOR=Creating Global Administrator
INFO_PROGRESS_CREATING_ADS=Creating Registration Configuration
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/installer/Installer.java
@@ -60,6 +60,7 @@
import org.opends.admin.ads.TopologyCache;
import org.opends.admin.ads.TopologyCacheException;
import org.opends.admin.ads.util.ApplicationTrustManager;
import org.opends.admin.ads.util.ConnectionUtils;
import org.opends.quicksetup.ui.*;
import org.opends.quicksetup.util.Utils;
@@ -164,6 +165,11 @@
  /** Alias of a self-signed certificate. */
  protected static final String SELF_SIGNED_CERT_ALIAS = "server-cert";
  /** The thresold in minutes used to know whether we must display a warning
   * informing that there is a server clock difference between two servers
   * whose contents are being replicated. */
  public static final int WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES = 5;
  /**
   * Creates a default instance.
   */
@@ -1483,6 +1489,9 @@
    replicationServers.put(Constants.SCHEMA_DN, adsServers);
    InitialLdapContext ctx = null;
    long localTime = -1;
    long localTimeMeasureTime = -1;
    String localServerDisplay = null;
    try
    {
      ctx = createLocalContext();
@@ -1491,6 +1500,9 @@
          getUserData().getReplicationOptions().useSecureReplication(),
          getLocalHostPort(),
          knownReplicationServerIds, knownServerIds);
      localTimeMeasureTime = System.currentTimeMillis();
      localTime = Utils.getServerClock(ctx);
      localServerDisplay = ConnectionUtils.getHostPort(ctx);
    }
    catch (ApplicationException ae)
    {
@@ -1583,6 +1595,22 @@
              replicationPort, enableSecureReplication,
              server.getHostPort(true), knownReplicationServerIds,
              knownServerIds);
        long remoteTimeMeasureTime = System.currentTimeMillis();
        long remoteTime = Utils.getServerClock(ctx);
        if ((localTime != -1) && (remoteTime != -1))
        {
          if (Math.abs(localTime - remoteTime - localTimeMeasureTime +
              remoteTimeMeasureTime) >
          (WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES * 60 * 1000))
          {
            notifyListeners(getFormattedWarning(
                INFO_WARNING_SERVERS_CLOCK_DIFFERENCE.get(
                    localServerDisplay, ConnectionUtils.getHostPort(ctx),
                    String.valueOf(
                        WARNING_CLOCK_DIFFERENCE_THRESOLD_MINUTES))));
          }
        }
        hmConfiguredRemoteReplication.put(server, repl);
        try
opendj-sdk/opends/src/quicksetup/org/opends/quicksetup/util/Utils.java
@@ -39,11 +39,14 @@
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapName;
@@ -1388,6 +1391,50 @@
    }
    return emptyStream;
  }
  /**
   * Returns the current time of a server in milliseconds.
   * @param ctx the connection to the server.
   * @return the current time of a server in milliseconds.
   */
  public static long getServerClock(InitialLdapContext ctx)
  {
    long time = -1;
    String v = null;
    SearchControls ctls = new SearchControls();
    ctls.setSearchScope(SearchControls.OBJECT_SCOPE);
    ctls.setReturningAttributes(
        new String[] {
            "currentTime"
        });
    String filter = "(objectclass=*)";
    try
    {
      LdapName jndiName = new LdapName("cn=monitor");
      NamingEnumeration listeners = ctx.search(jndiName, filter, ctls);
      while(listeners.hasMore())
      {
        SearchResult sr = (SearchResult)listeners.next();
        v = getFirstValue(sr, "currentTime");
        TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
        SimpleDateFormat formatter =
             new SimpleDateFormat("yyyyMMddHHmmss'Z'");
        formatter.setTimeZone(utcTimeZone);
        time = formatter.parse(v).getTime();
      }
    }
    catch (Throwable t)
    {
      LOG.log(Level.WARNING, "Error retrieving server current time: "+t, t);
    }
    return time;
  }
}
/**