Sun Cluster 3.1 10/03: Guía del desarrollador de los servicios de datos

Retorno desde svc_start()

Aun cuando la función svc_start() dé un retorno satisfactorio, es posible que la aplicación subyacente no se haya iniciado correctamente. Por tanto, svc_start() debe analizar la aplicación para verificar si se está ejecutando antes de devolver un mensaje satisfactorio. El análisis debe tener en cuenta también que es posible que la aplicación no esté disponible inmediatamente porque tarda un tiempo en iniciarse. El método svc_start() invoca svc_wait(), que se define en xfnts.c, para verificar que la aplicación está en ejecución, como se indica a continuación:


/* Esperar a que el servicio se inicie completamente */
   scds_syslog_debug(DBG_LEVEL_HIGH,
       "Llamar a svc_wait para verificar que se haya iniciado el servicio.");

   rc = svc_wait(scds_handle);

   scds_syslog_debug(DBG_LEVEL_HIGH,
       "Devuelto desde svc_wait");

   if (rc == 0) {
      scds_syslog(LOG_INFO, "El servicio se ha iniciado satisfactoriamente.");
   } else {
      scds_syslog(LOG_ERR, "No se ha podido iniciar el servicio.");
   }

La función svc_wait() invoca scds_get_netaddr_list(3HA) para obtener los recursos de dirección de red necesarios para analizar la aplicación, como se indica a continuación:


/* obtener el recurso de red para el análisis*/
   if (scds_get_netaddr_list(scds_handle, &netaddr)) {
      scds_syslog(LOG_ERR,
          "No se han encontrado recursos de dirección de red en el grupo
           de recursos.");
      return (1);
   }

   /* Devolver un error si no hay recursos de red */
   if (netaddr == NULL || netaddr->num_netaddrs == 0) {
      scds_syslog(LOG_ERR,
          "No hay recursos de dirección de red en el grupo de recursos.");
      return (1);
   }

Después, svc_wait() obtiene los valores start_timeout y stop_timeout como se indica a continuación.


svc_start_timeout = scds_get_rs_start_timeout(scds_handle)
   probe_timeout = scds_get_ext_probe_timeout(scds_handle)

Para justificar el tiempo que puede tardar en iniciarse el servidor, svc_wait() invoca scds_svc_wait() y pasa un valor de tiempo de espera equivalente a un tres por ciento del valor start_timeout. A continuación, svc_wait() invoca svc_probe() para verificar si la aplicación se ha iniciado. El método svc_probe() realiza una conexión de zócalo sencilla con el servidor en el puerto especificado. Si no puede conectarse con el puerto, svc_probe() devuelve un valor de 100, que indica un fallo total. Si la conexión pasa, pero la desconexión del puerto falla, svc_probe() devuelve un valor de 50.

Cuando se produce un fallo parcial o total de svc_probe(), svc_wait() invoca scds_svc_wait() con un valor de tiempo de espera de 5. El método scds_svc_wait() limita la frecuencia de los análisis a cada 5 segundos. Este método cuenta también el número de intentos hechos para iniciar el servicio. Si el número de intentos supera el valor de la propiedad Retry_count del recurso en el periodo especificado por la propiedad Retry_interval del recurso, la función scds_svc_wait() devuelve un fallo. En ese caso, la función svc_start() también devuelve un fallo.


# definir SVC_CONNECT_TIMEOUT_PCT    95
# definir   SVC_WAIT_PCT       3
   if (scds_svc_wait(scds_handle, (svc_start_timeout * SVC_WAIT_PCT)/100)
      != SCHA_ERR_NOERR) {

      scds_syslog(LOG_ERR, "No se ha podido iniciar el servicio.");
      return (1);
   }

   do {
      /*
       * analizar el servicio de datos en la dirección IP del
       * recurso de red y el nombre de puerto
       */
      rc = svc_probe(scds_handle,
          netaddr->netaddrs[0].hostname,
          netaddr->netaddrs[0].port_proto.port, probe_timeout);
      if (rc == SCHA_ERR_NOERR) {
         /* Satisfactorio. Liberar recursos y retornar */
         scds_free_netaddr_list(netaddr);
         return (0);
      }

       /* Invocar scds_svc_wait() por si el servicio también falla
      if (scds_svc_wait(scds_handle, SVC_WAIT_TIME)
         != SCHA_ERR_NOERR) {
         scds_syslog(LOG_ERR, "No se ha podido iniciar el servicio.");
         return (1);
      }

   /* Confiar en el tiempo de espera de RGM y terminar el programa*/
   } while (1);


Nota –

Antes de salir, el método xfnts_start invoca scds_close() para reclamar recursos asignados por scds_initialize(). Consulte Función scds_initialize() y la página de comando man scds_close(3HA) para obtener más detalles.