mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
6.1 KiB
198 lines
6.1 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: cibackup.cxx
|
|
//
|
|
// Contents: Content Index index migration
|
|
//
|
|
// Classes:
|
|
//
|
|
// History: 3-17-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <pstore.hxx>
|
|
#include <pidxtbl.hxx>
|
|
|
|
#include "cibackup.hxx"
|
|
#include "resman.hxx"
|
|
#include "indsnap.hxx"
|
|
#include "partn.hxx"
|
|
#include "fresh.hxx"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiWorkItem::CBackupCiWorkItem
|
|
//
|
|
// Synopsis: Constructor of the backup save work item.
|
|
//
|
|
// Arguments: [storage] - Destination storage object.
|
|
// [fFullSave] - Indicating if a full save is needed.
|
|
// [progressTracker] - Progress tracking object.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CBackupCiWorkItem::CBackupCiWorkItem( PStorage & storage,
|
|
BOOL fFullSave,
|
|
PSaveProgressTracker & progressTracker )
|
|
: _status(STATUS_UNSUCCESSFUL),
|
|
_storage(storage),
|
|
_fFull(fFullSave),
|
|
_progressTracker(progressTracker),
|
|
_fDoingFull(FALSE),
|
|
_backupState(eNotStarted)
|
|
{
|
|
_evtDone.Reset();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiPersData::CBackupCiPersData
|
|
//
|
|
// Synopsis: An object that backups the relevant CI persistent data.
|
|
//
|
|
// Arguments: [workItem] - The workitem having details of the save operation.
|
|
// [resman] - Resman reference.
|
|
// [partn] - The partition that must be saved.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
// Notes: We are assuming that changelog need not be saved. This is
|
|
// certainly true for the Incremental Index Shipping feature of
|
|
// Normandy.
|
|
//
|
|
// We are also assuming that for an incremental save, the
|
|
// destination has the same master index id as this. This
|
|
// assumption allows us to save the index table and the
|
|
// persistent freshlog without any transformation. If the
|
|
// destination misses even one "full" save in a sequence,
|
|
// a full save MUST be done.
|
|
//
|
|
// These limitations can be removed when KyleP does the complete
|
|
// implementation of incremental indexing.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
CBackupCiPersData::CBackupCiPersData(
|
|
CBackupCiWorkItem & workItem,
|
|
CResManager & resman,
|
|
CPartition & partn )
|
|
: _workItem( workItem ),
|
|
_pIndSnap( 0 ),
|
|
_resman( resman ),
|
|
_partn(partn),
|
|
_indexTable( resman.GetIndexTable() ),
|
|
_fresh( resman.GetFresh() )
|
|
{
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiPersData::~CBackupCiPersData
|
|
//
|
|
// Synopsis: Destroys the saved index snap shot.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CBackupCiPersData::~CBackupCiPersData()
|
|
{
|
|
delete _pIndSnap;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiPersData::LokGrabResources
|
|
//
|
|
// Synopsis: Grabs the persistent indexes that must be backed up.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CBackupCiPersData::LokGrabResources()
|
|
{
|
|
//
|
|
// First Create a new Index SnapShot depending upon the
|
|
// type of backup.
|
|
//
|
|
Win4Assert( 0 == _pIndSnap );
|
|
_pIndSnap = new CIndexSnapshot( _resman );
|
|
_pIndSnap->LokInitForBackup( _partn, _workItem.IsFullSave() );
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiPersData::BackupIndexes
|
|
//
|
|
// Synopsis: Backs up the relevant persistent indexes.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CBackupCiPersData::BackupIndexes()
|
|
{
|
|
//
|
|
// For each index in the snapshot, create a backup copy.
|
|
//
|
|
unsigned cInd;
|
|
CIndex ** apIndexes = _pIndSnap->LokGetIndexes( cInd );
|
|
|
|
Win4Assert( cInd <= 1 );
|
|
|
|
for ( unsigned i = 0; i < cInd; i++ )
|
|
{
|
|
|
|
Win4Assert( apIndexes[i]->IsPersistent() );
|
|
|
|
PStorage::EDefaultStrmType strmType = PStorage::eNonSparseIndex;
|
|
WORKID wid = _workItem.GetStorage().CreateObjectId( apIndexes[i]->GetId(),
|
|
strmType );
|
|
apIndexes[i]->MakeBackupCopy( _workItem.GetStorage(),
|
|
wid,
|
|
_workItem.GetSaveProgressTracker() );
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CBackupCiPersData::LokBackupMetaInfo
|
|
//
|
|
// Synopsis: Backs up the persistent fresh log and the index table.
|
|
// Also collects the workids in the fresh log to indicate the
|
|
// changed workid.
|
|
//
|
|
// Arguments: [aWids] - On output, will have the modified list of workids.
|
|
//
|
|
// History: 3-18-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CBackupCiPersData::LokBackupMetaInfo()
|
|
{
|
|
|
|
_fresh.LokMakeFreshLogBackup( _workItem.GetStorage(),
|
|
_workItem.GetSaveProgressTracker(),
|
|
_workItem.GetWorkidsIf() );
|
|
|
|
//
|
|
// Create a backup of the Index Table.
|
|
//
|
|
_indexTable.LokMakeBackupCopy( _workItem.GetStorage(),
|
|
_workItem.IsFullSave(),
|
|
_workItem.GetSaveProgressTracker() );
|
|
|
|
}
|
|
|
|
|