directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From elecha...@apache.org
Subject svn commit: r1300690 - in /directory/apacheds/branches/apacheds-txns: core-api/src/main/java/org/apache/directory/server/core/api/log/ core-api/src/main/java/org/apache/directory/server/core/api/txn/ core-api/src/main/java/org/apache/directory/server/c...
Date Wed, 14 Mar 2012 19:06:17 GMT
Author: elecharny
Date: Wed Mar 14 19:06:17 2012
New Revision: 1300690

URL: http://svn.apache.org/viewvc?rev=1300690&view=rev
Log:
o Added a type for LogEdit stored into UserLogRecord, in order to be able to read them back
from the stream knowing what is the stored data.
o Created an injectData() method to factorize the serialization of the LogEdit instances
o Removed the readObject()/writeObject() calls in the IndexChange class
o Added some Javadoc
o Minor refactoring

Added:
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java
      - copied, changed from r1299595, directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java
Modified:
    directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/LogAnchor.java
    directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/UserLogRecord.java
    directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/TxnLogManager.java
    directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/AbstractLogEdit.java
    directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/LogEdit.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/DefaultLogFileManager.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/LogFlushManager.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnLogManager.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnManager.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/DataChangeContainer.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryChange.java
    directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java

Modified: directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/LogAnchor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/LogAnchor.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/LogAnchor.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/LogAnchor.java
Wed Mar 14 19:06:17 2012
@@ -86,7 +86,7 @@ public class LogAnchor implements Extern
 
     public void resetLogAnchor( LogAnchor logAnchor )
     {
-        resetLogAnchor( logAnchor.getLogFileNumber(), logAnchor.getLogFileOffset(), logAnchor.getLogLSN()
);
+        resetLogAnchor( logAnchor.logFileNumber, logAnchor.logFileOffset, logAnchor.logLSN
);
     }
 
 

Modified: directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/UserLogRecord.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/UserLogRecord.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/UserLogRecord.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/log/UserLogRecord.java
Wed Mar 14 19:06:17 2012
@@ -44,6 +44,18 @@ import java.io.ObjectOutput;
  */
 public class UserLogRecord implements Externalizable
 {
+    /**
+     * An enum used to distinguished the data type being serialized in the UserLogRecord
+     */
+    public enum LogEditType
+    {
+        TXN,
+        DATA;
+    }
+
+    /** The serialized LogEdit type */
+    private LogEditType dataType;
+
     /** array used to hold user log records */
     private byte[] recordHolder;
 
@@ -101,12 +113,23 @@ public class UserLogRecord implements Ex
     @Override
     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
     {
+        // Read the DataType : TXN or DATA
+        int type = in.read();
+
+        dataType = LogEditType.values()[type];
+
+        // The data size
         length = in.readInt();
-        int dataSize = in.readInt();
 
-        recordHolder = new byte[dataSize];
+        // The buffer size
+        int bufferSize = in.readInt();
+
+        recordHolder = new byte[bufferSize];
+
+        // The buffer
         in.readFully( recordHolder );
 
+        // The position
         logAnchor = new LogAnchor();
         logAnchor.readExternal( in );
     }
@@ -124,13 +147,29 @@ public class UserLogRecord implements Ex
     @Override
     public void writeExternal( ObjectOutput out ) throws IOException
     {
+        // The inner data type : TXN or DATA
+        out.write( dataType.ordinal() );
+
+        // The size of the stored data
         out.writeInt( length );
+
+        // The size of the container buffer
         out.writeInt( recordHolder.length );
+
+        // The buffer
         out.write( recordHolder );
+
+        // The position
         logAnchor.writeExternal( out );
     }
 
 
+    public void setType( LogEditType dataType )
+    {
+        this.dataType = dataType;
+    }
+
+
     /**
      * @see Object#toString()
      */

Modified: directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/TxnLogManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/TxnLogManager.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/TxnLogManager.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/TxnLogManager.java
Wed Mar 14 19:06:17 2012
@@ -36,7 +36,6 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.model.name.Dn;
 
 
-
 /**
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
@@ -72,8 +71,7 @@ public interface TxnLogManager
      * @param entry current version of the entry the txn has
      * @return
      */
-    Entry mergeUpdates(Dn partitionDN, UUID entryID,  Entry entry );
-    
+    Entry mergeUpdates( Dn partitionDN, UUID entryID, Entry entry );
 
 
     /**
@@ -131,7 +129,6 @@ public interface TxnLogManager
         String attributeOid, boolean forwardIndex, Object onlyValueKey, UUID onlyIDKey )
throws Exception;
 
 
-    
     /**
      * Returns an index which a provides a transactionally consistent view over the given
index
      *

Modified: directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/AbstractLogEdit.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/AbstractLogEdit.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/AbstractLogEdit.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/AbstractLogEdit.java
Wed Mar 14 19:06:17 2012
@@ -20,7 +20,13 @@
 package org.apache.directory.server.core.api.txn.logedit;
 
 
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectOutputStream;
+
 import org.apache.directory.server.core.api.log.LogAnchor;
+import org.apache.directory.server.core.api.log.UserLogRecord;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -29,13 +35,21 @@ import org.apache.directory.server.core.
  */
 public abstract class AbstractLogEdit implements LogEdit
 {
-    /** position in the wal */
+    /** A logger for this class */
+    private static final Logger LOG = LoggerFactory.getLogger( AbstractLogEdit.class );
+
+    /** Position in the wal */
     private transient LogAnchor logAnchor = new LogAnchor();
 
     /** Transaction under which the change is done */
     protected long txnID;
 
 
+    /**
+     * Create a new instance of AbstractLogEdit
+     * 
+     * @param txnID The transaction ID to store
+     */
     protected AbstractLogEdit( long txnID )
     {
         this.txnID = txnID;
@@ -70,4 +84,44 @@ public abstract class AbstractLogEdit im
     {
         txnID = id;
     }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void injectData( UserLogRecord logRecord, UserLogRecord.LogEditType type ) throws
Exception
+    {
+        logRecord.setType( type );
+        LOG.debug( "Serializing : " + this );
+
+        ObjectOutputStream out = null;
+        ByteArrayOutputStream bout = null;
+        byte[] data;
+
+        try
+        {
+            bout = new ByteArrayOutputStream();
+            out = new ObjectOutputStream( bout );
+
+            // The LogEdit instance
+            writeExternal( out );
+
+            out.flush();
+            data = bout.toByteArray();
+        }
+        finally
+        {
+            if ( bout != null )
+            {
+                bout.close();
+            }
+
+            if ( out != null )
+            {
+                out.close();
+            }
+        }
+
+        logRecord.setData( data, data.length );
+    }
 }

Modified: directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/LogEdit.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/LogEdit.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/LogEdit.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-api/src/main/java/org/apache/directory/server/core/api/txn/logedit/LogEdit.java
Wed Mar 14 19:06:17 2012
@@ -19,15 +19,18 @@
  */
 package org.apache.directory.server.core.api.txn.logedit;
 
-import org.apache.directory.server.core.api.log.LogAnchor;
 
 import java.io.Externalizable;
 
+import org.apache.directory.server.core.api.log.LogAnchor;
+import org.apache.directory.server.core.api.log.UserLogRecord;
+
+
 /**
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public interface LogEdit extends Externalizable 
+public interface LogEdit extends Externalizable
 {
     /**
      * Returns the position the edit is inserted in the wal.
@@ -37,11 +40,22 @@ public interface LogEdit extends Externa
      * @return position of the log edit in the wal
      */
     LogAnchor getLogAnchor();
-    
+
+
     /**
      * Applies the logedit to the underlying partitions
      *
      * @param recovery true if at recovery stage 
      */
     void apply( boolean recovery ) throws Exception;
+
+
+    /**
+     * Serialize the LogEdit into a UserLogRecord
+     * 
+     * @param logRecord The UserLogRecord which will contain the serialized LogEdit
+     * @param type The type of data being written (TXN or DATA)
+     * @throws Exception If the serialization failed
+     */
+    void injectData( UserLogRecord logRecord, UserLogRecord.LogEditType type ) throws Exception;
 }

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/DefaultLogFileManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/DefaultLogFileManager.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/DefaultLogFileManager.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/DefaultLogFileManager.java
Wed Mar 14 19:06:17 2012
@@ -22,16 +22,16 @@ package org.apache.directory.server.core
 
 import java.io.EOFException;
 import java.io.File;
-import java.io.IOException;
 import java.io.FileNotFoundException;
-
+import java.io.IOException;
 import java.io.RandomAccessFile;
 
 
 /**
  * Creates and manages a LogFile on disk. The file name is the concatenation of a 
  * path on disk, and of a suffix.<br/>
- * Each log file has a name like <b>logFileName/log_&lt;logFileNumber&gt;.suffix</b>
+ * Each log file has a name like <b>logFileName/log_&lt;logFileNumber&gt;.suffix</b><br/>
+ * This class expose a reader and a writer for the given log file.
  *  
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/LogFlushManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/LogFlushManager.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/LogFlushManager.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/log/LogFlushManager.java
Wed Mar 14 19:06:17 2012
@@ -20,31 +20,29 @@
 package org.apache.directory.server.core.shared.log;
 
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
-
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.zip.Adler32;
 import java.util.zip.Checksum;
 
+import org.apache.directory.server.core.api.log.InvalidLogException;
 import org.apache.directory.server.core.api.log.LogAnchor;
 import org.apache.directory.server.core.api.log.UserLogRecord;
-import org.apache.directory.server.core.api.log.InvalidLogException;
-
-import java.io.IOException;
-
 import org.apache.directory.server.core.shared.log.LogFileManager.LogFileWriter;
 import org.apache.directory.server.i18n.I18n;
 
 
 /**
- * Manages the flushing of log to media and scanning of logs. All appends to the log file
go through this class. 
+ * Manages the flushing of log to media and scanning of logs. All appends to the log file
go 
+ * through this class. 
  *
  * Internally it manages a circular  buffer where appends initially go. Appends are first

- * appended to this in memory circular log. As the in memory circular log fills up or as
the user requests
- * memory buffer is flushed to the underlying media.  
+ * appended to this in memory circular log. As the in memory circular log fills up or as
the 
+ * user requests, memory buffer is flushed to the underlying media.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
@@ -92,7 +90,7 @@ import org.apache.directory.server.i18n.
 
     /**
      * Creates a LogFlushManager instance. We define the memory buffer size, and the default
maximum
-     * size for each Log file (this maximul size may be exceeded, if one user record is bigger
than 
+     * size for each Log file (this maximum size may be exceeded, if one user record is bigger
than 
      * this maximum size. Log file may be smaller too.
      * 
      * @param logManager The associated LogManager
@@ -191,7 +189,7 @@ import org.apache.directory.server.i18n.
                             // Write the data
                             writeHead.put( userBuffer, 0, length );
 
-                            // Write the footeer
+                            // Write the footer
                             writeFooter( writeHead, ( int ) checksum.getValue() );
 
                             appendedRecord = true;

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnLogManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnLogManager.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnLogManager.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnLogManager.java
Wed Mar 14 19:06:17 2012
@@ -20,9 +20,7 @@
 package org.apache.directory.server.core.shared.txn;
 
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.ObjectOutputStream;
 import java.util.Comparator;
 import java.util.UUID;
 
@@ -105,32 +103,7 @@ public class DefaultTxnLogManager implem
         ReadWriteTxn txn = ( ReadWriteTxn ) curTxn;
         UserLogRecord logRecord = txn.getUserLogRecord();
 
-        ObjectOutputStream out = null;
-        ByteArrayOutputStream bout = null;
-        byte[] data;
-
-        try
-        {
-            bout = new ByteArrayOutputStream();
-            out = new ObjectOutputStream( bout );
-            logEdit.writeExternal( out );
-            out.flush();
-            data = bout.toByteArray();
-        }
-        finally
-        {
-            if ( bout != null )
-            {
-                bout.close();
-            }
-
-            if ( out != null )
-            {
-                out.close();
-            }
-        }
-
-        logRecord.setData( data, data.length );
+        logEdit.injectData( logRecord, UserLogRecord.LogEditType.DATA );
 
         log( logRecord, sync );
 

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnManager.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnManager.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/DefaultTxnManager.java
Wed Mar 14 19:06:17 2012
@@ -20,9 +20,7 @@
 package org.apache.directory.server.core.shared.txn;
 
 
-import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.io.ObjectOutputStream;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -43,6 +41,7 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.api.txn.TxnConflictException;
 import org.apache.directory.server.core.api.txn.TxnHandle;
 import org.apache.directory.server.core.api.txn.TxnLogManager;
+import org.apache.directory.server.core.api.txn.logedit.LogEdit;
 import org.apache.directory.server.core.shared.txn.logedit.TxnStateChange;
 
 
@@ -64,7 +63,7 @@ class DefaultTxnManager implements TxnMa
 
     /** Used to assign start and commit version numbers to writeTxns */
     private Lock writeTxnsLock = new ReentrantLock();
-    
+
     /** Used to order txns in case of conflicts */
     private ReadWriteLock optimisticLock = new ReentrantReadWriteLock();
 
@@ -175,6 +174,7 @@ class DefaultTxnManager implements TxnMa
         syncer = null;
     }
 
+
     /**
      * {@inheritDoc}
      */
@@ -184,19 +184,19 @@ class DefaultTxnManager implements TxnMa
 
         // Should have a rw txn
         if ( ( curTxn == null ) ||
-              !( curTxn instanceof ReadWriteTxn )  )
+            !( curTxn instanceof ReadWriteTxn ) )
         {
             // Cannot start a TXN when a RW txn is ongoing 
             throw new IllegalStateException( "Unexpected txn state when trying txn: " +
                 curTxn );
         }
-        
+
         // abort current txn and start a new read write txn
-        
+
         abortTransaction();
         return beginReadWriteTxn( true );
     }
-    
+
 
     /**
      * {@inheritDoc}
@@ -241,7 +241,7 @@ class DefaultTxnManager implements TxnMa
         {
             throw new IOException( "Flushing of txns failed" );
         }
-        
+
         prepareForEndingTxn( txn );
 
         if ( txn instanceof ReadOnlyTxn )
@@ -265,23 +265,23 @@ class DefaultTxnManager implements TxnMa
     public void abortTransaction() throws Exception
     {
         Transaction txn = getCurTxn();
-        
+
         if ( txn == null )
         {
-            throw new IllegalStateException("Trying to abort while there is not txn ");
+            throw new IllegalStateException( "Trying to abort while there is not txn " );
         }
-        
+
         boolean isExclusive = txn.isExclusive();
 
         try
         {
             prepareForEndingTxn( txn );
-    
+
             if ( txn instanceof ReadWriteTxn )
             {
                 abortReadWriteTxn( ( ReadWriteTxn ) txn );
             }
-    
+
             txn.abortTxn();
             setCurTxn( null );
         }
@@ -420,7 +420,7 @@ class DefaultTxnManager implements TxnMa
 
         buildCheckList( txn, lastTxnToCheck );
 
-        optimisticLock.readLock().lock(); 
+        optimisticLock.readLock().lock();
         setCurTxn( txn );
 
         //System.out.println( "TRAN: Started " + txn );
@@ -440,35 +440,11 @@ class DefaultTxnManager implements TxnMa
         ReadWriteTxn txn = new ReadWriteTxn();
         UserLogRecord logRecord = txn.getUserLogRecord();
 
-        TxnStateChange txnRecord = new TxnStateChange( LogAnchor.UNKNOWN_LSN,
+        LogEdit logEdit = new TxnStateChange( LogAnchor.UNKNOWN_LSN,
             TxnStateChange.ChangeState.TXN_BEGIN );
-        ObjectOutputStream out = null;
-        ByteArrayOutputStream bout = null;
-        byte[] data;
 
-        try
-        {
-            bout = new ByteArrayOutputStream();
-            out = new ObjectOutputStream( bout );
-            txnRecord.writeExternal( out );
-            out.flush();
-            data = bout.toByteArray();
-        }
-        finally
-        {
-            if ( bout != null )
-            {
-                bout.close();
-            }
+        logEdit.injectData( logRecord, UserLogRecord.LogEditType.TXN );
 
-            if ( out != null )
-            {
-                out.close();
-            }
-        }
-
-        logRecord.setData( data, data.length );
-        
         if ( retry == false )
         {
             optimisticLock.readLock().lock();
@@ -506,7 +482,7 @@ class DefaultTxnManager implements TxnMa
             }
             while ( lastTxnToCheck != latestVerifiedTxn.get() );
         }
-        catch( Exception e )
+        catch ( Exception e )
         {
             if ( txn.isExclusive() == false )
             {
@@ -657,34 +633,10 @@ class DefaultTxnManager implements TxnMa
     {
         UserLogRecord logRecord = txn.getUserLogRecord();
 
-        TxnStateChange txnRecord = new TxnStateChange( txn.getStartTime(),
+        LogEdit logEdit = new TxnStateChange( txn.getStartTime(),
             TxnStateChange.ChangeState.TXN_COMMIT );
-        ObjectOutputStream out = null;
-        ByteArrayOutputStream bout = null;
-        byte[] data;
 
-        try
-        {
-            bout = new ByteArrayOutputStream();
-            out = new ObjectOutputStream( bout );
-            txnRecord.writeExternal( out );
-            out.flush();
-            data = bout.toByteArray();
-        }
-        finally
-        {
-            if ( bout != null )
-            {
-                bout.close();
-            }
-
-            if ( out != null )
-            {
-                out.close();
-            }
-        }
-
-        logRecord.setData( data, data.length );
+        logEdit.injectData( logRecord, UserLogRecord.LogEditType.TXN );
 
         verifyLock.lock();
 
@@ -738,34 +690,11 @@ class DefaultTxnManager implements TxnMa
     {
         UserLogRecord logRecord = txn.getUserLogRecord();
 
-        TxnStateChange txnRecord = new TxnStateChange( txn.getStartTime(),
+        LogEdit logEdit = new TxnStateChange( txn.getStartTime(),
             TxnStateChange.ChangeState.TXN_ABORT );
-        ObjectOutputStream out = null;
-        ByteArrayOutputStream bout = null;
-        byte[] data;
 
-        try
-        {
-            bout = new ByteArrayOutputStream();
-            out = new ObjectOutputStream( bout );
-            out.writeObject( txnRecord );
-            out.flush();
-            data = bout.toByteArray();
-        }
-        finally
-        {
-            if ( bout != null )
-            {
-                bout.close();
-            }
-
-            if ( out != null )
-            {
-                out.close();
-            }
-        }
+        logEdit.injectData( logRecord, UserLogRecord.LogEditType.TXN );
 
-        logRecord.setData( data, data.length );
         txnLogManager.log( logRecord, false );
     }
 

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/DataChangeContainer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/DataChangeContainer.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/DataChangeContainer.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/DataChangeContainer.java
Wed Mar 14 19:06:17 2012
@@ -72,6 +72,7 @@ public class DataChangeContainer extends
     public DataChangeContainer( Partition partition )
     {
         super( Long.MIN_VALUE );
+
         this.partitionDn = partition.getSuffixDn();
         this.partition = partition;
     }

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryChange.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryChange.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryChange.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/EntryChange.java
Wed Mar 14 19:06:17 2012
@@ -92,7 +92,7 @@ public class EntryChange implements Entr
             }
         }
 
-        // TODO in reovery mode, check the version of the entry. 
+        // TODO in recovery mode, check the version of the entry. 
         try
         {
             AttributeUtils.applyModification( curEntry, redoChange );

Modified: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java?rev=1300690&r1=1300689&r2=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/IndexChange.java
Wed Mar 14 19:06:17 2012
@@ -62,6 +62,15 @@ public class IndexChange implements Inde
     }
 
 
+    /**
+     * Create a new IndexChange instance.
+     * 
+     * @param index The changed index
+     * @param key The index' key
+     * @param id The entry's UUID
+     * @param type The change type, Add or Delete
+     * @param isSystemIndex Tells f the index is a system index or a user index
+     */
     public IndexChange( Index<?> index, Object key, UUID id, Type type, boolean isSystemIndex
)
     {
         this.index = index;
@@ -155,7 +164,29 @@ public class IndexChange implements Inde
     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
     {
         oid = in.readUTF();
-        key = in.readObject();
+        KeyType keyType = KeyType.getType( in.readByte() );
+
+        switch ( keyType )
+        {
+            case STRING:
+                key = in.readUTF();
+                break;
+
+            case LONG:
+                key = in.readLong();
+                break;
+
+            case BYTES:
+                int length = in.readInt();
+                key = new byte[length];
+                in.read( ( byte[] ) key );
+                break;
+
+            case OBJECT:
+                key = in.readObject();
+                break;
+        }
+
         id = UUID.fromString( in.readUTF() );
         type = Type.values()[in.readInt()];
     }
@@ -165,7 +196,29 @@ public class IndexChange implements Inde
     public void writeExternal( ObjectOutput out ) throws IOException
     {
         out.writeUTF( oid );
-        out.writeObject( key );
+
+        if ( key instanceof String )
+        {
+            out.write( KeyType.STRING.getOrdinal() );
+            out.writeUTF( ( String ) key );
+        }
+        else if ( key instanceof byte[] )
+        {
+            out.write( KeyType.BYTES.getOrdinal() );
+            out.writeInt( ( ( byte[] ) key ).length );
+            out.write( ( byte[] ) key );
+        }
+        else if ( key instanceof Long )
+        {
+            out.write( KeyType.LONG.getOrdinal() );
+            out.writeLong( ( Long ) key );
+        }
+        else
+        {
+            out.write( KeyType.OBJECT.getOrdinal() );
+            out.writeObject( key );
+        }
+
         out.writeUTF( id.toString() );
         out.writeInt( type.ordinal() );
     }
@@ -185,6 +238,7 @@ public class IndexChange implements Inde
         StringBuilder sb = new StringBuilder();
 
         sb.append( "IndexChange '" );
+
         // The index's name
         sb.append( index.getAttributeId() ).append( "': " );
 
@@ -201,4 +255,42 @@ public class IndexChange implements Inde
 
         return sb.toString();
     }
+
+    private enum KeyType
+    {
+        STRING(0),
+        LONG(1),
+        BYTES(2),
+        OBJECT(3);
+
+        private int value;
+
+
+        private KeyType( int value )
+        {
+            this.value = value;
+        }
+
+
+        private byte getOrdinal()
+        {
+            return ( byte ) value;
+        }
+
+
+        private static KeyType getType( byte value )
+        {
+            switch ( value )
+            {
+                case 0:
+                    return STRING;
+                case 1:
+                    return LONG;
+                case 2:
+                    return BYTES;
+                default:
+                    return OBJECT;
+            }
+        }
+    }
 }

Copied: directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java
(from r1299595, directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java)
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java?p2=directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java&p1=directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java&r1=1299595&r2=1300690&rev=1300690&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java
(original)
+++ directory/apacheds/branches/apacheds-txns/core-shared/src/main/java/org/apache/directory/server/core/shared/txn/logedit/TxnStateChange.java
Wed Mar 14 19:06:17 2012
@@ -28,31 +28,60 @@ import org.apache.directory.server.core.
 
 
 /**
+ * A class used to store a transaction changeState (either BEGIN, COMMIT or ABORT).
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
 public class TxnStateChange extends AbstractLogEdit
 {
+    /** SerialVrsionUID as requested for serializable classes */
+    private static final long serialVersionUID = 1;
+
+    /**
+     * Change State, one of :
+     * <ul>
+     * <li>TXN_BEGIN : for a starting transaction</li>
+     * <li>TXN_COMMIT :  for a validated transaction</li>
+     * <li>TXN_ABORT : for an aborted transaction</li>
+     * </ul>
+     */
+    public enum ChangeState
+    {
+        TXN_BEGIN,
+        TXN_COMMIT,
+        TXN_ABORT
+    }
+
     /** State to record for the txn */
     ChangeState txnState;
 
-    private static final long serialVersionUID = 1;
-
 
-    // For deserialization
+    /**
+     * A default constructor used by deserialization
+     */
     public TxnStateChange()
     {
         super( Long.MIN_VALUE );
     }
 
 
+    /**
+     * Creates a new TxnStateChange instance, with a transaction ID and a ChangeState.
+     * 
+     * @param txnID The transaction ID
+     * @param txnState The ChangeState
+     */
     public TxnStateChange( long txnID, ChangeState txnState )
     {
         super( txnID );
+
         this.txnState = txnState;
     }
 
 
+    /**
+     * @return The ChangeState for this transaction
+     */
     public ChangeState getTxnState()
     {
         return txnState;
@@ -74,10 +103,12 @@ public class TxnStateChange extends Abst
         out.writeInt( txnState.ordinal() );
     }
 
-    public enum ChangeState
+
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
     {
-        TXN_BEGIN,
-        TXN_COMMIT,
-        TXN_ABORT
+        return "TxnStateChange[" + txnID + "/" + txnState + "]";
     }
 }



Mime
View raw message