org.apache.derby.impl.store.raw.log
Class FlushedScan

java.lang.Object
  extended by org.apache.derby.impl.store.raw.log.FlushedScan
All Implemented Interfaces:
LogScan, StreamLogScan

public class FlushedScan
extends java.lang.Object
implements StreamLogScan

Scan the the log which is implemented by a series of log files.n This log scan knows how to move across log file if it is positioned at the boundary of a log file and needs to getNextRecord.

        4 bytes - length of user data, i.e. N
        8 bytes - long representing log instant
        N bytes of supplied data
        4 bytes - length of user data, i.e. N
        


Field Summary
(package private)  long currentInstant
           
(package private)  long currentLogFileFirstUnflushedPosition
           
(package private)  long currentLogFileNumber
           
(package private)  long firstUnflushed
           
(package private)  long firstUnflushedFileNumber
           
(package private)  long firstUnflushedFilePosition
           
(package private) static int LOG_REC_LEN_BYTE_LENGTH
           
(package private)  LogToFile logFactory
           
(package private)  int nextRecordLength
          The length of the next record.
(package private)  boolean open
           
(package private)  boolean readNextRecordLength
          Flag to indicate that the length of the next log record has been read by currentLogFileHasUnflushedRecord.
private  StorageRandomAccessFile scan
           
 
Constructor Summary
FlushedScan(LogToFile logFactory, long startAt)
           
 
Method Summary
 void close()
          Close the scan.
private  boolean currentLogFileHasUnflushedRecord()
           
 long getInstant()
          Return the log instant (as an integer) the scan is currently on - this is the log instant of the log record that was returned by getNextRecord.
 LogInstant getLogInstant()
          Return the log instant the scan is currently on - this is the log instant of the log record that was returned by getNextRecord.
 long getLogRecordEnd()
          Get the log instant that is right after the record just retrived
 LogRecord getNextRecord(ArrayInputStream input, TransactionId tranId, int groupmask)
          Read a log record into the byte array provided.
 boolean isLogEndFuzzy()
          returns true if there is partially writen log records before the crash in the last log file.
private  boolean positionToNextRecord()
           
 void resetPosition(LogInstant instant)
          Reset the scan to the given LogInstant.
private  void setCurrentLogFileFirstUnflushedPosition()
           
private  void setFirstUnflushed()
           
private  void switchLogFile()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

scan

private StorageRandomAccessFile scan

logFactory

LogToFile logFactory

open

boolean open

currentLogFileNumber

long currentLogFileNumber

currentLogFileFirstUnflushedPosition

long currentLogFileFirstUnflushedPosition

currentInstant

long currentInstant

firstUnflushed

long firstUnflushed

firstUnflushedFileNumber

long firstUnflushedFileNumber

firstUnflushedFilePosition

long firstUnflushedFilePosition

LOG_REC_LEN_BYTE_LENGTH

static final int LOG_REC_LEN_BYTE_LENGTH
See Also:
Constant Field Values

nextRecordLength

int nextRecordLength
The length of the next record. Read from scan and set by currentLogFileHasUnflushedRecord. This is used to retain the length of a log record in the case currentLogFileHasUnflushedRecord reads the length and determines that some bytes in the log record are not yet flushed.


readNextRecordLength

boolean readNextRecordLength
Flag to indicate that the length of the next log record has been read by currentLogFileHasUnflushedRecord. This flag gets reset in two ways:
  1. currentLogFileHasUnflushedRecord determines that the entire log record is flushed and returns true. In this case getNextRecord reads and returns the log record.
  2. we switch log files --due to a partial log record at the end of an old log file.

Constructor Detail

FlushedScan

public FlushedScan(LogToFile logFactory,
                   long startAt)
            throws StandardException
Throws:
StandardException
Method Detail

getNextRecord

public LogRecord getNextRecord(ArrayInputStream input,
                               TransactionId tranId,
                               int groupmask)
                        throws StandardException
Read a log record into the byte array provided. Resize the input stream byte array if necessary.

Specified by:
getNextRecord in interface StreamLogScan
Parameters:
input - the ArrayInputStream to put the log record
tranId - if non-null, only log record that equals tranId will be returned. If null, log records are not filtered on transaction Id.
groupmask - if non-zero, only log record whose Loggable's group value is included in the groupmask is returned. groupmask can be a bit wise OR of many Loggable groups. If zero, log records are not filtered on the Loggable's group.
Returns:
the length of the data written into data, or -1 if the end of the scan has been reached.
Throws:
StandardException - Standard Derby error policy

resetPosition

public void resetPosition(LogInstant instant)
                   throws java.io.IOException
Reset the scan to the given LogInstant.

Specified by:
resetPosition in interface StreamLogScan
Parameters:
instant - the position to reset to
Throws:
java.io.IOException - scan cannot access the log at the new position.

getLogRecordEnd

public long getLogRecordEnd()
Get the log instant that is right after the record just retrived

Specified by:
getLogRecordEnd in interface StreamLogScan
Returns:
INVALID_LOG_INSTANT if this is not a FORWARD scan or, no record have been returned yet or the scan has completed.

isLogEndFuzzy

public boolean isLogEndFuzzy()
returns true if there is partially writen log records before the crash in the last log file. Partiall wrires are identified during forward scans for log recovery.

Specified by:
isLogEndFuzzy in interface StreamLogScan
Returns:
true if fuzzy log end found during forward scan, this happens if there was a partially written log records before the crash.

getInstant

public long getInstant()
Return the log instant (as an integer) the scan is currently on - this is the log instant of the log record that was returned by getNextRecord.

Specified by:
getInstant in interface StreamLogScan
Returns:
INVALID_LOG_INSTANT if no records have been returned yet or the scan has completed.

getLogInstant

public LogInstant getLogInstant()
Return the log instant the scan is currently on - this is the log instant of the log record that was returned by getNextRecord.

Specified by:
getLogInstant in interface StreamLogScan
Returns:
null if no records have been returned yet or the scan has completed.

close

public void close()
Close the scan.

Specified by:
close in interface StreamLogScan

setFirstUnflushed

private void setFirstUnflushed()
                        throws StandardException,
                               java.io.IOException
Throws:
StandardException
java.io.IOException

setCurrentLogFileFirstUnflushedPosition

private void setCurrentLogFileFirstUnflushedPosition()
                                              throws java.io.IOException
Throws:
java.io.IOException

switchLogFile

private void switchLogFile()
                    throws StandardException
Throws:
StandardException

currentLogFileHasUnflushedRecord

private boolean currentLogFileHasUnflushedRecord()
                                          throws java.io.IOException
Throws:
java.io.IOException

positionToNextRecord

private boolean positionToNextRecord()
                              throws StandardException,
                                     java.io.IOException
Throws:
StandardException
java.io.IOException

Built on Thu 2010-12-23 20:49:13+0000, from revision ???

Apache Derby V10.6 Internals - Copyright © 2004,2007 The Apache Software Foundation. All Rights Reserved.