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_VersionedSegment_Included
00025 #define Fennel_VersionedSegment_Included
00026
00027 #include "fennel/segment/DelegatingSegment.h"
00028 #include "fennel/synch/SynchObj.h"
00029 #include "fennel/cache/FuzzyCheckpointSet.h"
00030 #include "fennel/common/PseudoUuid.h"
00031
00032 #include <boost/crc.hpp>
00033
00034 FENNEL_BEGIN_NAMESPACE
00035
00036 class WALSegment;
00037
00044 class FENNEL_SEGMENT_EXPORT VersionedSegment
00045 : public DelegatingSegment
00046 {
00047 friend class SegmentFactory;
00048
00049 bool inRecovery;
00050 PseudoUuid onlineUuid;
00051 SegVersionNum versionNumber;
00052 PageId oldestLogPageId;
00053 PageId newestLogPageId;
00054 PageId lastCheckpointLogPageId;
00055 StrictMutex mutex;
00056 SharedSegment logSegment;
00057 WALSegment *pWALSegment;
00058 FuzzyCheckpointSet fuzzyCheckpointSet;
00059
00060
00061 boost::crc_32_type crcComputer;
00062
00063 PageMap dataToLogMap;
00064
00065 explicit VersionedSegment(
00066 SharedSegment dataSegment,
00067 SharedSegment logSegment,
00068 PseudoUuid const &onlineUuid,
00069 SegVersionNum versionNumber);
00070
00071 uint64_t computeChecksum(void const *pPageData);
00072
00073 public:
00074 virtual ~VersionedSegment();
00075
00086 void recover(
00087 SharedSegment pDelegatingSegment,
00088 PageId firstLogPageId,
00089 SegVersionNum versionNumber = MAXU);
00090
00102 void recover(
00103 SharedSegment pDelegatingSegment,
00104 PageId firstLogPageId,
00105 SegVersionNum versionNumber,
00106 PseudoUuid const &onlineUuid);
00107
00112 void prepareOnlineRecovery();
00113
00118 PageId getRecoveryPageId() const;
00119
00124 PageId getOnlineRecoveryPageId() const;
00125
00133 SegVersionNum getPageVersion(CachePage &page);
00134
00138 SegVersionNum getVersionNumber() const;
00139
00143 SharedSegment getLogSegment() const;
00144
00153 void deallocateCheckpointedLog(CheckpointType checkpointType);
00154
00155
00156 virtual void deallocatePageRange(PageId startPageId,PageId endPageId);
00157 virtual void delegatedCheckpoint(
00158 Segment &delegatingSegment,CheckpointType checkpointType);
00159
00160
00161 virtual void notifyPageDirty(CachePage &page,bool bDataValid);
00162 virtual bool canFlushPage(CachePage &page);
00163 };
00164
00165 FENNEL_END_NAMESPACE
00166
00167 #endif
00168
00169