Функция OfflineClusterGroupEx (clusapi.h)
Расширяет метод OfflineClusterGroup . Клиент может использовать флаги для управления политиками отработки отказа группы, а входной буфер — для отправки конкретных инструкций по автономной операции ресурсам в целевой группе. Например, входной буфер можно использовать для указания виртуальной машине перейти в автономный режим путем сохранения ее состояния, а не завершения работы.
Синтаксис
DWORD OfflineClusterGroupEx(
[in] HGROUP hGroup,
[in] DWORD dwOfflineFlags,
PBYTE lpInBuffer,
[in] DWORD cbInBufferSize
);
Параметры
[in] hGroup
Дескриптор группы кластера.
[in] dwOfflineFlags
Флаги, влияющие на автономную политику. Наряду с 0x0 приемлемое значение: CLUSAPI_GROUP_OFFLINE_IGNORE_RESOURCE_LOCKED_STATUS (0x00000001): игнорирование, если ресурс должен быть заблокирован в текущем состоянии.
lpInBuffer
Содержит инструкции для автономной операции, предназначенной для определенных ресурсов в группе. lpInBuffer форматируется как список свойств, что означает, что инструкции содержатся в значениях свойств. Ресурсы в группе ищут в списке свойств имена свойств, которые поддерживаются для автономных операций, а затем интерпретируют инструкции в соответствующем значении свойства. Обратите внимание, что свойства, поддерживаемые ресурсом в операции OfflineClusterGroupEx , не связаны с частными свойствами, связанными с ресурсом.
[in] cbInBufferSize
Размер lpInBuffer в байтах.
Возвращаемое значение
OfflineClusterGroupEx возвращает ERROR_IO_PENDING , если автономная команда была принята и выполняется. OfflineClusterGroupEx возвращает ненулевой код ошибки, если автономная команда была немедленно отклонена без изменения состояния группы.
Комментарии
OfflineClusterGroupEx немедленно завершается сбоем с ошибкой ERROR_CLUSTER_RESOURCE_LOCKED_STATUS , если флаг CLUSAPI_OFFLINE_GROUP_IGNORE_RESOURCE_LOCKED_STATUS не задан и какой-либо ресурс в группе указал, что он заблокирован в текущем состоянии.
Как и в случае с MoveClusterGroupEx, если OfflineClusterGroupEx возвращает ERROR_IO_PENDING, служба кластера попытается перевести группу в автономное состояние.
OfflineClusterGroupEx требует, чтобы клиенту был предоставлен полный доступ к дескриптору безопасности кластера.
Примеры
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <ClusAPI.h>
#define DemoResDllTypeName L"dummy"
#define DemoGroupName L"DemoGroup"
BOOL WaitForGroupToGoOffline(__in HGROUP hGroup)
{
for(;;)
{
CLUSTER_GROUP_STATE state = GetClusterGroupState( hGroup, NULL, NULL );
if( state == ClusterGroupFailed || state == ClusterGroupPartialOnline || state == ClusterGroupOnline)
{
return false;
}
else if ( state == ClusterGroupOffline )
{
return true;
}
Sleep(100);
}
}
int __cdecl main( void )
{
HCLUSTER hCluster= NULL;
HGROUP hGroup = NULL;
DWORD error = 0;
hCluster = OpenCluster( NULL );
if ( hCluster == NULL )
{
error = GetLastError();
wprintf( L"Failed to open cluster: 0x%x\n", error );
goto Cleanup;
}
hGroup = OpenClusterGroup( hCluster, DemoGroupName );
if ( hGroup == NULL )
{
error = GetLastError();
wprintf( L"Failed to open cluster group " DemoGroupName L": 0x%x\n", error );
goto Cleanup;
}
// Offlining Group example
error = OfflineClusterGroupEx(hGroup, CLUSAPI_GROUP_OFFLINE_IGNORE_RESOURCE_STATUS, NULL, 0);
if ( error == ERROR_IO_PENDING )
{
if (WaitForGroupToGoOffline(hGroup))
{
error = ERROR_SUCCESS;
}
}
if ( error )
{
wprintf( L"Failed to offline the group" DemoGroupName L": 0x%x\n", error );
goto Cleanup;
}
else
{
wprintf( L"Offlined the group" DemoGroupName);
}
Cleanup:
if ( hGroup != NULL )
{
CloseClusterGroup( hGroup );
hGroup = NULL;
}
if ( hCluster != NULL )
{
CloseCluster( hCluster );
hCluster = NULL;
}
return (int)error;
}
Требования
Минимальная версия клиента | Ни одна версия не поддерживается |
Минимальная версия сервера | Windows Server 2012 |
Целевая платформа | Windows |
Header | clusapi.h |
Библиотека | ClusAPI.lib |
DLL | ClusAPI.dll |