initRedologSequence();
    public synchronized void start() {		mEnabled = true;		try {			File logdir = mLogFile.getParentFile();	        if (!logdir.exists()) {	        	if (!logdir.mkdirs())	        		throw new IOException("Unable to create directory " + logdir.getAbsolutePath());	        }	        if (!mArchiveDir.exists()) {	        	if (!mArchiveDir.mkdirs())	        		throw new IOException("Unable to create directory " + mArchiveDir.getAbsolutePath());	        }		} catch (IOException e) {			signalFatalError(e);		}        // Recover from crash during rollover.  We do this even when        // mSupportsCrashRecovery is false.        try {            mRolloverMgr.crashRecovery();        } catch (IOException e) {            mLog.fatal("Exception during crash recovery");            signalFatalError(e);        }        long fsyncInterval = RedoConfig.redoLogFsyncIntervalMS();        mLogWriter = createLogWriter(this, mLogFile, fsyncInterval);        initRedologSequence();                ArrayList postStartupRecoveryOps = new ArrayList(100);        int numRecoveredOps = 0;		if (mSupportsCrashRecovery) {			mRecoveryMode = true;			mLog.info("Starting pre-startup crash recovery");			// Run crash recovery.			try {				mLogWriter.open();				RedoPlayer redoPlayer = new RedoPlayer();				numRecoveredOps = redoPlayer.runCrashRecovery(this, postStartupRecoveryOps);                redoPlayer.shutdown();				mLogWriter.close();			} catch (Exception e) {				mLog.fatal("Exception during crash recovery");				signalFatalError(e);			}			mLog.info("Finished pre-startup crash recovery");			mRecoveryMode = false;		}		// Reopen log after crash recovery.		try {			mLogWriter.open();			mInitialLogSize = mLogWriter.getSize();		} catch (IOException e) {			mLog.fatal("Unable to open redo log");			signalFatalError(e);		}        if (numRecoveredOps > 0) {            // Add post-recovery ops to map before rollover, so the new redolog            // file after rollover will still list these uncommitted ops.            if (postStartupRecoveryOps.size() > 0) {                synchronized (mActiveOps) {                    for (Iterator iter = postStartupRecoveryOps.iterator(); iter.hasNext(); ) {                        RedoableOp op = (RedoableOp) iter.next();                        assert(op.isStartMarker());                        mActiveOps.put(op.getTransactionId(), op);                    }                }            }            // Force rollover to clear the current log file.            forceRollover();            // Start a new thread to run recovery on the remaining ops.            // Recovery of these ops will occur in parallel with new client            // requests.            if (postStartupRecoveryOps.size() > 0) {                Thread psrThread =                    new PostStartupCrashRecoveryThread(postStartupRecoveryOps);                psrThread.start();            }        }	}