Fennel: /home/pub/open/dev/fennel/test/VersionedSegmentTest.cpp Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 #include "fennel/common/CommonPreamble.h" 00025 #include "fennel/test/SegmentTestBase.h" 00026 #include "fennel/segment/VersionedSegment.h" 00027 #include "fennel/segment/WALSegment.h" 00028 00029 using namespace fennel; 00030 00031 class VersionedSegmentTest : virtual public SegmentTestBase 00032 { 00033 SegVersionNum versionNumber; 00034 DeviceId logDeviceId; 00035 SharedRandomAccessDevice pLogDevice; 00036 PageId firstLogPageId; 00037 PseudoUuid onlineUuid; 00038 00039 public: 00040 virtual void openSegmentStorage(DeviceMode openMode) 00041 { 00042 SegmentTestBase::openSegmentStorage(openMode); 00043 00044
00045 pLogDevice = openDevice( 00046 "shadow.dat",openMode, 00047 2*nDiskPages,logDeviceId); 00048 SharedSegment pLogSegment = createLinearDeviceSegment( 00049 logDeviceId,2*nDiskPages); 00050 SharedSegment pCircularSegment = pSegmentFactory->newCircularSegment( 00051 pLogSegment,SharedCheckpointProvider(),firstLogPageId); 00052 SharedSegment pWALSegment = pSegmentFactory->newWALSegment( 00053 pCircularSegment); 00054 SharedSegment pVersionedSegment = pSegmentFactory->newVersionedSegment( 00055 pLinearSegment, 00056 pWALSegment, 00057 onlineUuid, 00058 versionNumber); 00059 pLinearSegment = pVersionedSegment; 00060 } 00061 00062 virtual void closeStorage() 00063 { 00064 closeLinearSegment(); 00065 closeRandomSegment(); 00066 if (pLogDevice) { 00067 closeDevice(logDeviceId,pLogDevice); 00068 } 00069 SegmentTestBase::closeStorage(); 00070 ++versionNumber; 00071 } 00072 00073 explicit VersionedSegmentTest() 00074 { 00075 logDeviceId = DeviceId(42); 00076 versionNumber = 0; 00077 firstLogPageId = NULL_PAGE_ID; 00078 onlineUuid.generateInvalid(); 00079 FENNEL_UNIT_TEST_CASE(SegmentTestBase,testSingleThread); 00080 FENNEL_UNIT_TEST_CASE(VersionedSegmentTest,testRecovery); 00081 FENNEL_UNIT_TEST_CASE(PagingTestBase,testMultipleThreads); 00082 } 00083 00084 void testRecovery() 00085 { 00086
00087 versionNumber -= 2; 00088 firstLogPageId = FIRST_LINEAR_PAGE_ID; 00089 openStorage(DeviceMode::load); 00090 VersionedSegment *pVersionedSegment = 00091 SegmentFactory::dynamicCast<VersionedSegment *>(pLinearSegment); 00092 assert(pVersionedSegment); 00093 pVersionedSegment->recover(pLinearSegment, firstLogPageId); 00094 testSequentialRead(); 00095 closeStorage(); 00096 firstLogPageId = NULL_PAGE_ID; 00097 } 00098 00099 virtual void fillPage(CachePage &page,uint x) 00100 { 00101 SegmentTestBase::fillPage(page,x + versionNumber); 00102 } 00103 00104 virtual void testCheckpoint() 00105 { 00106 pLinearSegment->checkpoint(CHECKPOINT_FLUSH_FUZZY); 00107 ++versionNumber; 00108 VersionedSegment *pVersionedSegment = 00109 SegmentFactory::dynamicCast<VersionedSegment *>(pLinearSegment); 00110 assert(pVersionedSegment); 00111 assert(versionNumber == pVersionedSegment->getVersionNumber()); 00112 pVersionedSegment->deallocateCheckpointedLog(CHECKPOINT_FLUSH_FUZZY); 00113 } 00114 00115 virtual void verifyPage(CachePage &page,uint x) 00116 { 00117 VersionedSegment *pVersionedSegment = 00118 SegmentFactory::dynamicCast<VersionedSegment *>(pLinearSegment); 00119 assert(pVersionedSegment); 00120 SegVersionNum pageVersion = pVersionedSegment->getPageVersion(page); 00121 assert(pageVersion <= versionNumber); 00122 SegmentTestBase::verifyPage(page,x + pageVersion); 00123 } 00124 }; 00125 00126 FENNEL_UNIT_TEST_SUITE(VersionedSegmentTest); 00127 00128