return;
}
/* Write file header into this buffer in the usual log entry format. */
LogEntry headerLogEntry =
new FileHeaderEntry(LogEntryType.LOG_FILE_HEADER, header);
ByteBuffer headerBuf = envImpl.getLogManager().
putIntoBuffer(headerLogEntry,
0); // prevLogEntryOffset
/* Write the buffer into the channel. */
int bytesWritten;
try {
if (LOGWRITE_EXCEPTION_TESTING) {
generateLogWriteException(file, headerBuf, 0, fileNum);
}
/*
* Always flush header so that file.length() will be non-zero when
* this method returns and two threads won't attempt to create the
* header. [#20732]
*/
bytesWritten = writeToFile(file, headerBuf, 0, fileNum,
true /*flushRequired*/);
if (fileNum > savedCurrentFileNum) {
/*
* Writing the new file header succeeded without an IOE. This
* can not be undone in the event of another IOE (Out Of Disk
* Space) on the next write so update the saved LSN state with
* the new info. Do not update the nextAvailableLsn with a
* smaller (earlier) LSN in case there's already something in a
* buffer that is after the new header. [#15754]
*/
long lsnAfterHeader = DbLsn.makeLsn(fileNum, bytesWritten);
if (DbLsn.compareTo(nextAvailableLsn, lsnAfterHeader) < 0) {
nextAvailableLsn = lsnAfterHeader;
}
lastUsedLsn = DbLsn.makeLsn(fileNum, bytesWritten);
prevOffset = bytesWritten;
forceNewFile = false;
currentFileNum = fileNum;
saveLastPosition();
}
} catch (ClosedChannelException e) {
/*
* The channel should never be closed. It may be closed because
* of an interrupt received by another thread. See SR [#10463]
*/
throw new ThreadInterruptedException
(envImpl, "Channel closed, may be due to thread interrupt", e);
} catch (IOException e) {
/* Possibly an out of disk exception. */
throw new LogWriteException(envImpl, e);
}
if (bytesWritten != headerLogEntry.getSize() +
LogEntryHeader.MIN_HEADER_SIZE) {
throw new EnvironmentFailureException
(envImpl, EnvironmentFailureReason.LOG_INTEGRITY,
"File " + fileName +
" was created with an incomplete header. Only " +