Sun Cluster: Guía del desarrollador de los servicios de datos del sistema operativo Solaris

Método Stop

El método Stop se invoca en un nodo del clúster cuando el grupo de recursos que contiene el recurso HA-DNS se pone fuera de línea en ese nodo o si el grupo de recursos está en línea y se inhabilita el recurso. Este método detiene el daemon in.named (DNS) en ese nodo.

Esta sección describe los principales fragmentos del método Stop para la aplicación de ejemplo, pero no las funciones comunes a todos los métodos de rellamada, como la función parse_args() ni la obtención del recurso syslog; éstos se describen en Funciones comunes para todos los métodos.

Para obtener una lista completa del método Stop, consulte Método Stop.

Información general sobre Stop

Hay que tener presentes dos consideraciones fundamentales a la hora de intentar detener el servicio de datos. La primera es proporcionar un apagado ordenado. Enviar una señal de SIGTERM mediante pmfadm es la mejor forma de lograrlo.

La segunda consideración es garantizar que el servicio de datos se haya detenido realmente para evitar ponerlo en el estado Stop_failed. La mejor forma de hacerlo es enviar una señal de SIGKILL mediante pmfadm.

El método Stop del servicio de datos de ejemplo tiene presentes ambas consideraciones. Primero envía una señal de SIGTERM. Si ésta no logra detener el servicio de datos, envía una señal SIGKILL.

Antes de intentar detener el DNS, este método Stop verifica que el proceso esté realmente en ejecución. Si el proceso se está ejecutando, Stop usa PMF (pmfadm) para detenerlo.

Está garantizado que el método Stop sea idempotente. Aunque RGM no debería invocar un método Stop por segunda vez sin haber iniciado antes el servicio de datos mediante una llamada a su método Start, sí puede invocar un método Stop en un recurso aunque éste no se haya iniciado nunca o se haya terminado solo. Por tanto, el método Stop sale de forma satisfactoria aunque el DNS no esté en ejecución.

Parada de la aplicación

El método Stop proporciona un enfoque en dos hileras para detener el servicio de datos: un enfoque ordenado, o suave, que utiliza una señal de SIGTERM a través de pmfadm, y un enfoque duro o brusco, con la señal de SIGKILL. El método Stop obtiene el valor Stop_timeout (la cantidad de tiempo en el que el método Stop debe volver). Stop asigna entonces el 80 % de este tiempo a una parada suave y el 15 % a una parada brusca (el 5 % queda reservado), como se muestra a continuación.

STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME
\

-G $RESOURCEGROUP_NAMÈ
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))

((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

El método Stop utiliza pmfadm -q para verificar que el daemon de DNS está en ejecución. Si es así, Stop utiliza primero pmfadm -s para enviar una señal TERM para terminar el proceso de DNS. Si esta señal no logra terminar el proceso pasado un 80 % del valor de tiempo de espera, Stop envía una señal SIGKILL. Si esta señal tampoco puede finalizar el proceso en un 15 % del valor de tiempo de espera, el método registra un mensaje de error y sale con estado de error.

Si pmfadm termina el proceso, el método registra un mensaje que indica que el proceso se ha detenido y sale de forma satisfactoria.

Si el proceso de DNS no está en ejecución, el método registra un mensaje de que no está en ejecución y sale de forma satisfactoria de todas formas. El siguiente ejemplo de código muestra cómo Stop utiliza pmfadm para detener el proceso de DNS.

# Ver si in.named está en ejecución y, en caso afirmativo, terminarlo. 
if pmfadm -q $PMF_TAG; then 
   # Enviar una señal SIGTERM al servicio de datos y esperar un 80 %
   # del valor total del tiempo de espera.
   pmfadm -s $RESOURCE_NAME.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then 
      logger -p ${SYSLOG_FACILITY}.err \
          -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
          “${ARGV0} No se ha podido detener HA-DNS con SIGTERM; \
           Reintentarlo con SIGKILL”
      
      # Dado que el servicio de datos no se ha detenido con una señal SIGTERM
      # usar SIGKILL ahora y esperar otro 15 % del valor de tiempo de espera total.
      pmfadm -s $PMF_TAG -w $HARD_TIMEOUT KILL
      if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err \
          -t [$SYSLOG_TAG]
          “${ARGV0} No se ha podido detener HA-DNS; salida NO SATISFACTORIA”
          
          exit 1
      fi   
fi
else 
   # El servicio de datos no se está ejecutando actualmente. Registrar un mensaje y
   # salir con resultado satisfactorio.
   logger -p ${SYSLOG_FACILITY}.err \
           -t [$SYSLOG_TAG] \
           “No se ha podido iniciar HA-DNS”

   # Aunque HA-DNS no esté en ejecución, salir con resultado satisfactorio para
   # no poner el recurso del servicio de datos en el estado STOP_FAILED.
   exit 0

fi

# Se ha podido detener satisfactoriamente DNS. Registrar un mensaje y salir con
# resultado satisfactorio.
logger -p ${SYSLOG_FACILITY}.err \
    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME]
\
    “HA-DNS se ha detenido satisfactoriamente”
exit 0

Estado de salida de Stop

Un método Stop no debería salir satisfactoriamente hasta que la aplicación subyacente se hubiera detenido realmente, en especial cuando otros servicios de datos dependan de ella. De lo contrario se podrían corromper los datos.

En el caso de una aplicación compleja, como una base de datos, establezca un valor suficientemente alto para la propiedad Stop_timeout en el archivo RTR para permitir que la aplicación tenga tiempo de reorganizarse mientras se detiene.

Si este método no logra detener el DNS y sale con estado de fallo, RGM comprueba la propiedad Failover_mode, que determina el modo de reaccionar. El servicio de datos de ejemplo no fija explícitamente la propiedad Failover_mode, por lo que tiene el valor predeterminado NONE (salvo que el administrador del sistema haya anulado el valor predeterminado y haya especificado otro). En este caso, RGM no realiza ninguna acción, salvo fijar el estado del servicio de datos en Stop_failed. Se requiere la intervención del usuario para forzar la parada de la aplicación y borrar el estado Stop_failed.