(57)【要約】【課題】２つの装置間で送受信されるデータの内容に応じて擬似的に障害を発生させる。【解決手段】サーバとディスクとの間に接続された障害シミュレータ１１において、データ保存部Ａ１１１は、データ受信部Ａ１０１によりサーバから受信されたデータを複データ保持部１７２に順次保存する。コマンド解析部１４１は、複データ保持部１７２に保存されている、最先のデータから１フレーム分のデータを解析して、当該１フレーム分のデータが特定のコマンドであるかどうかを判定する。特定のコマンドでなければ、制御部１３１は複データ保持部１７２から最先のデータを取り出してデータ送信部Ａ１０２によりディスクＡ１４へ送信する。特定のコマンドであれば、制御部１３１は予め定められた時間が経過するまで待機してから当該１フレーム分のデータをデータ送信部Ａ１０２によりディスクＡ１４へ送信することで擬似障害を発生させる。【選択図】図２
2011123783.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータで構成されたフレームを送信する送信装置と、当該フレームを受信する受信装置との間に接続され、当該フレームを用いた通信における擬似障害を発生させる擬似障害発生装置であって、
前記送信装置からデータを受信するデータ受信部と、
前記受信装置へデータを送信するデータ送信部と、
前記データ受信部により受信されたデータをバッファメモリに順次保存するデータ保存部と、
前記データ保存部により前記バッファメモリに保存されている、最先のデータから１フレーム分のデータを解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定するデータ判定部と、
前記データ判定部により解析された１フレーム分のデータが前記所定のフレームでないと判定された場合、前記バッファメモリから最先のデータを取り出して前記データ送信部に送信させ、前記データ判定部により当該１フレーム分のデータが前記所定のフレームであると判定された場合、前記擬似障害を発生させる制御部とを備えることを特徴とする擬似障害発生装置。
【請求項２】
前記データ判定部は、解析した１フレーム分のデータが前記所定のフレームでなければ、前記データ保存部により前記バッファメモリに保存されている、前記制御部により最先のデータが取り出されたことにより新たに最先のデータとなったデータから１フレーム分のデータを解析して当該１フレーム分のデータが前記所定のフレームであるかどうかを判定し、
前記制御部は、前記データ判定部による判定の結果が出る度に、当該結果に応じて動作することを特徴とする請求項１に記載の擬似障害発生装置。
【請求項３】
前記擬似障害発生装置は、さらに、
前記データ保存部により保存されたデータの代わりとなるデータを生成するデータ生成部を備え、
前記制御部は、前記データ保存部により前記バッファメモリに保存されているデータが１フレーム分に満たない場合、前記データ生成部により生成されたデータを前記データ送信部に送信させることを特徴とする請求項１又は２に記載の擬似障害発生装置。
【請求項４】
前記制御部は、前記データ判定部により解析された１フレーム分のデータが前記所定のフレームであると判定された場合、予め定められた時間が経過するまで待機してから当該１フレーム分のデータを前記データ送信部に送信させることで前記擬似障害を発生させることを特徴とする請求項１から３までのいずれかに記載の擬似障害発生装置。
【請求項５】
前記制御部は、前記データ判定部により解析された１フレーム分のデータが前記所定のフレームであると判定された場合、当該１フレーム分のデータを前記データ送信部に送信させないことで前記擬似障害を発生させることを特徴とする請求項１から３までのいずれかに記載の擬似障害発生装置。
【請求項６】
前記擬似障害発生装置は、さらに、
前記所定のフレームに対して前記受信装置から返信されるフレームを前記送信装置へ転送するデータ転送部を備え、
前記制御部は、前記データ判定部により解析された１フレーム分のデータが前記所定のフレームであると判定された場合、当該１フレーム分のデータを前記データ送信部に送信させ、当該１フレーム分のデータに対して前記受信装置から返信されるフレームを前記データ転送部に転送させる際に、当該フレームの一部のデータを変更することで前記擬似障害を発生させることを特徴とする請求項１から３までのいずれかに記載の擬似障害発生装置。
【請求項７】
前記擬似障害発生装置は、さらに、前記擬似障害発生装置に対して時間を指定する信号を入力する端末装置と接続し、
前記制御部は、前記端末装置からの信号で指定された時間が経過するまで待機してから動作し始めることを特徴とする請求項１から６までのいずれかに記載の擬似障害発生装置。
【請求項８】
前記擬似障害発生装置は、さらに、前記擬似障害発生装置に対して頻度を指定する信号を入力する端末装置と接続し、
前記制御部は、前記データ判定部により解析された１フレーム分のデータが前記所定のフレームであると判定された場合、毎回前記擬似障害を発生させる代わりに前記端末装置からの信号で指定された頻度で前記擬似障害を発生させることを特徴とする請求項１から７までのいずれかに記載の擬似障害発生装置。
【請求項９】
前記擬似障害発生装置は、さらに、前記擬似障害発生装置から情報を収集する端末装置と接続し、
前記制御部は、前記擬似障害を発生させる度に、時刻を記録し、記録した時刻の一覧を履歴情報として前記端末装置へ出力することを特徴とする請求項１から８までのいずれかに記載の擬似障害発生装置。
【請求項１０】
前記擬似障害発生装置は、さらに、前記擬似障害発生装置から情報を収集する端末装置と接続し、
前記制御部は、前記データ判定部により解析された１フレーム分のデータが前記所定のフレームであると判定される度に、当該データを記録し、記録したデータの一覧をログ情報として前記端末装置へ出力することを特徴とする請求項１から９までのいずれかに記載の擬似障害発生装置。
【請求項１１】
複数のデータで構成されたフレームを送信する送信装置と、当該フレームを受信する受信装置との間に接続された擬似障害発生装置が、当該フレームを用いた通信における擬似障害を発生させる擬似障害発生方法であって、
前記擬似障害発生装置が、前記送信装置からデータを受信し、
前記擬似障害発生装置が、受信したデータをバッファメモリに順次保存し、
前記擬似障害発生装置が、前記バッファメモリに保存されている、最先のデータから１フレーム分のデータを解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定し、
前記擬似障害発生装置が、解析した１フレーム分のデータが前記所定のフレームでない場合、前記バッファメモリから最先のデータを取り出して前記受信装置へ送信し、当該１フレーム分のデータが前記所定のフレームである場合、前記擬似障害を発生させることを特徴とする擬似障害発生方法。
【請求項１２】
複数のデータで構成されたフレームを送信する送信装置と、当該フレームを受信する受信装置との間に接続されたコンピュータにより実行され、当該フレームを用いた通信における擬似障害を発生させる擬似障害発生プログラムであって、
前記送信装置からデータを受信するデータ受信処理と、
前記受信装置へデータを送信するデータ送信処理と、
前記データ受信処理により受信されたデータをバッファメモリに順次保存するデータ保存処理と、
前記データ保存処理により前記バッファメモリに保存されている、最先のデータから１フレーム分のデータを処理装置により解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定するデータ判定処理と、
前記データ判定処理により解析された１フレーム分のデータが前記所定のフレームでないと判定された場合、前記バッファメモリから最先のデータを取り出して前記データ送信処理に送信させ、前記データ判定処理により当該１フレーム分のデータが前記所定のフレームであると判定された場合、前記擬似障害を前記処理装置により発生させる制御処理とをコンピュータに実行させることを特徴とする擬似障害発生プログラム。
【請求項１３】
複数のデータで構成されたフレームを送信する送信装置と、当該フレームを受信する受信装置と、前記送信装置と前記受信装置との間に接続され当該フレームを用いた通信における擬似障害を発生させる擬似障害発生装置と、前記擬似障害発生装置と接続され試験の開始を指示する端末装置とを具備する試験システムであって、
前記擬似障害発生装置は、
前記送信装置からデータを受信するデータ受信部と、
前記受信装置へデータを送信するデータ送信部と、
前記端末装置により前記試験の開始を指示された場合、前記データ受信部により受信されたデータをバッファメモリに順次保存するデータ保存部と、
前記データ保存部により前記バッファメモリに保存されている、最先のデータから１フレーム分のデータを解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定するデータ判定部と、
前記データ判定部により解析された１フレーム分のデータが前記所定のフレームでないと判定された場合、前記バッファメモリから最先のデータを取り出して前記データ送信部に送信させ、前記データ判定部により当該１フレーム分のデータが前記所定のフレームであると判定された場合、前記擬似障害を発生させる制御部とを備えることを特徴とする試験システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、擬似障害発生装置及び擬似障害発生方法及び擬似障害発生プログラム及び試験システムに関するものである。本発明は、特に、高信頼性システム向け試験システムに関するものである。
【背景技術】
【０００２】
システムの信頼性を高めるためにコンポーネントを冗長化し、二重系システムを構築することが多い。ホットスタンバイ方式では、１台が主系として業務を処理し、もう１台は従系として待機する。主系で障害が発生すると、系の切り替え機構が動作して、従系において業務を処理するようになる。この結果、障害が発生してもＭＴＴＲ（Ｍｅａｎ・Ｔｉｍｅ・Ｔｏ・Ｒｅｐａｉｒ：平均復旧時間）を短くすることができ信頼性の高いシステムを実現できる。
【０００３】
ところで主系から従系への系切り替えの試験は、障害を発生させる必要があるため、試験を行うのは難しい。システムをフルカスタムで構成すれば、デバイスドライバ、ミドルウェアに障害モードを作り、ソフトウェア的に障害が発生したことを模擬することができ、容易に系切り替え試験を行うことができる。しかし実際は、ＩＨＶ（Ｉｎｄｅｐｅｎｄｅｎｔ・Ｈａｒｄｗａｒｅ・Ｖｅｎｄｏｒ）製品、ＩＳＶ（Ｉｎｄｅｐｅｎｄｅｎｔ・Ｓｏｆｔｗａｒｅ・Ｖｅｎｄｏｒ）製品といったサードパーティの提供する製品を活用しながらシステムを組むために上記のような方法を取ることは難しく、細かい条件の障害を発生させることができていない。この結果、十分な試験を行えずに二重系システムの系切り替えを失敗し、二重系システムでありながらシステムがダウンするようなことが起こる。
【０００４】
ケーブルやバックボードを介して接続するコンポーネントの障害について特許文献１では、コンポーネント間に障害を模擬するような障害シミュレータを設置することであたかも故障が起こったように見せかける方法が開示されている。また、特許文献２では、ディスクアレイ装置内の障害模擬機能において、送受信するデータを停止することにより障害を模擬することが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−２３２３１６号公報
【特許文献２】特開２００７−１２２３９６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記の通り、ミッションクリティカルなシステムでは、二重系システムを構築し高い信頼性を実現する。二重系システムにおいても障害は発生するが、中でもストレージに関するものが多く見られる。そこで、系切り替えの品質を高めるために、ストレージに関する試験を充実させる必要がある。ストレージでは、故障してしまいまったく応答しなくなる障害から、「応答遅延」が大きくなるものや、リトライすれば救われるような現象でも程度の差により障害と見られるものまで、いろいろなレベルでの障害が起こる。しかし現状ではケーブルを抜いたり、電源オフしたりするしか障害を模擬する方法がなく、十分な試験を行えていないという課題がある。従来の障害シミュレータを設置しても、回線上を転送されてくるデータを解析する手段がないので、ディスクの特定のエリアにアクセスする場合に発生する障害を模擬することはできないという課題がある。
【０００７】
本発明は、例えば、２つの装置間で送受信されるデータの内容に応じて擬似的に障害を発生させることを目的とする。また、本発明は、例えば、障害レベルや障害発生タイミングを細かく調節することを目的とする。また、本発明は、例えば、二重系システム等の品質を高めるためにきめ細やかな試験を行うことを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一の態様に係る擬似障害発生装置は、
複数のデータで構成されたフレームを送信する送信装置と、当該フレームを受信する受信装置との間に接続され、当該フレームを用いた通信における擬似障害を発生させる擬似障害発生装置であって、
前記送信装置からデータを受信するデータ受信部と、
前記受信装置へデータを送信するデータ送信部と、
前記データ受信部により受信されたデータをバッファメモリに順次保存するデータ保存部と、
前記データ保存部により前記バッファメモリに保存されている、最先のデータから１フレーム分のデータを解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定するデータ判定部と、
前記データ判定部により解析された１フレーム分のデータが前記所定のフレームでないと判定された場合、前記バッファメモリから最先のデータを取り出して前記データ送信部に送信させ、前記データ判定部により当該１フレーム分のデータが前記所定のフレームであると判定された場合、前記擬似障害を発生させる制御部とを備えることを特徴とする。
【発明の効果】
【０００９】
本発明の一の態様において、送信装置と受信装置との間に接続された擬似障害発生装置のデータ保存部は、送信装置からのデータをバッファメモリに順次保存する。擬似障害発生装置のデータ判定部は、データ保存部によりバッファメモリに保存されている、最先のデータから１フレーム分のデータを解析して当該１フレーム分のデータが所定のフレームであるかどうかを判定する。データ判定部により解析された１フレーム分のデータが所定のフレームでないと判定された場合、擬似障害発生装置の制御部は、バッファメモリから最先のデータを取り出してデータ送信部に送信させる。一方、データ判定部により当該１フレーム分のデータが所定のフレームであると判定された場合、制御部は、擬似障害を発生させる。このため、送信装置と受信装置との間で送受信されるフレームの内容に応じて擬似的に障害を発生させることが可能となる。
【図面の簡単な説明】
【００１０】
【図１】実施の形態１に係る試験システムの構成を示すブロック図である。
【図２】実施の形態１に係る障害シミュレータの構成を示すブロック図である。
【図３】実施の形態１に係る障害シミュレータのハードウェア構成の一例を示す図である。
【図４】実施の形態１に係る試験システムの動作を示すフローチャートである。
【図５】実施の形態１に係る障害注入指示コマンドのフォーマットを示す図である。
【図６】実施の形態１に係るＦＣＰ＿ＣＭＮＤのフォーマットを示す図である。
【図７】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図８】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図９】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図１０】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図１１】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図１２】実施の形態１に係る障害シミュレータの動作を示すフローチャートである。
【図１３】実施の形態２に係る障害シミュレータの構成を示すブロック図である。
【図１４】実施の形態２に係る障害シミュレータの動作を示すフローチャートである。
【図１５】実施の形態３に係る障害シミュレータの構成を示すブロック図である。
【図１６】実施の形態３に係る障害シミュレータの動作を示すフローチャートである。
【図１７】実施の形態４に係る障害シミュレータの構成を示すブロック図である。
【図１８】実施の形態４に係る障害シミュレータの動作を示すフローチャートである。
【図１９】実施の形態４に係る実行履歴データのフォーマットを示す図である。
【図２０】実施の形態４に係るステータスデータ要求コマンドのフォーマットを示す図である。
【図２１】実施の形態４に係るステータスデータのフォーマットを示す図である。
【図２２】実施の形態４に係る障害シミュレータの動作を示すフローチャートである。
【図２３】実施の形態５に係る障害シミュレータの構成を示すブロック図である。
【図２４】実施の形態５に係るＦＣＰ＿ＣＭＮＤモニタ要求コマンドのフォーマットを示す図である。
【図２５】実施の形態５に係るＦＣＰ＿ＣＭＮＤログのフォーマットを示す図である。
【図２６】実施の形態５に係る障害シミュレータの動作を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下、本発明の実施の形態について、図を用いて説明する。
【００１２】
実施の形態１．
図１は、本実施の形態に係る試験システム１０の構成を示すブロック図である。
【００１３】
図１において、試験システム１０は、障害シミュレータ１１、サーバＡ１２、サーバＢ１３、ディスクＡ１４、ディスクＢ１５、検証端末１６を備える。障害シミュレータ１１、サーバＡ１２、サーバＢ１３、ディスクＡ１４、ディスクＢ１５は、いずれもＦＣ（ファイバチャネル）のコンポーネントとなっている。障害シミュレータ１１とサーバＡ１２は、ＦＣ１７で接続されている。障害シミュレータ１１とディスクＡ１４は、ＦＣ１８で接続されている。サーバＢ１３とディスクＢ１５は、ＦＣ１９で接続されている。サーバＡ１２とサーバＢ１３は、ＬＡＮ＿Ａ２０（ローカルエリアネットワーク）で接続されている。また、サーバＡ１２とサーバＢ１３は、検証端末１６にＬＡＮ＿Ｂ２１（ローカルエリアネットワーク）で接続されている。検証端末１６は、障害シミュレータ１１とＵＳＢ２２（Ｕｎｉｖｅｒｓａｌ・Ｓｅｒｉａｌ・Ｂｕｓ）で接続されている。
【００１４】
試験システム１０は、主としてサーバＡ１２とサーバＢ１３で構成された二重系システムにおいて、障害シミュレータ１１を使用して、障害を模擬的に起こして系切り替えの試験を実施する。サーバＡ１２は主系であり業務処理を行う。サーバＢ１３は従系でありサーバＡ１２に障害が発生したとき（例えば、サーバＡ１２の故障時）に業務処理を継続するために待機している。サーバＡ１２及びサーバＢ１３間の系切り替え等の二重系処理は、サーバＡ１２及びサーバＢ１３上で動作する二重系制御プログラムが行う。
【００１５】
障害シミュレータ１１が模擬できる障害（擬似障害）の分類（障害タイプ）としては、以下のようなものがある。
（１）「応答遅延」：サーバからのコマンドに対してディスクからの応答が遅れる。
（２）「無応答」：サーバからのコマンドに対してディスクからの応答がない。
（３）「リンク断」：コンポーネント間の接続の同期が取れなくなる。
（４）「応答異常」：ディスクからの応答に異常が発生する。具体的には、ＣＲＣ（Ｃｙｃｌｉｃ・Ｒｅｄｕｎｄａｎｃｙ・Ｃｈｅｃｋ）エラーが発生する。
【００１６】
サーバＡ１２は、複数のデータで構成されたフレームを送信する送信装置の一例である。ディスクＡ１４は、このフレームを受信する受信装置の一例である。なお、サーバＡ１２やディスクＡ１４は、他の種類の装置（例えば、コンピュータ）に置き換えても構わない。本実施の形態では、フレームの一例としてファイバチャネルのフレームを用いているが、他の種類のフレームを用いてもよい。例えば、ＨＤＬＣ（Ｈｉｇｈ−Ｌｅｖｅｌ・Ｄａｔａ・Ｌｉｎｋ・Ｃｏｎｔｒｏｌ）のフレームを用いてもよい。また、複数のデータのかたまりであれば、フレーム以外のものを用いてもよい。障害シミュレータ１１は、送信装置と受信装置との間に接続され、上記フレームを用いた通信における擬似障害を発生させる擬似障害発生装置の一例である。本実施の形態では、通信の一例としてファイバチャネルを用いているが、他の種類の通信でもよいことは前述した通りである。検証端末１６は、擬似障害発生装置と接続され、試験の開始を指示する端末装置の一例である。
【００１７】
図２は、障害シミュレータ１１の構成を示すブロック図である。
【００１８】
図２において、障害シミュレータ１１は、データ受信部Ａ１０１、データ送信部Ａ１０２、データ送信部Ｂ１０３、データ受信部Ｂ１０４、データ保存部Ａ１１１、データ保存部Ｂ１１２、制御部１３１、コマンド解析部１４１、データ解析部１４２、代替送信データ出力部１５１、データ選択部Ａ１５２、データ選択部Ｂ１５３、データ置換部１５４、コマンド送信遅延タイマ１６１を備える。データ保存部Ａ１１１は、単データ保持部１７１及び複データ保持部１７２を有する。データ送信部Ｂ１０３及びデータ受信部Ｂ１０４は、データ生成部の一例である。コマンド解析部１４１は、データ判定部の一例である。代替送信データ出力部１５１は、データ生成部の一例である。複データ保持部１７２は、バッファメモリの一例である。また、障害シミュレータ１１は、検証端末Ｉ／Ｆ１８１（インタフェース）、障害注入設定部１８２、非ＩＤＬＥフラグ１９１、受信データ数カウンタ１９２、Ｄ＿ＩＤ保存部１９３を備える。障害シミュレータ１１の各部の動作については後述する。
【００１９】
障害シミュレータ１１において、ディスクＡ１４へ送信されるデータのパスとしては、第１データ経路１７３、第２データ経路１７４、第３データ経路１７５の３つがある。これらのパスはデータ選択部Ａ１５２によって選択的に使用される。第１データ経路１７３は、データ受信部Ａ１０１によってサーバＡ１２から受信されたデータが、単データ保持部１７１で一旦保存された後、複データ保持部１７２をバイパスしてデータ送信部Ａ１０２によってそのままディスクＡ１４へ送信されるパスである。第２データ経路１７４は、データ受信部Ａ１０１によってサーバＡ１２から受信されたデータが、単データ保持部１７１で一旦保存された後、複データ保持部１７２で暫く保持されてからデータ送信部Ａ１０２によってディスクＡ１４へ送信されるパスである。第３データ経路１７５は、代替送信データ出力部１５１によって生成されたデータが、データ送信部Ａ１０２によってディスクＡ１４へ送信されるパスである。
【００２０】
障害シミュレータ１１において、サーバＡ１２へ送信されるデータのパスとしては、第４データ経路１７６、第５データ経路１７７の２つがある。詳細については後述するが、これらのパスはデータ選択部Ｂ１５３によって選択的に使用される。第４データ経路１７６は、データ受信部Ｂ１０４によってディスクＡ１４から受信されたデータが、データ保存部Ｂ１１２で保存された後、データ送信部Ｂ１０３によってサーバＡ１２へ送信されるパスである。第５データ経路１７７は、代替送信データ出力部１５１によって生成されたデータが、データ送信部Ｂ１０３によってサーバＡ１２へ送信されるパスである。
【００２１】
図２に示していないが、障害シミュレータ１１は、処理装置、記憶装置、入力装置、出力装置等のハードウェアを具備する。ハードウェアは障害シミュレータ１１の各部によって利用される。例えば、処理装置は、障害シミュレータ１１の各部でデータや情報の演算、加工、読み取り、書き込み等を行うために利用される。記憶装置は、そのデータや情報を記憶するために利用される。また、入力装置は、そのデータや情報を入力するために、出力装置は、そのデータや情報を出力するために利用される。
【００２２】
図３は、障害シミュレータ１１のハードウェア構成の一例を示す図である。なお、障害シミュレータ１１と同様に、サーバＡ１２、サーバＢ１３、検証端末１６を、以下に示すようなハードウェア構成で実現しても構わない。
【００２３】
図３において、障害シミュレータ１１は、コンピュータであり、ＬＣＤ９０１（Ｌｉｑｕｉｄ・Ｃｒｙｓｔａｌ・Ｄｉｓｐｌａｙ）、キーボード９０２（Ｋ／Ｂ）、マウス９０３、ＦＤＤ９０４（Ｆｌｅｘｉｂｌｅ・Ｄｉｓｋ・Ｄｒｉｖｅ）、ＣＤＤ９０５（Ｃｏｍｐａｃｔ・Ｄｉｓｃ・Ｄｒｉｖｅ）、プリンタ９０６といったハードウェアデバイスを備えている。これらのハードウェアデバイスはケーブルや信号線で接続されている。ＬＣＤ９０１の代わりに、ＣＲＴ（Ｃａｔｈｏｄｅ・Ｒａｙ・Ｔｕｂｅ）、あるいは、その他の表示装置が用いられてもよい。マウス９０３の代わりに、タッチパネル、タッチパッド、トラックボール、ペンタブレット、あるいは、その他のポインティングデバイスが用いられてもよい。
【００２４】
障害シミュレータ１１は、プログラムを実行するＣＰＵ９１１（Ｃｅｎｔｒａｌ・Ｐｒｏｃｅｓｓｉｎｇ・Ｕｎｉｔ）を備えている。ＣＰＵ９１１は、処理装置の一例である。ＣＰＵ９１１は、バス９１２を介してＲＯＭ９１３（Ｒｅａｄ・Ｏｎｌｙ・Ｍｅｍｏｒｙ）、ＲＡＭ９１４（Ｒａｎｄｏｍ・Ａｃｃｅｓｓ・Ｍｅｍｏｒｙ）、通信ボード９１５、ＬＣＤ９０１、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５、プリンタ９０６、ＨＤＤ９２０（Ｈａｒｄ・Ｄｉｓｋ・Ｄｒｉｖｅ）と接続され、これらのハードウェアデバイスを制御する。ＨＤＤ９２０の代わりに、フラッシュメモリ、光ディスク装置、メモリカードリーダライタ又はその他の記憶媒体が用いられてもよい。
【００２５】
ＲＡＭ９１４は、揮発性メモリの一例である。ＲＯＭ９１３、ＦＤＤ９０４、ＣＤＤ９０５、ＨＤＤ９２０は、不揮発性メモリの一例である。これらは、記憶装置の一例である。通信ボード９１５、キーボード９０２、マウス９０３、ＦＤＤ９０４、ＣＤＤ９０５は、入力装置の一例である。また、通信ボード９１５、ＬＣＤ９０１、プリンタ９０６は、出力装置の一例である。
【００２６】
通信ボード９１５は、ＬＡＮ等に接続されている。通信ボード９１５は、ＬＡＮに限らず、ＩＰ−ＶＰＮ（Ｉｎｔｅｒｎｅｔ・Ｐｒｏｔｏｃｏｌ・Ｖｉｒｔｕａｌ・Ｐｒｉｖａｔｅ・Ｎｅｔｗｏｒｋ）、広域ＬＡＮ、ＡＴＭ（Ａｓｙｎｃｈｒｏｎｏｕｓ・Ｔｒａｎｓｆｅｒ・Ｍｏｄｅ）ネットワークといったＷＡＮ（ワイドエリアネットワーク）、あるいは、インターネットに接続されていても構わない。ＬＡＮ、ＷＡＮ、インターネットは、ネットワークの一例である。
【００２７】
ＨＤＤ９２０には、オペレーティングシステム９２１（ＯＳ）、ウィンドウシステム９２２、プログラム群９２３、ファイル群９２４が記憶されている。プログラム群９２３のプログラムは、ＣＰＵ９１１、オペレーティングシステム９２１、ウィンドウシステム９２２により実行される。プログラム群９２３には、本実施の形態の説明において「〜部」として説明する機能を実行するプログラムが含まれている。プログラムは、ＣＰＵ９１１により読み出され実行される。ファイル群９２４には、本実施の形態の説明において、「〜データ」、「〜情報」、「〜ＩＤ（識別子）」、「〜フラグ」、「〜結果」として説明するデータや情報や信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」や「〜テーブル」の各項目として含まれている。「〜ファイル」や「〜データベース」や「〜テーブル」は、ＲＡＭ９１４やＨＤＤ９２０等の記憶媒体に記憶される。ＲＡＭ９１４やＨＤＤ９２０等の記憶媒体に記憶されたデータや情報や信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ９１１によりメインメモリやキャッシュメモリに読み出され、抽出、検索、参照、比較、演算、計算、制御、出力、印刷、表示といったＣＰＵ９１１の処理（動作）に用いられる。抽出、検索、参照、比較、演算、計算、制御、出力、印刷、表示といったＣＰＵ９１１の処理中、データや情報や信号値や変数値やパラメータは、メインメモリやキャッシュメモリやバッファメモリに一時的に記憶される。
【００２８】
本実施の形態の説明において用いるブロック図やフローチャートの矢印の部分は主としてデータや信号の入出力を示す。データや信号は、ＲＡＭ９１４等のメモリ、ＦＤＤ９０４のフレキシブルディスク（ＦＤ）、ＣＤＤ９０５のコンパクトディスク（ＣＤ）、ＨＤＤ９２０の磁気ディスク、光ディスク、ＤＶＤ（Ｄｉｇｉｔａｌ・Ｖｅｒｓａｔｉｌｅ・Ｄｉｓｃ）、あるいは、その他の記録媒体に記録される。また、データや信号は、バス９１２、信号線、ケーブル、あるいは、その他の伝送媒体により伝送される。
【００２９】
本実施の形態の説明において「〜部」として説明するものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜工程」、「〜手順」、「〜処理」であってもよい。即ち、「〜部」として説明するものは、ＲＯＭ９１３に記憶されたファームウェアで実現されていても構わない。あるいは、「〜部」として説明するものは、ソフトウェアのみ、あるいは、素子、デバイス、基板、配線といったハードウェアのみで実現されていても構わない。あるいは、「〜部」として説明するものは、ソフトウェアとハードウェアとの組み合わせ、あるいは、ソフトウェアとハードウェアとファームウェアとの組み合わせで実現されていても構わない。ファームウェアとソフトウェアは、プログラムとして、フレキシブルディスク、コンパクトディスク、磁気ディスク、光ディスク、ＤＶＤ等の記録媒体に記憶される。プログラムはＣＰＵ９１１により読み出され、ＣＰＵ９１１により実行される。即ち、プログラムは、本実施の形態の説明で述べる「〜部」としてコンピュータを機能させるものである。あるいは、プログラムは、本実施の形態の説明で述べる「〜部」の手順や方法をコンピュータに実行させるものである。
【００３０】
上記のように、本実施の形態では、障害シミュレータ１１を、ＣＰＵ９１１（処理装置の一例）を具備するコンピュータで実現しているが、障害シミュレータ１１を、ＣＰＵ９１１を具備しない専用のハードウェアで実現しても構わない。
【００３１】
試験システム１０は、前述したように、模擬的に障害を発生させて、業務処理を行うサーバをサーバＡ１２からサーバＢ１３に切り替えられることを確認する試験を行う。きめ細かい試験を行うためには、特定のコマンドを対象にして擬似的な障害を発生させる、あるいは、特定のディスクエリアへのアクセスを対象にして擬似的な障害を発生させる等、障害注入の対象を限定することが必要である。
【００３２】
以下では、特定のコマンドを対象にして擬似的な障害を発生させる方法について、障害タイプ「応答遅延」を例に説明する。
【００３３】
図４は、試験システム１０の動作（本実施の形態に係る試験方法）を示すフローチャートである。
【００３４】
図４において、障害発生に伴う系切り替え試験を開始するにあたり、サーバＡ１２は、サーバＡ１２からディスクＡ１４にアクセスする処理を含む業務処理プログラムを起動する（ステップＳ１０１）。このとき、業務処理プログラムは、コンソールからの操作等により手動で起動するようにしてもよいし、タスクスケジューリング等により自動的に起動するようにしてもよい。また、検証端末１６から業務処理プログラムの起動及び起動タイミングを指示するようにしてもよい。
【００３５】
検証端末１６は、障害シミュレータ１１に障害注入指示コマンドを送信して障害発生を指示する（ステップＳ１０２）。障害注入指示コマンドは、どのような場合に障害を発生させるかを指示するデータである。例えば、サーバＡ１２がディスクＡ１４の特定エリアからデータを読み取る（リード処理を行う）場合やサーバＡ１２がディスクＡ１４の特定エリアへデータを書き込む（ライト処理を行う）場合等に障害を発生させるよう指示することができる。
【００３６】
障害シミュレータ１１は、例えば、リード処理の場合に障害を発生させるよう指示する障害注入指示コマンドを受信すると、サーバＡ１２からディスクＡ１４へ送信されるコマンド（フレーム）が指定されたエリアからのリード処理を行うものである場合にディスクＡ１４の応答遅延が大きくなる障害を発生させる。なお、リード処理の場合、サーバＡ１２及びディスクＡ１４間の通信は以下のようにして行われる。
（１）サーバＡ１２からディスクＡ１４にコマンドが送信される。
（２）ディスクＡ１４からサーバＡ１２にリードデータが送信される。
（３）ディスクＡ１４からサーバＡ１２にステータスが送信される。
【００３７】
また、障害シミュレータ１１は、例えば、ライト処理の場合に障害を発生させるよう指示する障害注入指示コマンドを受信すると、サーバＡ１２からディスクＡ１４へ送信されるコマンド（フレーム）が指定されたエリアへのライト処理を行うものである場合にディスクＡ１４の応答遅延が大きくなる障害を発生させる。なお、ライト処理の場合、サーバＡ１２及びディスクＡ１４間の通信は以下のようにして行われる。
（１）サーバＡ１２からディスクＡ１４にコマンドが送信される。
（２）ディスクＡ１４からサーバＡ１２にＲＥＡＤＹが送信される。
（３）サーバＡ１２からディスクＡ１４にライトデータが送信される。
（４）ディスクＡ１４からサーバＡ１２にステータスが送信される。
【００３８】
ここで、障害注入指示コマンドのフォーマットを図５に示す。例えば、障害注入指示コマンドのｂｉｔ０からｂｉｔ６には、障害タイプを指定するＦＴＹＰＥが含まれる。ｂｉｔ７には、障害注入処理を実行するかどうかを指定するＩＮＪＳＴＡＲＴが含まれる。ｂｉｔ８からｂｉｔ１５には、障害注入モードを指定するＦＭＯＤＥ（実施の形態２及び３で使用する）が含まれる。ｂｉｔ１６からｂｉｔ２３には、障害注入対象のＳＣＳＩ（Ｓｍａｌｌ・Ｃｏｍｐｕｔｅｒ・Ｓｙｓｔｅｍ・Ｉｎｔｅｒｆａｃｅ）コマンドを指定するＳＣＳＩＣＭＤが含まれる。ｂｉｔ２４からｂｉｔ３１には、障害注入スキップ頻度を指定するＭＤＮＵＭ（実施の形態３で使用する）が含まれる。ｂｉｔ３２からｂｉｔ６３には、障害注入遅延時間を指定するＭＤＴＩＭＥ（実施の形態２で使用する）が含まれる。ｂｉｔ６４からｂｉｔ９５には、応答遅延時間を指定するＤＬＹＴＩＭＥが含まれる。ｂｉｔ９６からｂｉｔ１２７には、障害注入対象のＦＣポートＩＤを指定するＦＣＰＯＲＴが含まれる。ｂｉｔ１２８からｂｉｔ１５９には、障害注入対象のＳＣＳＩロジカルブロックアドレスを指定するＳＣＳＩＡＤＲが含まれる。
【００３９】
障害シミュレータ１１は、サーバＡ１２からディスクＡ１４に送信されるコマンドを検出し、必要な処理を行うことで「応答遅延」を実現することができる。ＦＣではこのコマンドはＦＣＰ＿ＣＭＮＤと呼ばれるフレームである。
【００４０】
ここで、ＦＣＰ＿ＣＭＮＤのフォーマットを図６に示す。ＦＣＰ＿ＣＭＮＤは、ｗｏｒｄ０：ｂｉｔ０からｗｏｒｄ１６：ｂｉｔ３１の順序で送信される。例えば、ＦＣＰ＿ＣＭＮＤのｗｏｒｄ０には、フレームの先頭を示すＳＯＦが含まれる。ｗｏｒｄ１には、フレームの送信先ＩＤ（識別子）を示すＤ＿ＩＤ、フレームの分類（機能）を示すＲ＿ＣＴＬが含まれる。ｗｏｒｄ２には、フレームの送信元ＩＤを示すＳ＿ＩＤが含まれる。ｗｏｒｄ３には、フレームのデータ部の分類を示すＴＹＰＥが含まれる。ｗｏｒｄ１０からｗｏｒｄ１３には、フレームのデータ部が含まれる。ｗｏｒｄ１５には、誤り検出のためのＣＲＣ−３２が含まれる。
【００４１】
以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明する。
【００４２】
図４において、障害シミュレータ１１は、サーバＡ１２からディスクＡ１４へ送信されるコマンド（フレーム）を解析する（ステップＳ１０３）。コマンドが、検証端末１６により指定されたエリアからのリード処理を指示するＦＣＰ＿ＣＭＮＤであれば（ステップＳ１０４）、障害シミュレータ１１は、そのＦＣＰ＿ＣＭＮＤを一定時間保持する（ステップＳ１０５）。これによって遅延を発生させた後、障害シミュレータ１１は、保持していたＦＣＰ＿ＣＭＮＤをディスクＡ１４へ送信する。ディスクＡ１４は、ＦＣＰ＿ＣＭＮＤを受け取ると応答を返す。
【００４３】
サーバＡ１２からはＦＣＰ＿ＣＭＮＤに対する応答遅延が大きくなったように見える。ディスクＡ１４からの応答遅延が、サーバＡ１２のＩＯ（Ｉｎｐｕｔ／Ｏｕｔｐｕｔ）タイムアウト値よりも大きくなった場合、サーバＡ１２はディスクＡ１４からのリード処理がタイムアウトになったと判定してＩＯタイムアウト処理を行う（ステップＳ１０６）。
【００４４】
二重系制御プログラムはサーバＡ１２に障害があったと判定して、サーバＢ１３に処理系を切り替える（ステップＳ１０７）。
【００４５】
以下では、障害シミュレータ１１の詳細な動作について説明する。
【００４６】
障害シミュレータ１１が動作する際には、前述したように、サーバＡ１２において業務処理プログラムが実行され、業務処理が開始されている。このプログラムにはサーバＡ１２からディスクＡ１４へアクセスする処理が含まれている。
【００４７】
検証端末１６は、試験を行うためにサーバＡ１２が業務処理を行っている状態で障害注入を指示する。ここでは、一例として、検証端末１６が、以下のように設定された障害注入指示コマンドを障害シミュレータ１１に送信することで、障害シミュレータ１１に障害注入を指示するものとする。
（１）ＦＴＹＰＥ（障害タイプ）：「応答遅延」
（２）ＤＬＹＴＩＭＥ（応答遅延時間）：１．５秒
（３）ＦＣＰＯＲＴ（障害注入対象ＦＣポートＩＤ）：ディスクＡ１４
（４）ＳＣＳＩＣＭＤ（障害注入対象ＳＣＳＩコマンド）：ＲＥＡＤ（リード処理）
（５）ＳＣＳＩＡＤＲ（障害注入対象ＳＣＳＩロジカルブロックアドレス）：１２００＿００００ｈ
【００４８】
「応答遅延」は、障害シミュレータ１１がサーバＡ１２から受信したＦＣＰ＿ＣＭＮＤを保存し、その内容が指定された条件に一致したらディスクＡ１４への送信を一時停止し、その後指定された時間が経過すると、保存していたＦＣＰ＿ＣＭＮＤをディスクＡ１４に送信することで実現する。ＦＣでは、コンポーネント間の接続同期を維持するために、有意なデータを送信しないときはＩＤＬＥプリミティブ（データパターン：ＢＣ９５＿Ｂ５Ｂ５ｈ）を送信しなくてはならない。したがって、ディスクＡ１４へのＦＣＰ＿ＣＭＮＤの送信を一時停止している間、障害シミュレータ１１はＦＣＰ＿ＣＭＮＤの代わりにＩＤＬＥプリミティブを送信しなくてはならない。また、検証端末１６から障害注入処理開始の指示がなければ、障害シミュレータ１１は特に多くのデータを保存する必要もなく、障害シミュレータ１１の入出力遅延を短縮するために保存するデータ量を減らすことが望ましい。そこで、障害シミュレータ１１では、制御部１３１がデータ選択部Ａ１５２を制御して、ディスクＡ１４へ送信するデータをデータ送信部Ａ１０２に入力するための３つのデータ経路から１つを適宜選択する。３つのデータ経路とは、前述した第１データ経路１７３、第２データ経路１７４、第３データ経路１７５のことである。
【００４９】
第１データ経路１７３は、障害注入処理を開始していないときに選択されるデータ経路である。データ保存部Ａ１１１は、データ受信部Ａ１０１から入力された１回分のデータを保持する単データ保持部１７１と６８バイトのＦＣＰ＿ＣＭＮＤを保存するための複データ保持部１７２を備えている。第１データ経路１７３は、単データ保持部１７１から複データ保持部１７２を経ずに（データ選択部Ａ１５２を経て）データ送信部Ａ１０２に直接つながるデータ経路である。第１データ経路１７３は、複データ保持部１７２をバイパスするため、このデータ経路を選択した場合には入出力遅延を短縮することができる。
【００５０】
第２データ経路１７４は、障害注入処理を開始したときに選択されるデータ経路である。第２データ経路１７４は、単データ保持部１７１から複データ保持部１７２（及びデータ選択部Ａ１５２）を経てデータ送信部Ａ１０２につながるデータ経路である。このデータ経路を選択した場合には、データ受信部Ａ１０１から入力されるデータが全て単データ保持部１７１、複データ保持部１７２を経由してデータ送信部Ａ１０２に入力される。
【００５１】
第３データ経路１７５は、複データ保持部１７２でのデータ保存開始の直後や、データ（ＦＣＰ＿ＣＭＮＤである場合）送信の一時停止によりサーバＡ１２からの受信データを利用できないときに選択されるデータ経路である。第３データ経路１７５は、代替送信データ出力部１５１から（データ選択部Ａ１５２を経て）データ送信部Ａ１０２につながるデータ経路である。このデータ経路を選択した場合には、サーバＡ１２からの受信データの代わりに代替送信データ出力部１５１が出力するデータ（例えばＩＤＬＥプリミティブ）がデータ送信部Ａ１０２に入力される。
【００５２】
ＦＣでは、ＦＣＰ＿ＣＭＮＤに対し、Ｒ＿ＲＤＹプリミティブ（データパターン：ＢＣ９５＿４Ａ４Ａｈ）を返信して、ＦＣＰ＿ＣＭＮＤを受信したことを送信元のコンポーネントに通知する必要がある。そのため、ディスクＡ１４へのＦＣＰ＿ＣＭＮＤの送信を一時停止する場合、障害シミュレータ１１はディスクＡ１４の代わりにＲ＿ＲＤＹプリミティブを返信する必要がある。また、その後でＦＣＰ＿ＣＭＮＤをディスクＡ１４へ送信すると、ディスクＡ１４からＲ＿ＲＤＹプリミティブが返信されてくるため、これを破棄しなければならないが、このとき、障害シミュレータ１１はＲ＿ＲＤＹプリミティブの代わりにＩＤＬＥプリミティブを送信しなくてはならない。そこで、障害シミュレータ１１では、制御部１３１がデータ選択部Ｂ１５３を制御して、サーバＡ１２へ送信するデータをデータ送信部Ｂ１０３に入力するための２つのデータ経路から１つを適宜選択する。２つのデータ経路とは、前述した第４データ経路１７６、第５データ経路１７７のことである。
【００５３】
第４データ経路１７６は、障害注入処理を開始していないときや、障害注入処理を行っているときに選択されるデータ経路である。第４データ経路１７６は、データ保存部Ｂ１１２から（データ選択部Ｂ１５３を経て）データ送信部Ｂ１０３につながるデータ経路である。このデータ経路を選択した場合には、データ受信部Ｂ１０４から入力されるデータが全てデータ保存部Ｂ１１２を経由してデータ送信部Ｂ１０３に入力される。なお、このデータ経路を使わないのは、Ｒ＿ＲＤＹプリミティブの破棄のときと、ＦＣＰ＿ＣＭＮＤの受信通知のときだけである。
【００５４】
第５データ経路１７７は、Ｒ＿ＲＤＹプリミティブの破棄、及び、ＦＣＰ＿ＣＭＮＤの受信通知のとき、即ち、受信データを利用しないときに選択されるデータ経路である。第５データ経路１７７は、代替送信データ出力部１５１から（データ選択部Ｂ１５３を経て）データ送信部Ｂ１０３につながるデータ経路である。このデータ経路を選択した場合には、ディスクＡ１４からの受信データの代わりに代替送信データ出力部１５１が出力するデータ（例えばＩＤＬＥプリミティブ、Ｒ＿ＲＤＹプリミティブ）がデータ送信部Ｂ１０３に入力される。
【００５５】
図７は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【００５６】
障害注入設定部１８２は、障害注入指示コマンドを検証端末Ｉ／Ｆ１８１を介して検証端末１６から受信すると、記憶装置に保存する。制御部１３１は、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）障害注入指示コマンドを読み出し、障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドを処理装置により確認する（ステップＳ２０１）。ＩＮＪＳＴＡＲＴフィールドが１になっていれば、制御部１３１は、障害注入処理を開始する。ＩＮＪＳＴＡＲＴフィールドが０であれば、制御部１３１は、障害注入処理を開始せず、次の障害注入指示コマンドを待つ。
【００５７】
制御部１３１は、ステップＳ２０１で障害注入処理を開始すると、データ選択部Ａ１５２を制御し、第３データ経路１７５を選択する（ステップＳ２０２）。これにより、データ送信部Ａ１０２は、再びデータ経路が切り替えられるまで、ＩＤＬＥプリミティブをディスクＡ１４に送信することになる。なお、障害注入処理の開始前、即ち、デフォルトでは、第１データ経路１７３が選択されているものとする。
【００５８】
データ受信部Ａ１０１は、サーバＡ１２から送信されたデータを受信する。データ受信部Ａ１０１は、受信したデータのデシリアライズ及びデコードを行う。まず、データ受信部Ａ１０１は、デコードを終えたデータをデータ保存部Ａ１１１に２バイト送信する。データ保存部Ａ１１１は、データ受信部Ａ１０１から送られてきた２バイトのデータを単データ保持部１７１に一旦保存した後、複データ保持部１７２に保存する（ステップＳ２０３）。続けて、データ受信部Ａ１０１は、デコードを終えたデータをデータ保存部Ａ１１１に２バイトずつ送信する。データ保存部Ａ１１１は、データ受信部Ａ１０１から送られてきた２バイトのデータを複データ保持部１７２に保存する（ステップＳ２０４）。このとき、制御部１３１は、ｎ＝２とするｎバイト保存処理を処理装置により実行する。
【００５９】
図８に示すように、ｎバイト保存処理において、制御部１３１は、まず、受信データ数カウンタ１９２をクリアする（ステップＳ３０１）。即ち、受信データ数カウンタ１９２のカウンタ値を０にセットする。制御部１３１は、データ保存部Ａ１１１に、データ受信部Ａ１０１から送られてきた２バイトのデータを単データ保持部１７１に一旦保存させ、さらに、複データ保持部１７２に保存させる（ステップＳ３０２）。制御部１３１は、複データ保持部１７２に６８バイトのデータが保存されているかどうかを判定する（ステップＳ３０３）。複データ保持部１７２に６８バイトのデータが保存されていれば、複データ保持部１７２に有効なデータ、即ち、１フレーム分のデータが保存されたことになる。そのため、次サイクルからは、保存したデータのうち、後述するチェックが済んだデータをディスクＡ１４へ送信することが可能になる。そこで、制御部１３１は、データ選択部Ａ１５２を制御し、第２データ経路１７４を選択する（ステップＳ３０４）。これにより、データ送信部Ａ１０２は、再びデータ経路が切り替えられるまで、データ選択部Ａ１５２を介して複データ保持部１７２から入力されるデータをエンコード及びシリアライズしてディスクＡ１４に送信することになる。なお、制御部１３１は、直近の障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドが０になっている場合にも、データ選択部Ａ１５２を制御し、第２データ経路１７４を選択する。続けて、制御部１３１は、受信データ数カウンタ１９２を１つインクリメントする（ステップＳ３０５）。ステップＳ３０３で複データ保持部１７２に６８バイトのデータが保存されていなければ、制御部１３１は、データ経路の変更はせずに、受信データ数カウンタ１９２を１つインクリメントする（ステップＳ３０５）。制御部１３１は、受信データ数カウンタ１９２のカウンタ値がｎ／２であるかどうかを判定する。カウンタ値がｎ／２でなければ、ステップＳ３０２から処理を繰り返す。カウンタ値がｎ／２であれば、ｎバイト保存処理を終了する。
【００６０】
データ保存部Ａ１１１は、ステップＳ２０４でｎ＝２とするｎバイト保存処理により、２バイトのデータを複データ保持部１７２に保存すると、直近の（即ち、最後に保存した）４バイトのデータをコマンド解析部１４１に出力する。コマンド解析部１４１は、データ保存部Ａ１１１から受け取ったデータを解析し、そのデータがＩＤＬＥプリミティブであるかを処理装置により判定する。そして、コマンド解析部１４１は、判定結果を制御部１３１に通知する。制御部１３１は、判定結果に応じて、非ＩＤＬＥフラグ１９１を更新する（ステップＳ２０５）。非ＩＤＬＥフラグ１９１は、複データ保持部１７２に保存されているデータにＩＤＬＥプリミティブでないものが含まれているかどうかを示すフラグデータである。
【００６１】
障害注入処理を終了するときには、データ経路をデフォルト設定の第１データ経路１７３に切り替える必要がある。そのための条件として、複データ保持部１７２に保存されているデータが全て破棄してよいデータ、即ち、ＩＤＬＥプリミティブであることが必要である。これは、有効なデータを破棄しないためである。制御部１３１は、上記条件の判定のために非ＩＤＬＥフラグ１９１を記憶装置に記憶している。複データ保持部１７２に保存されている最大で６８バイトのデータの中に、コマンド解析部１４１がＩＤＬＥプリミティブであると判定したデータしか含まれていなければ、制御部１３１は、非ＩＤＬＥフラグ１９１を無意に設定する。一方、１つでもコマンド解析部１４１がＩＤＬＥプリミティブでないと判定したデータが含まれていれば、制御部１３１は、非ＩＤＬＥフラグ１９１を有意に設定する。
【００６２】
制御部１３１は、記憶装置から直近の障害注入指示コマンドを読み出し、障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドを処理装置により確認する（ステップＳ２０６）。ＩＮＪＳＴＡＲＴフィールドが０になっていれば、制御部１３１は、障害注入処理を終了する。ＩＮＪＳＴＡＲＴフィールドが１であれば、制御部１３１は、障害注入処理を継続する。
【００６３】
コマンド解析部１４１は、ステップＳ２０６で制御部１３１が障害注入処理を継続する場合、ステップＳ２０５で解析した４バイトのデータがフレームの先頭であるかを処理装置により判定する（ステップＳ２０７）。具体的には、コマンド解析部１４１は、４バイトのデータがＢＣＢ５＿５６５６ｈであれば、解析したデータがＳＯＦ、即ち、フレームの先頭であると判定する。コマンド解析部１４１が解析したデータがフレームの先頭である場合、制御部１３１は、ｎ＝４とするｎバイト保存処理を処理装置により実行する（ステップＳ２０８）。ステップＳ２０７でコマンド解析部１４１が解析したデータがフレームの先頭でない場合、ステップＳ２０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ２０７まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出するまで同様の処理を繰り返す。
【００６４】
データ保存部Ａ１１１は、ステップＳ２０８でｎ＝４とするｎバイト保存処理により、後続の４バイトのデータを複データ保持部１７２に保存すると、その４バイトのデータをコマンド解析部１４１に出力する。コマンド解析部１４１は、データ保存部Ａ１１１から受け取ったデータを解析し、末尾の１バイトのデータ、即ち、フレームの先頭から８バイト目のＲ＿ＣＴＬフィールドがＦＣＰ＿ＣＭＮＤを示すものであるかを処理装置により判定する（ステップＳ２０９）。具体的には、コマンド解析部１４１は、Ｒ＿ＣＴＬフィールドが０６ｈであれば、受信中のフレームがＦＣＰ＿ＣＭＮＤであると判定する。フレームがＦＣＰ＿ＣＭＮＤである場合、制御部１３１は、ｎ＝３６とするｎバイト保存処理を処理装置により実行する（ステップＳ２１０）。ステップＳ２０９でフレームがＦＣＰ＿ＣＭＮＤでない場合、ステップＳ２０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ２０７まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出すると、Ｒ＿ＣＴＬフィールドを解析する。コマンド解析部１４１は、ＦＣＰ＿ＣＭＮＤを検出するまで同様の処理を繰り返す。
【００６５】
データ保存部Ａ１１１は、ステップＳ２１０でｎ＝３６とするｎバイト保存処理により、後続の３６バイトのデータを複データ保持部１７２に保存すると、その３６バイトのデータをコマンド解析部１４１に出力する。コマンド解析部１４１は、データ保存部Ａ１１１から受け取ったデータを解析し、末尾の１バイトのデータ、即ち、フレームの先頭から４４バイト目のＳＣＳＩ＿ＣＤＢ０フィールドがリード処理を示すものであるかを処理装置により判定する（ステップＳ２１１）。具体的には、コマンド解析部１４１は、ＳＣＳＩ＿ＣＤＢ０フィールドが２８ｈであれば、受信中のＦＣＰ＿ＣＭＮＤがＳＣＳＩのＲＥＡＤコマンドであると判定する。ＦＣＰ＿ＣＭＮＤがＲＥＡＤコマンドである場合、制御部１３１は、ｎ＝４とするｎバイト保存処理を処理装置により実行する（ステップＳ２１２）。ステップＳ２１１でＦＣＰ＿ＣＭＮＤがＲＥＡＤコマンドでない場合、ステップＳ２０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ２０７まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出すると、Ｒ＿ＣＴＬフィールドを解析する。コマンド解析部１４１は、ＦＣＰ＿ＣＭＮＤを検出すると、ＳＣＳＩ＿ＣＤＢ０フィールドを解析する。コマンド解析部１４１は、ＲＥＡＤコマンドを検出するまで同様の処理を繰り返す。
【００６６】
データ保存部Ａ１１１は、ステップＳ２１２でｎ＝４とするｎバイト保存処理により、後続の４バイトのデータを複データ保持部１７２に保存すると、その４バイトのデータをコマンド解析部１４１に出力する。コマンド解析部１４１は、データ保存部Ａ１１１から受け取ったデータを解析し、フレームの先頭から４２バイト目のＳＣＳＩ＿ＣＤＢ２フィールド、４１バイト目のＳＣＳＩ＿ＣＤＢ３フィールド、４８バイト目のＳＣＳＩ＿ＣＤＢ４フィールド、４７バイト目のＳＣＳＩ＿ＣＤＢ５フィールドの順番で４バイトのデータと、障害注入指示コマンドのＳＣＳＩＡＤＲフィールドの値とを処理装置により比較する（ステップＳ２１３）。ここで、ＳＣＳＩ＿ＣＤＢ２フィールド、ＳＣＳＩ＿ＣＤＢ３フィールド、ＳＣＳＩ＿ＣＤＢ４フィールド、ＳＣＳＩ＿ＣＤＢ５フィールドからなる４バイトのデータでは、ＦＣＰ＿ＣＭＮＤがリード処理の対象として指定するＳＣＳＩロジカルブロックアドレスが示されているものとする。このＳＣＳＩロジカルブロックアドレスが障害注入指示コマンドのＳＣＳＩＡＤＲフィールドの値と一致する場合、障害を注入する条件が揃ったことになる。この場合、制御部１３１は、ｎ＝２０とするｎバイト保存処理を処理装置により実行する（ステップＳ２１４）。これにより、６８バイトのＦＣＰ＿ＣＭＮＤの保存が完了したことになる。このとき、制御部１３１は、コマンド送信遅延タイマ１６１を開始する。ステップＳ２１３でＦＣＰ＿ＣＭＮＤがリード処理の対象として指定するＳＣＳＩロジカルブロックアドレスが障害注入指示コマンドのＳＣＳＩＡＤＲフィールドの値と一致しない場合、ステップＳ２０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ２０７まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出すると、Ｒ＿ＣＴＬフィールドを解析する。コマンド解析部１４１は、ＦＣＰ＿ＣＭＮＤを検出すると、ＳＣＳＩ＿ＣＤＢ０フィールドを解析する。コマンド解析部１４１は、ＲＥＡＤコマンドを検出すると、ＳＣＳＩ＿ＣＤＢ２フィールド、ＳＣＳＩ＿ＣＤＢ３フィールド、ＳＣＳＩ＿ＣＤＢ４フィールド、ＳＣＳＩ＿ＣＤＢ５フィールドを解析する。コマンド解析部１４１は、障害注入指示コマンドで指定されたＳＣＳＩロジカルブロックアドレスを処理対象とするＲＥＡＤコマンドを検出するまで同様の処理を繰り返す。
【００６７】
制御部１３１は、ステップＳ２１４でデータ保存部Ａ１１１が６８バイトのＦＣＰ＿ＣＭＮＤを複データ保持部１７２に保存し終わると、データ保存部Ａ１１１を制御し、これ以降、データ受信部Ａ１０１から入力されるデータの保存を停止する。また、制御部１３１は、データ選択部Ａ１５２を制御し、第３データ経路１７５を選択する（ステップＳ２１５）。これにより、データ送信部Ａ１０２は、再びデータ経路が切り替えられるまで、ＩＤＬＥプリミティブをディスクＡ１４に送信することになる。
【００６８】
さらに、制御部１３１は、データ選択部Ｂ１５３を制御し、第５データ経路１７７を選択して、データ送信部Ｂ１０３にＲ＿ＲＤＹプリミティブを送信させる（ステップＳ２１６）。これにより、障害シミュレータ１１は、ディスクＡ１４に代わってＦＣＰ＿ＣＭＮＤを受信したことをサーバＡ１２に通知したことになる。なお、デフォルトでは、第４データ経路１７６が選択されているものとする。制御部１３１は、ステップＳ２１６でサーバＡ１２にＲ＿ＲＤＹプリミティブを送信すると、データ選択部Ｂ１５３を制御し、第４データ経路１７６を選択する（ステップＳ２１７）。これにより、データ送信部Ｂ１０３は、再びデータ経路が切り替えられるまで、ディスクＡ１４からの受信データをサーバＡ１２に送信することになる。
【００６９】
制御部１３１は、コマンド送信遅延タイマ１６１のタイマ値と、障害注入指示コマンドのＤＬＹＴＩＭＥフィールドの値とを処理装置により比較する（ステップＳ２１８）。具体的には、制御部１３１は、コマンド送信遅延タイマ１６１が１．５秒に達しているかどうかを判定する。コマンド送信遅延タイマ１６１のタイマ値と障害注入指示コマンドのＤＬＹＴＩＭＥフィールドの値とが一致していなければ、一致するまで比較を続ける。ステップＳ２１８でコマンド送信遅延タイマ１６１のタイマ値と障害注入指示コマンドのＤＬＹＴＩＭＥフィールドの値とが一致したら、ＦＣＰ＿ＣＭＮＤをディスクＡ１４に送信する条件が整ったことになる。そのため、制御部１３１は、データ選択部Ａ１５２を制御し、第２データ経路１７４を選択して、データ選択部Ａ１５２にＦＣＰ＿ＣＭＮＤを送信させる（ステップＳ２１９）。また、制御部１３１は、データ保存部Ａ１１１を制御し、データ受信部Ａ１０１から入力されるデータの保存を再開して、ステップＳ２０４に戻る。
【００７０】
上記のように、本実施の形態において、障害シミュレータ１１のデータ受信部Ａ１０１は、ＦＣ１７でサーバＡ１２からデータを受信する。障害シミュレータ１１のデータ保存部Ａ１１１は、データ受信部Ａ１０１により受信されたデータを複データ保持部１７２に順次保存する。障害シミュレータ１１のコマンド解析部１４１は、データ保存部Ａ１１１により複データ保持部１７２に保存されている、最先のデータから１フレーム分のデータを処理装置により解析する。そして、コマンド解析部１４１は、解析した１フレーム分のデータがＦＣＰ＿ＣＭＮＤであるかどうかを処理装置により判定する。なお、本実施の形態では、所定のフレームの一例としてＦＣＰ＿ＣＭＮＤを用いているが、他の種類のフレームを用いてもよい。コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤでないと判定された場合、障害シミュレータ１１の制御部１３１は、複データ保持部１７２から最先のデータを取り出してデータ送信部Ａ１０２に送信させる。障害シミュレータ１１のデータ送信部Ａ１０２は、ＦＣ１８でディスクＡ１４へデータを送信する。一方、コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤであると判定された場合、制御部１３１は、擬似障害を処理装置により発生させる。この場合、具体的には、制御部１３１は、予め定められた時間（例えば、１．５秒）が経過するまで待機してから当該１フレーム分のデータをデータ送信部Ａ１０２に送信させることで擬似障害を発生させる。
【００７１】
コマンド解析部１４１は、解析した１フレーム分のデータがＦＣＰ＿ＣＭＮＤでなければ、再び、データ保存部Ａ１１１により複データ保持部１７２に保存されている、最先のデータから１フレーム分のデータを処理装置により解析する。なお、このときの最先のデータは、制御部１３１により最先のデータ（コマンド解析部１４１が前回解析したデータ）が取り出されたことにより新たに最先のデータとなったデータである。コマンド解析部１４１は、前回と同様に、解析した１フレーム分のデータがＦＣＰ＿ＣＭＮＤであるかどうかを処理装置により判定する。制御部１３１は、コマンド解析部１４１の判定結果に応じて、前回と同様に処理を行う。以降、同様の処理が繰り返される。つまり、制御部１３１は、コマンド解析部１４１による判定の結果が出る度に、当該結果に応じて動作する。
【００７２】
障害シミュレータ１１の代替送信データ出力部１５１は、ＩＤＬＥプリミティブを処理装置により生成する。なお、本実施の形態では、データ保存部Ａ１１１により保存されたデータの代わりとなるデータの一例としてＩＤＬＥプリミティブを用いているが、他の種類のデータを用いてもよい。制御部１３１は、データ保存部Ａ１１１により複データ保持部１７２に保存されているデータが１フレーム分に満たない場合、代替送信データ出力部１５１により生成されたＩＤＬＥプリミティブをデータ送信部Ａ１０２に送信させる。データ送信部Ａ１０２は、ＦＣ１８でディスクＡ１４へＩＤＬＥプリミティブを送信する。
【００７３】
なお、本実施の形態では、データ保存部Ａ１１１、制御部１３１、コマンド解析部１４１等は、データを２バイトずつ処理しているが、任意のバイト数を単位として処理を行ってよい。例えば、データを１バイトずつ処理してもよいし、４バイトずつ処理してもよい。
【００７４】
以上説明した障害シミュレータ１１の処理により、ディスクＡ１４は、障害注入指示コマンドのＤＬＹＴＩＭＥフィールドで指定された時間（具体的には、１．５秒）が経過した後にＦＣＰ＿ＣＭＮＤ（具体的には、ＲＥＡＤコマンド）を受信することになる。ディスクＡ１４は、障害シミュレータ１１からＦＣＰ＿ＣＭＮＤを受信すると、ＦＣＰ＿ＣＭＮＤを受信したことを通知するためにＲ＿ＲＤＹプリミティブをサーバＡ１２宛てに送信する。その後、ディスクＡ１４は、リードデータが準備できると、リードデータをサーバＡ１２宛てに送信する。また、ディスクＡ１４は、リードデータの送信が完了すると、リード時のエラーの有無等を示すステータス情報をサーバＡ１２宛てに送信する。
【００７５】
障害シミュレータ１１は、ディスクＡ１４から送信されたデータをデータ受信部Ｂ１０４で受信する。データ受信部Ｂ１０４は、受信したデータのデシリアライズ及びデコードを行う。データ受信部Ｂ１０４は、デコードを終えたデータをデータ保存部Ｂ１１２に２バイトずつ送信する。データ保存部Ｂ１１２は、データ受信部Ｂ１０４から送られてきたデータを保存するとともに、直近の（即ち、最後に保存した）４バイトのデータをデータ解析部１４２に出力する。
【００７６】
データ解析部１４２は、入力された４バイトのデータを解析し、そのデータがＲ＿ＲＤＹプリミティブであるかを処理装置により判定する。そして、データ解析部１４２は、判定結果を制御部１３１に通知する。具体的には、データ解析部１４２は、データ保存部Ｂ１１２から受け取った４バイトのデータがＢＣ９５＿４Ａ４Ａｈであれば、そのデータがＲ＿ＲＤＹプリミティブであると判定して制御部１３１に通知する。制御部１３１は、データ選択部Ｂ１５３及び代替送信データ出力部１５１を制御し、第５データ経路１７７を選択して、ディスクＡ１４から受信したＲ＿ＲＤＹプリミティブの代わりにＩＤＬＥプリミティブをデータ送信部Ｂ１０３に出力する。これにより、ディスクＡ１４から受信したＲ＿ＲＤＹプリミティブを破棄する。これは、前述したように、障害シミュレータ１１がＦＣＰ＿ＣＭＮＤを受信したことを通知するためのＲ＿ＲＤＹプリミティブを既に送信しており、Ｒ＿ＲＤＹプリミティブを二重に送信するのを避けるためである。制御部１３１は、ＩＤＬＥプリミティブを送信すると、データ選択部Ｂ１５３を制御し、データ経路を第４データ経路１７６に戻す。これにより、データ送信部Ｂ１０３は、再びデータ経路が切り替えられるまで、ディスクＡ１４からの受信データをサーバＡ１２に送信することになる。
【００７７】
上記のように、本実施の形態において、障害シミュレータ１１のデータ受信部Ｂ１０４は、ＦＣＰ＿ＣＭＮＤに対してディスクＡ１４から返信されるフレームを受信する。障害シミュレータ１１のデータ保存部Ｂ１１２は、データ受信部Ｂ１０４により受信されたデータを一時的に保存する。障害シミュレータ１１のデータ送信部Ｂ１０３は、データ保存部Ｂ１１２により保存されたデータをサーバＡ１２へ送信（転送）する。
【００７８】
サーバＡ１２は、自身が発行したＳＣＳＩのＲＥＡＤコマンドに対する応答（リードデータ）を待つ。障害シミュレータ１１によりディスクＡ１４がコマンドを受信するのが、障害注入指示コマンドのＤＬＹＴＩＭＥフィールドで指定された時間（具体的には、１．５秒）遅れるため、その分リードデータがディスクＡ１４から送信されるタイミングも遅れる。したがって、サーバＡ１２では、見かけ上リードデータが到達するのが１．５秒遅れた形になる。この遅延時間がサーバＡ１２のＩＯタイムアウト値より大きいとＩＯタイムアウトとしてサーバＡ１２は異常時処理を行う。異常時処理では、二重系制御プログラムが、サーバＡ１２に異常があったことを検知し、系の切り替えを実行する。また、系切り替えの要因と時刻をログに記録し、ＩＯタイムアウトが発生したことがわかるようにする。サーバＢ１３は、二重系制御プログラムによる系切り替えにより業務処理を開始する。また、サーバＢ１３は、業務処理の開始時刻をログに記録する。一方、上記遅延時間がサーバＡ１２のＩＯタイムアウト値より小さいとＩＯタイムアウトは発生しない。そのため、サーバＡは業務処理を続けることになる。
【００７９】
検証端末１６は、サーバＡ１２及びサーバＢ１３からログを収集する。検証端末１６は、定期的にログを確認することで系切り替え処理の有無等を確認する。検証端末１６は、例えば、系切り替え処理が実行されたことを確認すると、ＩＮＪＳＴＡＲＴフィールドを０に設定した障害注入指示コマンドを障害シミュレータ１１に送信することで、障害シミュレータ１１に障害注入の停止を指示する。
【００８０】
前述したように、障害注入設定部１８２は、障害注入指示コマンドを検証端末Ｉ／Ｆ１８１を介して検証端末１６から受信すると、記憶装置に保存する。ステップＳ２０６において、制御部１３１は、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）障害注入指示コマンドを読み出し、障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドを処理装置により確認する。ＩＮＪＳＴＡＲＴフィールドが０になっていれば、制御部１３１は、障害注入処理を終了する。ＩＮＪＳＴＡＲＴフィールドが１であれば、制御部１３１は、障害注入処理を継続する。
【００８１】
制御部１３１は、ステップＳ２０６で障害注入処理を終了する場合、非ＩＤＬＥフラグ１９１を処理装置により確認する（ステップＳ２２０）。非ＩＤＬＥフラグ１９１が有意であれば、ステップＳ２０４に戻り、非ＩＤＬＥフラグ１９１が無意になるまでステップＳ２２０までの動作を繰り返す。なお、ステップＳ２０４では、直近の障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドが０になっているため、必ず第２データ経路１７４が選択される。これにより、データ送信部Ａ１０２は、複データ保持部１７２に保存されているデータをディスクＡ１４に順次送信することになる。また、ＦＣＰ＿ＣＭＮＤが受信されても、直近の障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドが０になっているため、ステップＳ２０７以降の処理において制御部１３１が「応答遅延」を発生させることはない。制御部１３１は、ステップＳ２２０で非ＩＤＬＥフラグ１９１が無意になると、データ選択部Ａ１５２を制御し、データ経路を通常の第１データ経路１７３に戻す（ステップＳ２２１）。これにより、データ送信部Ａ１０２は、再びデータ経路が切り替えられるまで、サーバＡ１２からの受信データをディスクＡ１４に送信することになる。
【００８２】
以上説明したように、本実施の形態では、障害シミュレータ１１が、コマンド解析部１４１と、コマンド解析部１４１の判定結果に応じて制御を行う制御部１３１を備えることにより、２つの装置間で送受信されるデータの内容に応じて擬似的に障害を発生させることができる。例えば、サーバＡ１２から送信される特定のコマンドやディスクＡ１４内の特定のエリアに対するアクセスを対象に障害注入を行うことが可能である。このため、障害注入の対象を限定することができ、二重系システム等の品質を高めるためにきめ細やかな試験を行うことが可能となる。
【００８３】
以上、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明したが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても上記と同様である。例えば、サーバＡ１２がコマンドを発行後に待つのがリードデータではなくＲＥＡＤＹになり、また、その後にサーバＡ１２からライトデータが送信されるといった違いはあるが、障害注入処理に関しては同様の動作となる。
【００８４】
以下では、特定のコマンドを対象にして擬似的な障害を発生させる方法について、障害タイプ「無応答」を例に説明する。なお、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【００８５】
図９は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【００８６】
図９において、ステップＳ２０１〜Ｓ２１７、Ｓ２２０、Ｓ２２１の処理は、前述した障害タイプ「応答遅延」の例と同様である。
【００８７】
この例では、ステップＳ２１７の後、ステップＳ２０４に戻る。これにより、サーバＡ１２が発行したコマンドは、ディスクＡ１４に送信されることなく破棄されたことになる。ディスクＡ１４はコマンドを受信しないため、サーバＡ１２には応答（リードデータ）を送信しない。したがって、サーバＡ１２では、見かけ上ディスクＡ１４からコマンドに対する応答が得られない形になる。このため、サーバＡ１２は異常時処理を行う。異常時処理では、前述したように、二重系制御プログラムが、サーバＡ１２に異常があったことを検知し、系の切り替えを実行する。
【００８８】
以下では、特定のコマンドを対象にして擬似的な障害を発生させる方法について、障害タイプ「リンク断」を例に説明する。なお、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【００８９】
図１０は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【００９０】
図１０において、ステップＳ２０１〜Ｓ２１４、Ｓ２２０、Ｓ２２１の処理は、前述した障害タイプ「応答遅延」の例と同様である。
【００９１】
この例では、ステップＳ２１４の後、制御部１３１は、データ送信部Ａ１０２及びデータ送信部Ｂ１０３を制御し、電気的アイドルな状態（例えばバッファ電源ＯＦＦ）に移る（ステップＳ２３１）。これにより、サーバＡ１２とディスクＡ１４の接続同期がとれなくなり、リンク断の状態になる。このため、サーバＡ１２は異常時処理を行う。異常時処理では、前述したように、二重系制御プログラムが、サーバＡ１２に異常があったことを検知し、系の切り替えを実行する。
【００９２】
上記のように、本実施の形態において、コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤであると判定された場合、制御部１３１は、当該１フレーム分のデータをデータ送信部Ａ１０２に送信させないことで擬似障害を発生させることもできる。
【００９３】
以下では、特定のコマンドを対象にして擬似的な障害を発生させる方法について、障害タイプ「応答異常」を例に説明する。なお、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【００９４】
図１１及び図１２は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【００９５】
図１１において、ステップＳ２０１〜Ｓ２０８、Ｓ２２０、Ｓ２２１の処理は、前述した障害タイプ「応答遅延」の例と同様である。
【００９６】
制御部１３１は、ステップＳ２０８でｎ＝４とするｎバイト保存処理により、データ保存部Ａ１１１が４バイトのデータを複データ保持部１７２に保存すると、その４バイトのデータの先頭から３バイトのデータ、即ち、Ｄ＿ＩＤフィールドのデータをＤ＿ＩＤ保存部１９３に保存させる（ステップＳ２４１）。ここで、Ｄ＿ＩＤフィールドでは、ディスクＡ１４のポートＩＤが示されているものとする。この後、ステップＳ２０９〜Ｓ２１３の処理が実行される。ステップＳ２０９〜Ｓ２１３の処理は、前述した障害タイプ「応答遅延」の例と同様である。
【００９７】
ステップＳ２１３でＦＣＰ＿ＣＭＮＤがリード処理の対象として指定するＳＣＳＩロジカルブロックアドレスが障害注入指示コマンドのＳＣＳＩＡＤＲフィールドの値と一致する場合、障害を注入する条件が揃ったことになる。この場合、コマンド解析部１４１は、制御部１３１にＣＲＣエラーを発生させる条件が整ったことを通知する。制御部１３１は、ＣＲＣエラー注入処理を起動し、データ解析部１４２を制御してデータ保存部Ｂ１１２のデータ解析を開始させる（ステップＳ２４２）。この後、ステップＳ２１４の処理が実行される。ステップＳ２１４の処理は、前述した障害タイプ「応答遅延」の例と同様である。ステップＳ２１４の後は、ステップＳ２０４に戻る。
【００９８】
以上説明した障害シミュレータ１１の処理により、ディスクＡ１４は、通常のＦＣＰ＿ＣＭＮＤ（具体的には、ＲＥＡＤコマンド）を受信することになる。ディスクＡ１４は、障害シミュレータ１１からＦＣＰ＿ＣＭＮＤを受信すると、ＦＣＰ＿ＣＭＮＤを受信したことを通知するためにＲ＿ＲＤＹプリミティブをサーバＡ１２宛てに送信する。その後、ディスクＡ１４は、リードデータが準備できると、リードデータをサーバＡ１２宛てに送信する。また、ディスクＡ１４は、リードデータの送信が完了すると、リード時のエラーの有無等を示すステータス情報をサーバＡ１２宛てに送信する。
【００９９】
図１２において、障害シミュレータ１１は、ディスクＡ１４から送信されたデータをデータ受信部Ｂ１０４で受信する。データ受信部Ｂ１０４は、受信したデータのデシリアライズ及びデコードを行う。データ受信部Ｂ１０４は、デコードを終えたデータをデータ保存部Ｂ１１２に２バイトずつ送信する（ステップＳ４０１）。データ保存部Ｂ１１２は、データ受信部Ｂ１０４から送られてきたデータを保存するとともに、直近の（即ち、最後に保存した）４バイトのデータをデータ解析部１４２に出力する。
【０１００】
データ解析部１４２は、入力された４バイトのデータを解析し、そのデータがフレームの先頭であるかを処理装置により判定する（ステップＳ４０２）。具体的には、データ解析部１４２は、４バイトのデータがＢＣＢ５＿５６５６ｈであれば、解析したデータがＳＯＦ、即ち、フレームの先頭であると判定する。データ解析部１４２は、解析したデータがフレームの先頭である場合、後続のデータを解析し、フレームの先頭から９〜１１バイト目のＳ＿ＩＤフィールドのデータと、Ｄ＿ＩＤ保存部１９３に保存されたデータとを処理装置により比較する（ステップＳ４０３）。一方、ステップＳ４０２でデータ解析部１４２が解析したデータがフレームの先頭でない場合、ステップＳ４０１に戻る。その後、次の２バイトが読み込まれ、ステップＳ４０２で、データ解析部１４２は、その直前の２バイトと合わせた４バイトのデータを解析する。データ解析部１４２は、フレームの先頭を検出するまで同様の処理を繰り返す。
【０１０１】
Ｓ＿ＩＤフィールドでは、送信元コンポーネントのポートＩＤが示されている。そのため、制御部１３１は、ステップＳ４０３でＳ＿ＩＤフィールドのデータとＤ＿ＩＤ保存部１９３に保存されたデータが一致すれば、データ解析部１４２により解析されたフレームがディスクＡ１４から受信したものであると処理装置により判定する。そして、制御部１３１は、データ置換部１５４を制御し、受信したフレームのデータを加工する（ステップＳ４０４）。例えば、データ置換部１５４は、データを加工しないで送り出す経路と、データを反転する経路を選択的に使用するものであり、制御部１３１からどちらの経路を使用させるか制御できるものとする。ここでは、一例として、加工対象とするデータをＳ＿ＩＤフィールドのデータとする。制御部１３１は、Ｓ＿ＩＤフィールドのデータのみについて、データを反転する経路を使用するようにデータ置換部１５４を制御する。データ置換部１５４は、データをデータ選択部Ｂ１５３に出力する。データ送信部Ｂ１０３は、データ選択部Ｂ１５３を介して入力されるデータをエンコード及びシリアライズしてサーバＡ４に送信する（ステップＳ４０５）。
【０１０２】
サーバＡ１２は、自身が発行したＳＣＳＩのＲＥＡＤコマンドに対する応答（リードデータ）を待つ。障害シミュレータ１１によりリードデータがＣＲＣエラーを含むフレームに加工されているため、サーバＡ１２は異常時処理を行う。異常時処理では、前述したように、二重系制御プログラムが、サーバＡ１２に異常があったことを検知し、系の切り替えを実行してもよいし、他の処理が行われてもよい。
【０１０３】
上記のように、本実施の形態において、コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤであると判定された場合、制御部１３１は、当該１フレーム分のデータをデータ送信部Ａ１０２に送信させる。そして、制御部１３１は、当該１フレーム分のデータに対してディスクＡ１４から返信されるフレームをデータ送信部Ｂ１０３に転送させる際に、当該フレームの一部のデータを変更することで擬似障害を発生させることもできる。
【０１０４】
実施の形態２．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１０５】
図１３は、本実施の形態に係る障害シミュレータ１１の構成を示すブロック図である。
【０１０６】
図１３において、障害シミュレータ１１は、実施の形態１と同様の構成要素に加えて、障害注入遅延タイマ１６２を備える。
【０１０７】
実施の形態１において、業務処理プログラムを実行してからすぐに障害注入を開始すると、試験をしたいタイミングと違うタイミングで障害が注入されてしまう可能性がある。例えば、試験対象は業務プログラム内の定常処理であるが、業務処理プログラム内の初期化処理において障害注入対象となるコマンドが発行されるとその時点で障害が注入されてしまう。本実施の形態では、このようなことを防ぐために、障害シミュレータ１１が障害注入を開始するタイミングを調整する機能（障害注入遅延モード）を有する。
【０１０８】
以下では、試験システム１０の動作について、障害タイプ「応答遅延」を例に説明するが、障害タイプが「無応答」、「リンク断」、「応答異常」であっても同様の動作が可能である。また、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【０１０９】
検証端末１６は、実施の形態１と同様に、試験を行うためにサーバＡ１２が業務処理を行っている状態で障害注入を指示する。ここでは、一例として、検証端末１６が、以下のように設定された障害注入指示コマンドを障害シミュレータ１１に送信することで、障害シミュレータ１１に障害注入を指示するものとする。
（１）ＦＴＹＰＥ（障害タイプ）：「応答遅延」
（２）ＤＬＹＴＩＭＥ（応答遅延時間）：１．５秒
（３）ＦＣＰＯＲＴ（障害注入対象ＦＣポートＩＤ）：ディスクＡ１４
（４）ＳＣＳＩＣＭＤ（障害注入対象ＳＣＳＩコマンド）：ＲＥＡＤ（リード処理）
（５）ＳＣＳＩＡＤＲ（障害注入対象ＳＣＳＩロジカルブロックアドレス）：１２００＿００００ｈ
（６）ＦＭＯＤＥ（障害注入モード）：２（障害注入遅延モード）
（７）ＭＤＴＩＭＥ（障害注入遅延時間）：２．５秒
【０１１０】
障害シミュレータ１１は、障害注入指示コマンドのＦＭＯＤＥフィールドに２が指定された場合には、障害注入指示コマンドを受け付けてもすぐに障害注入処理を開始しない。障害シミュレータ１１は、障害注入遅延タイマ１６２で計時し、障害注入指示コマンドのＭＤＴＩＭＥフィールドで指定された時間が経過してから障害注入処理を開始する。なお、障害を注入する方法については実施の形態１と同様である。
【０１１１】
図１４は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【０１１２】
実施の形態１と同様に、障害注入設定部１８２は、障害注入指示コマンドを検証端末Ｉ／Ｆ１８１を介して検証端末１６から受信すると、記憶装置に保存する。制御部１３１は、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）障害注入指示コマンドを読み出し、障害注入指示コマンドのＩＮＪＳＴＡＲＴフィールドを処理装置により確認する（ステップＳ２０１）。ＩＮＪＳＴＡＲＴフィールドが０であれば、制御部１３１は、障害注入処理を開始せず、次の障害注入指示コマンドを待つ。
【０１１３】
制御部１３１は、ステップＳ２０１でＩＮＪＳＴＡＲＴフィールドが１であれば、障害注入指示コマンドのＦＭＯＤＥフィールドを処理装置により確認する（ステップＳ２５１）。ＦＭＯＤＥフィールドが２でなければ、制御部１３１は、障害注入処理を開始する。この後、ステップＳ２０２〜Ｓ２２１の処理が実行される。ステップＳ２０２〜Ｓ２２１の処理は、実施の形態１と同様である。
【０１１４】
制御部１３１は、ステップＳ２０２でＦＭＯＤＥフィールドが２であれば、障害遅延注入モードが指定されていると処理装置により判定する。この場合、制御部１３１は、すぐに障害注入処理を開始せず、障害注入遅延タイマ１６２により障害注入処理の開始のタイミングを制御する。具体的には、制御部１３１は、まず、障害注入遅延タイマ１６２を起動させる。そして、制御部１３１は、障害注入遅延タイマ１６２のタイマ値と、障害注入指示コマンドのＭＤＴＩＭＥフィールドの値（具体的には、２．５秒）とを処理装置により比較する。両者が一致しなければ、一致するまで制御部１３１は比較を続ける。両者が一致すれば、制御部１３１は、障害注入処理を開始する。この後、ステップＳ２０２〜Ｓ２２１の処理が実行される。ステップＳ２０２〜Ｓ２２１の処理は、実施の形態１と同様である。
【０１１５】
上記のように、本実施の形態において、検証端末１６は、障害シミュレータ１１に対して時間を指定する信号を入力する。障害シミュレータ１１の制御部１３１は、検証端末１６からの信号で指定された時間が経過するまで待機してから動作し始める。
【０１１６】
以上説明したように、本実施の形態では、障害シミュレータ１１が、障害注入指示コマンドのＭＤＴＩＭＥフィールドで指定された時間を経過してから障害注入処理を開始する機能を有する。この機能を使うことで障害注入処理の開始タイミングを制御することができるようになる。これにより、試験をしたいタイミングと違うタイミングで障害が注入されてしまう事態を回避することができる。
【０１１７】
実施の形態３．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１１８】
図１５は、本実施の形態に係る障害シミュレータ１１の構成を示すブロック図である。
【０１１９】
図１５において、障害シミュレータ１１は、実施の形態１と同様の構成要素に加えて、障害注入回数カウンタ１６３を備える。
【０１２０】
実施の形態１において、サーバＡ１２に、ＩＯタイムアウト等の障害が発生してもリトライをして救済するようなシステムを採用することができる。このようなシステムでは、規定のリトライ回数まではリトライを繰り返すが、規定値を超えるとリトライをやめて、異常処理を行う。本実施の形態では、このような規定値に関する試験を可能にするため、障害シミュレータ１１が障害注入を一旦停止する機能（障害間欠注入モード）を有する。
【０１２１】
以下では、試験システム１０の動作について、障害タイプ「応答遅延」を例に説明するが、障害タイプが「無応答」、「リンク断」、「応答異常」であっても同様の動作が可能である。また、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【０１２２】
検証端末１６は、実施の形態１と同様に、試験を行うためにサーバＡ１２が業務処理を行っている状態で障害注入を指示する。ここでは、一例として、検証端末１６が、以下のように設定された障害注入指示コマンドを障害シミュレータ１１に送信することで、障害シミュレータ１１に障害注入を指示するものとする。
（１）ＦＴＹＰＥ（障害タイプ）：「応答遅延」
（２）ＤＬＹＴＩＭＥ（応答遅延時間）：１．５秒
（３）ＦＣＰＯＲＴ（障害注入対象ＦＣポートＩＤ）：ディスクＡ１４
（４）ＳＣＳＩＣＭＤ（障害注入対象ＳＣＳＩコマンド）：ＲＥＡＤ（リード処理）
（５）ＳＣＳＩＡＤＲ（障害注入対象ＳＣＳＩロジカルブロックアドレス）：１２００＿００００ｈ
（６）ＦＭＯＤＥ（障害注入モード）：３（障害間欠注入モード）
（７）ＭＤＮＵＭ（障害注入スキップ頻度）：４回（４回に１回）
【０１２３】
障害シミュレータ１１は、障害注入指示コマンドのＦＭＯＤＥフィールドに３が指定された場合には、障害注入指示コマンドを受け付けるとすぐに障害注入処理を開始するが、障害注入指示コマンドのＭＤＮＵＭフィールドで指定された回数に１回は障害を注入せずに受信データをそのままディスクＡ１４に送信する。なお、障害を注入する方法については実施の形態１と同様である。
【０１２４】
図１６は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【０１２５】
図１６において、ステップＳ２０１〜Ｓ２１４、Ｓ２２０、Ｓ２２１の処理は、実施の形態１と同様である。
【０１２６】
制御部１３１は、ステップＳ２１４でデータ保存部Ａ１１１が６８バイトのＦＣＰ＿ＣＭＮＤを複データ保持部１７２に保存し終わると、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）障害注入指示コマンドを読み出し、障害注入指示コマンドのＦＭＯＤＥフィールドを処理装置により確認する（ステップＳ２６１）。ＦＭＯＤＥフィールドが３でなければ、ステップＳ２１５〜Ｓ２１９の処理が実行される。ステップＳ２１５〜Ｓ２１９の処理は、実施の形態１と同様である。
【０１２７】
制御部１３１は、ステップＳ２６１でＦＭＯＤＥフィールドが３であれば、障害間欠注入モードが指定されていると処理装置により判定する。この場合、制御部１３１は、障害注入回数カウンタ１６３のカウンタ値（初期値は０とする）と、障害注入指示コマンドのＭＤＮＵＭフィールドの値から１を減じた値（具体的には、３）とを処理装置により比較する（ステップＳ２６２）。両者が一致すれば、制御部１３１は、障害注入回数カウンタ１６３をリセットしてカウンタ値を０に戻した上で、障害注入をスキップしてＦＣＰ＿ＣＭＮＤを遅延させずにデータ送信部ＡによりディスクＡ１４へ送信する。一方、両者が一致しなければ、制御部１３１は、障害注入回数カウンタ１６３を１つインクリメントする（ステップＳ２６３）。この後、ステップＳ２１５〜Ｓ２１９の処理が実行される。ステップＳ２１５〜Ｓ２１９の処理は、実施の形態１と同様である。
【０１２８】
上記のように、本実施の形態において、検証端末１６は、障害シミュレータ１１に対して頻度を指定する信号を入力する。障害シミュレータ１１の制御部１３１は、コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤであると判定された場合、毎回擬似障害を発生させる代わりに検証端末１６からの信号で指定された頻度で擬似障害を発生させる。
【０１２９】
以上説明したように、本実施の形態では、障害シミュレータ１１が、障害が発生してもリトライを行い救済するようなシステムにおいて、障害注入指示コマンドのＭＤＮＵＭフィールドで指定された回数に１回は障害を注入しない機能を有する。この機能を使うことで、間欠障害を擬似的に発生させることができ、システムにおいてリトライによる救済が行えているかどうか等を確認することが可能になる。
【０１３０】
なお、本実施の形態では、障害シミュレータ１１が、障害注入指示コマンドのＭＤＮＵＭフィールドで指定された回数につき１回だけ障害注入をスキップするが、当該回数につき複数回障害注入をスキップするようにしてもよい。例えば、障害注入回数カウンタ１６３のカウンタ値が、障害注入指示コマンドのＭＤＮＵＭフィールドの値から１を減じた値（具体的には、３）と一致した場合だけでなく、ＭＤＮＵＭフィールドの値から２を減じた値（具体的には、２）と一致した場合にも、障害シミュレータ１１が障害注入をスキップするようにしてもよい。ただし、障害注入回数カウンタ１６３をリセットするのは、障害注入回数カウンタ１６３のカウンタ値が、障害注入指示コマンドのＭＤＮＵＭフィールドの値から１を減じた値と一致した場合のみである。
【０１３１】
また、本実施の形態では、障害シミュレータ１１が、障害注入指示コマンドのＭＤＮＵＭフィールドで指定された回数につき１回だけ障害注入をスキップするが、当該回数につき１回だけ障害を注入するようにしてもよい。例えば、障害注入回数カウンタ１６３のカウンタ値が、障害注入指示コマンドのＭＤＮＵＭフィールドの値から１を減じた値（具体的には、３）と一致した場合のみ、障害シミュレータ１１が障害を注入し、それまでは、障害注入をスキップするようにしてもよい。また、例えば、障害注入指示コマンドのＦＭＯＤＥフィールドに４が指定された場合に、このような動作をするようにしてもよい。
【０１３２】
実施の形態４．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１３３】
図１７は、本実施の形態に係る障害シミュレータ１１の構成を示すブロック図である。
【０１３４】
図１７において、障害シミュレータ１１は、実施の形態１と同様の構成要素に加えて、ステータスデータ生成部１８３、実行履歴記録部１８４、時計部１８５を備える。
【０１３５】
実施の形態１において、系が切り替わったことは、検証端末１６で収集するサーバＡ１２及びサーバＢ１３のログからわかる。しかし、実際に試験をしたときに、正しく指示がなされ、期待するタイミングで障害注入が行われたかどうかは、これらのログではわからない。本実施の形態では、試験システム１０が、系切り替え処理に関する試験を行ったときに、どのようなタイミングで、どのような障害が注入されたのかを確認するための機能を有する。
【０１３６】
以下では、試験システム１０の動作について、障害タイプ「応答遅延」を例に説明するが、障害タイプが「無応答」、「リンク断」、「応答異常」であっても同様の動作が可能である。また、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【０１３７】
図１８は、障害シミュレータ１１の動作（本実施の形態に係る擬似障害発生方法、本実施の形態に係る擬似障害発生プログラムの処理手順）を示すフローチャートである。
【０１３８】
図１８において、ステップＳ２０１〜Ｓ２１４、Ｓ２２０、Ｓ２２１の処理は、実施の形態１と同様である。
【０１３９】
制御部１３１は、ステップＳ２１４でデータ保存部Ａ１１１が６８バイトのＦＣＰ＿ＣＭＮＤを複データ保持部１７２に保存し終わると、そのときの時刻を記録するように実行履歴記録部１８４に命令する（ステップＳ２７１）。実行履歴記録部１８４は、制御部１３１からの命令に応じて、時計部１８５から現在時刻を読み出す。このとき、時計部１８５は、時：分：秒：ミリ秒（上位３桁）の形式で現在時刻を示す８ビットのデータを出力する。実行履歴記録部１８４は、時計部１８５から読み出した時刻から実行履歴データを作成して記憶装置に保存する。
【０１４０】
ここで、実行履歴データのフォーマットを図１９に示す。実行履歴データのｂｉｔ０からｂｉｔ３１には、障害を注入した時刻を示すＨＯＵＲ７（時）、ＭＩＮＵＴＥ７（分）、ＳＥＣＯＮＤ７（秒）、ＭＩＬＬＳＥＣ７（ミリ秒）が含まれる。ｂｉｔ３２からｂｉｔ２５５にも、同様に、障害を注入した時刻を示すデータが含まれる。ここでは、一例として、最大８回分の時刻を示すデータを含むことにしているが、これより少ないデータを含むようにしてもよいし、これより多くのデータを含むようにしてもよい。なお、実行履歴記録部１８４は、９回目以降の障害注入時には、初回の分から上書きするようにして最新の８回分を記録する。
【０１４１】
ステップＳ２７１の後、ステップＳ２１５〜Ｓ２１９の処理が実行される。ステップＳ２１５〜Ｓ２１９の処理は、実施の形態１と同様である。
【０１４２】
検証端末１６が障害シミュレータ１１にステータスデータ要求コマンドを送信すると、障害シミュレータ１１は、現在の設定や、障害注入の結果を示すステータスデータを生成し、検証端末１６へ送信する。
【０１４３】
ここで、ステータスデータ要求コマンドのフォーマットを図２０に示す。例えば、ステータスデータ要求コマンドのｂｉｔ０には、ステータスデータを要求するかどうかを示すＲＱＳＴＳが含まれる。
【０１４４】
また、ここで、ステータスデータのフォーマットを図２１に示す。例えば、ステータスデータののｂｉｔ０からｂｉｔ１５９には、障害注入指示コマンドと同様に、ＦＴＹＰＥ、ＩＮＪＳＴＡＲＴ、ＦＭＯＤＥ、ＳＣＳＩＣＭＤ、ＭＤＮＵＭ、ＭＤＴＩＭＥ、ＤＬＹＴＩＭＥ、ＦＣＰＯＲＴ、ＳＣＳＩＡＤＲが含まれる。ｂｉｔ２５６からｂｉｔ５１１には、実行履歴データと同様に、障害を注入した時刻を示すデータが含まれる。ここでは、一例として、最大８回分の時刻を示すデータを含むことにしているが、これより少ないデータを含むようにしてもよいし、これより多くのデータを含むようにしてもよい。
【０１４５】
図２２は、ステータスデータを送信する際の障害シミュレータ１１の動作を示すフローチャートである。
【０１４６】
障害シミュレータ１１は、検証端末１６からＵＳＢ２２を介してステータスデータ要求コマンドが送信されると、検証端末Ｉ／Ｆ１８１を介してステータスデータ要求コマンドを受信して（ステップＳ５０１）、記憶装置で保持する（ステップＳ５０２）。
【０１４７】
ステータスデータ生成部１８３は、記憶装置からステータスデータ要求コマンドを読み出し、ステータスデータ要求コマンドのＲＱＳＴＳビットを処理装置により確認する（ステップＳ５０３）。ＲＱＳＴＳビットが０であれば、コマンドは無効であるので、処理を終了する。ＲＱＳＴＳビットが１であれば、ステータスデータ生成部１８３は、ステータスデータの生成処理を開始する。
【０１４８】
ステータスデータ生成部１８３は、実行履歴記録部１８４により記憶装置に保存されている実行履歴データを読み出して保持する（ステップＳ５０４）。また、ステータスデータ生成部１８３は、障害注入設定部１８２により記憶装置に保存されている直近の（即ち、障害注入設定部１８２が最後に受信した）障害注入指示コマンドを読み出し、障害注入指示コマンドで設定されている内容（データ）を保持する（ステップＳ５０５）。ステータスデータ生成部１８３は、ステップＳ５０４、Ｓ５０５で保持したデータを合わせてステータスデータを生成する（ステップＳ５０６）。そして、ステータスデータ生成部１８３は、生成したステータスデータを検証端末Ｉ／Ｆ１８１を介して検証端末１６へ送信する（ステップＳ５０７）。
【０１４９】
検証端末１６は、障害シミュレータ１１から送信されたステータスデータを受信して、例えば、出力装置により出力する。検証端末１６のユーザは、出力されたステータスデータを見ることにより、障害シミュレータ１１がどのような間隔でどのような障害を発生させたかを知ることができる。
【０１５０】
上記のように、本実施の形態において、検証端末１６は、障害シミュレータ１１から情報を収集する。障害シミュレータ１１の制御部１３１は、擬似障害を発生させる度に、時刻を記録し、記録した時刻の一覧を履歴情報として検証端末１６へ出力する。
【０１５１】
以上説明したように、本実施の形態では、検証端末１６が、障害シミュレータ１１で実行された障害注入処理に関する情報を獲得する。これにより、二重系システムにおいて系切り替え試験を実施したときに、試験結果の検証のために有用な情報となる、障害注入に関する設定情報や障害注入の履歴を獲得することができる。
【０１５２】
実施の形態５．
本実施の形態について、主に実施の形態１との差異を説明する。
【０１５３】
図２３は、本実施の形態に係る障害シミュレータ１１の構成を示すブロック図である。
【０１５４】
図２３において、障害シミュレータ１１は、実施の形態１と同様の構成要素に加えて、ＦＣＰ＿ＣＭＮＤ記録部１９４を備える。
【０１５５】
実施の形態１では、ディスクＡ１４の特定のエリアを指定することで障害注入の対象となるコマンドを限定していた。試験のときに、特定のエリアではなく、特定のファイルにアクセスすることを試験項目として設定している場合には、そのファイルとディスクＡ１４のエリア（ＳＣＳＩＡＤＲ）を関連付ける必要がある。本実施の形態では、検証端末１６が、特定のファイルにアクセスすることが試験項目として設定されているときに、障害注入指示コマンドを発行するのに必要な情報を得る機能を有する。
【０１５６】
以下では、試験システム１０の動作について、障害タイプ「応答遅延」を例に説明するが、障害タイプが「無応答」、「リンク断」、「応答異常」であっても同様の動作が可能である。また、以下では、障害注入指示コマンドが、ディスクＡ１４の特定エリアからのリード処理が行われる際に障害を発生させるよう指示するものである場合について説明するが、障害注入指示コマンドが、ディスクＡ１４の特定エリアへのライト処理が行われる際に障害を発生させるよう指示するものである場合についても同様である。
【０１５７】
検証端末１６は、ＵＳＢ２２を介して障害シミュレータ１１にＦＣＰ＿ＣＭＮＤモニタ要求コマンドを送信する。障害シミュレータ１１は、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドを受信すると、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドがＦＣＰ＿ＣＭＮＤのモニタの開始を要求するものであるか、あるいは、ＦＣＰ＿ＣＭＮＤのモニタの停止を要求するものであるかを確認する。ＦＣＰ＿ＣＭＮＤモニタ要求コマンドがＦＣＰ＿ＣＭＮＤのモニタの開始を要求するものであれば、障害シミュレータ１１は、サーバＡ１２から受信するデータをモニタし、ＦＣＰ＿ＣＭＮＤを受信した場合には、ＦＣＰ＿ＣＭＮＤを保持する。一方、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドがＦＣＰ＿ＣＭＮＤのモニタの停止を要求するものであれば、障害シミュレータ１１は、保持している複数のＦＣＰ＿ＣＭＮＤからＦＣＰ＿ＣＭＮＤログを生成して検証端末１６へ送信する。検証端末１６は、ＦＣＰ＿ＣＭＮＤログを解析し、障害注入指示コマンドの作成に必要な情報を取得する。
【０１５８】
ここで、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドのフォーマットを図２４に示す。例えば、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドのｂｉｔ０には、ＦＣＰ＿ＣＭＮＤのモニタの開始を要求するかどうかを示すＭＯＮＳＴＡＲＴが含まれる。ｂｉｔ１には、ＦＣＰ＿ＣＭＮＤのモニタの停止を要求するかどうかを示すＭＯＮＳＴＯＰが含まれる。
【０１５９】
また、ここで、ＦＣＰ＿ＣＭＮＤログのフォーマットを図２５に示す。例えば、ＦＣＰ＿ＣＭＮＤログには、障害シミュレータ１１がサーバＡ１２から受信した複数のＦＣＰ＿ＣＭＮＤが受信時刻の順に記録される。
【０１６０】
図２６は、障害シミュレータ１１の動作を示すフローチャートである。
【０１６１】
障害注入設定部１８２は、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドを検証端末Ｉ／Ｆ１８１を介して検証端末１６から受信すると、記憶装置に保存する（ステップＳ６０１）。制御部１３１は、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）ＦＣＰ＿ＣＭＮＤモニタ要求コマンドを読み出し、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドのＭＯＮＳＴＡＲＴフィールドを処理装置により確認する（ステップＳ６０２）。ＭＯＮＳＴＡＲＴフィールドが１になっていれば、制御部１３１は、モニタを開始する。ＭＯＮＳＴＡＲＴフィールドが０であれば、制御部１３１は、モニタを開始せず、次のＦＣＰ＿ＣＭＮＤモニタ要求コマンドを待つ。
【０１６２】
制御部１３１は、ステップＳ６０２でモニタ開始するにあたりＦＣＰ＿ＣＭＮＤ記録部１９４にモニタの開始を通知し、記憶装置に記録されているＦＣＰ＿ＣＭＮＤログをクリアする（記録されているＦＣＰ＿ＣＭＮＤを削除する）。制御部１３１は、データ選択部Ａ１５２を制御し、第１データ経路１７３を選択するが、複データ保持部１７２にデータを保存するようにデータ保存部Ａ１１１も制御する。データ保存部Ａ１１１が複データ保持部１７２に保存したデータは、ＦＣＰ＿ＣＭＮＤログの生成のために使われるのであり、データ送信部Ａ１０２に出力されることはない。
【０１６３】
サーバＡ１２においてディスクＡ１４上にあるファイルＸをリードするようなプログラムが実行されると、サーバＡ１２からディスクＡ１４に対してＦＣＰ＿ＣＭＮＤが発行される。障害シミュレータ１１は、サーバＡ１２から送信されたデータをデータ受信部Ａ１０１で受信する。データ受信部Ａ１０１は、受信したデータのデシリアライズ及びデコードを行う。データ受信部Ａ１０１は、デコードを終えたデータを２バイトずつデータ保存部Ａ１１１に送信する。データ保存部Ａ１１１は、データ受信部Ａ１０１から送られてきたデータを複データ保持部１７２に保存するとともにコマンド解析部１４１に直近の（即ち、最後に受信した）４バイトのデータを出力する（ステップＳ６０３、Ｓ６０４）。
【０１６４】
制御部１３１は、記憶装置から直近の（即ち、障害注入設定部１８２が最後に受信した）ＦＣＰ＿ＣＭＮＤモニタ要求コマンドを読み出し、ＦＣＰ＿ＣＭＮＤモニタ要求コマンドのＭＯＮＳＴＯＰフィールドを処理装置により確認する（ステップＳ６０５）。ＭＯＮＳＴＯＰフィールドが０になっていれば、制御部１３１は、モニタを継続する。
【０１６５】
コマンド解析部１４１は、ステップＳ６０５で制御部１３１がモニタを継続する場合には、データ保存部Ａ１１１から入力されてきた４バイトのデータを解析し、このデータがフレームの先頭であるかを処理装置により判定する（ステップＳ６０６）。具体的には、コマンド解析部１４１は、４バイトのデータがＢＣＢ５＿５６５６ｈであれば、解析したデータがＳＯＦ、即ち、フレームの先頭であると判定する。コマンド解析部１４１が解析したデータがフレームの先頭でない場合、ステップＳ６０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ６０６まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出するまで同様の処理を繰り返す。
【０１６６】
データ保存部Ａ１１１は、ステップＳ６０６でコマンド解析部１４１が解析したデータがフレームの先頭である場合、後続の４バイトのデータを複データ保持部１７２に保存する（ステップＳ６０７）。そして、データ保存部Ａ１１１は、その４バイトのデータをコマンド解析部１４１に出力する。コマンド解析部１４１は、データ保存部Ａ１１１から受け取ったデータを解析し、末尾の１バイトのデータ、即ち、フレームの先頭から８バイト目のＲ＿ＣＴＬフィールドがＦＣＰ＿ＣＭＮＤを示すものであるかを処理装置により判定する（ステップＳ６０８）。具体的には、コマンド解析部１４１は、Ｒ＿ＣＴＬフィールドが０６ｈであれば、受信中のフレームがＦＣＰ＿ＣＭＮＤであると判定する。ステップＳ６０８でフレームがＦＣＰ＿ＣＭＮＤでない場合、ステップＳ６０４に戻る。その後、次の２バイトが読み込まれ、ステップＳ６０６まで進んだ場合、コマンド解析部１４１は、その直前の２バイトと合わせた４バイトのデータを解析する。コマンド解析部１４１は、フレームの先頭を検出すると、Ｒ＿ＣＴＬフィールドを解析する。コマンド解析部１４１は、ＦＣＰ＿ＣＭＮＤを検出するまで同様の処理を繰り返す。
【０１６７】
データ保存部Ａ１１１は、ステップＳ６０８でフレームがＦＣＰ＿ＣＭＮＤである場合、後続の６０バイトのデータを複データ保持部１７２に保存する（ステップＳ６０９）。制御部１３１は、データ保存部Ａ１１１でＦＣＰ＿ＣＭＮＤが保存されたことをＦＣＰ＿ＣＭＮＤ記録部１９４に通知する。ＦＣＰ＿ＣＭＮＤ記録部１９４は、データ保存部Ａ１１１が複データ保持部１７２に保存したＦＣＰ＿ＣＭＮＤを記録したＦＣＰ＿ＣＭＮＤログを生成する（ステップＳ６１０）。例えば、ＦＣＰ＿ＣＭＮＤ記録部１９４は、データ保存部Ａ１１１でＦＣＰ＿ＣＭＮＤが保存される度に、新たに保存されたＦＣＰ＿ＣＭＮＤをＦＣＰ＿ＣＭＮＤログの末尾に追加する。ＦＣＰ＿ＣＭＮＤ記録部１９４は、ＦＣＰ＿ＣＭＮＤログが予め割り当てられた容量を超える場合には、新たに保存されたＦＣＰ＿ＣＭＮＤを無視する。
【０１６８】
制御部１３１は、ステップＳ６０５でＭＯＮＳＴＯＰフィールドが１になっていれば、モニタを停止する。制御部１３１は、ＦＣＰ＿ＣＭＮＤ記録部１９４により記録されたＦＣＰ＿ＣＭＮＤログを記憶装置から読み出し、検証端末Ｉ／Ｆ１８１を介して検証端末１６へ送信する（ステップＳ６１１）。
【０１６９】
検証端末１６は、障害シミュレータ１１から送信されたＦＣＰ＿ＣＭＮＤログを受信して、例えば、出力装置により出力する。検証端末１６のユーザは、出力されたＦＣＰ＿ＣＭＮＤログを見ることにより、ファイルＸにアクセスするときのＳＣＳＩアドレス、ＦＣＰＯＲＴに関する情報を入手することが可能になる。そして、この情報を利用して、検証端末１６から障害シミュレータ１１に送信する障害注入指示コマンドを作成することができる。
【０１７０】
上記のように、本実施の形態において、検証端末１６は、障害シミュレータ１１から情報を収集する。障害シミュレータ１１の制御部１３１は、コマンド解析部１４１により解析された１フレーム分のデータがＦＣＰ＿ＣＭＮＤであると判定される度に、当該データを記録し、記録したデータの一覧をログ情報として検証端末１６へ出力する。
【０１７１】
以上説明したように、本実施の形態では、検証端末１６が、あるファイルへのアクセス時のＦＣＰ＿ＣＭＮＤのパラメータを得ることができる。これにより、障害注入指示コマンドの作成に必要な情報（ＳＣＳＩＡＤＲ、ＦＣＰＯＲＴ等）を得ることができ、障害注入の限定条件がある特定のファイル名であるような試験でも実施が可能になる。
【０１７２】
以上、本発明の実施の形態について説明したが、これらのうち、２つ以上の実施の形態を組み合わせて実施しても構わない。あるいは、これらのうち、１つの実施の形態を部分的に実施しても構わない。あるいは、これらのうち、２つ以上の実施の形態を部分的に組み合わせて実施しても構わない。
【符号の説明】
【０１７３】
１０  試験システム、１１  障害シミュレータ、１２  サーバＡ、１３  サーバＢ、１４  ディスクＡ、１５  ディスクＢ、１６  検証端末、１０１  データ受信部Ａ、１０２  データ送信部Ａ、１０３  データ送信部Ｂ、１０４  データ受信部Ｂ、１１１  データ保存部Ａ、１１２  データ保存部Ｂ、１３１  制御部、１４１  コマンド解析部、１４２  データ解析部、１５１  代替送信データ出力部、１５２  データ選択部Ａ、１５３  データ選択部Ｂ、１５４  データ置換部、１６１  コマンド送信遅延タイマ、１６２  障害注入遅延タイマ、１６３  障害注入回数カウンタ、１７１  単データ保持部、１７２  複データ保持部、１７３  第１データ経路、１７４  第２データ経路、１７５  第３データ経路、１７６  第４データ経路、１７７  第５データ経路、１８１  検証端末Ｉ／Ｆ、１８２  障害注入設定部、１８３  ステータスデータ生成部、１８４  実行履歴記録部、１８５  時計部、１９１  非ＩＤＬＥフラグ、１９２  受信データ数カウンタ、１９３  Ｄ＿ＩＤ保存部、１９４  ＦＣＰ＿ＣＭＮＤ記録部、９０１  ＬＣＤ、９０２  キーボード、９０３  マウス、９０４  ＦＤＤ、９０５  ＣＤＤ、９０６  プリンタ、９１１  ＣＰＵ、９１２  バス、９１３  ＲＯＭ、９１４  ＲＡＭ、９１５  通信ボード、９２０  ＨＤＤ、９２１  オペレーティングシステム、９２２  ウィンドウシステム、９２３  プログラム群、９２４  ファイル群。
【図１】
2011123783.tif 000003
【図２】
2011123783.tif 000004
【図３】
2011123783.tif 000005
【図４】
2011123783.tif 000006
【図５】
2011123783.tif 000007
【図６】
2011123783.tif 000008
【図７】
2011123783.tif 000009
【図８】
2011123783.tif 000010
【図９】
2011123783.tif 000011
【図１０】
2011123783.tif 000012
【図１１】
2011123783.tif 000013
【図１２】
2011123783.tif 000014
【図１３】
2011123783.tif 000015
【図１４】
2011123783.tif 000016
【図１５】
2011123783.tif 000017
【図１６】
2011123783.tif 000018
【図１７】
2011123783.tif 000019
【図１８】
2011123783.tif 000020
【図１９】
2011123783.tif 000021
【図２０】
2011123783.tif 000022
【図２１】
2011123783.tif 000023
【図２２】
2011123783.tif 000024
【図２３】
2011123783.tif 000025
【図２４】
2011123783.tif 000026
【図２５】
2011123783.tif 000027
【図２６】
2011123783.tif 000028