資料服務範例實作 Validate 方法與 Update 方法來處理由叢集管理員進行的特性更新。
當建立資源時以及當管理動作更新資源或資源所在群組的特性時,RGM 將呼叫 Validate 方法。在套用建立或更新之前,RGM 將呼叫 Validate,並且在任何節點上此方法的故障退出碼將導致取消建立或更新。
僅當叢集管理員變更資源或資源特性時,RGM 呼叫 Validate,而當 RGM 設定特性或監視器設定資源特性 Status 和 Status_msg 時,RGM 不會呼叫 Validate。
每當 PROBE 方法嘗試將資料服務容錯移轉至新節點時,Monitor_check 方法也會明確呼叫 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) 的更新或建立都將失敗。
由於 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)。
在其 MAIN 函數中,Validate 首先將 CONFDIR 變數設定為空字串,將 UPDATE_PROPERTY 和 CONFDIR_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 以成功狀態 (0) 結束,則將使用新值建立 Confdir。如果 Validate 以失敗狀態 (1) 結束,則不會建立 Confdir 和任何其他特性,並將產生表示原因的訊息。
RGM 執行 Update 方法來通知正在執行的資源其特性已變更。在叢集管理員成功設定某一資源或其群組的特性後,RGM 執行 Update。將在資源處於線上狀態的節點上呼叫此方法。
Update 方法不會更新特性。RGM 會更新特性。Update 方法通知正在執行的程序已經發生更新。資料服務範例中唯一受特性更新影響的程序是故障監視器。因此,故障監視器程序是 Update 方法停止並重新啟動的程序。
Update 方法必須驗證故障監視器是否正在執行,然後透過使用 pmfadm 指令強制結束此程序。此方法獲取實作故障監視器之探測程式的位置,然後透過使用 pmfadm 指令將其重新啟動。
Update 方法使用 pmfadm -q 來驗證監視器是否正在執行,如果正在執行,則使用 pmfadm -s TERM 將其強制結束。如果監視器成功終止,會將成功終止的訊息傳送給叢集管理員。如果監視器無法停止,Update 將以失敗狀態結束並將錯誤訊息傳送給叢集管理員。
if pmfadm -q $RESOURCE_NAME.monitor; then # Kill the monitor that is running already pmfadm -s $PMF_TAG TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ "${ARGV0} Could not stop the monitor" exit 1 else # could successfully stop DNS. Log a message. logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ "Monitor for HA-DNS successfully stopped" fi
若要重新啟動監視器,Update 方法必須找到實現探測程式的程序檔。探測程式位於資料服務的基底目錄中,RT_basedir 特性指向該基底目錄。Update 擷取 RT_basedir 的值,並將其儲存於變數 RT_BASEDIR 中,如下所示。
RT_BASEDIR=`scha_resource_get -O RT_basedir -R $RESOURCE_NAME -G \ $RESOURCEGROUP_NAME`
Update 透過 pmfadm 使用 RT_BASEDIR 的值來重新啟動 > to restart the dns_probe 程式。如果成功,Update 將以成功狀態結束,並將成功的訊息傳送給叢集管理員。如果 pmfadm 無法啟動探測程式,Update 將以失敗狀態結束並記錄錯誤訊息。
Update 方法失敗將導致資源被置於「更新失敗」狀態。這種狀態對資源的 RGM 管理沒有影響,而是表示透過 syslog() 函數對管理工具所採取的更新動作失敗。