private final void performRecovery(LogInput logInput)
                    throws ObjectManagerException {
        final String methodName = "performRecovery";
        if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
            trace.entry(this,
                        cclass,
                        methodName,
                        new Object[] { logInput });

        // Set no checkpoint end yest seen.
        checkpointEndSeen = false;
        // We start reading the log at the start of the last complete checkpoint.
        // The checkpointed and in flight transactions are recovered until we find checkpoint end.

        try {
            for (;;) { // Loop over input log records.
                LogRecord logRecordRead = logInput.readNext();
                logRecordRead.performRecovery(this);
            } // for log records to read.

        } catch (LogFileExhaustedException exception) {
            // No FFDC Code Needed, condition expected when end of log seen.
            if (Tracing.isAnyTracingEnabled() && trace.isEventEnabled())
                trace.event(this,
                            cclass,
                            methodName,
                            exception);

        } catch (ObjectManagerException exception) {
            // No FFDC Code Needed.
            ObjectManager.ffdc.processException(this,
                                                cclass,
                                                methodName,
                                                exception,
                                                "1:751:1.62");

            shutdown();
            if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                trace.exit(this,
                           cclass,
                           methodName,
                           "ObjectManagerException:758");
            throw exception;
        } // try.

        // Have wee seen a completed checkpoint?
        if (checkpointEndSeen == false) {
            // TODO At cold start, we need to mark the log header so that it indicates that we have not yet
            //      completed the first ever checkpoint. If we fail before we do this we then know
            //      that we crashed before it is rewritten, we can safely have another go at writing it
            //      another first checkpoint. We could just assume that because we have not seen
            //      a checkpoint end then we did not successfully cold start and have another go.
            shutdown();
            if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                trace.exit(this,
                           cclass,
                           methodName,
                           new Object[] { "CheckpointEndNotFoundException:774", logFileName });
            throw new CheckpointEndNotFoundException(this,
                                                     logFileName);
        }

        synchronized (this) {
            // Make the state change.
            setState(nextStateForLogReplayed);
        } // synchronized (this).

        if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
            trace.exit(this,
                       cclass,
                       methodName);
    }
private final void performRecovery ( LogInput logInput ) throws ObjectManagerException { final String methodName = "performRecovery" ; if ( Tracing . isAnyTracingEnabled ( ) && trace . isEntryEnabled ( ) ) trace . entry ( this , cclass , methodName , new Object [ ] { logInput } ) ; checkpointEndSeen = false ; try { for ( ; ; ) { LogRecord logRecordRead = logInput . readNext ( ) ; logRecordRead . performRecovery ( this ) ; } } catch ( LogFileExhaustedException exception ) { if ( Tracing . isAnyTracingEnabled ( ) && trace . isEventEnabled ( ) ) trace . event ( this , cclass , methodName , exception ) ; } catch ( ObjectManagerException exception ) { ObjectManager . ffdc . processException ( this , cclass , methodName , exception , "1:751:1.62" ) ; shutdown ( ) ; if ( Tracing . isAnyTracingEnabled ( ) && trace . isEntryEnabled ( ) ) trace . exit ( this , cclass , methodName , "ObjectManagerException:758" ) ; throw exception ; } if ( checkpointEndSeen == false ) { shutdown ( ) ; if ( Tracing . isAnyTracingEnabled ( ) && trace . isEntryEnabled ( ) ) trace . exit ( this , cclass , methodName , new Object [ ] { "CheckpointEndNotFoundException:774" , logFileName } ) ; throw new CheckpointEndNotFoundException ( this , logFileName ) ; } synchronized ( this ) { setState ( nextStateForLogReplayed ) ; } if ( Tracing . isAnyTracingEnabled ( ) && trace . isEntryEnabled ( ) ) trace . exit ( this , cclass , methodName ) ; }
Recover the state of the objectManager from the Log. Re apply changes to object stores that were lost.

@param logInput the logger that LogRecords are read from.
@throws ObjectManagerException