Class 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 Detail

      • open

        boolean open
      • currentLogFileNumber

        long currentLogFileNumber
      • currentLogFileFirstUnflushedPosition

        long currentLogFileFirstUnflushedPosition
      • currentInstant

        long currentInstant
      • firstUnflushed

        long firstUnflushed
      • firstUnflushedFileNumber

        long firstUnflushedFileNumber
      • firstUnflushedFilePosition

        long firstUnflushedFilePosition
      • 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.
    • 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
      • setCurrentLogFileFirstUnflushedPosition

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

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