[
https://issues.apache.org/jira/browse/DERBY-2939?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12529097
]
Jørgen Løland commented on DERBY-2939:
--------------------------------------
Seems that this is an issue of poor documentation rather than a bug. The
assumption that the log record is too big to fit in any LogAccessFileBuffer is
correct because the method LogAccessFile.reserveSpaceForChecksum is always
called from LogToFile#appendLogRecord before LogAccessFile.writeLogRecord is
called. reserveSpace... allocates a fresh LogAccessFileBuffer if the LogRecord
is too big to fit in the current one.
However, there are two remaining issues with LogAccessFile#writeLogRecord that
I would like to address:
1. Document the not too obvious behavior described above.
2. Change what happens when a log record is too big to fit into any of the
allocated LogAccessFileBuffers the following way:
* Current strategy:
------------------------
flushDirtyBuffers (1 disk write for every dirty buffer)
4x disk writes to put the very big log record to disk
* New strategy
-----------------------
flushDirtyBuffers (as above)
allocate a big enough buffer
put the log record into the new buffer
1x disk write to put the giant log record to disk
remove the newly created buffer
Hence, I want to swap 3 disk write operations with main memory operations,
which should be much faster. Note that the writeLogRecord method is called from
a synchronized context in LogToFile. Thus, the 4 current disk writes are
blocking all other transactions that try to append log.
> Log file is flushed every time a log buffer gets full
> -----------------------------------------------------
>
> Key: DERBY-2939
> URL: https://issues.apache.org/jira/browse/DERBY-2939
> Project: Derby
> Issue Type: Bug
> Components: Store
> Affects Versions: 10.3.1.4, 10.4.0.0
> Reporter: Jørgen Løland
> Assignee: Jørgen Løland
>
> LogAccessFile consists of a number of log buffers:
> LinkedList<LogAccessFileBuffer> freeBuffers and dirtyBuffers, and
> LogAccessFileBuffer currentBuffer.
> When a log record is written to log, writeLogRecord wrongly assumes that the
> log record is too big to fit in any log buffer if there is not enough free
> space in the current log buffer. The code:
> if (total_log_record_length <= currentBuffer.bytes_free) {
> <append log record to current buffer>
> ...
> } else {
> <log record too big to fit in any buffer>
> ...
> }
> should be modified to:
> if (total_log_record_length <= currentBuffer.bytes_free) {
> <append log record to current buffer>
> ...
> } else if (total_log_record_length <= currentBuffer.length) {
> <swap log buffer>
> <append log record to new current buffer>
> ...
> } else {
> <log record too big to fit in any buffer>
> ...
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.