return;
}
// log file isn't being flushed right now and logOut is not being
// used.
StorageFile newLogFile = getLogFileName(logFileNumber+1);
if (logFileNumber+1 >= maxLogFileNumber)
{
throw StandardException.newException(
SQLState.LOG_EXCEED_MAX_LOG_FILE_NUMBER,
new Long(maxLogFileNumber));
}
StorageRandomAccessFile newLog = null; // the new log file
try
{
// if the log file exist and cannot be deleted, cannot
// switch log right now
if (privExists(newLogFile) && !privDelete(newLogFile))
{
logErrMsg(MessageService.getTextMessage(
MessageId.LOG_NEW_LOGFILE_EXIST,
newLogFile.getPath()));
return;
}
try
{
newLog = privRandomAccessFile(newLogFile, "rw");
}
catch (IOException ioe)
{
newLog = null;
}
if (newLog == null || !privCanWrite(newLogFile))
{
if (newLog != null)
newLog.close();
newLog = null;
return;
}
if (initLogFile(newLog, logFileNumber+1,
LogCounter.makeLogInstantAsLong(logFileNumber, endPosition)))
{
// New log file init ok, close the old one and
// switch over, after this point, need to shutdown the
// database if any error crops up
switchedOver = true;
// write out an extra 0 at the end to mark the end of the log
// file.
logOut.writeEndMarker(0);
endPosition += 4;
//set that we are in log switch to prevent flusher
//not requesting to switch log again
inLogSwitch = true;
// flush everything including the int we just wrote
flush(logFileNumber, endPosition);
// simulate out of log error after the switch over
if (SanityManager.DEBUG)
{
if (SanityManager.DEBUG_ON(TEST_SWITCH_LOG_FAIL2))
throw new IOException("TestLogSwitchFail2");
}
logOut.close(); // close the old log file
logWrittenFromLastCheckPoint += endPosition;
endPosition = newLog.getFilePointer();
lastFlush = endPosition;
if(isWriteSynced)
{
//extend the file by wring zeros to it
preAllocateNewLogFile(newLog);
newLog.close();
newLog = openLogFileInWriteMode(newLogFile);
newLog.seek(endPosition);
}
logOut = new LogAccessFile(this, newLog, logBufferSize);
newLog = null;
if (SanityManager.DEBUG)
{
if (endPosition != LOG_FILE_HEADER_SIZE)
SanityManager.THROWASSERT(
"new log file has unexpected size" +
+ endPosition);
}
logFileNumber++;
if (SanityManager.DEBUG)
{
SanityManager.ASSERT(endPosition == LOG_FILE_HEADER_SIZE,
"empty log file has wrong size");
}
}
else // something went wrong, delete the half baked file
{
newLog.close();
newLog = null;
if (privExists(newLogFile))
privDelete(newLogFile);
logErrMsg(MessageService.getTextMessage(
MessageId.LOG_CANNOT_CREATE_NEW,
newLogFile.getPath()));
newLogFile = null;
}
}
catch (IOException ioe)
{
inLogSwitch = false;
// switching log file is an optional operation and there is no direct user
// control. Just sends a warning message to whomever, if any,
// system adminstrator there may be
logErrMsg(MessageService.getTextMessage(
MessageId.LOG_CANNOT_CREATE_NEW_DUETO,
newLogFile.getPath(),
ioe.toString()));
try
{
if (newLog != null)