You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/12/03 17:40:41 UTC

svn commit: r109696 - /incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java

Author: akarasulu
Date: Fri Dec  3 08:40:40 2004
New Revision: 109696

URL: http://svn.apache.org/viewcvs?view=rev&rev=109696
Log:
Changes ...

 o added shutdown hook to runtime that closes the nexus which in turn closes
   all backing stores - this prevents us from having to register a thread per
   registered context partition
 o added some code to make sure the sync() and close() ops performed their
   repective operation on each backing store even if ones before it throw
   exceptions

Notes ...

 o adding fail fast protection to sync() and close() methods brought some 
   exceptions to our attention that we were not catching on sync() calls
 o this causes a lot of noice on all test cases but does not seem to 
   produce any negative affects - sync ops still seem to work
 o regardless we need to get to the bottom of this
 o these changes fix this issue in JIRA:

      http://nagoya.apache.org/jira/browse/DIREVE-92


Modified:
   incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java

Modified: incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java
Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java?view=diff&rev=109696&p1=incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java&r1=109695&p2=incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java&r2=109696
==============================================================================
--- incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java	(original)
+++ incubator/directory/eve/trunk/jndi-provider/src/java/org/apache/eve/RootNexus.java	Fri Dec  3 08:40:40 2004
@@ -29,6 +29,7 @@
 import org.apache.ldap.common.filter.ExprNode;
 import org.apache.ldap.common.filter.PresenceNode;
 import org.apache.ldap.common.NotImplementedException;
+import org.apache.ldap.common.MultiException;
 import org.apache.ldap.common.exception.LdapNameNotFoundException;
 import org.apache.ldap.common.util.SingletonEnumeration;
 import org.apache.ldap.common.message.LockableAttributeImpl;
@@ -94,8 +95,24 @@
 
         // register will add to the list of namingContexts as well
         register( this.system );
+
+        Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() {
+            public void run()
+            {
+                try
+                {
+                    RootNexus.this.close();
+                }
+                catch ( NamingException e )
+                {
+                    e.printStackTrace();
+                    // @todo again we need to monitor this failure and report
+                    // that it occured on shutdown specifically
+                }
+            }
+        }, "RootNexusShutdownHook" ) );
     }
-    
+
 
     // ------------------------------------------------------------------------
     // BackendNexus Interface Method Implementations
@@ -372,11 +389,35 @@
      */
     public void sync() throws NamingException
     {
+        MultiException error = null;
         Iterator list = this.backends.values().iterator();
         while ( list.hasNext() )
         {
             BackingStore store = ( BackingStore ) list.next();
-            store.sync();
+
+            try
+            {
+                store.sync();
+            }
+            catch ( NamingException e )
+            {
+                e.printStackTrace();
+
+                if ( error == null )
+                {
+                    error = new MultiException( "Grouping many exceptions on root nexus sync()" );
+                }
+
+                // @todo really need to send this info to a monitor
+                error.addThrowable( e );
+            }
+        }
+
+        if ( error != null )
+        {
+            NamingException total = new NamingException( "Encountered failures "
+                    + "while performing a sync() operation on backing stores" );
+            total.setRootCause( error );
         }
     }
 
@@ -386,15 +427,43 @@
      */
     public void close() throws NamingException
     {
+        MultiException error = null;
         Iterator list = this.backends.values().iterator();
+
+        // make sure this loop is not fail fast so all backing stores can
+        // have an attempt at closing down and synching their cached entries
         while ( list.hasNext() )
         {
             BackingStore store = ( BackingStore ) list.next();
-            store.sync();
-            store.close();
+
+            try
+            {
+                store.sync();
+                store.close();
+            }
+            catch ( NamingException e )
+            {
+                e.printStackTrace();
+
+                if ( error == null )
+                {
+                    error = new MultiException( "Grouping many exceptions on root nexus close()" );
+                }
+
+                // @todo really need to send this info to a monitor
+                error.addThrowable( e );
+            }
         }
 
         s_singleton = null;
+
+
+        if ( error != null )
+        {
+            NamingException total = new NamingException( "Encountered failures " 
+                    + "while performing a close() operation on backing stores" );
+            total.setRootCause( error );
+        }
     }