You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2011/11/01 11:47:39 UTC

svn commit: r1195921 - in /directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log: DefaultLog.java DefaultLogScanner.java LogFileManager.java LogFileRecords.java LogFlushManager.java LogManager.java

Author: elecharny
Date: Tue Nov  1 10:47:39 2011
New Revision: 1195921

URL: http://svn.apache.org/viewvc?rev=1195921&view=rev
Log:
o Added some toString methods
o Added a getMilLogAnchor method in LogManager
o Added some missing Javadoc
o Added some comments
o Minor refactoring

Modified:
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLog.java
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLogScanner.java
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileManager.java
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileRecords.java
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFlushManager.java
    directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogManager.java

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLog.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLog.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLog.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLog.java Tue Nov  1 10:47:39 2011
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 
 /**
+ * Log interface default Implementation. 
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
@@ -91,6 +92,7 @@ public class DefaultLog implements Log
        logManager.advanceMinLogAnchor( newAnchor ); 
     }
     
+    
     /**
      * {@inheritDoc}
      */
@@ -98,4 +100,13 @@ public class DefaultLog implements Log
     {
        logFlushManager.sync( uptoLSN ); 
     }
+    
+    
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        return "Log{" + logFileManager + "}";
+    }
 }

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLogScanner.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLogScanner.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLogScanner.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/DefaultLogScanner.java Tue Nov  1 10:47:39 2011
@@ -257,6 +257,9 @@ public class DefaultLogScanner implement
     }
     
     
+    /**
+     * Read the user record header
+     */
     private int readRecordHeader() throws IOException, InvalidLogException, EOFException
     {
         markerHead.rewind();
@@ -281,6 +284,9 @@ public class DefaultLogScanner implement
     }
     
     
+    /**
+     * Read the user record footer.
+     */
     private void readRecordFooter( int expectedChecksum ) throws IOException, InvalidLogException, EOFException 
     {
         markerHead.rewind();
@@ -302,7 +308,7 @@ public class DefaultLogScanner implement
     
     
     /**
-     * Read the data from the LogFile, excludinhg the header and footer. 
+     * Read the data from the LogFile, excluding the header and footer. 
      */
     private void readLogRecord( UserLogRecord userRecord, int length ) throws IOException, EOFException
     {
@@ -369,7 +375,9 @@ public class DefaultLogScanner implement
         return logFileReader;
     }
     
-    
+    /**
+     * Verify that the Log is not closed.
+     */
     private void checkIfClosed()
     {
         if ( closed == true )
@@ -379,6 +387,9 @@ public class DefaultLogScanner implement
     }
     
     
+    /**
+     * Mark the file as invalid and throw an InvalidLogException
+     */
     private void markScanInvalid( Exception cause ) throws InvalidLogException
     {
         invalidLog = true;

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileManager.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileManager.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileManager.java Tue Nov  1 10:47:39 2011
@@ -31,6 +31,7 @@ import java.io.FileNotFoundException;
  */
 /* Package protected */ interface LogFileManager
 {
+    /** The log file prefix */
     final static String LOG_NAME_PREFIX = "log_"; 
   
     /**
@@ -38,8 +39,8 @@ import java.io.FileNotFoundException;
      *
      * @param logFileNumber identifier of the log file to read
      * @return reader for the given logfile
-     * @throws IOException
-     * @throws FileNotFoundException
+     * @throws IOException If there is an issue accessing the LogFile
+     * @throws FileNotFoundException If the log file can't be found
      */
     LogFileReader getReaderForLogFile( long logFileNumber ) throws IOException, FileNotFoundException;
     
@@ -49,8 +50,8 @@ import java.io.FileNotFoundException;
      *
      * @param logFileNumber identifier of the log file to read
      * @return writer for the given logfile
-     * @throws IOException
-     * @throws FileNotFoundException
+     * @throws IOException If there is an issue accessing the LogFile
+     * @throws FileNotFoundException If the log file can't be found
      */
     LogFileWriter getWriterForLogFile( long logFileNumber ) throws IOException, FileNotFoundException;
     
@@ -60,7 +61,7 @@ import java.io.FileNotFoundException;
      * 
      * @param logFileNumber identifier of the log file to write to.
      * @return true if file already existed
-     * @throws IOException
+     * @throws IOException If there is an issue creating the LogFile
      */
     boolean createLogFile( long logFileNumber ) throws IOException;
     
@@ -71,7 +72,7 @@ import java.io.FileNotFoundException;
      *
      * @param logFileNumber identifier of the log file
      * @param size new size of the file
-     * @throws IOException
+     * @throws IOException If there is an issue truncating the LogFile
      */
     void truncateLogFile( long logFileNumber, long size ) throws IOException;
     
@@ -91,7 +92,7 @@ import java.io.FileNotFoundException;
      * @param newLongFileNumber identifier of the new file
      * @return true if the rename succeeded
      */
-    boolean rename(long orignalLogFileNumber, long newLongFileNumber);
+    boolean rename( long orignalLogFileNumber, long newLongFileNumber );
     
     
     /**

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileRecords.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileRecords.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileRecords.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFileRecords.java Tue Nov  1 10:47:39 2011
@@ -21,6 +21,7 @@ package org.apache.directory.server.core
 
 
 /**
+ * A helper class defining the various magic numbers, headers and footers constants.
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFlushManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFlushManager.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFlushManager.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogFlushManager.java Tue Nov  1 10:47:39 2011
@@ -85,10 +85,13 @@ import org.apache.directory.server.i18n.
     private Checksum checksum = new Adler32();
 
     /**
-     * TODO : doco
-     * @param logManager
-     * @param logMemoryBufferSize
-     * @param logFileSize
+     * 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 
+     * this maximum size. Log file may be smaller too.
+     * 
+     * @param logManager The associated LogManager
+     * @param logMemoryBufferSize The buffer size
+     * @param logFileSize The default max size for each Log file.
      */
     public LogFlushManager( LogManager logManager, int logMemoryBufferSize, long logFileSize )
     {
@@ -111,33 +114,33 @@ import org.apache.directory.server.i18n.
      *
      * @param userLogRecord provides the user data to be appended to the log
      * @param sync if true, this calls returns after making sure that the appended data is reflected to the underlying file
-     * @throws IOException
-     * @throws InvalidLogException
+     * @throws IOException If we had an issue while appending some record in the file
+     * @throws InvalidLogException If the log system is is declared as invalid, due to a previous error
      */
     public void append( UserLogRecord userRecord, boolean sync ) throws IOException, InvalidLogException
     {
-        long lsn = LogAnchor.UNKNOWN_LSN;
         boolean appendedRecord = false;
         byte[] userBuffer = userRecord.getDataBuffer();
         int length  = userRecord.getDataLength();
         LogAnchor userLogAnchor = userRecord.getLogAnchor(); 
         
-        int recordSize = LogFileRecords.RECORD_HEADER_SIZE + LogFileRecords.RECORD_FOOTER_SIZE + length;
+        int recordSize = LogFileRecords.RECORD_HEADER_SIZE + length + LogFileRecords.RECORD_FOOTER_SIZE;
         
         // The addition of a record is done in a protected section
         appendLock.lock();
         
+        // Get out immediately if the log system is invalid
         if ( logFailed )
         {
             appendLock.unlock();
             throw new InvalidLogException( I18n.err( I18n.ERR_750 ) );
         }
         
+        // Get a new sequence number for the logged data
+        long lsn = logLSN++;
+
         try
         {
-            lsn = logLSN++;
-            
-            
             // Compute the checksum for the user record
             checksum.reset();
             checksum.update( userBuffer, 0, length );
@@ -257,11 +260,14 @@ import org.apache.directory.server.i18n.
         }
     }
     
+    
     /**
      * Syncs the log upto the given lsn. If lsn is equal to unknow lsn, then the log is 
      * flushed upto the latest logged lsn.
      *
      * @param uptoLSN lsn to flush upto. Unkown lsn if caller just wants to sync the log upto the latest logged lsn.
+     * @throws IOException If we had an issue while flushing some record in the file
+     * @throws InvalidLogException If the log system is is declared as invalid, due to a previous error
      */
     void sync( long uptoLSN ) throws IOException, InvalidLogException
     {
@@ -299,15 +305,13 @@ import org.apache.directory.server.i18n.
      * complete, the thread that wakes up and does the sync will take it for the team and sync upto flushStatus.uptoLSN so 
      * that logging is more efficient.
      * 
-     *  
-     *
      * @param flushLSN max LSN the calling thread wants to sync upto
      * @param userBuffer if not null, user buffer is appended to the log without any buffering
      * @param offset offset of data in user buffer
      * @param length length of user data
      * @param appendLockHeld true if append lock is held
-     * @throws IOException
-     * @throws InvalidLogException
+     * @throws IOException If we had an issue while flushing some record in the file
+     * @throws InvalidLogException If the log system is is declared as invalid, due to a previous error
      */
     private void flush( long flushLSN, byte[] userBuffer, int offset, int length, 
                         boolean appendLockHeld ) throws IOException, InvalidLogException
@@ -552,6 +556,9 @@ import org.apache.directory.server.i18n.
     }
     
     
+    /**
+     * Write the log file header 
+     */
     private void writeHeader( ByteBuffer buffer, int length, long lsn )
     {
         buffer.putInt( LogFileRecords.RECORD_HEADER_MAGIC_NUMBER );
@@ -561,6 +568,9 @@ import org.apache.directory.server.i18n.
     }
     
     
+    /**
+     * Write the log file footer 
+     */
     private void writeFooter( ByteBuffer buffer, int checksum )
     {
         buffer.putInt( checksum );
@@ -602,8 +612,6 @@ import org.apache.directory.server.i18n.
         
         /**
          * Create a new instance of a LogBuffer
-         * @param bufferSize
-         * @param currentLogFile
          */
         private LogBuffer( int bufferSize, LogFileWriter currentLogFile )
         {

Modified: directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogManager.java?rev=1195921&r1=1195920&r2=1195921&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogManager.java (original)
+++ directory/apacheds/branches/apacheds-txns/core/src/main/java/org/apache/directory/server/core/log/LogManager.java Tue Nov  1 10:47:39 2011
@@ -87,6 +87,11 @@ import org.apache.directory.server.i18n.
     private Checksum checksum = new Adler32();
 
     
+    /**
+     * Creates a new instance of LogManager. It manages the control file and 
+     * 
+     * @param logFileManager The associated LogFileManager
+     */
     public LogManager( LogFileManager logFileManager )
     {
         this.logFileManager = logFileManager;
@@ -101,8 +106,8 @@ import org.apache.directory.server.i18n.
      * determine the end of the log.
      * This scan ends either when a properly ended log file is found or a partially written log record is found. 
      *
-     * @throws IOException
-     * @throws InvalidLogException
+     * @throws IOException If we had an issue accessing the log files
+     * @throws InvalidLogException If any of the user record is invalid
      */
     public void initLogManager() throws IOException, InvalidLogException
     {
@@ -136,11 +141,13 @@ import org.apache.directory.server.i18n.
             logRecord = new UserLogRecord();
             scanner = new DefaultLogScanner( scanPoint, logFileManager );
             
+            // Now, scan all the logged user records to check if they are all valid
             try
             {
                 while ( scanner.getNextRecord( logRecord ) )
                 {
-                    // No need to do anything with the log record
+                    // No need to do anything with the log record, just
+                    // read all of them to check that they are all valid.
                 }
             }
             catch( InvalidLogException e )
@@ -187,7 +194,6 @@ import org.apache.directory.server.i18n.
                 try
                 {
                     reader = logFileManager.getReaderForLogFile( ( lastGoodLogFileNumber + 1 ) );
-                    
                 }
                 catch ( FileNotFoundException e )
                 {
@@ -267,9 +273,9 @@ import org.apache.directory.server.i18n.
      * of this tasks can be delegated to a background thread later. 
      *
      * @param currentWriter current log file used by the flush manager. Null if the flush manager is just starting up.
-     * @return new lgo file to be used.
-     * @throws IOException
-     * @throws InvalidLogException
+     * @return new log file to be used.
+     * @throws IOException If we had an issue accessing the log files
+     * @throws InvalidLogException If any of the user record is invalid
      */
     public LogFileManager.LogFileWriter switchToNextLogFile( LogFileManager.LogFileWriter currentWriter ) throws IOException, InvalidLogException
     {
@@ -291,6 +297,21 @@ import org.apache.directory.server.i18n.
         return writer;
     }
     
+    
+    /**
+     * @return The anchor associated with the last valid checkpoint.
+     */
+    /* Package protected */ LogAnchor getMinLogAnchor()
+    {
+        minLogAnchorLock.lock();
+        LogAnchor anchor = new LogAnchor();
+        anchor.resetLogAnchor( minLogAnchor );
+        minLogAnchorLock.unlock();
+        
+        return anchor;
+    }
+    
+    
     /**
      * Called when the logging subsystem is notified about the minimum position 
      * in the log files that is needed. Log manager uses this information to advance
@@ -333,7 +354,7 @@ import org.apache.directory.server.i18n.
      * </ul>
      * 
      *
-     * @throws IOException
+     * @throws IOException If we can't write the control file
      */
     private void writeControlFile() throws IOException
     {
@@ -396,9 +417,9 @@ import org.apache.directory.server.i18n.
     /**
      * Read and verifies the control file.
      *
-     * @throws IOException
-     * @throws InvalidLogException
-     * @throws FileNotFoundException
+     * @throws IOException If we can't read the control file
+     * @throws InvalidLogException If the control file is invalid
+     * @throws FileNotFoundException If the control file can't be found
      */
     private void readControlFile() throws IOException, InvalidLogException, FileNotFoundException
     {
@@ -445,8 +466,8 @@ import org.apache.directory.server.i18n.
      * its size is truncated to zero and file header is written again.
      *
      * @param reformatExistingFile log file already exists and should be formatted. If false, log file should not exist.
-     * @throws IOException
-     * @throws InvalidLogException
+     * @throws IOException If we can't create the new log file
+     * @throws InvalidLogException If we already have a log file with the same number
      */
     private void createNextLogFile( boolean reformatExistingFile ) throws IOException, InvalidLogException
     {
@@ -493,6 +514,9 @@ import org.apache.directory.server.i18n.
     }
     
     
+    /**
+     * Purge the useless log files
+     */
     private void deleteUnnecessaryLogFiles( long startingLogFileNumber, long endingLogFileNumber )
     {
         for ( long logFileNumber = startingLogFileNumber; logFileNumber < endingLogFileNumber; 
@@ -509,10 +533,19 @@ import org.apache.directory.server.i18n.
      */
      private class ControlFileRecord
      {
-         long minExistingLogFile;
-         long minNeededLogFile;
-         long minNeededLogFileOffset;
-         long minNeededLSN;
-         long checksum;
+         /** The smallest existing log file number */
+         private long minExistingLogFile;
+         
+         /** The log file number associated with a checkpoint */
+         private long minNeededLogFile;
+         
+         /** The offset in the min needed log file */
+         private long minNeededLogFileOffset;
+         
+         /** The LSN of the first user record in the min needed log file at the offset position */
+         private long minNeededLSN;
+         
+         /** The control file checksum */
+         private long checksum;
      }
 }