VersionedSegmentTest.cpp

Go to the documentation of this file.
00001 /*
00002 // $Id: //open/dev/fennel/test/VersionedSegmentTest.cpp#11 $
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 #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         // NOTE:  2*nDiskPages for fuzzy checkpointing
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         // revert to previous version
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 // End VersionedSegmentTest.cpp

Generated on Mon Jun 22 04:00:21 2009 for Fennel by  doxygen 1.5.1