RGM invoca el método de rellamada Stop de una implementación del tipo de recurso en un nodo del clúster para detener la aplicación. La semántica de la rellamada del método Stop requiere estas condiciones:
El método Stop ha de ser idempotente, ya que RGM lo puede invocar aun cuando el método Start no se haya completado satisfactoriamente en el nodo. Por tanto, el método Stop debe ser satisfactorio (salida cero) aunque la aplicación no se esté ejecutando actualmente en el nodo del clúster y no tenga que realizar ninguna tarea.
Si el método Stop del tipo de recurso falla (la salida es diferente de cero) en un nodo del clúster, el recurso que se está deteniendo acabaría con el estado STOP_FAILED. Según la configuración de Failover_mode del recurso, esto puede hacer que RGM realice un rearranque por hardware del nodo del clúster. Por eso es importante diseñar el método Stop de forma que intente realmente detener la aplicación, aunque sea de forma seca y brusca (por ejemplo, con SIGKILL) si la aplicación no se puede terminar de otra forma. También debería hacerlo en un tiempo determinado, porque cuando se cumple el tiempo de espera de Stop_timeout la estructura considera que se ha producido un fallo de parada y pone el recurso en el estado STOP_FAILED.
La utilidad scds_pmf_stop() de DSDL debería bastar para casi todas las aplicaciones ya que en primer lugar intenta detenerlas de forma no drástica (a través de SIGTERM) (asume que se inició con PMF mediante scds_pmf_start()) seguido por el envío de SIGKILL al proceso. Consulte Funciones de PMF para obtener más detalles sobre esta utilidad.
Siguiendo el modelo del código que hemos utilizado hasta ahora, presuponiendo que la función específica de la aplicación para detener la aplicación se denomine svc_stop() (que la implementación de svc_stop() utilice scds_pmf_stop() no es relevante en este momento y dependerá de que la aplicación se haya iniciado bajo PMF con el método Start), el método Stop se puede implementar de la manera siguiente:
if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* Error de inicialización */ } return (svc_stop(handle));
El método svc_validate() no se utiliza en la implementación del método Stop, porque aunque el sistema tenga actualmente un problema, el método Stop debería intentar detener la aplicación en este nodo.