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