|
|
#ifndef _FM_H
#define _FM_H
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
fm.h
Abstract:
Public data structures and procedure prototypes for the Failover Manager subcomponent of the NT Cluster Service
Author:
John Vert (jvert) 7-Feb-1996
Revision History:
--*/
//
// Public structure definitions
//
//
// FM notifications
// The FM supports the following notifications to allow other
// cluster components to prepare and cleanup state.
//
//SS: for now add it here..but if this is needed externally
//move it to appropriate place
// these notifications are generated only on the node where the
// resource resides
#define NOTIFY_RESOURCE_PREONLINE 0x00000001
#define NOTIFY_RESOURCE_POSTONLINE 0x00000002
#define NOTIFY_RESOURCE_PREOFFLINE 0x00000004
#define NOTIFY_RESOURCE_POSTOFFLINE 0x00000008 //this is the same as offline
#define NOTIFY_RESOURCE_FAILED 0x00000010
#define NOTIFY_RESOURCE_OFFLINEPENDING 0x00000020
#define NOTIFY_RESOURCE_ONLINEPENDING 0x00000040
//
// Resource type structure definition
//
// Define Flags
#define RESTYPE_DEBUG_CONTROL_FUNC 1
#define RESTYPE_STATE_LOADS 0x00000001
typedef struct FM_RESTYPE { LPWSTR DllName; DWORD LooksAlivePollInterval; DWORD IsAlivePollInterval; LPWSTR DebugPrefix; DWORD Flags; DWORD State; DWORD Class; LIST_ENTRY PossibleNodeList; } FM_RESTYPE, *PFM_RESTYPE;
//
// Resource Possible Owners structure
//
typedef struct RESTYPE_POSSIBLE_ENTRY { LIST_ENTRY PossibleLinkage; PNM_NODE PossibleNode; } RESTYPE_POSSIBLE_ENTRY, *PRESTYPE_POSSIBLE_ENTRY;
#if CLUSTER_BETA
#define FM_MAX_LOCK_ENTRIES 8
#else
#define FM_MAX_LOCK_ENTRIES 4
#endif
//
// Group structure
//
typedef struct _LOCK_INFO { DWORD Module: 5; DWORD ThreadId: 11; DWORD LineNumber: 16; } LOCK_INFO, *PLOCK_INFO;
typedef struct FM_GROUP { DWORD dwStructState; LIST_ENTRY Contains; // List of root resources in this Group
LIST_ENTRY PreferredOwners; // Ordered list of preferred owners
LIST_ENTRY DmRundownList; // DM rundown list
DWORD OrderedOwners; // # of ordered owners in above list
CRITICAL_SECTION Lock; // Critical section for this Group
DWORD LockIndex; DWORD UnlockIndex; LOCK_INFO LockTable[FM_MAX_LOCK_ENTRIES]; LOCK_INFO UnlockTable[FM_MAX_LOCK_ENTRIES]; CLUSTER_GROUP_STATE State; // State of the Group
PRESOURCE_ENUM MovingList; // Ptr to List of moving resources
BOOL Initialized; // TRUE if registry parameters read
BOOL InitFailed; // TRUE if a resource fails to init
PNM_NODE OwnerNode; // Ptr to owner node. NULL if not known
UCHAR FailbackType; // See AutoFailbackTypes
UCHAR FailbackWindowStart; // 0-24 hours
UCHAR FailbackWindowEnd; // 0-24 hours (0 is immediate)
UCHAR FailoverPeriod; // 1-24 hours (0 is infinite)
DWORD FailoverThreshold; // 1-N failovers (0 is infinite)
CLUSTER_GROUP_STATE PersistentState; // Preferred state of this group
DWORD FailureTime; // Time of first failure
DWORD NumberOfFailures; // Number of failures.
HDMKEY RegistryKey; LIST_ENTRY WaitQueue; // chained FM_WAIT_BLOCK structures
DWORD StateSequence; HANDLE hPendingEvent; PNM_NODE pIntendedOwner; LPWSTR lpszAntiAffinityClassName; // Anti-affinity property
} FM_GROUP, *PFM_GROUP;
#define FM_GROUP_STRUCT_CREATED 0x00000001
#define FM_GROUP_STRUCT_INITIALIZED 0x00000002
#define FM_GROUP_STRUCT_MARKED_FOR_DELETE 0x00000004
#define FM_GROUP_STRUCT_MARKED_FOR_MOVE_ON_FAIL 0x00000008
#define FM_GROUP_STRUCT_MARKED_FOR_REGULAR_MOVE 0x00000010
#define FM_GROUP_STRUCT_MARKED_FOR_PENDING_ACTION 0x00000020
#define IS_VALID_FM_GROUP(pFmGroup) \
(!(pFmGroup->dwStructState & FM_GROUP_STRUCT_MARKED_FOR_DELETE))
//
#define IS_PENDING_FM_GROUP(pFmGroup) \
(pFmGroup->dwStructState & FM_GROUP_STRUCT_MARKED_FOR_PENDING_ACTION)
// Resource structure and types
//
//
// Resource structure
//
// Define Flags
#define RESOURCE_SEPARATE_MONITOR 1
#define RESOURCE_CREATED 2
#define RESOURCE_WAITING 4
typedef struct FM_RESOURCE { DWORD dwStructState; LIST_ENTRY DependsOn; LIST_ENTRY ProvidesFor; LIST_ENTRY PossibleOwners; // List of possible owners
LIST_ENTRY ContainsLinkage; // Linkage onto FM_GROUP.Contains
LIST_ENTRY DmRundownList; // DM rundown list
//SS: for now we dont use resource locks, so dont create it and leak it !
//CRITICAL_SECTION Lock;
RESID Id; CLUSTER_RESOURCE_STATE State; BOOL QuorumResource; LPWSTR Dependencies; LPWSTR DebugPrefix; DWORD DependenciesSize; struct RESMON *Monitor; PFM_RESTYPE Type; PFM_GROUP Group; ULONG Flags; DWORD LooksAlivePollInterval; DWORD IsAlivePollInterval; CLUSTER_RESOURCE_STATE PersistentState; DWORD RestartAction; DWORD RestartThreshold; DWORD RestartPeriod; DWORD NumberOfFailures; DWORD PendingTimeout; HANDLE PendingEvent; HDMKEY RegistryKey; DWORD FailureTime; PVOID CheckpointState; // for use by checkpoint manager
DWORD ExFlags; // Extrinsic flags
DWORD Characteristic; DWORD StateSequence; BOOL PossibleList; // TRUE if possible list entries specified
DWORD BlockingQuorum; // 1 if shared lock held, blocking quorum
HANDLE hTimer; // handle to timer used for delayed restart
DWORD RetryPeriodOnFailure; //Time,in milliseconds, after which a restart will be attempted
} FM_RESOURCE, *PFM_RESOURCE;
#define FM_RESOURCE_STRUCT_CREATED 0x00000001
#define FM_RESOURCE_STRUCT_INITIALIZED 0x00000002
#define FM_RESOURCE_STRUCT_MARKED_FOR_DELETE 0x00000004
#define IS_VALID_FM_RESOURCE(pFmResource) \
(!(pFmResource->dwStructState & FM_RESOURCE_STRUCT_MARKED_FOR_DELETE))
//
// Dependency structure
//
typedef struct dependency { LIST_ENTRY DependentLinkage; PFM_RESOURCE DependentResource; LIST_ENTRY ProviderLinkage; PFM_RESOURCE ProviderResource; } DEPENDENCY, *PDEPENDENCY;
//
// AutoFailbackType
//
typedef enum { GroupNoFailback, GroupFailback } GROUP_FAILBACK_TYPE;
//
// Group Preferred Owners structure
//
typedef struct PREFERRED_ENTRY { LIST_ENTRY PreferredLinkage; PNM_NODE PreferredNode; } PREFERRED_ENTRY, *PPREFERRED_ENTRY;
//
// Resource Possible Owners structure
//
typedef struct POSSIBLE_ENTRY { LIST_ENTRY PossibleLinkage; PNM_NODE PossibleNode; } POSSIBLE_ENTRY, *PPOSSIBLE_ENTRY;
//
// Public function interfaces
//
//
// Startup, online and shutdown
//
DWORD WINAPI FmInitialize( VOID );
BOOL FmArbitrateQuorumResource( VOID );
VOID FmHoldIO( VOID );
VOID FmResumeIO( VOID );
DWORD WINAPI FmFindQuorumResource( OUT PFM_RESOURCE *ppResource );
DWORD FmBringQuorumOnline();
DWORD WINAPI FmFindQuorumOwnerNodeId( IN PFM_RESOURCE pResource );
DWORD WINAPI FmGetQuorumResource( OUT PFM_GROUP *ppQuoGroup, OUT LPDWORD lpdwSignature OPTIONAL );
DWORD WINAPI FmSetQuorumResource( IN PFM_RESOURCE Resource, IN LPCWSTR lpszLogPathName, IN DWORD dwMaxQuorumLogSize );
DWORD WINAPI FmBackupClusterDatabase( IN LPCWSTR lpszPathName );
DWORD WINAPI FmFormNewClusterPhase1( IN PFM_GROUP pQuoGroup );
DWORD WINAPI FmFormNewClusterPhase2( VOID );
DWORD WINAPI FmJoinPhase1( VOID );
DWORD WINAPI FmJoinPhase2( VOID );
VOID FmJoinPhase3( VOID );
VOID FmShutdownGroups( VOID );
VOID FmShutdown( VOID );
//
// Management APIs for groups
//
DWORD WINAPI FmOnlineGroup( IN PFM_GROUP Group );
DWORD WINAPI FmOfflineGroup( IN PFM_GROUP Group );
DWORD WINAPI FmMoveGroup( IN PFM_GROUP Group, IN PNM_NODE DestinationNode OPTIONAL );
PFM_GROUP WINAPI FmCreateGroup( IN LPWSTR GroupId, IN LPCWSTR GroupName );
DWORD WINAPI FmDeleteGroup( IN PFM_GROUP Group );
DWORD WINAPI FmSetGroupName( IN PFM_GROUP Group, IN LPCWSTR FriendlyName );
CLUSTER_GROUP_STATE WINAPI FmGetGroupState( IN PFM_GROUP Group, OUT LPWSTR NodeName, IN OUT PDWORD NameLength );
//
// Check if a cluster partition exists
//
BOOL WINAPI FmVerifyNodeDown( IN PNM_NODE Node, OUT LPBOOL IsDown );
DWORD WINAPI FmEvictNode( IN PNM_NODE Node );
//
// enumeration callback routine definitions
//
typedef BOOL (*FM_ENUM_GROUP_RESOURCE_ROUTINE)( IN PVOID Context1, IN PVOID Context2, IN PVOID Resource, IN LPCWSTR Name );
DWORD WINAPI FmEnumerateGroupResources( IN PFM_GROUP Group, IN FM_ENUM_GROUP_RESOURCE_ROUTINE EnumerationRoutine, IN PVOID Context1, IN PVOID Context2 );
//
// Management APIs for resources
//
PFM_RESOURCE WINAPI FmCreateResource( IN PFM_GROUP Group, IN LPWSTR ResourceId, IN LPCWSTR ResourceName, IN LPCWSTR ResourceType, IN DWORD dwFlags );
DWORD WINAPI FmOnlineResource( IN PFM_RESOURCE Resource );
DWORD WINAPI FmOfflineResource( IN PFM_RESOURCE Resource );
CLUSTER_RESOURCE_STATE WINAPI FmGetResourceState( IN PFM_RESOURCE Resource, OUT LPWSTR NodeName, IN OUT PDWORD NameLength );
DWORD WINAPI FmFailResource( IN PFM_RESOURCE Resource );
DWORD WINAPI FmDeleteResource( IN PFM_RESOURCE Resource );
DWORD WINAPI FmSetResourceName( IN PFM_RESOURCE Resource, IN LPCWSTR FriendlyName );
DWORD WINAPI FmAddResourceDependency( IN PFM_RESOURCE Resource, IN PFM_RESOURCE DependentResource );
DWORD WINAPI FmRemoveResourceDependency( IN PFM_RESOURCE Resource, IN PFM_RESOURCE DependentResource );
BOOL FmDependentResource( IN PFM_RESOURCE Resource, IN PFM_RESOURCE DependentResource, IN BOOL ImmediateOnly );
DWORD WINAPI FmEnumResourceDependent( IN PFM_RESOURCE Resource, IN DWORD Index, OUT PFM_RESOURCE *DependentResource );
DWORD WINAPI FmEnumResourceProvider( IN PFM_RESOURCE Resource, IN DWORD Index, OUT PFM_RESOURCE *ProviderResource );
DWORD WINAPI FmEnumResourceNode( IN PFM_RESOURCE Resource, IN DWORD Index, OUT PNM_NODE *ProviderResource );
DWORD WINAPI FmChangeResourceNode( IN PFM_RESOURCE Resource, IN PNM_NODE Node, IN BOOL Add );
DWORD FmCreateResourceType( IN LPCWSTR lpszTypeName, IN LPCWSTR lpszDisplayName, IN LPCWSTR lpszDllName, IN DWORD dwLooksAlive, IN DWORD dwIsAlive );
DWORD WINAPI FmDeleteResourceType( IN LPCWSTR TypeName );
DWORD FmEnumResourceTypeNode( IN PFM_RESTYPE pResType, IN DWORD dwIndex, OUT PNM_NODE *pPossibleNode );
DWORD FmChangeResourceGroup( IN PFM_RESOURCE Resource, IN PFM_GROUP Group );
DWORD FmChangeClusterName( IN LPCWSTR NewName );
DWORD FmNetNameParseProperties( IN PUCHAR InBuffer, IN DWORD InBufferSize, OUT LPWSTR *ppszClusterName );
DWORD WINAPI FmResourceControl( IN PFM_RESOURCE Resource, IN PNM_NODE Node OPTIONAL, IN DWORD ControlCode, IN PUCHAR InBuffer, IN DWORD InBufferSize, OUT PUCHAR OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required );
DWORD WINAPI FmResourceTypeControl( IN LPCWSTR ResourceTypeName, IN PNM_NODE Node OPTIONAL, IN DWORD ControlCode, IN PUCHAR InBuffer, IN DWORD InBufferSize, OUT PUCHAR OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required );
DWORD WINAPI FmGroupControl( IN PFM_GROUP Group, IN PNM_NODE Node OPTIONAL, IN DWORD ControlCode, IN PUCHAR InBuffer, IN DWORD InBufferSize, OUT PUCHAR OutBuffer, IN DWORD OutBufferSize, OUT LPDWORD BytesReturned, OUT LPDWORD Required );
//
// Routines for manipulating dependency trees
//
typedef struct FM_DEPENDENCY_TREE { LIST_ENTRY ListHead; } FM_DEPENDENCY_TREE, *PFM_DEPENDENCY_TREE;
typedef struct FM_DEPENDTREE_ENTRY { LIST_ENTRY ListEntry; PFM_RESOURCE Resource; } FM_DEPENDTREE_ENTRY, *PFM_DEPENDTREE_ENTRY;
PFM_DEPENDENCY_TREE FmCreateFullDependencyTree( IN PFM_RESOURCE Resource );
VOID FmDestroyFullDependencyTree( IN PFM_DEPENDENCY_TREE Tree );
BOOL FmCheckNetworkDependency( IN LPCWSTR DependentNetwork );
DWORD FmBuildWINS( IN DWORD dwFixUpType, OUT PVOID *ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR *pszKeyName );
DWORD FmBuildDHCP( IN DWORD dwFixUpType, OUT PVOID *ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildIIS( IN DWORD dwFixUpType, OUT PVOID *ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildSMTP( IN DWORD dwFixUpType, OUT PVOID *ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildNNTP( IN DWORD dwFixUpType, OUT PVOID *ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildMSDTC( IN DWORD dwFixUpType, OUT PVOID * ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildNewMSMQ( IN DWORD dwFixUpType, OUT PVOID * ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmBuildClusterProp( IN DWORD dwFixUpType, OUT PVOID * ppPropertyList, OUT LPDWORD pdwPropertyListSize, OUT LPWSTR * pszKeyName );
DWORD FmCreateRpcBindings( PNM_NODE Node );
//callback for registry fixups (resource type addition)
DWORD FmFixupNotifyCb(VOID);
//the callback registered for object notifications
typedef void (WINAPI *FM_ONLINE_ONTHISNODE_CB)( );
void FmCheckQuorumState( IN FM_ONLINE_ONTHISNODE_CB OnLineOnThisNodeCb, OUT PBOOL pbQuorumOfflineOnThisNode );
DWORD FmDoesQuorumAllowJoin();
DWORD FmDoesQuorumAllowLogging();
//Fixup function for AdminExt value
DWORD FmFixupAdminExt(VOID);
#endif //_FM_H
|