windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/postcfg/postcfgmgr.h
2020-09-26 16:20:57 +08:00

187 lines
8.2 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2001 Microsoft Corporation
//
// Module Name:
// PostCfgManager.h
//
// Description:
// CPostCfgManager implementation.
//
// Maintained By:
// Galen Barbee (GalenB) 09-JUN-2000
//
//////////////////////////////////////////////////////////////////////////////
// Make sure that this file is included only once per compile path.
#pragma once
//////////////////////////////////////////////////////////////////////////////
// Include Files
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Constant Declarations
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//++
//
// class CPostCfgManager
//
// Description:
// The class CPostCfgManager inplements the PostCfgManager
// interface.
//
// Interfaces:
// IPostCfgManager
// IClusCfgInitialize
// IClusCfgCallback
//
//--
//////////////////////////////////////////////////////////////////////////////
class
CPostCfgManager
: public IPostCfgManager // private
, public IClusCfgInitialize
, public IClusCfgCallback
{
private:
//
// Private types
//
// Stucture for one entry in the resource type GUID to resource type name map.
struct SResTypeGUIDAndName
{
GUID m_guidTypeGUID;
WCHAR * m_pszTypeName;
}; //*** SResTypeGUIDAndName
// IUnknown
LONG m_cRef; // Reference counter
// Pointer to the callback interface.
IClusCfgCallback * m_pcccb; // Callback to the client
// The locale id
LCID m_lcid; // Local ID of the client
// IPostCfgManager
IEnumClusCfgManagedResources * m_peccmr; // Enumer of managed resources
IClusCfgClusterInfo * m_pccci; // Cluster configuration list
ULONG m_cResources; // Count of resources in list
ULONG m_cAllocedResources; // Count of alloc'ed resources
CResourceEntry ** m_rgpResources; // List of pointers to Resource Entries
ULONG m_idxIPAddress; // Cluster IP Address resource index
ULONG m_idxClusterName; // Cluster Name resource index
ULONG m_idxQuorumResource; // Quorum resource index
ULONG m_idxLastStorage; // Last storage resource examined
HCLUSTER m_hCluster; // Cluster handle
ULONG m_cNetName; // Net Name instance counter
ULONG m_cIPAddress; // IP Address instance counter
SResTypeGUIDAndName * m_pgnResTypeGUIDNameMap; // Map between resource type GUID and its name
ULONG m_idxNextMapEntry; // Index of the first free map entry
ULONG m_cMapSize; // Count of the number of elements in the map buffer.
DWORD m_dwLocalQuorumStatusMax; // The max of the status report range for local quorum deletion.
ECommitMode m_ecmCommitChangesMode; // What are we doing, create cluster, adding nodes, or cleaning up?
BOOL m_isQuorumChanged:1; // Set this flag if a better quorum resource has been found.
BSTR m_bstrNodeName;
private: // Methods
CPostCfgManager( void );
~CPostCfgManager( void );
// Private copy constructor to prevent copying.
CPostCfgManager( const CPostCfgManager & nodeSrc );
// Private assignment operator to prevent copying.
const CPostCfgManager & operator = ( const CPostCfgManager & nodeSrc );
HRESULT HrInit( void );
HRESULT HrPreCreateResources( void );
HRESULT HrCreateGroups( void );
HRESULT HrCreateResources( void );
HRESULT HrPostCreateResources( void );
HRESULT HrFindNextSharedStorage( ULONG * pidxInout );
HRESULT HrAttemptToAssignStorageToResource( ULONG idxResourceIn, EDependencyFlags dfResourceFlagsIn );
HRESULT HrMovedDependentsToAnotherResource( ULONG idxSourceIn, ULONG idxDestIn );
HRESULT HrSetGroupOnResourceAndItsDependents( ULONG idxResourceIn, CGroupHandle * pghIn );
HRESULT HrFindGroupFromResourceOrItsDependents( ULONG idxResourceIn, CGroupHandle ** pghOut );
HRESULT HrCreateResourceAndDependents( ULONG idxResourceIn );
HRESULT HrPostCreateResourceAndDependents( ULONG idxResourceIn );
HRESULT HrPreInitializeExistingResources( void );
HRESULT HrAddSpecialResource( BSTR bstrNameIn, const CLSID * pclsidTypeIn, const CLSID * pclsidClassTypeIn );
HRESULT HrCreateResourceInstance( ULONG idxResourceIn, HGROUP hGroupIn, LPCWSTR pszResTypeIn, HRESOURCE * phResourceOut );
HRESULT HrGetCoreClusterResourceNames(
BSTR * pbstrClusterNameResourceNameOut
, HRESOURCE * phClusterNameResourceOut
, BSTR * pbstrClusterIPAddressNameOut
, HRESOURCE * phClusterIPAddressResourceOut
, BSTR * pbstrClusterQuorumResourceNameOut
, HRESOURCE * phClusterQuorumResourceOut
);
//HRESULT HrIsLocalQuorum( BSTR bstrNameIn );
// Enumerate all components on the local computer registered for resource type
// configuration.
HRESULT HrConfigureResTypes( IUnknown * punkResTypeServicesIn );
// Instantiates a resource type configuration component and calls the appropriate methods.
HRESULT HrProcessResType( const CLSID & rclsidResTypeCLSIDIn, IUnknown * punkResTypeServicesIn );
// Notify all components on the local computer registered to get
// notification of cluster member set change (create, add node or evict).
HRESULT HrNotifyMemberSetChangeListeners( void );
// Instantiates cluster member set change listener and notifies it.
HRESULT HrProcessMemberSetChangeListener( const CLSID & rclsidListenerClsidIn );
// Create a mapping between a resource type GUID and a resource type name.
HRESULT HrMapResTypeGUIDToName( const GUID & rcguidTypeGuidIn, const WCHAR * pcszTypeNameIn );
// Given a resource type GUID this function finds the resource type name if any.
const WCHAR * PcszLookupTypeNameByGUID( const GUID & rcguidTypeGuidIn );
// Callback function used to delete the local quorum resource.
static DWORD S_DwDeleteLocalQuorumResource( HCLUSTER hClusterIn , HRESOURCE hSelfIn, HRESOURCE hCurrentResourceIn, PVOID pvParamIn );
#if defined(DEBUG)
void
DebugDumpDepencyTree( void );
#endif // DEBUG
public: // Methods
static HRESULT S_HrCreateInstance( IUnknown ** ppunkOut );
// IUnknown
STDMETHOD( QueryInterface )( REFIID riid, LPVOID *ppv );
STDMETHOD_( ULONG, AddRef )( void );
STDMETHOD_( ULONG, Release )( void );
// IPostCfgManager - private
STDMETHOD( CommitChanges )( IEnumClusCfgManagedResources * peccmrIn, IClusCfgClusterInfo * pccciIn );
// IClusCfgInitialize
STDMETHOD( Initialize )( IUnknown * punkCallbackIn, LCID lcidIn );
// IClusCfgCallback
STDMETHOD( SendStatusReport )(
LPCWSTR pcszNodeNameIn
, CLSID clsidTaskMajorIn
, CLSID clsidTaskMinorIn
, ULONG ulMinIn
, ULONG ulMaxIn
, ULONG ulCurrentIn
, HRESULT hrStatusIn
, LPCWSTR pcszDescriptionIn
, FILETIME * pftTimeIn
, LPCWSTR pcszReferenceIn
);
}; //*** Class CPostCfgManager