00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Fennel_LogicalRecoveryLog_Included
00025 #define Fennel_LogicalRecoveryLog_Included
00026
00027 #include "fennel/txn/LogicalTxnStoredStructs.h"
00028 #include "fennel/common/PseudoUuid.h"
00029
00030 #include <boost/utility.hpp>
00031 #include <hash_map>
00032
00033 FENNEL_BEGIN_NAMESPACE
00034
00035 class LogicalTxnParticipant;
00036 class LogicalTxnParticipantFactory;
00037
00042 class FENNEL_TXN_EXPORT LogicalRecoveryLog
00043 : public boost::noncopyable
00044 {
00045 typedef std::hash_map<TxnId,LogicalTxnEventMemento> TxnMap;
00046 typedef TxnMap::iterator TxnMapIter;
00047
00048 TxnMap checkpointTxnMap;
00049
00050 LogicalTxnParticipantFactory &participantFactory;
00051
00052 SharedSegmentFactory pSegmentFactory;
00053
00054 SegmentAccessor logSegmentAccessor;
00055
00056 SharedSegInputStream pInputStream;
00057
00058 explicit LogicalRecoveryLog(
00059 LogicalTxnParticipantFactory &participantFactory,
00060 SegmentAccessor const &logSegmentAccessor,
00061 PseudoUuid const &onlineUuid,
00062 SharedSegmentFactory pSegmentFactory);
00063
00064 void redoTxn(
00065 LogicalTxnEventMemento const &commitMemento,
00066 LogicalTxnEventMemento const *pCheckpointMemento,
00067 SharedSegInputStream pTxnInputStream);
00068
00069 void undoTxn(
00070 LogicalTxnEventMemento const &checkpointMemento,
00071 SharedSegInputStream pTxnInputStream);
00072
00073 SharedSegInputStream openLongLogStream(TxnId txnId);
00074
00075 public:
00092 static SharedLogicalRecoveryLog newLogicalRecoveryLog(
00093 LogicalTxnParticipantFactory &participantFactory,
00094 SegmentAccessor const &logSegmentAccessor,
00095 PseudoUuid const &onlineUuid,
00096 SharedSegmentFactory pSegmentFactory);
00097
00098 virtual ~LogicalRecoveryLog();
00099 void recover(LogicalTxnLogCheckpointMemento const &memento);
00100
00107 static std::string getLongLogFileName(TxnId txnId);
00108 };
00109
00110 FENNEL_END_NAMESPACE
00111
00112 #endif
00113
00114