You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by sa...@apache.org on 2011/12/14 09:36:31 UTC

svn commit: r1214107 - in /directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers: ./ controls/ extended/

Author: saya
Date: Wed Dec 14 08:36:30 2011
New Revision: 1214107

URL: http://svn.apache.org/viewvc?rev=1214107&view=rev
Log:
added some missing txn demarcaction. moved txn conflict handling to the right place in handlers

Modified:
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/AddHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/BindHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/DeleteHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/LdapRequestHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyDnHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchContext.java
    directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/CertGenerationRequestHandler.java

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/AddHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/AddHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/AddHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/AddHandler.java Wed Dec 14 08:36:30 2011
@@ -66,17 +66,22 @@ public class AddHandler extends LdapRequ
                 catch ( Exception e )
                 {
                   txnManager.abortTransaction();
-                  
-                  // TODO Instead of rethrowing the exception here all the time, check
-                  // if the root cause if conflictexception and retry by going to he
-                  // beginning of the loop if necessary.
-                  
+                   
                   throw ( e );
                 }
                 
                 // If here then we are done.
-                txnManager.commitTransaction();
                 done = true;
+                
+                try
+                {
+                    txnManager.commitTransaction();
+                }
+                catch( Exception e )
+                {
+                    // TODO check for conflict
+                    throw e;
+                }
             }
             while ( !done );
 

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/BindHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/BindHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/BindHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/BindHandler.java Wed Dec 14 08:36:30 2011
@@ -622,6 +622,7 @@ public class BindHandler extends LdapReq
             }
             catch ( Exception e )
             {
+                e.printStackTrace();
               txnManager.abortTransaction();
               
               // TODO Instead of rethrowing the exception here all the time, check

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/DeleteHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/DeleteHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/DeleteHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/DeleteHandler.java Wed Dec 14 08:36:30 2011
@@ -66,16 +66,21 @@ public class DeleteHandler extends LdapR
                 {
                   txnManager.abortTransaction();
                   
-                  // TODO Instead of rethrowing the exception here all the time, check
-                  // if the root cause if conflictexception and retry by going to he
-                  // beginning of the loop if necessary.
-                  
                   throw ( e );
                 }
                 
                 // If here then we are done.
-                txnManager.commitTransaction();
                 done = true;
+                
+                try
+                {
+                    txnManager.commitTransaction();
+                }
+                catch( Exception e )
+                {
+                    // TODO check for conflict
+                    throw e;
+                }
             }
             while ( !done );
             

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/LdapRequestHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/LdapRequestHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/LdapRequestHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/LdapRequestHandler.java Wed Dec 14 08:36:30 2011
@@ -22,6 +22,7 @@ package org.apache.directory.server.ldap
 
 import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.directory.server.core.api.CoreSession;
+import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.txn.TxnManager;
 import org.apache.directory.server.core.shared.txn.TxnManagerFactory;
 import org.apache.directory.server.i18n.I18n;
@@ -65,12 +66,6 @@ public abstract class LdapRequestHandler
 
     /** Txn Manager */
     protected TxnManager txnManager;
-   
-    
-    public LdapRequestHandler()
-    {
-        txnManager = TxnManagerFactory.txnManagerInstance();
-    }
     
     
     /**
@@ -89,6 +84,13 @@ public abstract class LdapRequestHandler
     public final void setLdapServer( LdapServer ldapServer )
     {
         this.ldapServer = ldapServer;
+        
+        DirectoryService service = ldapServer.getDirectoryService();
+        
+        if ( service != null )
+        {
+            txnManager = ldapServer.getDirectoryService().getTxnManager();
+        }
     }
 
 

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyDnHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyDnHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyDnHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyDnHandler.java Wed Dec 14 08:36:30 2011
@@ -137,16 +137,21 @@ public class ModifyDnHandler extends Lda
                     {
                       txnManager.abortTransaction();
                       
-                      // TODO Instead of rethrowing the exception here all the time, check
-                      // if the root cause if conflictexception and retry by going to he
-                      // beginning of the loop if necessary.
-                      
                       throw ( e );
                     }
                     
                     // If here then we are done.
-                    txnManager.commitTransaction();
                     done = true;
+                    
+                    try
+                    {
+                        txnManager.commitTransaction();
+                    }
+                    catch( Exception e )
+                    {
+                        // TODO check for conflict
+                        throw e;
+                    }
                 }
                 while ( !done );
             }
@@ -164,7 +169,6 @@ public class ModifyDnHandler extends Lda
         }
         catch ( Exception e )
         {
-            e.printStackTrace();
             handleException( session, req, e );
         }
     }

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/ModifyHandler.java Wed Dec 14 08:36:30 2011
@@ -66,18 +66,21 @@ public class ModifyHandler extends LdapR
                 {
                   txnManager.abortTransaction();
                   
-                  // TODO Instead of rethrowing the exception here all the time, check
-                  // if the root cause if conflictexception and retry by going to he
-                  // beginning of the loop if necessary.
-                  
-                  e.printStackTrace();
-                  
                   throw ( e );
                 }
                 
                 // If here then we are done.
-                txnManager.commitTransaction();
                 done = true;
+                
+                try
+                {
+                    txnManager.commitTransaction();
+                }
+                catch( Exception e )
+                {
+                    // TODO check for conflict
+                    throw e;
+                }
             }
             while ( !done );
             

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/SearchHandler.java Wed Dec 14 08:36:30 2011
@@ -34,6 +34,7 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.api.event.NotificationCriteria;
 import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
 import org.apache.directory.server.core.api.partition.PartitionNexus;
+import org.apache.directory.server.core.api.txn.TxnHandle;
 import org.apache.directory.server.i18n.I18n;
 import org.apache.directory.server.ldap.LdapSession;
 import org.apache.directory.server.ldap.handlers.controls.PagedSearchContext;
@@ -207,7 +208,28 @@ public class SearchHandler extends LdapR
             // SearchResponseEntry elements instead of
             // SearchResponseReference elements.
             LOG.debug( "ManageDsaITControl detected." );
-            handleIgnoringReferrals( session, req );
+            boolean txnStarted = false;
+            
+            try
+            {
+                beginTxnForSearch( session, req );
+                txnStarted = true;
+                
+                handleIgnoringReferrals( session, req );
+                
+            }
+            catch ( Exception e )
+            {
+                if  ( txnStarted )
+                {
+                    endTxnForSearch( true );
+                }
+                
+                throw e;
+            }
+            
+            // if here, we are done
+            endTxnForSearch( false );
         }
         else
         {
@@ -218,7 +240,29 @@ public class SearchHandler extends LdapR
             switch ( req.getType() )
             {
                 case SEARCH_REQUEST:
-                    handleWithReferrals( session, req );
+                    
+                    boolean txnStarted = false;
+                    
+                    try
+                    {
+                        beginTxnForSearch( session, req );
+                        txnStarted = true;
+                    
+                        handleWithReferrals( session, req );
+                    }
+                    catch ( Exception e )
+                    {
+                        if  ( txnStarted )
+                        {
+                            endTxnForSearch( true );
+                        }
+                        
+                        throw e;
+                    }
+                    
+                    // if here, we are done
+                    endTxnForSearch( false );
+                    
                     break;
 
                 default:
@@ -401,7 +445,7 @@ public class SearchHandler extends LdapR
             LOG.debug( "Sending {}", entry.getDn() );
             count++;
         }
-
+        
         // DO NOT WRITE THE RESPONSE - JUST RETURN IT
         ldapResult.setResultCode( ResultCodeEnum.SUCCESS );
 
@@ -492,6 +536,11 @@ public class SearchHandler extends LdapR
 
                 // Stores the cursor current position
                 pagedContext.incrementCurrentPosition( pageCount );
+                
+                // Suspend the current txn
+                TxnHandle txnHandle = txnManager.suspendCurTxn();
+                pagedContext.setTxnHandle( txnHandle );
+                
                 return;
             }
             else
@@ -787,44 +836,31 @@ public class SearchHandler extends LdapR
         
         try
         {
-            txnManager.beginTransaction( true );
-            
-            try
-            {
-                // A normal search
-                // Check that we have a cursor or not.
-                // No cursor : do a search.
-                cursor = session.getCoreSession().search( req );
-        
-                // Position the cursor at the beginning
-                cursor.beforeFirst();
-        
-                /*
-                 * Iterate through all search results building and sending back responses
-                 * for each search result returned.
-                 */
-               
-                    // Get the size limits
-                    // Don't bother setting size limits for administrators that don't ask for it
-                    long serverLimit = getServerSizeLimit( session, req );
-        
-                    long requestLimit = req.getSizeLimit() == 0L ? Long.MAX_VALUE : req.getSizeLimit();
-        
-                    req.addAbandonListener( new SearchAbandonListener( ldapServer, cursor ) );
-                    setTimeLimitsOnCursor( req, session, cursor );
-                    LOG.debug( "using <{},{}> for size limit", requestLimit, serverLimit );
-                    long sizeLimit = min( requestLimit, serverLimit );
-        
-                    readResults( session, req, ldapResult, cursor, sizeLimit );
-            }
-            catch ( Exception e )
-            {
-                txnManager.abortTransaction();
-                throw ( e );
-            }
+            // A normal search
+            // Check that we have a cursor or not.
+            // No cursor : do a search.
+            cursor = session.getCoreSession().search( req );
 
-            // If here then we are done.
-            txnManager.commitTransaction();
+            // Position the cursor at the beginning
+            cursor.beforeFirst();
+
+            /*
+             * Iterate through all search results building and sending back responses
+             * for each search result returned.
+             */
+
+            // Get the size limits
+            // Don't bother setting size limits for administrators that don't ask for it
+            long serverLimit = getServerSizeLimit( session, req );
+
+            long requestLimit = req.getSizeLimit() == 0L ? Long.MAX_VALUE : req.getSizeLimit();
+
+            req.addAbandonListener( new SearchAbandonListener( ldapServer, cursor ) );
+            setTimeLimitsOnCursor( req, session, cursor );
+            LOG.debug( "using <{},{}> for size limit", requestLimit, serverLimit );
+            long sizeLimit = min( requestLimit, serverLimit );
+
+            readResults( session, req, ldapResult, cursor, sizeLimit );
         }
         finally
         {
@@ -1655,4 +1691,70 @@ public class SearchHandler extends LdapR
     {
         this.replicationReqHandler = replicationReqHandler;
     }
+    
+    
+    private boolean checkPagedSearchTxnResume( LdapSession session, SearchRequest req )
+    {
+        boolean resumedTxn = false;
+        
+        PagedResultsDecorator pagedSearchControl = ( PagedResultsDecorator )req.getControls().get( PagedResults.OID );
+        
+        if ( pagedSearchControl != null )
+        {
+            byte[] cookie = pagedSearchControl.getCookie();
+            
+            if ( !Strings.isEmpty( cookie ) )
+            {
+                int cookieValue = pagedSearchControl.getCookieValue();
+                PagedSearchContext pagedContext = session.getPagedSearchContext( cookieValue );
+                
+                if ( pagedContext != null )
+                {
+                    TxnHandle txnHandle = pagedContext.getTxnHandle();
+                    pagedContext.setTxnHandle( null );
+                    txnManager.resumeTxn( txnHandle );
+                    resumedTxn = true;
+                }
+            }
+        }
+        
+        return resumedTxn;
+    }
+    
+    
+    private void beginTxnForSearch( LdapSession session, SearchRequest req ) throws Exception
+    {
+        boolean resumedTxn = checkPagedSearchTxnResume( session, req );
+     
+        // If resumed an existing txn then just return
+        
+        if ( resumedTxn )
+        {
+            return;
+        }
+        
+        txnManager.beginTransaction( true );
+    }
+    
+    
+    private void endTxnForSearch( boolean abort ) throws Exception
+    {
+        // Paged search might have suspended the execution of the txn
+        TxnHandle txnHandle = txnManager.getCurTxn();
+        
+        if ( txnHandle == null )
+        {
+            return;
+        }
+        
+        if ( abort == false )
+        {
+            txnManager.commitTransaction();
+        }
+        else
+        {
+            txnManager.abortTransaction();
+        }
+        
+    }
 }

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchContext.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchContext.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/controls/PagedSearchContext.java Wed Dec 14 08:36:30 2011
@@ -24,6 +24,7 @@ import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.directory.server.core.api.filtering.EntryFilteringCursor;
+import org.apache.directory.server.core.api.txn.TxnHandle;
 import org.apache.directory.server.ldap.LdapSession;
 import org.apache.directory.shared.asn1.ber.tlv.Value;
 import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
@@ -56,6 +57,9 @@ public class PagedSearchContext
 
     /** The associated cursor for the current search request */
     private EntryFilteringCursor cursor;
+    
+    /** Suspended txn..Not null if a txn is suspended */
+    TxnHandle txnHandle;
 
     /**
      * Creates a new instance of this class, storing the SearchRequest into it.
@@ -305,6 +309,21 @@ public class PagedSearchContext
     {
         this.cursor = cursor;
     }
+    
+    
+    /**
+     * Set suspendedn txn Handle
+     */
+    public void setTxnHandle( TxnHandle handle )
+    {
+        txnHandle = handle;
+    }
+    
+    
+    public TxnHandle getTxnHandle()
+    {
+        return txnHandle;
+    }
 
 
     /**

Modified: directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/CertGenerationRequestHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/CertGenerationRequestHandler.java?rev=1214107&r1=1214106&r2=1214107&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/CertGenerationRequestHandler.java (original)
+++ directory/apacheds/branches/apacheds-txns/protocol-ldap/src/main/java/org/apache/directory/server/ldap/handlers/extended/CertGenerationRequestHandler.java Wed Dec 14 08:36:30 2011
@@ -25,7 +25,9 @@ import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.directory.server.core.api.entry.ClonedServerEntry;
+import org.apache.directory.server.core.api.txn.TxnManager;
 import org.apache.directory.server.core.security.TlsKeyGenerator;
+import org.apache.directory.server.core.shared.txn.TxnManagerFactory;
 import org.apache.directory.server.ldap.ExtendedOperationHandler;
 import org.apache.directory.server.ldap.LdapServer;
 import org.apache.directory.server.ldap.LdapSession;
@@ -77,16 +79,44 @@ public class CertGenerationRequestHandle
      */
     public void handleExtendedOperation( LdapSession session, CertGenerationRequest req ) throws Exception
     {
-        Entry entry = session.getCoreSession().lookup( new Dn( req.getTargetDN() ) );
+        TxnManager txnManager = session.getCoreSession().getDirectoryService().getTxnManager();
+        boolean done = false;
 
-        if ( entry != null )
+        do
         {
-            TlsKeyGenerator.addKeyPair( 
-                ( ( ClonedServerEntry ) entry ).getOriginalEntry(), 
-                req.getIssuerDN(),
-                req.getSubjectDN(), 
-                req.getKeyAlgorithm() );
+            txnManager.beginTransaction( false );
+
+            try
+            {
+                Entry entry = session.getCoreSession().lookup( new Dn( req.getTargetDN() ) );
+
+                if ( entry != null )
+                {
+                    TlsKeyGenerator.addKeyPair(
+                        ( ( ClonedServerEntry ) entry ).getOriginalEntry(),
+                        req.getIssuerDN(),
+                        req.getSubjectDN(),
+                        req.getKeyAlgorithm() );
+                }
+            }
+            catch ( Exception e )
+            {
+                txnManager.abortTransaction();
+
+                // TODO Instead of rethrowing the exception here all the time, check
+                // if the root cause if conflictexception and retry by going to he
+                // beginning of the loop if necessary.
+
+                e.printStackTrace();
+
+                throw ( e );
+            }
+
+            // If here then we are done.
+            txnManager.commitTransaction();
+            done = true;
         }
+        while ( !done );
     }