Salesforce

What are the causes of Error 9908 JVM clock skew?

« Go Back

Information

 
TitleWhat are the causes of Error 9908 JVM clock skew?
URL NameP160681
Article Number000140179
EnvironmentProduct: OpenEdge
Version All supported versions
OS: All supported platforms
Question/Problem Description
What are the causes of Error 9908 JVM clock skew
How to diagnose the cause of error 9908 when it's not SSO credentials or hostname resolution
How to verify if the Operating System time and the internal time of the Java process of the AdminServer are in sync
How to use SysTime.java to verify if a java process has an internal time discrepancy
Steps to Reproduce
Clarifying Information
Error Message<user,time> System generated password has expired (9908)
Defect Number
Enhancement Number
Cause
Resolution

There are 2 known causes for JVM clock skew which results in AdminServer startup failure or "*man" startup failure with error 9908. One is specific to HP-UX, the other is generic.

1.  HP-UX JVM clock skew time

The specific problem is a java bug on HP-UX which causes the java process to have a loss in time the longer it runs. 

For OpenEdge versions earlier than 10.0A:

Add the following HP-UX java switch as a parameter of JVMARGS for the AdminServer and all scripts which issue commands which communicate with the AdminServer such as dbman, asbman, wtbman, etc.

-XX:+UseGetTimeOfDay

To the $DLC/bin/java_env file under the relevant HP-UX section:

Example:   
     "HP-UX")   #  HP UNIX 11.00, No jdk but jre
      THREADS_FLAG=native_threads
      JVMARGS="-mx256m -ms128m -XX:+UseGetTimeOfDay ${JVMARGS}"  ## (or -Xmx256m -Xms128m for Java 1.4 and above)
      JDKHOME=
      if [ ! -f $JDKHOME/bin/javac ]
      then
        JDKHOME=$env_jdkhome
      fi
      JDKCP=$JDKHOME/lib/tools.jar
      JRECP=
      VMTYPE=classic
      ARCH=PA_RISC
      # set the shared library search path - snippet from the java script
      SHLIB_PATH=$SHLIB_PATH:$JREHOME/lib/$ARCH/$THREADS_FLAG:$JREHOME/lib/$ARCH
/$VMTYPE:$JREHOME/lib/$ARCH
      export SHLIB_PATH

For OpenEdge 10.0A and later:

In HP-UX environments, the +UseGetTimeOfDay value needs to be added to the jvmargs in the DLC/properties/AdminServerPlugins.properties file under the following section:

[PluginPolicy.Progress.AdminServer]
   jvmargs="-mx256m -ms128m -XX:+UseGetTimeOfDay ${JVMARGS}"  ## (or -Xmx256m -Xms128m for Java 1.4 and above)

2.  Generic JVM clock skew time

The generic problem occurs when there is a time difference between what the AdminServer sees as the time, and what any other process sees as the time.

The SysTime.java Java code contained in the Note section of this Article can be used to verify if there is a difference between the OS and Java process time. 

  • The same java which is used to launch the AdminServer should be used to perform the test and the same environment variables which exist for the AdminServer should also be setup when running this Java code.
  • This piece of Java code should be left running in parallel to the AdminServer. 
  • Periodically the java code will display Java Process time and system time. 
  • When the processes encounters divergence in times, then the 9908 error will eventually occur once the times differ by 15 minutes (the default).
Use the following commands on Unix to prepare the environment:

$DLC/bin/proenv
. $DLC/bin/slib_env
. $DLC/bin/java_env
java SysTime -classpath <current path>

To increase the AdminServer timeout window

Add the -Dpwdtimeout parameter to the JVMARGS passed to the java executable before starting the AdminServer as detailed above:

To the $DLC/bin/java_env file pre OpenEdge 10.0A
To the $DLC/properties/AdminServerPlugins.properties post 10.0A

Example:
JVMARGS="-Xms128m ${JVMARGS} -Dpwdtimeout=180000"

If the time variance is ever greater than 3 minutes (180000 milliseconds) then the 9908 error can still occur.
 

Workaround
Notes
/* the following is the code for SysTime.java */
import java.util.*;
import java.text.DateFormat;
import java.io.*;

public class SysTime implements Runnable
{
    private InputStream in = null;
    private InputStreamReader reader = null;
    private Thread t = null;
    private DateFormat dFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
   
    private Date dTime = null;
    private String sTime = null;
    private String shellTime = null;

    public static void  main(String args[])
    {
        SysTime st = new SysTime();
        try
        {
            st.execute();
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
    }

    public SysTime()
    {
    }

    public void execute() throws Exception
    {
        try
        {
            Runtime rt = Runtime.getRuntime();
            while(true)
            {
                t = new Thread(this);
                Process p = rt.exec("date");
                in = p.getInputStream();
                dTime = new Date(System.currentTimeMillis());
                sTime = dFormat.format(dTime);
                System.out.println("System time: " + sTime);
                t.start();
                p.waitFor();
                Thread.sleep(60000);
            }
        } catch (InterruptedException e){}
   }

    public void run()
    {
        try
        {
            reader = new InputStreamReader(in);
            int c = 0;
            StringBuffer sb = new StringBuffer("");
            while ((c = reader.read()) != -1)
            {
                sb.append((char)c);
            }
       &nbs.p;    System.out.println("Shell time:\t" + sb);
        }
        catch (Exception e)
        {
        }
    }
}

.p;    System.out.println("Shell time:\t" + sb);
        }
        catch (Exception e)
        {
        }
    }
}.
Keyword Phrase
Last Modified Date6/30/2016 9:41 AM

Powered by