192 lines
4.3 KiB
C++
192 lines
4.3 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1991 - 1992.
|
||
|
//
|
||
|
// File: MERGE.HXX
|
||
|
//
|
||
|
// Contents: Merge object
|
||
|
//
|
||
|
// Classes: CMerge, CMasterMerge
|
||
|
//
|
||
|
// History: 13-Nov-91 BartoszM Created
|
||
|
// 23-Aug-94 SrikantS Split up into CMerge and CMasterMerge.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "dindex.hxx"
|
||
|
#include "indsnap.hxx"
|
||
|
#include "keylist.hxx"
|
||
|
|
||
|
class CResManager;
|
||
|
class CPartition;
|
||
|
class CFreshTest;
|
||
|
class PStorage;
|
||
|
class CMasterMergeIndex;
|
||
|
class CDeletedIIDTrans;
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CMerge
|
||
|
//
|
||
|
// Purpose: Encapsulated resources needed for merge of indexes
|
||
|
// This is used for shadow merges. For master merge, use
|
||
|
// CMasterMerge.
|
||
|
//
|
||
|
// History: 13-Nov-91 BartoszM Created.
|
||
|
// 23-Aug-94 SrikantS Split up into CMerge and CMasterMerge.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CMerge
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
//
|
||
|
// These methods do not require locking:
|
||
|
//
|
||
|
|
||
|
CMerge ( CResManager & resman, PARTITIONID partid, MergeType mt );
|
||
|
|
||
|
virtual ~CMerge ();
|
||
|
|
||
|
// Main worker: no lock should be held!
|
||
|
|
||
|
virtual void Do (CCiFrmPerfCounter & mergeProgress);
|
||
|
|
||
|
unsigned LokCountOld() const { return _cIidOld; }
|
||
|
|
||
|
INDEXID* LokGetIidList() { return _aIidOld; }
|
||
|
|
||
|
CDiskIndex* LokGetNewIndex() { return _pIndexNew; }
|
||
|
|
||
|
//
|
||
|
// These methods require LOCKING
|
||
|
//
|
||
|
|
||
|
virtual void LokGrabResources();
|
||
|
|
||
|
virtual void LokRollBack ( unsigned swapped = 0 );
|
||
|
|
||
|
void LokZombify();
|
||
|
|
||
|
void LokAbort();
|
||
|
|
||
|
inline CFreshTest * GetFresh() { return _indSnap.GetFresh(); }
|
||
|
|
||
|
MergeType GetMergeType() { return _mt; }
|
||
|
|
||
|
void ReleaseNewIndex() { _pIndexNew = 0; }
|
||
|
|
||
|
protected:
|
||
|
|
||
|
void LokSetup( BOOL fIsMasterMerge );
|
||
|
|
||
|
PARTITIONID _partid;
|
||
|
|
||
|
CResManager& _resman;
|
||
|
|
||
|
CPartition* _pPart;
|
||
|
|
||
|
INDEXID _iidNew;
|
||
|
|
||
|
WORKID _widNewIndex; // New index, shadow or master
|
||
|
|
||
|
MergeType _mt; // Master vs. shadow merge
|
||
|
|
||
|
// Owned resources:
|
||
|
|
||
|
CIndexSnapshot _indSnap;
|
||
|
|
||
|
CDiskIndex * _pIndexNew;
|
||
|
|
||
|
INDEXID* _aIidOld;
|
||
|
|
||
|
unsigned _cIidOld;
|
||
|
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CMerge::LokAbort, public
|
||
|
//
|
||
|
// Synopsis: Abort merge-in-progress
|
||
|
//
|
||
|
// History: 13-Aug-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline void CMerge::LokAbort()
|
||
|
{
|
||
|
//
|
||
|
// We know there's an index becuase:
|
||
|
// a) This call is made only after GrabResouces()
|
||
|
// b) Under lock
|
||
|
//
|
||
|
|
||
|
Win4Assert( _pIndexNew );
|
||
|
|
||
|
_pIndexNew->AbortMerge();
|
||
|
}
|
||
|
|
||
|
class CMasterMerge : public CMerge
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CMasterMerge ( CResManager & resman, PARTITIONID partid )
|
||
|
: CMerge( resman, partid, mtMaster ),
|
||
|
_widCurrentMaster(widInvalid),
|
||
|
_widMasterLog(widInvalid),
|
||
|
_fSoftAbort(0),
|
||
|
_pNewKeyList(0),
|
||
|
_widKeyList(widInvalid)
|
||
|
{
|
||
|
END_CONSTRUCTION( CMasterMerge );
|
||
|
}
|
||
|
|
||
|
~CMasterMerge();
|
||
|
|
||
|
CWKeyList * LokGetNewKeyList() { return _pNewKeyList; }
|
||
|
void LokReleaseNewKeyList() { _pNewKeyList = 0; }
|
||
|
|
||
|
// Main worker: no lock should be held!
|
||
|
|
||
|
void Do(CCiFrmPerfCounter & mergeProgress);
|
||
|
|
||
|
//
|
||
|
// These methods require LOCKING
|
||
|
//
|
||
|
|
||
|
void LokGrabResources( CDeletedIIDTrans & trans );
|
||
|
|
||
|
void LokRollBack ( unsigned swapped = 0 );
|
||
|
|
||
|
void LokLoadRestartResources();
|
||
|
|
||
|
CMasterMergeIndex * LokGetMasterMergeIndex()
|
||
|
{
|
||
|
return( (CMasterMergeIndex *) _pIndexNew );
|
||
|
}
|
||
|
|
||
|
void LokTakeIndexes( CMasterMergeIndex * pMaster );
|
||
|
|
||
|
private:
|
||
|
|
||
|
CMasterMergeIndex * LokCreateOrFindNewMaster();
|
||
|
|
||
|
void LokStoreRestartResources( CDeletedIIDTrans & delIIDTrans );
|
||
|
|
||
|
WORKID _widCurrentMaster; // Last master on this partition
|
||
|
WORKID _widMasterLog; // Master log for this partition
|
||
|
|
||
|
|
||
|
BOOL _fSoftAbort; // Flag set to TRUE if a soft
|
||
|
// abort must be done.
|
||
|
WORKID _widKeyList; // Keylist for this partition
|
||
|
CWKeyList * _pNewKeyList;
|
||
|
|
||
|
};
|
||
|
|