From deb8ddd1ebafcfa1b81876239733778105a547d2 Mon Sep 17 00:00:00 2001 From: dsandersoremutah Date: Wed, 20 Sep 2006 17:33:09 +0000 Subject: [PATCH] Modified dbRebuild to correctly report database size and the total bytes examined in the callback. git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@877 0109f412-320b-0410-ab79-c3e0c5ffbbe6 --- xflaim/src/flaimsys.h | 7 +++ xflaim/src/flblddb.cpp | 134 ++++++++++++++++++++++++++++------------- 2 files changed, 99 insertions(+), 42 deletions(-) diff --git a/xflaim/src/flaimsys.h b/xflaim/src/flaimsys.h index 65c50c6..9fce9c7 100644 --- a/xflaim/src/flaimsys.h +++ b/xflaim/src/flaimsys.h @@ -8230,8 +8230,15 @@ public: return( rc); } + void incrBytesExamined() + { + m_callbackData.ui64BytesExamined += m_dbHdr.ui16BlockSize; + } + private: + RCODE getDatabaseSize( void); + RCODE rebuildDatabase( void); RCODE recoverNodes( diff --git a/xflaim/src/flblddb.cpp b/xflaim/src/flblddb.cpp index 1d3d6aa..94e39e4 100644 --- a/xflaim/src/flblddb.cpp +++ b/xflaim/src/flblddb.cpp @@ -146,6 +146,7 @@ public: private: RCODE readBlock( + FLMBOOL bCount, FLMUINT uiFileNumber, FLMUINT uiFileOffset, F_SCAN_STATE * pScanState); @@ -828,12 +829,61 @@ Exit: return( rc); } +/*************************************************************************** +Desc: +*****************************************************************************/ +RCODE F_DbRebuild::getDatabaseSize( void) +{ + RCODE rc = NE_XFLM_OK; + FLMUINT uiFileNumber = 1; + FLMUINT64 ui64FileSize; + + m_callbackData.ui64FileSize = 0; + + while (uiFileNumber <= MAX_DATA_BLOCK_FILE_NUMBER) + { + + // Get the actual size of the last file. + + if (RC_BAD( rc = m_pSFileHdl->getFileSize( uiFileNumber, + &ui64FileSize))) + { + if (rc == NE_FLM_IO_PATH_NOT_FOUND || + rc == NE_FLM_IO_INVALID_FILENAME) + { + if (uiFileNumber > 1) + { + rc = NE_XFLM_OK; + } + else + { + + // Should always be a data file #1 + + RC_UNEXPECTED_ASSERT( rc); + } + } + goto Exit; + } + else + { + m_callbackData.ui64FileSize += ui64FileSize; + } + uiFileNumber++; + } + +Exit: + + return( rc); +} + /*************************************************************************** Desc: *****************************************************************************/ RCODE F_DbRebuild::rebuildDatabase( void) { RCODE rc = NE_XFLM_OK; + RCODE rc2; FLMBOOL bStartedTrans = FALSE; m_corruptInfo.uiErrLocale = XFLM_LOCALE_B_TREE; @@ -852,10 +902,16 @@ RCODE F_DbRebuild::rebuildDatabase( void) goto Exit; } + if (RC_BAD( rc = getDatabaseSize())) + { + goto Exit; + } + // Recover the dictionary m_callbackData.iDoingFlag = REBUILD_RECOVER_DICT; m_callbackData.bStartFlag = TRUE; + m_callbackData.ui64BytesExamined = 0; if( RC_BAD( rc = recoverNodes( TRUE))) { @@ -871,6 +927,7 @@ RCODE F_DbRebuild::rebuildDatabase( void) m_callbackData.iDoingFlag = REBUILD_RECOVER_DATA; m_callbackData.bStartFlag = TRUE; + m_callbackData.ui64BytesExamined = 0; if( RC_BAD( rc = recoverNodes( FALSE))) { @@ -911,6 +968,12 @@ RCODE F_DbRebuild::rebuildDatabase( void) Exit: + rc2 = reportStatus( TRUE); + if (RC_OK( rc)) + { + rc = rc2; + } + if( bStartedTrans) { m_pDb->transAbort(); @@ -1900,6 +1963,7 @@ RCODE F_RebuildNodeIStream::closeStream( void) Desc: *****************************************************************************/ RCODE F_RebuildNodeIStream::readBlock( + FLMBOOL bCount, FLMUINT uiFileNumber, FLMUINT uiFileOffset, F_SCAN_STATE * pScanState) @@ -1919,6 +1983,10 @@ RCODE F_RebuildNodeIStream::readBlock( { goto Exit; } + if (bCount) + { + m_pDbRebuild->incrBytesExamined(); + } // Determine if we should convert the block here. Calculation of CRC // should be on unconverted block. @@ -1960,6 +2028,7 @@ RCODE F_RebuildNodeIStream::readBlock( // Make sure the transaction ID looks valid if( !m_pDbRebuild->m_bBadHeader && + pBlkHdr->ui64TransID > 1 && pBlkHdr->ui64TransID > m_pDbRebuild->m_dbHdr.ui64LastRflCommitID) { rc = RC_SET( NE_XFLM_DATA_ERROR); @@ -2000,11 +2069,6 @@ RCODE F_RebuildNodeIStream::readBlock( pScanState->uiCurOffset = 0; f_memset( &pScanState->elmInfo, 0, sizeof( F_ELM_INFO)); - if( RC_BAD( rc = m_pDbRebuild->reportStatus())) - { - goto Exit; - } - Exit: return( RC_BAD( rc) ? rc : m_pDbRebuild->reportStatus()); @@ -2051,7 +2115,7 @@ TryNextFile: pScanState->uiFileOffset += uiBlockSize; } - if( RC_BAD( rc = readBlock( pScanState->uiFileNumber, + if( RC_BAD( rc = readBlock( TRUE, pScanState->uiFileNumber, pScanState->uiFileOffset, pScanState))) { if( rc == NE_FLM_IO_END_OF_FILE || @@ -2069,41 +2133,11 @@ TryNextFile: goto Exit; } - - // Make sure the block end looks correct - - if( pScanState->blkUnion.pBlkHdr->ui16BlkBytesAvail > - uiBlockSize - blkHdrSize( pScanState->blkUnion.pBlkHdr)) - { - if( RC_BAD( rc = m_pDbRebuild->reportCorruption( - FLM_BAD_BLK_HDR_BLK_END, - pScanState->blkUnion.pBlkHdr->ui32BlkAddr, 0, 0))) - { - goto Exit; - } - - continue; - } - - // Verify the block address - - if( pScanState->blkUnion.pBlkHdr->ui32BlkAddr != - FSBlkAddress( pScanState->uiFileNumber, pScanState->uiFileOffset)) - { - if( RC_BAD( rc = m_pDbRebuild->reportCorruption( - FLM_BAD_BLK_HDR_ADDR, pScanState->blkUnion.pBlkHdr->ui32BlkAddr, - 0, 0))) - { - goto Exit; - } - - continue; - } // Determine if this is a block that should be processed - if( FSGetFileOffset( pScanState->blkUnion.pBlkHdr->ui32BlkAddr) == - pScanState->uiFileOffset && + if( pScanState->blkUnion.pBlkHdr->ui32BlkAddr == + FSBlkAddress( pScanState->uiFileNumber, pScanState->uiFileOffset) && (pScanState->blkUnion.pBlkHdr->ui8BlkType == BT_LEAF || pScanState->blkUnion.pBlkHdr->ui8BlkType == BT_LEAF_DATA) && pScanState->blkUnion.pBTreeBlkHdr->ui8BlkLevel == 0 && @@ -2111,6 +2145,22 @@ TryNextFile: isContainerBlk( pScanState->blkUnion.pBTreeBlkHdr) && doCollection( uiBlkCollectionNum, m_bRecovDictionary)) { + + // Make sure the block end looks correct + + if( pScanState->blkUnion.pBlkHdr->ui16BlkBytesAvail > + uiBlockSize - blkHdrSize( pScanState->blkUnion.pBlkHdr)) + { + if( RC_BAD( rc = m_pDbRebuild->reportCorruption( + FLM_BAD_BLK_HDR_BLK_END, + pScanState->blkUnion.pBlkHdr->ui32BlkAddr, 0, 0))) + { + goto Exit; + } + + continue; + } + if( !m_bRecovDictionary) { if( RC_BAD( rc = m_pDbRebuild->m_pDb->getDict()->getCollection( @@ -2221,7 +2271,7 @@ RCODE F_RebuildNodeIStream::readContinuationElm( void) { F_BLK_HDR * pBlkHdr = m_pCurState->blkUnion.pBlkHdr; - if( RC_BAD( rc = readBlock( + if( RC_BAD( rc = readBlock( FALSE, FSGetFileNumber( pBlkHdr->ui32NextBlkInChain), FSGetFileOffset( pBlkHdr->ui32NextBlkInChain), &m_tmpState))) { @@ -2304,7 +2354,7 @@ RCODE F_RebuildNodeIStream::readFirstDataOnlyBlock( void) flmAssert( pElmInfo->uiDataOnlyBlkAddr); - if( RC_BAD( rc = readBlock( + if( RC_BAD( rc = readBlock( FALSE, FSGetFileNumber( pElmInfo->uiDataOnlyBlkAddr), FSGetFileOffset( pElmInfo->uiDataOnlyBlkAddr), &m_tmpState))) { @@ -2379,7 +2429,7 @@ RCODE F_RebuildNodeIStream::readNextDataOnlyBlock( void) goto Exit; } - if( RC_BAD( rc = readBlock( + if( RC_BAD( rc = readBlock( FALSE, FSGetFileNumber( ui32NextBlkAddr), FSGetFileOffset( ui32NextBlkAddr), &m_tmpState))) { @@ -2671,7 +2721,7 @@ RCODE F_RebuildNodeIStream::readNode( } f_mutexUnlock( gv_XFlmSysData.hNodeCacheMutex); - if( RC_BAD( rc = readBlock( FSGetFileNumber( ui32BlkAddr), + if( RC_BAD( rc = readBlock( FALSE, FSGetFileNumber( ui32BlkAddr), FSGetFileOffset( ui32BlkAddr), &m_firstElmState))) { goto Exit;