Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

xfnts_start-Methode

RGM führt die Start-Methode an einem Cluster-Knoten aus, wenn die Ressourcengruppe, die die Datendienstressource enthält, an diesem Knoten in den Online-Modus versetzt oder die Ressource aktiviert wird. Im SUNW.xfnts-Beispielressourcentyp aktiviert die xfnts_start-Methode den xfs-Dämon an diesem Knoten.

Die xfnts_start-Methode ruft scds_pmf_start() auf, um den Dämon unter PMF zu starten. PMF bietet die automatische Fehlerbenachrichtigung und Neustartfunktionen sowie die Integration mit dem Fehler-Monitor.


Hinweis –

Der erste Aufruf in xfnts_start findet an scds_initialize () statt, das einige erforderliche housekeeping-Funktionen ausführt. Der Abschnitt scds_initialize()-Funktion und die Online-Dokumentation zu scds_initialize(3HA) enthalten weitere Informationen.


Dienstvalidierung vor dem Starten von X Font Server

Bevor die xfnts_start-Methode versucht, X Font Server zu starten, ruft sie svc_validate() auf, um zu prüfen, ob eine ordnungsgemäße Konfiguration zur Unterstützung des xfs-Dämons vorhanden ist.

rc = svc_validate(scds_handle);
   if (rc != 0) {
      scds_syslog(LOG_ERR,
          "Failed to validate configuration.");
      return (rc);
   }

Weitere Informationen finden Sie unter xfnts_validate-Methode.

Starten des Dienstes mit svc_start()

Die xfnts_start-Methode ruft die svc_start()-Methode auf, die in der Datei xfnts.c definiert ist, um den xfs-Dämon zu starten. Dieser Abschnitt beschreibt svc_start().

Der Befehl zum Starten des xfs-Dämons lautet wie folgt:


# xfs -config Konfigurationsverzeichnis/fontserver.cfg -port Portnummer

Die Confdir_list-Erweiterungseigenschaft identifiziert das Konfigurationsverzeichnis während die Port_list-Eigenschaft die Portnummer identifiziert. Der Cluster-Administrator gibt für diese Eigenschaften bei der Konfiguration des Datendienstes bestimmte Werte an.

Die xfnts_start-Methode deklariert diese Eigenschaften als Zeichenketten-Arrays. Die xfnts_start-Methode erhält die Werte, die der Cluster-Administrator unter Verwendung der Funktionen scds_get_ext_confdir_list() und scds_get_port_list() festlegt. Diese Funktionen werden in der Online-Dokumentation zu scds_property_functions(3HA) beschrieben.

scha_str_array_t *confdirs;
scds_port_list_t    *portlist;
scha_err_t   err;

   /* get the configuration directory from the confdir_list property */
   confdirs = scds_get_ext_confdir_list(scds_handle);

   (void) sprintf(xfnts_conf, "%s/fontserver.cfg", confdirs->str_array[0]);

   /* obtain the port to be used by XFS from the Port_list property */
   err = scds_get_port_list(scds_handle, &portlist);
   if (err != SCHA_ERR_NOERR) {
      scds_syslog(LOG_ERR,
          "Could not access property Port_list.");
      return (1);
   }

Beachten Sie, dass die confdirs-Variable auf das erste Element (0) im Array zeigt.

Die xfnts_start-Methode verwendet sprintf(), um die Befehlszeile für xfs zu bilden.

/* Construct the command to start the xfs daemon. */
   (void) sprintf(cmd,
       "/usr/openwin/bin/xfs -config %s -port %d 2>/dev/null",
       xfnts_conf, portlist->ports[0].port);

Beachten Sie, dass die Ausgabe an /dev/null weitergeleitet wird, um vom Dämon generierte Meldungen zu unterdrücken.

Die xfnts_start-Methode übergibt die xfs-Befehlszeile an scds_pmf_start(), um den Datendienst unter PMF zu starten.

scds_syslog(LOG_INFO, "Issuing a start request.");
   err = scds_pmf_start(scds_handle, SCDS_PMF_TYPE_SVC,
      SCDS_PMF_SINGLE_INSTANCE, cmd, -1);

   if (err == SCHA_ERR_NOERR) {
      scds_syslog(LOG_INFO,
          "Start command completed successfully.");
   } else {
      scds_syslog(LOG_ERR,
          "Failed to start HA-XFS ");
   }

Beachten Sie die folgenden Punkte zum Aufruf von scds_pmf_start():

Vor der Rückgabe setzt svc_pmf_start() den Speicher frei, der für die portlist-Struktur zugewiesen wird.

scds_free_port_list(portlist);
return (err);

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).