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
This commit is contained in:
dsandersoremutah
2006-09-20 17:33:09 +00:00
parent 4fe6f59633
commit deb8ddd1eb
2 changed files with 99 additions and 42 deletions

View File

@@ -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;