リソースタイプ実装の Stop コールバックメソッドは、特定のクラスタノードでアプリケーションを停止するときに RGM によって呼び出されます。 Stop メソッドのコールバックが有効であるためには、次の条件が必要です。
Stop メソッドは結果に依存しない命令 (idempotent) でなければなりません。つまり、Stop メソッドは、そのノードで Start メソッドが正常に終了していなくても、RGM から呼び出されることがあります。 したがって、Stop メソッドは、そのクラスタノードでアプリケーションが動作していない場合でも (したがって、特別な処理が必要ない場合でも)、正常に (終了コード 0 で) 終了しなければなりません。
リソースタイプの Stop メソッドが特定のクラスタノードで失敗に終わると (戻りコードが 0 以外だと)、そのリソースタイプは STOP_FAILED の状態になります。 この場合、リソースの Failover_mode 設定によっては、このクラスタノードが RGM によって強制的に再起動されることがあります。 したがって、Stop メソッドの設計時には、アプリケーションを停止する手段をメソッドに組み込んでおくことが重要です。たとえば、アプリケーションが停止しない場合は、 SIGKILL などを使って、アプリケーションを強制的かつ即時に停止する必要があります。 さらに、この処理は一定の時間内に行われなければなりません。Stop_timeout で設定した時間が経過すると、停止が失敗したものとみなされ、リソースは STOP_FAILED の状態になるからです。
ほとんどのアプリケーションには、DSDL ユーティリティー scds_pmf_stop() で十分なはずです。このユーティリティーは、まず、アプリケーションが PMF の scds_pmf_start() で起動されたものとみなして、アプリケーションを SIGTERM で「静かに」停止しようとします。これで停止しない場合は、プロセスに対して SIGKILL を適用します。 このユーティリティーの詳細については、PMF 関数を参照してください。
アプリケーションを停止するそのアプリケーション固有の関数を svc_stop() とし、これまで使用してきたコードモデルに従うとするなら、Stop メソッドは、次のように実装できます。svc_stop() の実装で scds_pmf_stop() が使用されているかどうかは、ここでは関係ありません。それが使用されているかどうかは、アプリケーションが PMF のもとで Start メソッドによって起動されているかどうかに依存します。
if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* 初期化エラー */ } return (svc_stop(handle));
Stop メソッドの実装では、svc_validate() メソッドは使用されません。システムに問題があったとしても、Stop メソッドは、このノードでこのアプリケーションを停止すべきだからです。