Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Rückgabe von svc_start()

Selbst wenn svc_start() eine erfolgreiche Rückgabe durchführt, konnte die zugrunde liegende Anwendung eventuell nicht gestartet werden. Daher muss svc_start() die Anwendung testen, um sicherzustellen, dass sie läuft, bevor eine Erfolgsmeldung zurückgegeben wird. Das Testsignalverfahren muss auch berücksichtigen, dass die Anwendung eventuell nicht sofort zur Verfügung steht, da sie einige Zeit zum Starten benötigt. Die svc_start()-Methode ruft svc_wait() auf, definiert in der Datei xfnts.c, um zu prüfen, ob die Anwendung ausgeführt wird.

/* 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.");
   }

Die svc_wait()-Funktion ruft scds_get_netaddr_list () auf, um die Netzwerkadressressourcen zu erhalten, die zum Testen der Anwendung benötigt werden.

/* 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);
   }

Die svc_wait()-Funktion erhält die Werte Start_timeout und Stop_timeout.

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

Um die Zeit zu berücksichtigen, die der Server eventuell zum Starten benötigt, ruft svc_wait() scds_svc_wait() auf und übergibt einen Zeitüberschreitungswert, der drei Prozent des Start_timeout-Werts entspricht. Die svc_wait()-Funktion ruft die svc_probe()-Funktion auf, um zu prüfen, ob die Anwendung gestartet wurde. Die svc_probe()-Methode stellt eine einfache Socketverbindung mit dem Server auf dem angegebenen Port her. Wenn keine Verbindung mit dem Port hergestellt werden konnte, gibt svc_probe() einen Wert von 100 zurück, was auf einen kompletten Fehlschlag hinweist. Wenn die Vebindung hergestellt wurde, die Trennung der Verbindung mit dem Port jedoch fehlgeschlagen ist, gibt svc_probe() einen Wert von 50 zurück.

Bei Fehlschlag oder Teilfehlschlag von svc_probe() ruft svc_wait() die scds_svc_wait()-Methode mit einem Zeitüberschreitungswert von 5 auf. Die scds_svc_wait()-Methode beschränkt die Testhäufigkeit auf ein Testsignal alle fünf Sekunden. Diese Methode zählt auch die Anzahl der Startversuche für den Dienst. Wenn die Anzahl der Versuche den Wert der Retry_count-Eigenschaft der Ressource innerhalb des Zeitraums, der von der Retry_interval -Eigenschaft der Ressource angegeben wird, überschreitet, gibt die scds_svc_wait()-Funktion einen Fehler aus. In diesem Fall gibt die svc_start()-Funktion ebenfalls Fehlschlag zurück.

#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);

Hinweis –

Vor der Beendigung ruft die xfnts_start-Methode scds_close() auf, um Ressourcen wiederzuverwenden, die von scds_initialize () zugewiesen wurden. Weitere Informationen finden Sie im Abschnitt scds_initialize()-Funktion sowie in der Online-Dokumentation zu scds_close(3HA).