admin@glassfish.java.net

CODE REVIEW: "DASJ2EEServerImpl handles 'state', 'RestartRequired' failures"

From: Lloyd L Chambers <Lloyd.Chambers_at_Sun.COM>
Date: Tue, 21 Aug 2007 17:27:14 -0700

Anissa,

This fix is for V3, unless we decide to backport to V2 (I think it
would be a good idea).

https://glassfish.dev.java.net/issues/show_bug.cgi?id=3519

(also CR 6594023).

These changes should fix all the issues you've seen with the state
and RestartRequired Attributes. Could you please review the changes?

I'll send you the changed files separately.

Lloyd

--------------
? admin/mbeanapi-impl/src/java/com/sun/enterprise/management/.DS_Store
? admin/mbeanapi-impl/src/java/com/sun/enterprise/management/
j2ee/.DS_Store
Index: appserv-api/src/java/com/sun/appserv/management/j2ee/
J2EEServer.java
===================================================================
RCS file: /cvs/glassfish/appserv-api/src/java/com/sun/appserv/
management/j2ee/J2EEServer.java,v
retrieving revision 1.4
diff -u -w -r1.4 J2EEServer.java
--- appserv-api/src/java/com/sun/appserv/management/j2ee/
J2EEServer.java 5 May 2007 05:30:51 -0000 1.4
+++ appserv-api/src/java/com/sun/appserv/management/j2ee/
J2EEServer.java 22 Aug 2007 00:22:15 -0000
@@ -138,7 +138,8 @@
         /**
                 @return true if server configuration has changed
such that a restart must
- be performed.
+ be performed. A server whose state is STATE_STOPPED
or STATE_FAILED
+ (as returned by {_at_link #getstate}) always returns 'true'.
          */
      public boolean getRestartRequired();
}


Index: admin/mbeanapi-impl/src/java/com/sun/enterprise/management/
j2ee/DASJ2EEServerImpl.java
===================================================================
RCS file: /cvs/glassfish/admin/mbeanapi-impl/src/java/com/sun/
enterprise/management/j2ee/DASJ2EEServerImpl.java,v
retrieving revision 1.11
diff -u -w -r1.11 DASJ2EEServerImpl.java
--- admin/mbeanapi-impl/src/java/com/sun/enterprise/management/j2ee/
DASJ2EEServerImpl.java 5 May 2007 05:23:29 -0000 1.11
+++ admin/mbeanapi-impl/src/java/com/sun/enterprise/management/j2ee/
DASJ2EEServerImpl.java 22 Aug 2007 00:22:15 -0000
@@ -60,6 +60,7 @@
import com.sun.appserv.management.j2ee.J2EEServer;
import com.sun.appserv.management.j2ee.J2EETypes;
import com.sun.appserv.management.j2ee.StateManageable;
+import static com.sun.appserv.management.j2ee.StateManageable.*;
import com.sun.appserv.management.j2ee.J2EEServer;
import com.sun.enterprise.management.support.Delegate;
@@ -67,6 +68,8 @@
import com.sun.enterprise.management.support.LoaderMBean;
import com.sun.enterprise.management.support.QueryMgrImpl;
import com.sun.enterprise.management.support.DelegateToMBeanDelegate;
+import
com.sun.enterprise.management.support.oldconfig.OldConfigProxies;
+import com.sun.enterprise.management.support.oldconfig.OldServersMBean;
import com.sun.enterprise.admin.mbeans.DomainStatusMBean;
import com.sun.enterprise.admin.mbeans.DomainStatus;
@@ -75,6 +78,10 @@
import com.sun.appserv.management.j2ee.J2EETypes;
+
+import com.sun.enterprise.admin.servermgmt.RuntimeStatus;
+import com.sun.enterprise.admin.common.Status;
+
/**
         JSR 77 extension representing an Appserver standalone server
(non-clustered)
@@ -117,7 +124,7 @@
                 private boolean
         remoteServerIsRunning()
         {
- return (StateManageable.STATE_RUNNING == getstate());
+ return (STATE_RUNNING == getstate());
         }
                 private boolean
@@ -125,8 +132,8 @@
         {
                 final int cState = getstate();
- return (StateManageable.STATE_STOPPED == cState) ||
- (StateManageable.STATE_FAILED == cState);
+ return (STATE_STOPPED == cState) ||
+ (STATE_FAILED == cState);
         }
                 private boolean
@@ -134,9 +141,9 @@
         {
                 int cState = getstate();
- if ((StateManageable.STATE_STARTING == cState) ||
- (StateManageable.STATE_RUNNING == cState) ||
- (StateManageable.STATE_FAILED == cState))
+ if ((STATE_STARTING == cState) ||
+ (STATE_RUNNING == cState) ||
+ (STATE_FAILED == cState))
                 {
                         return true;
                 }
@@ -147,7 +154,7 @@
         }
                 public void
- handleNotification( Notification notif , Object obj)
+ handleNotification( final Notification notif , final Object
ignore)
         {
                 final String notifType = notif.getType();
@@ -156,6 +163,9 @@
                         final String serverName = (String)
                             Util.getAMXNotificationValue( notif,
DomainStatusMBean.SERVER_NAME_KEY );
+//System.out.println( "##########
DASJ2EEServerImpl.handleNotification: serverName = " + serverName +
", state = " + getstate() + ": " +
com.sun.appserv.management.util.jmx.stringifier.NotificationStringifier.
toString(notif) );
+
+
                         if ( serverName.equals( getServerName() ) )
                         {
                                 setDelegate();
@@ -163,11 +173,13 @@
                 }
         }
+
                 private synchronized void
         setDelegate()
         {
                 if ( remoteServerIsRunning() )
                 {
+//System.out.println( "########## DASJ2EEServerImpl.setDelegate():
remoteServerIsRunning=true");
                     try {
                  // get the object name for the old jsr77 server mBean
                  com.sun.enterprise.ManagementObjectManager
mgmtObjManager =
@@ -189,15 +201,22 @@

                  setDelegate( delegate );
                  setstartTime(System.currentTimeMillis());
+//System.out.println( "########## DASJ2EEServerImpl.setDelegate():
set delegate to " + serverON);
                     }
              catch (Exception e) {
                  final Throwable rootCause =
ExceptionUtil.getRootCause( e );
                  getMBeanLogger().warning(
                      rootCause.toString() + "\n" +
ExceptionUtil.getStackTrace( rootCause ) );
+ if ( getDelegate() == null )
+ {
+ setDelegate( DummyDelegate.INSTANCE );
+ setstartTime(0);
+ }
              }
                 }
                 else
                 {
+//System.out.println( "########## DASJ2EEServerImpl.setDelegate():
setting DummyDelegate" );
                         setDelegate( DummyDelegate.INSTANCE );
                         setstartTime(0);
                 }
@@ -225,17 +244,53 @@
                 return true;
         }
+ final RuntimeStatus
+ getRuntimeStatus(final String serverName )
+ {
+ final MBeanServer mbeanServer = getMBeanServer();
+ final OldServersMBean oldServers =
+ OldConfigProxies.getInstance
( mbeanServer ).getOldServersMBean( );
+
+ final RuntimeStatus status = oldServers.getRuntimeStatus
( serverName );
+
+ return status;
+ }
+
+ /**
+ Convert an internal status code to JSR 77 StateManageable
state.
+ */
+ private static int
+ serverStatusCodeToStateManageableState( final int statusCode )
+ {
+ int state = STATE_FAILED;
+ switch( statusCode )
+ {
+ default: throw new IllegalArgumentException( "Uknown
status code: " + statusCode );
+
+ case Status.kInstanceStartingCode: state =
STATE_STARTING; break;
+ case Status.kInstanceRunningCode: state = STATE_RUNNING;
break;
+ case Status.kInstanceStoppingCode: state =
STATE_STOPPING; break;
+ case Status.kInstanceNotRunningCode: state =
STATE_STOPPED; break;
+ }
+
+ return state;
+ }
+
                 public int
         getstate()
         {
- try {
- return (getDomainStatus().getstate
(getServerName()));
- } catch (Exception e) {
- final Throwable rootCause =
ExceptionUtil.getRootCause( e );
- getMBeanLogger().warning( rootCause.toString() + "\n" +
- ExceptionUtil.getStackTrace( rootCause ) );
+ int state = STATE_STOPPED;
+ try
+ {
+ final int internalStatus = getRuntimeStatus(getServerName
()).getStatus().getStatusCode();
+ state = serverStatusCodeToStateManageableState
( internalStatus );
          }
- return StateManageable.STATE_FAILED;
+ catch ( final Exception e )
+ {
+ // not available, must not be running
+ }
+
+ return state;
         }
                 public void
@@ -470,10 +525,25 @@

          public boolean
         getRestartRequired() {
+ // Notification mechanism is broken (reason unknown). Just
set it explicitly if not
+ // already set.
+//System.out.println( "##########
DASJ2EEServerImpl.getRestartRequired:" + getServerName() );
+ if ( getDelegate() == null || getDelegate() ==
DummyDelegate.INSTANCE )
+ {
+ setDelegate();
+ }
+
          // there might not be a Delegate. Default to 'true', since
a non-running server
          // must be restarted!
          boolean required = true;
- if ( getDelegate() != null )
+
+ final int state = getstate();
+ // ensure that these states always return 'true'
+ if ( state == STATE_STOPPED || state == STATE_FAILED ||
state == STATE_STOPPING )
+ {
+ required = true;
+ }
+ else
          {
              try {
                  final Object result = getDelegate().getAttribute
( "restartRequired" );
@@ -484,9 +554,12 @@
                  required = true;
              }
          }
+
          return required;
         }
}
+
+



Index: admin/mbeanapi-impl/src/java/com/sun/enterprise/management/
support/oldconfig/OldServersMBean.java
===================================================================
RCS file: /cvs/glassfish/admin/mbeanapi-impl/src/java/com/sun/
enterprise/management/support/oldconfig/OldServersMBean.java,v
retrieving revision 1.3
diff -u -w -r1.3 OldServersMBean.java
--- admin/mbeanapi-impl/src/java/com/sun/enterprise/management/
support/oldconfig/OldServersMBean.java 5 May 2007 05:23:49
-0000 1.3
+++ admin/mbeanapi-impl/src/java/com/sun/enterprise/management/
support/oldconfig/OldServersMBean.java 22 Aug 2007 00:22:15 -0000
@@ -50,6 +50,8 @@
import javax.management.ObjectName;
import javax.management.AttributeList;
+import com.sun.enterprise.admin.servermgmt.RuntimeStatus;
+
/**
         Implementing class was:
com.sun.enterprise.ee.admin.mbeans.ServersConfigMBean
*/
@@ -63,7 +65,7 @@
         public ObjectName createServerInstance( final String
param1, final String param2, final String param3, final String
param4, final java.util.Properties param5 );
         public void deleteServerInstance( final String param1 );
         public boolean destroyConfigElement();
- //public
com.sun.enterprise.admin.servermgmt.RuntimeStatus
getRuntimeStatus( final String param1 );
+ public
com.sun.enterprise.admin.servermgmt.RuntimeStatus
getRuntimeStatus( final String serverName );
         public ObjectName[] getServer();
         public ObjectName getServerByName( final String key );
         public ObjectName listDASServerInstance();
MB2:/gf/build/glassfish lloyd$