Class FileLogger
- java.lang.Object
-
- org.apache.derby.impl.store.raw.log.FileLogger
-
- All Implemented Interfaces:
Logger
public class FileLogger extends java.lang.Object implements Logger
Write log records to a log file as a stream (ie. log records added to the end of the file, no concept of pages).The format of a log record that is not a compensation operation is
- See Also:
LogRecord
-
-
Field Summary
Fields Modifier and Type Field Description protected byte[]encryptionBufferprivate LogToFilelogFactoryprivate FormatIdOutputStreamlogicalOutprivate ArrayInputStreamlogInprivate DynamicByteArrayOutputStreamlogOutputBufferprivate LogRecordlogRecord
-
Constructor Summary
Constructors Constructor Description FileLogger(LogToFile logFactory)Make a new Logger with its own log record buffers MT - not needed for constructor
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidclose()Close the logger.voidflush(LogInstant where)Flush the log up to the given log instant.voidflushAll()Flush all outstanding log to disk.LogInstantlogAndDo(RawTransaction xact, Loggable operation)Writes out a log record to the log stream, and call its doMe method to apply the change to the rawStore.LogInstantlogAndUndo(RawTransaction xact, Compensation compensation, LogInstant undoInstant, LimitObjectInput in)Writes out a compensation log record to the log stream, and call its doMe method to undo the change of a previous log operation.protected LoggablereadLogRecord(StreamLogScan scan, int size)Read the next log record from the scan.protected longredo(RawTransaction recoveryTransaction, TransactionFactory transFactory, StreamLogScan redoScan, long redoLWM, long ttabInstant)Recovery Redo loop.voidreprepare(RawTransaction t, TransactionId prepareId, LogInstant prepareStopAt, LogInstant prepareStartAt)During recovery re-prepare a transaction.voidundo(RawTransaction t, TransactionId undoId, LogInstant undoStopAt, LogInstant undoStartAt)Undo a part of or the entire transaction.
-
-
-
Field Detail
-
logRecord
private LogRecord logRecord
-
encryptionBuffer
protected byte[] encryptionBuffer
-
logOutputBuffer
private DynamicByteArrayOutputStream logOutputBuffer
-
logicalOut
private FormatIdOutputStream logicalOut
-
logIn
private ArrayInputStream logIn
-
logFactory
private LogToFile logFactory
-
-
Constructor Detail
-
FileLogger
public FileLogger(LogToFile logFactory)
Make a new Logger with its own log record buffers MT - not needed for constructor
-
-
Method Detail
-
close
public void close() throws java.io.IOExceptionClose the logger. MT - caller provide synchronization (RESOLVE: not called by anyone ??)- Throws:
java.io.IOException
-
logAndDo
public LogInstant logAndDo(RawTransaction xact, Loggable operation) throws StandardException
Writes out a log record to the log stream, and call its doMe method to apply the change to the rawStore.
Any optional data the doMe method need is first written to the log stream using operation.writeOptionalData, then whatever is written to the log stream is passed back to the operation for the doMe method.MT - there could be multiple threads running in the same raw transactions and they can be calling the same logger to log different log operations. This whole method is synchronized to make sure log records are logged one at a time.
- Specified by:
logAndDoin interfaceLogger- Parameters:
xact- the transaction logging the changeoperation- the log operation- Returns:
- the instant in the log that can be used to identify the log record
- Throws:
StandardException- Derby Standard error policy
-
logAndUndo
public LogInstant logAndUndo(RawTransaction xact, Compensation compensation, LogInstant undoInstant, LimitObjectInput in) throws StandardException
Writes out a compensation log record to the log stream, and call its doMe method to undo the change of a previous log operation.MT - Not needed. A transaction must be single threaded thru undo, each RawTransaction has its own logger, therefore no need to synchronize. The RawTransaction must handle synchronizing with multiple threads during rollback.
- Specified by:
logAndUndoin interfaceLogger- Parameters:
xact- the transaction logging the changecompensation- the compensation log operationundoInstant- the log instant of the operation that is to be rolled backin- optional data input for the compenastion doMe method- Returns:
- the instant in the log that can be used to identify the log record
- Throws:
StandardException- Derby Standard error policy
-
flush
public void flush(LogInstant where) throws StandardException
Flush the log up to the given log instant.MT - not needed, wrapper method
- Specified by:
flushin interfaceLogger- Parameters:
where- flush log up to here- Throws:
StandardException- cannot sync log file
-
flushAll
public void flushAll() throws StandardExceptionFlush all outstanding log to disk.MT - not needed, wrapper method
- Specified by:
flushAllin interfaceLogger- Throws:
StandardException- cannot sync log file
-
reprepare
public void reprepare(RawTransaction t, TransactionId prepareId, LogInstant prepareStopAt, LogInstant prepareStartAt) throws StandardException
During recovery re-prepare a transaction.After redo() and undo(), this routine is called on all outstanding in-doubt (prepared) transactions. This routine re-acquires all logical write locks for operations in the xact, and then modifies the transaction table entry to make the transaction look as if it had just been prepared following startup after recovery.
- Specified by:
repreparein interfaceLogger- Parameters:
t- is the transaction performing the re-prepareprepareId- is the transaction ID to be re-preparedprepareStopAt- is where the log instant (inclusive) where the re-prepare should stop.prepareStartAt- is the log instant (inclusive) where re-prepare should begin, this is normally the log instant of the last log record of the transaction that is to be re-prepare. If null, then re-prepare starts from the end of the log.- Throws:
StandardException- Standard exception policy.
-
undo
public void undo(RawTransaction t, TransactionId undoId, LogInstant undoStopAt, LogInstant undoStartAt) throws StandardException
Undo a part of or the entire transaction. Begin rolling back the log record at undoStartAt and stopping at (inclusive) the log record at undoStopAt.MT - Not needed. A transaction must be single threaded thru undo, each RawTransaction has its own logger, therefore no need to synchronize. The RawTransaction must handle synchronizing with multiple threads during rollback.
- Specified by:
undoin interfaceLogger- Parameters:
t- the transaction that needs to be rolled backundoId- the transaction IDundoStopAt- the last log record that should be rolled backundoStartAt- the first log record that should be rolled back- Throws:
StandardException- Standard Derby error policy- See Also:
Logger.undo(org.apache.derby.iapi.store.raw.xact.RawTransaction, org.apache.derby.iapi.store.raw.xact.TransactionId, org.apache.derby.iapi.store.raw.log.LogInstant, org.apache.derby.iapi.store.raw.log.LogInstant)
-
redo
protected long redo(RawTransaction recoveryTransaction, TransactionFactory transFactory, StreamLogScan redoScan, long redoLWM, long ttabInstant) throws java.io.IOException, StandardException, java.lang.ClassNotFoundException
Recovery Redo loop.The log stream is scanned from the beginning (or from the undo low water mark of a checkpoint) forward until the end. The purpose of the redo pass is to repeat history, i.e, to repeat exactly the same set of changes the rawStore went thru right before it stopped. With each log record that is encountered in the redo pass:
- if it isFirst(), then the transaction factory is called upon to create a new transaction object.
- if it needsRedo(), its doMe() is called (if it is a compensation operation, then the undoable operation needs to be created first before the doMe is called).
- if it isComplete(), then the transaction object is closed.
MT - caller provides synchronization
- Parameters:
transFactory- - the transaction factoryredoLWM- - if checkpoint seen, starting from this point on, apply redo if necessary- Returns:
- the log instant of the next log record (or the instant just after the last log record). This is used to determine where the log truly ends
- Throws:
StandardException- Standard Derby error policyjava.io.IOException- error reading log filejava.lang.ClassNotFoundException- log file corrupted- See Also:
LogToFile.recover(org.apache.derby.iapi.store.raw.data.DataFactory, org.apache.derby.iapi.store.raw.xact.TransactionFactory)
-
readLogRecord
protected Loggable readLogRecord(StreamLogScan scan, int size) throws java.io.IOException, StandardException, java.lang.ClassNotFoundException
Read the next log record from the scan.MT - caller must provide synchronization (right now, it is only called in recovery to find the checkpoint log record. When this method is called by a more general audience, MT must be revisited).
- Parameters:
scan- an opened log scansize- estimated size of the log record- Returns:
- the log operation that is the next in the scan, or null if no more log operation in the log scan
- Throws:
java.io.IOException- Error reading the log fileStandardException- Standard Derby error policyjava.lang.ClassNotFoundException- log corrupted
-
-