Поделиться через


Функция MoveClusterGroupEx (clusapi.h)

Расширяет существующий метод MoveClusterGroup с добавлением флагов и буфера. Флаги управляют поведением политики отработки отказа кластера, а входной буфер позволяет клиенту отправлять специальные инструкции ресурсам в группе.

Синтаксис

DWORD MoveClusterGroupEx(
  [in]           HGROUP hGroup,
  [in, optional] HNODE  hDestinationNode,
  [in]           DWORD  dwMoveFlags,
  [in, optional] PBYTE  lpInBuffer,
  [in]           DWORD  cbInBufferSize
);

Параметры

[in] hGroup

Дескриптор группы кластера.

[in, optional] hDestinationNode

Дескриптор узла кластера, указывающий узел, на который следует переместить группу. Этот параметр является необязательным. Если оставить значение NULL, кластер переместит группу на наиболее подходящий узел в соответствии с политиками отработки отказа, настроенными для кластера и для этой конкретной группы.

[in] dwMoveFlags

Побитовое сочетание флагов, влияющих на политику отработки отказа в отношении этой операции перемещения.

CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS (0x00000001)

Принудительное перемещение группы, даже если ресурс указал, что он должен быть заблокирован в текущем состоянии на текущем узле, и при необходимости завершает ресурс.

CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR (0x00000002)

Если группе не удается достичь своего постоянного состояния на конечном узле (независимо от того, указан ли он с помощью hDestinationNode или выбран кластером), возвращает группу на исходный узел и переводит ее в постоянное состояние там.

CLUSAPI_GROUP_MOVE_QUEUE_ENABLED (0x00000004)

Если библиотека DLL ресурса в группе указывает, что перемещение невозможно в настоящее время, но может быть возможно в ближайшем будущем, помещает это перемещение в очередь в службе кластера и продолжает повторять попытку, если сочтет это целесообразным, пока операция перемещения не завершится или не будет отменена клиентом.

CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START (0x00000008)

Переводит эту группу в постоянное состояние на целевом узле как можно скорее без учета политик, относящихся к реализации, которые регулируют упорядочение и (или) определение приоритетов приведения групп к их постоянным состояниям.

CLUSAPI_GROUP_MOVE_FAILBACK (0x00000010)

Зарезервировано.

[in, optional] lpInBuffer

Список свойств, содержащий инструкции по перемещению для определенных ресурсов в группе. Инструкции содержатся в значениях свойств. Ресурсы в группе ищут в списке свойств имена свойств, которые поддерживаются для операций перемещения, а затем интерпретируют инструкции в связанном значении свойства. Свойства, поддерживаемые ресурсом в операции MoveClusterGroupEx , не связаны с частными свойствами, связанными с ресурсом.

[in] cbInBufferSize

Размер lpInBuffer в байтах.

Возвращаемое значение

MoveClusterGroupEx возвращает ERROR_IO_PENDING , если команда перемещения была принята и выполняется. MoveClusterGroupEx возвращает ненулевой код ошибки, если команда перемещения была немедленно отклонена без изменения состояния группы. Например, это произойдет, если hDestinationNode не работает во время запроса на перемещение.

Комментарии

MoveClusterGroupEx немедленно завершается сбоем с ошибкой ERROR_CLUSTER_RESOURCE_LOCKED_STATUS , если флаг CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS не установлен и какой-либо ресурс в группе находится в сети и указывает, что он заблокирован в текущем состоянии.

После того как MoveClusterGroupEx вернет ERROR_IO_PENDING, существует ряд возможных результатов, в том числе:

  • Операция перемещения может завершиться успешно, и группа может достичь своего постоянного состояния на целевом узле.
  • Операция перемещения может завершиться ошибкой, так как группа не может достичь своего постоянного состояния на целевом узле. Если dwMoveFlags не содержит CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, кластер выполнит соответствующие действия (в соответствии с настроенными политиками), чтобы привести группу в постоянное состояние, возможно, на других узлах кластера. Если dwMoveFlags включает CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, кластер попытается перевести группу в постоянное состояние на исходном узле. В случае сбоя кластер выполнит соответствующее действие (в соответствии с настроенными политиками), чтобы привести группу в постоянное состояние, возможно, на других узлах кластера.
  • Операция перемещения может быть помещена в очередь, если ресурс указывает, что он не может немедленно переместиться и установлен флаг CLUSAPI_GROUP_MOVE_QUEUE_ENABLED .
  • Операция перемещения может быть отклонена ресурсом в группе, таким образом возвращая группу в постоянное состояние на исходном узле без увеличения количества сбоев и без активации политик сбоев. Это не может произойти, если установлен флаг CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS .
Для динамической миграции виртуальной машины выполните следующие действия.
  1. В параметре dwMoveFlags задайте флаги CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, CLUSAPI_GROUP_MOVE_QUEUE_ENABLED и CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START .
  2. В параметре lpInBuffer добавьте в список свойств тип ресурса с именем "Виртуальная машина" или "Конфигурация виртуальной машины", который задает значение перечисления CLUSTER_PROPERTY_FORMATCLUSPROP_FORMAT_DWORD (который представляет формат данных свойства) и значение свойства VmResdllContextLiveMigration (из перечисления VM_RESDLL_CONTEXT возможных действий виртуальной машины).
MoveClusterGroupEx требует, чтобы клиенту был предоставлен полный доступ к дескриптору безопасности кластера.

Примеры

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <ClusAPI.h>


#define DemoResDllTypeName L"dummy"
#define DemoGroupName L"DemoGroup"


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;
    }


    // Move Group example
    error = MoveClusterGroupEx( hGroup,
                                NULL,
                                CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR | CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS,
                                NULL,
                                0);

    if ( error == ERROR_IO_PENDING  )
    {
        wprintf( L"Group move pending" DemoGroupName L": 0x%x\n", error );
        error = ERROR_SUCCESS;
    }
    else if ( error != ERROR_SUCCESS)
    {
        wprintf( L"Failed to move group" DemoGroupName L": 0x%x\n", error );
    }
    else 
    {
        wprintf( L"Group move completed" DemoGroupName L": 0x%x\n");
    }

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