Skip Navigation Links
Exit Print View
| Oracle Solaris Cluster Data Services Developer's Guide Oracle Solaris Cluster 4.1

Search Scope:

- This Document
- Entire Library

## `xfnts_validate` Method

The RGM calls the `Validate` method when a resource is created and when a cluster administrator updates the properties of the resource or its containing group. The RGM calls the `Validate` method before the creation or update is applied. A failure exit code from the method on any node causes the creation or update to be canceled.

The RGM calls `Validate` only when a cluster administrator changes resource or resource group properties or when a monitor sets the `Status` and `Status_msg` resource properties. The RGM does not call `Validate` when the RGM sets properties.

Note - The `Monitor_check` method also explicitly calls the `Validate` method whenever the `PROBE` method attempts to fail over the data service to a new node.

The RGM calls `Validate` with additional arguments to those that are passed to other methods, including the properties and values that are being updated. The call to `scds_initialize()` at the beginning of `xfnts_validate` parses all the arguments that the RGM passes to `xfnts_validate` and stores the information in the `scds_handle` argument. The subroutines that `xfnts_validate` calls make use of this information.

The `xfnts_validate` method calls `svc_validate()`, which verifies the following conditions:

- The `Confdir_list` property has been set for the resource and defines a single directory.

      scha_str_array_t *confdirs;
         confdirs = scds_get_ext_confdir_list(scds_handle);

      /* Return error if there is no confdir_list extension property */
         if (confdirs == NULL || confdirs->array_cnt != 1) {
            scds_syslog(LOG_ERR,
                "Property Confdir_list is not set properly.");
            return (1); /* Validation failure */
         }

- The directory that is specified by `Confdir_list` contains the `fontserver.cfg` file.

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

         if (stat(xfnts_conf, &statbuf) != 0) {
            /*
             * suppress lint error because errno.h prototype
             * is missing void arg
             */
            scds_syslog(LOG_ERR,
                "Failed to access file <%s> : <%s>",
                xfnts_conf, strerror(errno));   /*lint !e746 */
            return (1);
         }

- The server daemon binary is accessible on the cluster node.

      if (stat("/usr/bin/xfs", &statbuf) != 0) {
            scds_syslog(LOG_ERR,
                "Cannot access XFS binary : <%s> ", strerror(errno));
            return (1);
         }

- The `Port_list` property specifies a single port.

      scds_port_list_t   *portlist;
         err = scds_get_port_list(scds_handle, &portlist);
         if (err != SCHA_ERR_NOERR) {
            scds_syslog(LOG_ERR,
                "Could not access property Port_list: %s.",
               scds_error_string(err));
            return (1); /* Validation Failure */
         }

      #ifdef TEST
         if (portlist->num_ports != 1) {
            scds_syslog(LOG_ERR,
                "Property Port_list must have only one value.");
            scds_free_port_list(portlist);
            return (1); /* Validation Failure */
         }
      #endif

- The resource group that contains the data service also contains at least one network address resource.

      scds_net_resource_list_t *snrlp;
         if ((err = scds_get_rs_hostnames(scds_handle, &snrlp))
            != SCHA_ERR_NOERR) {
            scds_syslog(LOG_ERR,
                "No network address resource in resource group: %s.",
               scds_error_string(err));
            return (1); /* Validation Failure */
         }

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

Before it returns, `svc_validate()` frees all allocated resources.

    finished:
       scds_free_net_list(snrlp);
       scds_free_port_list(portlist);

       return (rc); /* return result of validation */

Note - Before it exits, the `xfnts_validate` method calls `scds_close()` to reclaim resources that were allocated by `scds_initialize()`. `scds_initialize()` Function and the `scds_close`(3HA) man page contain more information.

Copyright © 2000, 2012, Oracle and/or its affiliates. All rights reserved. Legal Notices |