Offline処理の結果、userApplicationオブジェクトの状態はOffline状態へと遷移します。
Offline要求は、以下のいずれかの理由で生成されます。
GUIまたはCLI (hvutil -f) を使った手動Offline要求
GUIまたはCLI (hvswitch) を使った手動切替え要求
障害 (Fault) 発生後の、自動またはGUIまたはCLI (hvutil -c) を使ったOffline処理
GUIまたはCLI (hvshut) を使ったRMSのシャットダウン
運用時では、RMSコマンドインタフェースのみがOffline要求を生成することができます。異常 (Fault) が発生した場合、userApplicationは自らのOffline要求を生成し、問題のあるアプリケーションが動作し続けることを防止します ("2.1.5 Fault処理"も参照してください)。このOffline要求は、その後に続く切替えが実施されるための前提条件としても必要な要求です。
注意
userApplicationオブジェクトのOffline処理は、RMSが「hvshut -L」または「hvshut -A」で停止された場合には実行されません。
Online処理と異なり、Offline処理はuserApplicationグラフノードからリーフノードへとトップダウン形式で行われます。ディテクタが存在しないグラフノードでは、OfflineScriptの実行直後にPostOfflineScriptが実行されます。Offline処理の流れを以下に示します。
userApplicationがWait状態に遷移する。
userApplicationはPreOfflineScriptを実行し、PreOfflineScriptの終了後、該当する要求を子へ送信する。
PreOffline要求の受信後、子のグラフノードはWait状態へ遷移し、自分のPreOfflineScriptを実行し、要求を転送する。
リーフノードでは、PreOfflineScriptの実行が完了すると、該当するメッセージ (PreOffline処理の完了通知) を親オブジェクトに転送する。
メッセージはそれ以上の処理をすることなく、userApplicationへ到達するまで子から親へと転送される。
PreOfflineScriptの処理が完了してから、userApplicationはOfflineScriptを実行し、その直後にPostOfflineScriptを実行する (userApplication自体のグラフノードはディテクタを保持しないため)。
userApplicationが実際のOffline要求を生成する。
次に示すように、Offline要求の処理はOnline処理と同様に行われます。
はじめにOfflineScriptを実行する。
オブジェクトのディテクタによるOffline通知を受けた後、PostOfflineScriptを起動する。
PostOfflineScriptの完了後、Offline要求をオブジェクトの子それぞれに転送する。
すべての子からPostOfflineDoneメッセージを受信したら、オブジェクトはPostOfflineDoneメッセージを親に送信する。
前述したように、userApplicationは最後にOfflineとなるグラフノードです。最後の子からPostOfflineDoneメッセージを受信するとOffline処理が完了します。OfflineDoneScriptが存在する場合は起動され、ベースモニタは他のノード上の対応するuserApplicationオブジェクトに、アプリケーションがOfflineになったことを通知します。
例3
Offline処理についてさらに詳しく説明します。
例ではPreOfflineScriptを持つノードが存在しないため対応するPreOffline要求はappからリーフノードに転送されます。
リーフノードは成功メッセージをuserApplicationに返します。
userApplicationはOfflineScriptを実行します。これは、この例ではアプリケーションappが停止したことを意味します。オブジェクトappがアプリケーションの監視を行っていないため、RMSは、OfflineScriptの完了によりOffline処理が成功したものと判断します。
PostOfflineScriptが構成設定されていないため、OfflineScriptが完了すると直ちにOffline要求がandOp1に送信されます。
andOp1オブジェクトにはディテクタもスクリプトも存在しません。Offline要求は転送可能です。
cmdオブジェクトは、OfflineScriptを実行し、オブジェクトのディテクタがOffline処理の完了を通知するとすぐに、要求を転送します。
lfsリーフノードもまた、OfflineScriptを実行し、ディテクタから対応した通知を受信した後に成功メッセージを転送します。
appが成功メッセージを受信すると、Offline処理は完了します。
Offline処理が完了すると、OfflineDoneScriptを実行します。このスクリプトはクリーンアップまたは情報送信を目的とするスクリプトです。リターンコードがuserApplicationの状態に影響することはありません。
Offline処理中の予期しないレポート(Unexpected report)とは、Offline処理中に通知されるが、BM(ベースモニタ)により無視されるOffline 状態以外のレポートのことです。
BM(ベースモニタ)により無視されるOffline状態以外のレポートは、あるオブジェクトが属するユーザアプリケーションのOffline処理が開始してから、そのオブジェクトのOffline処理が成功または失敗するまでの間に通知されることがあります。
なお、オブジェクトのOffline処理が失敗するケースについては、"2.1.4.4 Offline処理中のFault"を参照してください。
Offline処理中にエラーが発生すると、影響するグラフノードはFault処理を開始し、親グラフノードにエラーを通知します ("2.1.5 Fault処理"も参照してください)。Offline処理中に異常が発生するのは、以下のような場合です。
Offline処理終了時点で、あるリソースオブジェクトのディテクタから最後に報告された状態がOnline、StandbyまたはFaulted状態である場合。
スクリプトが0以外の値で終了した。
スクリプトが復帰せずタイムアウトになり実行に失敗した。
オブジェクトのOfflineScriptが完了し、ディテクタから一定時間内にOffline状態が通知されなかった。
Offline処理の開始時に、グラフノードがすでにOffline状態になっている場合があります。これが発生するのは、通常、親userApplicationがOfflineであるノードからOffline要求が出された場合です(親userApplicationがOnlineであれば、Offline状態のグラフノードはツリーでORグラフノードの下に表示されます)。 OfflineオブジェクトがOffline要求を受信すると、Online処理の時と同様に、その要求はそのまま転送されます。スクリプトは実行されず、状態はWaitにはなりません。
RMSは、スクリプトがOffline状態にできない資源の監視にも対応することができます。たとえば物理ディスクは監視対象とすることはできても、通常は物理的にシャットダウンできないオブジェクトとなります。このような例に対処するため、RMSでは真のOffline状態が存在しない資源をLieOffline属性を使ってグラフノードとして表します。 RMS Wizard Toolsサブアプリケーションはこの属性を、物理ディスクを表すgResourceオブジェクトにデフォルトで設定するため、明示的に指定する必要はありません。
Offline処理中、LieOffline属性が設定されたグラフノードは、Pre-OfflineScript、OfflineScript、Post-OfflineScript実行時も他のオブジェクトと同じように動作します。親オブジェクトに関連するオブジェクトの反応もまた同じで、オブジェクトがOfflineになったものとして扱われます。LieOffline属性が設定されたオブジェクトは、OfflineScriptの実行後、ディテクタのOffline通知を待たずにPostOfflineScriptが自動的に実行されます。OfflineScriptも実行以後に予期しないディテクタのOnline通知が届いても、この場合はFaulted状態とはなりません。