Go to main content

Oracle® Solaris Cluster Data Services Developer's Guide

Exit Print View

Updated: September 2015
 
 

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.