Función MoveClusterGroupEx (clusapi.h)
Extiende el método MoveClusterGroup existente con la adición de marcas y un búfer. Las marcas controlan el comportamiento de la directiva de conmutación por error del clúster y el búfer de entrada permite al cliente enviar instrucciones especiales a los recursos del grupo.
Sintaxis
DWORD MoveClusterGroupEx(
[in] HGROUP hGroup,
[in, optional] HNODE hDestinationNode,
[in] DWORD dwMoveFlags,
[in, optional] PBYTE lpInBuffer,
[in] DWORD cbInBufferSize
);
Parámetros
[in] hGroup
Identificador de un grupo de clústeres.
[in, optional] hDestinationNode
Identificador de un nodo de clúster, que indica el nodo al que se debe mover el grupo. Este parámetro es opcional. Si se deja NULL, el clúster moverá el grupo al nodo más adecuado, según las directivas de conmutación por error configuradas para el clúster y para este grupo en particular.
[in] dwMoveFlags
Combinación bit a bit de las marcas que influyen en la directiva de conmutación por error con respecto a esta operación de movimiento.
CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS (0x00000001)
Fuerza el movimiento del grupo incluso si un recurso ha indicado que debe estar "bloqueado" en su estado actual en el nodo actual y finaliza el recurso si es necesario.
CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR (0x00000002)
Si el grupo no alcanza su estado persistente en el nodo de destino (ya sea especificado con hDestinationNode o elegido por el clúster), devuelve el grupo al nodo de origen y lo lleva a su estado persistente allí.
CLUSAPI_GROUP_MOVE_QUEUE_ENABLED (0x00000004)
Si un archivo DLL de recursos del grupo indica que el traslado no es posible en este momento, pero puede ser posible en un futuro próximo, pone en cola este movimiento en el servicio de clúster y continúa reintentando, cuando se considere adecuado, hasta que el cliente complete o cancele la operación de traslado.
CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START (0x00000008)
Lleva este grupo a su estado persistente en el nodo de destino tan pronto como sea posible sin tener en cuenta las directivas específicas de la implementación que rigen la ordenación o priorización de traer grupos a sus estados persistentes.
CLUSAPI_GROUP_MOVE_FAILBACK (0x00000010)
Reservado.
[in, optional] lpInBuffer
Lista de propiedades que contiene instrucciones de operación de movimiento para recursos específicos dentro del grupo. Las instrucciones se incluyen en los valores de propiedad. Los recursos del grupo buscan en la lista de propiedades los nombres de propiedad que admiten para las operaciones de movimiento y, a continuación, interpretan las instrucciones del valor de propiedad asociado. Las propiedades admitidas por un recurso en una operación MoveClusterGroupEx no están relacionadas con las propiedades privadas asociadas a un recurso.
[in] cbInBufferSize
Tamaño de lpInBuffer, en bytes.
Valor devuelto
MoveClusterGroupEx devuelve ERROR_IO_PENDING si se ha aceptado el comando move y está en curso. MoveClusterGroupEx devuelve un código de error distinto de cero si el comando move se rechazó inmediatamente sin cambios en el estado del grupo. Por ejemplo, esto ocurriría si hDestinationNode no está activo en el momento de la solicitud de traslado.
Comentarios
MoveClusterGroupEx produce un error inmediatamente con el error ERROR_CLUSTER_RESOURCE_LOCKED_STATUS si la marca de CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS no está establecida y ningún recurso del grupo está en línea y ha indicado que está "bloqueado" en su estado actual.
Después de que MoveClusterGroupEx devuelva ERROR_IO_PENDING, hay una serie de resultados posibles, entre los que se incluyen:
- La operación de movimiento podría realizarse correctamente y el grupo podría alcanzar su estado persistente en el nodo de destino.
- La operación de traslado podría producir un error, en que el grupo no puede alcanzar su estado persistente en el nodo de destino. Si dwMoveFlags no incluye CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, el clúster realizará las acciones adecuadas (según las directivas configuradas) para llevar el grupo a su estado persistente, quizás en otros nodos del clúster. Si dwMoveFlags incluye CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, el clúster intentará llevar el grupo a su estado persistente en el nodo de origen. Si se produce un error, el clúster realizará las acciones adecuadas (según las directivas configuradas) para llevar el grupo a su estado persistente, quizás en otros nodos del clúster.
- La operación de traslado se podría poner en cola si un recurso indica que no se puede mover inmediatamente y se establece la marca de CLUSAPI_GROUP_MOVE_QUEUE_ENABLED .
- Un recurso del grupo podría rechazar la operación de traslado, devolviendo así el grupo a su estado persistente en el nodo de origen sin incrementar los recuentos de errores ni desencadenar ninguna directiva de error. Esto no puede ocurrir si se establece la marca CLUSAPI_GROUP_MOVE_IGNORE_RESOURCE_STATUS .
- En el parámetro dwMoveFlags , establezca las marcas CLUSAPI_GROUP_MOVE_RETURN_TO_SOURCE_NODE_ON_ERROR, CLUSAPI_GROUP_MOVE_QUEUE_ENABLED y CLUSAPI_GROUP_MOVE_HIGH_PRIORITY_START .
- En el parámetro lpInBuffer , agregue a la lista de propiedades un tipo de recurso denominado "Máquina virtual" o "Configuración de máquina virtual" que especifique un valor de enumeración CLUSTER_PROPERTY_FORMAT de CLUSPROP_FORMAT_DWORD (que representa el formato de datos de la propiedad) y un valor de propiedad de VmResdllContextLiveMigration (de la enumeración VM_RESDLL_CONTEXT de posibles acciones de máquina virtual).
Ejemplos
#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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | No se admite ninguno |
Servidor mínimo compatible | Windows Server 2012 |
Plataforma de destino | Windows |
Encabezado | clusapi.h |
Library | ClusAPI.lib |
Archivo DLL | ClusAPI.dll |