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

Devolución de svc_start()

Aunque svc_start() devuelva un mensaje satisfactorio, es posible que la aplicación subyacente no haya podido ejecutarse. 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 la aplicación puede no estar disponible inmediatamente, ya que el proceso de inicio tarda algún tiempo. El método svc_start() llama a svc_wait(), que se define en archivo xfnts.c, para verificar que la aplicación se esté ejecutando.

/* Wait for the service to start up fully */
   scds_syslog_debug(DBG_LEVEL_HIGH,
       "Calling svc_wait to verify that service has started.");

   rc = svc_wait(scds_handle);

   scds_syslog_debug(DBG_LEVEL_HIGH,
       "Returned from svc_wait");

   if (rc == 0) {
      scds_syslog(LOG_INFO, "Successfully started the service.");
   } else {
      scds_syslog(LOG_ERR, "Failed to start the service.");
   }

La función svc_wait() llama a scds_get_netaddr_list () para obtener el recurso de dirección de red necesario para analizar la aplicación.

/* obtain the network resource to use for probing */
   if (scds_get_netaddr_list(scds_handle, &netaddr)) {
      scds_syslog(LOG_ERR,
          "No network address resources found in resource group.");
      return (1);
   }

   /* Return an error if there are no network resources */
   if (netaddr == NULL || netaddr->num_netaddrs == 0) {
      scds_syslog(LOG_ERR,
          "No network address resource in resource group.");
      return (1);
   }

La función svc_wait() obtiene los valores de Start_timeout y Stop_timeout.

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

Para contabilizar el tiempo que necesita el servidor para iniciarse, svc_wait() llama a scds_svc_wait() y pasa un valor de tiempo de espera equivalente al tres por ciento del valor de Start_timeout. La función svc_wait() llama a svc_probe() para comprobar que la aplicación se ha iniciado. El método svc_probe() realiza una conexión de socket sencilla con el servidor en el puerto especificado. Si no se puede conectar al puerto, svc_probe() devuelve el valor 100, que indica un fallo completo. Si se establece la conexión, pero falla la desconexión del puerto, svc_probe() devuelve el valor 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 en la propiedad Retry_interval , la función scds_svc_wait() devuelve un fallo. En ese caso, la función svc_start() también devuelve un fallo.

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

      scds_syslog(LOG_ERR, "Service failed to start.");
      return (1);
   }

   do {
      /*
       * probe the data service on the IP address of the
       * network resource and the portname
       */
      rc = svc_probe(scds_handle,
          netaddr->netaddrs[0].hostname,
          netaddr->netaddrs[0].port_proto.port, probe_timeout);
      if (rc == SCHA_ERR_NOERR) {
         /* Success. Free up resources and return */
         scds_free_netaddr_list(netaddr);
         return (0);
      }

       /* Call scds_svc_wait() so that if service fails too
      if (scds_svc_wait(scds_handle, SVC_WAIT_TIME)
         != SCHA_ERR_NOERR) {
         scds_syslog(LOG_ERR, "Service failed to start.");
         return (1);
      }

   /* Rely on RGM to timeout and terminate the program */
   } while (1);

Nota –

Antes de salir, el método xfnts_start llama a scds_close() para reclamar los recursos asignados por scds_initialize (). Para obtener más información, consulte Función scds_initialize() y la página de comando man scds_close(3HA).