00001 /* 00002 // $Id: //open/dev/fennel/txn/LogicalTxnLog.h#14 $ 00003 // Fennel is a library of data storage and processing components. 00004 // Copyright (C) 2005-2009 The Eigenbase Project 00005 // Copyright (C) 2005-2009 SQLstream, Inc. 00006 // Copyright (C) 2005-2009 LucidEra, Inc. 00007 // Portions Copyright (C) 1999-2009 John V. Sichi 00008 // 00009 // This program is free software; you can redistribute it and/or modify it 00010 // under the terms of the GNU General Public License as published by the Free 00011 // Software Foundation; either version 2 of the License, or (at your option) 00012 // any later version approved by The Eigenbase Project. 00013 // 00014 // This program is distributed in the hope that it will be useful, 00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 // GNU General Public License for more details. 00018 // 00019 // You should have received a copy of the GNU General Public License 00020 // along with this program; if not, write to the Free Software 00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 */ 00023 00024 #ifndef Fennel_LogicalTxnLog_Included 00025 #define Fennel_LogicalTxnLog_Included 00026 00027 #include <vector> 00028 #include <boost/utility.hpp> 00029 #include <boost/enable_shared_from_this.hpp> 00030 #include "fennel/synch/SynchMonitoredObject.h" 00031 #include "fennel/txn/LogicalTxnStoredStructs.h" 00032 #include "fennel/common/PseudoUuid.h" 00033 00034 FENNEL_BEGIN_NAMESPACE 00035 00040 class FENNEL_TXN_EXPORT LogicalTxnLog 00041 : public boost::noncopyable, 00042 public boost::enable_shared_from_this<LogicalTxnLog>, 00043 public SynchMonitoredObject 00044 { 00045 friend class LogicalTxn; 00046 00047 typedef std::vector<SharedLogicalTxn> TxnList; 00048 typedef std::vector<SharedLogicalTxn>::iterator TxnListIter; 00049 00050 typedef std::vector<SharedSegment> SegList; 00051 typedef std::vector<SharedSegment>::iterator SegListIter; 00052 00056 SharedSegmentFactory pSegmentFactory; 00057 00061 TxnId nextTxnId; 00062 00066 TxnList uncommittedTxns; 00067 00072 SegList committedLongLogSegments; 00073 00077 SegmentAccessor logSegmentAccessor; 00078 00082 SharedSegOutputStream pOutputStream; 00083 00087 LogicalTxnLogCheckpointMemento lastCheckpointMemento; 00088 00093 uint nCommittedBeforeLastCheckpoint; 00094 00098 uint groupCommitInterval; 00099 00100 explicit LogicalTxnLog( 00101 SegmentAccessor const &logSegmentAccessor, 00102 PseudoUuid const &onlineUuid, 00103 SharedSegmentFactory pSegmentFactory); 00104 00105 void removeTxn(SharedLogicalTxn pTxn); 00106 00107 void commitTxn(SharedLogicalTxn pTxn); 00108 00109 void rollbackTxn(SharedLogicalTxn pTxn); 00110 00111 void checkpointTxn(SharedLogicalTxn pTxn); 00112 00113 void commitTxnWithGroup(StrictMutexGuard &mutexGuard); 00114 00115 public: 00116 00129 static SharedLogicalTxnLog newLogicalTxnLog( 00130 SegmentAccessor const &logSegmentAccessor, 00131 PseudoUuid const &onlineUuid, 00132 SharedSegmentFactory pSegmentFactory); 00133 00134 virtual ~LogicalTxnLog(); 00135 00141 void setNextTxnId(TxnId nextTxnIdInit); 00142 00150 SharedLogicalTxn newLogicalTxn( 00151 SharedCacheAccessor pCacheAccessor); 00152 00163 void checkpoint( 00164 LogicalTxnLogCheckpointMemento &memento, 00165 CheckpointType checkpointType = CHECKPOINT_FLUSH_ALL); 00166 00177 void deallocateCheckpointedLog( 00178 LogicalTxnLogCheckpointMemento const &memento, 00179 CheckpointType checkpointType = CHECKPOINT_FLUSH_ALL); 00180 00187 TxnId getOldestActiveTxnId(); 00188 }; 00189 00190 FENNEL_END_NAMESPACE 00191 00192 #endif 00193 00194 // End LogicalTxnLog.h