Sun Cluster 資料服務開發者指南 (適用於 Solaris 作業系統)

Validate 方法如何工作

當建立資源時以及當管理動作更新資源或資源所在群組的特性時,RGM 將呼叫 Validate 方法。在套用建立或更新之前,RGM 將呼叫 Validate,並且在任何節點上此方法的故障退出碼將導致取消建立或更新。

僅當叢集管理員變更資源或資源特性時,RGM 呼叫 Validate,而當 RGM 設定特性或監視器設定資源特性 StatusStatus_msg 時,RGM 不會呼叫 Validate


備註 –

每當 PROBE 方法嘗試將資料服務容錯移轉至新節點時,Monitor_check 方法也會明確呼叫 Validate 方法。


Validate 方法有何作用

RGM 使用附加引數將 Validate 呼叫至傳送到其他方法的引數,包含正在更新的特性和值。因此,資料服務範例中的此方法必須實作不同的 parse_args() 函數來處理附加引數。

資料服務範例中的 Validate 方法確認單一特性 (Confdir 延伸特性)。此特性指向 DNS 配置目錄,該目錄對於 DNS 的成功作業非常重要。


備註 –

由於配置目錄無法在 DNS 正在執行時進行變更,因此 Confdir 特性在 RTR 檔案中宣告為 TUNABLE = AT_CREATION。因此,作為更新結果,永遠不呼叫 Validate 方法來驗證 Confdir 特性,但僅當建立資料服務資源時才可以呼叫此方法。


如果 Confdir 是 RGM 傳送至 Validate 的特性之一,parse_args() 函數將擷取並儲存其值。Validate 驗證 Confdir 的新值所指向的目錄是否可存取以及 named.conf 檔案是否存在於該目錄以及是否含有資料。

如果 parse_args() 函數無法從 RGM 所傳送的指令行引數中擷取 Confdir 的值,則 Validate 仍將嘗試驗證 Confdir 特性。Validate 使用 scha_resource_get() 從靜態配置中獲取 Confdir 的值。Validate 執行相同的檢查以驗證配置目錄是否可存取以及是否含有不為空的 named.conf 檔案。

如果 Validate 以失敗狀態退出,則所有特性 (而非僅僅 Confdir) 的更新或建立都將失敗。

Validate 方法剖析函數

由於 RGM 傳送至 Validate 方法的引數集與傳送至其他回呼方法的引數集不同,所以 Validate 需要與其他方法不同的函數來剖析引數。請參閱 rt_callbacks(1HA) 線上手冊,以取得有關傳送至 Validate 和其他回呼方法之引數的更多資訊。以下程式碼範例顯示了 Validate parse_args() 函數。

#########################################################################
# Parse Validate arguments.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # The method is not accessing any system defined
                  # properties so this is a no-op
                  ;;
         g)
                  # The method is not accessing any resource group
                  # properties, so this is a no-op
                  ;;
         c)
                  # Indicates the Validate method is being called while
                  # creating the resource, so this flag is a no-op.
                  ;;
         u)
                  # Indicates the updating of a property when the
                  # resource already exists. If the update is to the
                  # Confdir property then Confdir should appear in the
                  # command-line arguments. If it does not, the method must
                  # look for it specifically using scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Extension property list. Separate the property and
                  # value pairs using "=" as the separator.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # If the Confdir extension property is found on the
                  # command line, note its value.
                  if [ $PROPERTY == "Confdir" ]; then
                           CONFDIR=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                  ;;
         esac
   done
}

正如其他方法具有 parse_args() 函數一樣,此函數提供了旗標 (R) 來擷取資源名稱,(G) 來擷取資源群組名稱和 (T) 來擷取由 RGM 傳送的資源類型。

忽略 r 旗標 (表示系統定義的特性)、g 旗標 (表示資源群組特性) 以及 c 旗標 (表示在建立資源的過程中進行驗證)。忽略它們是因為正在更新資源時會呼叫此方法來驗證延伸特性。

u 旗號將 UPDATE_PROPERTY shell 變數的值設定為 1 (TRUE)。x 旗標將擷取正在更新的特性之名稱和值。如果 Confdir 是正在更新的特性之一,則其值將被放入 CONFDIR shell 變數中,變數 CONFDIR_FOUND 將設定為 1 (TRUE)。

驗證 Confdir

在其 MAIN 函數中,Validate 首先將 CONFDIR 變數設定為空字串,將 UPDATE_PROPERTYCONFDIR_FOUND 設定為 0

CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validate 呼叫 parse_args() 來剖析由 RGM 傳送的引數。

parse_args “$@”

Validate 檢查 Validate 是否正在作為特性的更新結果被呼叫。Validate 還檢查 Confdir 延伸特性是否位於指令行上。Validate 驗證 Confdir 特性是否具有一個值,如果沒有,將以失敗狀態結束並記錄錯誤訊息。

if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Verify that the Confdir property has a value. If not there is a failure
# and exit with status 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi

備註 –

具體來說,上述程式碼會檢查 Validate 是否正在作為更新結果被呼叫 ($UPDATE_PROPERTY == 1),以及該特性是否在指令行上 (CONFDIR_FOUND == 0)。在這種情況下,程式碼將透過使用 scha_resource_get() 擷取 Confdir 的現有值。如果 Confdir 位於指令行上 (CONFDIR_FOUND == 1),則 CONFDIR 的值會來自 parse_args() 函數,而非 scha_resource_get()


Validate 方法使用 CONFDIR 的值來驗證目錄是否可存取。如果目錄不可存取,Validate 會記錄錯誤訊息並以錯誤狀態結束。

# Check if $CONFDIR is accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

在驗證 Confdir 特性的更新之前,Validate 將執行最終檢查來驗證 named.conf 檔案是否存在。如果檔案不存在,此方法會記錄錯誤訊息並以錯誤狀態結束。

# Check that the named.conf file is present in the Confdir directory
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} File $CONFDIR/named.conf is missing or empty"
         exit 1
fi

如果最終檢查已通過,Validate 會記錄表示成功的訊息並以成功狀態結束。

# Log a message indicating that the Validate method was successful.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

Validate 退出狀態

如果 Validate 以成功狀態 (0) 結束,則將使用新值建立 Confdir。如果 Validate 以失敗狀態 (1) 結束,則不會建立 Confdir 和任何其他特性,並將產生表示原因的訊息。