(57)【特許請求の範囲】
【請求項１】
データを記憶する記憶装置と、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを、他方の制御装置内のキャッシュメモリにも記録するアクセス制御部をそれぞれ備える第１の制御装置および第２の制御装置と、
を有し、
前記第１の制御装置は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を再起動させるとともに、前記第２の制御装置内の不揮発性記憶部に対して、前記第２の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第１の再起動制御部を有し、
前記第２の制御装置は、自装置が起動したときに、前記第１の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第１の制御装置を、前記第１の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第２の再起動制御部を有する、
ことを特徴とするストレージシステム。
【請求項２】
前記第１の再起動制御部は、前記第２の制御装置を再起動させたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記録し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする請求項１記載のストレージシステム。
【請求項３】
前記第１の再起動制御部は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を、前記第２の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させ、前記第２の制御装置を再起動させた後に自装置のキャッシュメモリ内のデータが更新されたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする請求項１記載のストレージシステム。
【請求項４】
前記第１の制御装置および前記第２の制御装置は、それぞれ、前記キャッシュ識別情報として、自装置内のキャッシュメモリに記憶されたデータが更新された回数を示す更新回数情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置および前記第２の制御装置のアクセス制御部は、それぞれ、自装置内のキャッシュメモリに記憶されたデータを更新するたびに、自装置内の不揮発性記憶部に記憶された更新回数情報をカウントアップするとともに、他方の制御装置のアクセス制御部を通じて、他方の制御装置の不揮発性記憶部に記憶された更新回数情報が自装置内の不揮発性記憶部に記憶された更新回数情報と一致するように制御し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第２の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報の比較結果に基づいて自装置内のキャッシュメモリに最新のキャッシュデータが保持されていると判定した場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする請求項３記載のストレージシステム。
【請求項５】
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第２の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報が同一である場合には、前記第２の制御装置のアクセス制御部とともに前記記憶装置に対するアクセス処理を再開することを特徴とする請求項４記載のストレージシステム。
【請求項６】
データを記憶する記憶装置へのアクセス処理を制御する制御装置において、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを他の制御装置内のキャッシュメモリにも記録するアクセス制御部と、
前記他の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記他の制御装置を再起動させるとともに、前記他の制御装置内の不揮発性記憶部に対して、前記他の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第１の再起動制御部と、
自装置が起動したとき、前記他の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記他の制御装置を、前記他の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第２の再起動制御部と、
を有することを特徴とする制御装置。
【請求項７】
データを記憶する記憶装置と、前記記憶装置へのアクセス処理をそれぞれ制御する第１の制御装置および第２の制御装置とを有し、前記各制御装置が、前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュするとともに、自装置内のキャッシュメモリにキャッシュしたデータを他方の制御装置内のキャッシュメモリにも記録する機能を備えたストレージシステムにおける制御方法であって、
前記第１の制御装置が、前記第２の制御装置における前記記憶装置へのアクセス処理が停止したことを検知すると、前記第２の制御装置を再起動させるとともに、前記第２の制御装置内の不揮発性記憶部に対して、前記第２の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録し、
前記第２の制御装置が、自装置が起動したとき、前記第１の制御装置における前記記憶装置へのアクセス処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第１の制御装置を、前記第１の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる、
ことを特徴とする制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステム、制御装置および制御方法に関する。
【背景技術】
【０００２】
近年、ＨＤＤ（Hard Disk Drive）などの大容量の記憶装置を複数用いたストレージシステムが広く使用されている。一般的に、ストレージシステムには、複数の記憶装置と、これらの記憶装置に対するアクセスを制御する制御装置とが含まれる。また、制御装置を複数設けて、記憶装置へのアクセス経路を冗長化したストレージシステムもある。アクセス経路を冗長化することで、記憶装置へのアクセスの信頼性を向上させることができる。
【０００３】
さらに、ストレージシステム内の制御装置には、記憶装置に記憶されたデータを制御装置内のキャッシュメモリにキャッシュする機能を備えることで、記憶装置へのアクセスを高速化したものもある。ここで、それぞれ個別のキャッシュメモリを備えた制御装置が例えば２つ設けられた場合、一方の制御装置に記憶されたキャッシュデータを他方の制御装置にも記憶して、キャッシュデータを二重化しておくこともできる。
【０００４】
このように制御装置とキャッシュデータとがともに二重化されたストレージシステムでは、例えば、一方の制御装置が異常発生などによって初期化されたとき、初期化された制御装置は、自装置内のキャッシュメモリの内容を、他方の制御装置から読み込んだ有効なキャッシュデータによって更新することができる。これにより、初期化された制御装置は、他方の制御装置から読み込んだ有効なキャッシュデータを用いて、記憶装置へのアクセス処理をアクセス速度の高速性を保ったまま継続することができる。
【０００５】
また、上記のように制御装置とキャッシュデータとがともに二重化されたストレージシステムの別の例として、各制御装置のアクセス制御部とは独立して動作する監視部を備えるものがある。監視部は、両方の制御装置のアクセス制御部が停止したことを検知すると、両方の制御装置を「復旧モード」で起動させる。復旧モードでは、各制御装置内のキャッシュメモリへの電源供給が継続され、各キャッシュメモリ上のキャッシュデータが失われることなく、各制御装置が再起動する。アクセス制御部が停止した両方の制御装置が復旧モードの再起動することにより、各制御装置は、最新のキャッシュデータを用いた記憶装置へのアクセス制御を再開させることができる。
【０００６】
なお、複数の制御装置を備えたストレージシステムの他の例としては、キャッシュメモリの構成情報を管理する情報と、キャッシュメモリと制御装置との対応を示す情報とを利用して、制御装置ごとに個別にキャッシュメモリの排他処理や領域確保を管理することで、同一のキャッシュメモリ上の任意の領域にライトキャッシュデータ、その冗長化データ、およびリードキャッシュデータを配置できるようにしたものがある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平１０−１０５４６７号公報
【特許文献２】特開２００４−２０６２３９号公報
【特許文献３】特開２００８−４７０２９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ところで、前述のように、制御装置とキャッシュデータとがともに二重化されたストレージシステムでは、一方の制御装置が異常発生などによって初期化された場合でも、初期化された制御装置は、自装置内のキャッシュメモリの内容を、他方の制御装置から読み込んだ有効なキャッシュデータによって更新することができる。しかしながら、異常の発生した一方の制御装置が初期化処理を実行している途中で、正常運用中の他方の制御装置におけるアクセス制御も異常発生などによって停止してしまった場合には、先に初期化された一方の制御装置は、初期化処理の終了後に、他方の制御装置から最新のキャッシュデータを取得できなくなる。この場合に、先に初期化された一方の制御装置がアクセス制御を再開したとしても、アクセス制御を再開した制御装置は最新のキャッシュデータを使用できず、最新のキャッシュデータが失われてしまうという問題があった。
【０００９】
本発明はこのような課題に鑑みてなされたものであり、二重化された制御装置の両方が異常発生などによって連続的に停止した場合でも、キャッシュデータが失われる事態が発生することを抑制したストレージシステム、制御装置および制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記目的を達成するために、データを記憶する記憶装置と、前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを、他方の制御装置内のキャッシュメモリにも記録するアクセス制御部をそれぞれ備える第１の制御装置および第２の制御装置と、を有するストレージシステムが提供される。このストレージシステムにおいて、前記第１の制御装置は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を再起動させるとともに、前記第２の制御装置内の不揮発性記憶部に対して、前記第２の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第１の再起動制御部を有する。また、前記第２の制御装置は、自装置が起動したときに、前記第１の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第１の制御装置を、前記第１の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第２の再起動制御部を有する。
【００１１】
また、上記目的を達成するために、データを記憶する記憶装置へのアクセス処理を制御する制御装置が提供される。
さらに、上記目的を達成するために、上記のストレージシステムと同様の処理を行う制御方法が提供される。
【発明の効果】
【００１２】
上記のストレージシステム、制御装置および制御方法によれば、二重化された制御装置が連続的に停止した場合でも、キャッシュデータが失われる事態の発生を抑制できる。
【図面の簡単な説明】
【００１３】
【図１】第１の実施の形態に係るストレージシステムの構成例を示す図である。
【図２】制御装置の処理が連続的に停止した場合の動作を示す図（その１）である。
【図３】制御装置の処理が連続的に停止した場合の動作を示す図（その２）である。
【図４】第２の実施の形態に係るストレージシステムの全体構成例を示す図である。
【図５】ストレージシステム内のＣＭのハードウェア構成例を示す図である。
【図６】管理端末のハードウェア構成例を示す図である。
【図７】ＣＭが備える処理機能の例を示すブロック図である。
【図８】冗長運用状態におけるアクセス制御について示す図である。
【図９】単独運用状態におけるアクセス制御について示す図である。
【図１０】構成情報テーブルおよび構成情報更新回数の更新処理について示す図である。
【図１１】両ＣＭ復旧処理について示す図である。
【図１２】２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作の参考例を示すタイムチャートである。
【図１３】第２の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その１）である。
【図１４】第２の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その２）である。
【図１５】Ｉ／Ｏアクセス制御部による他方のＲｏＣの動作監視処理を示すフローチャートである。
【図１６】復旧制御部の処理を示すフローチャートである。
【図１７】ＲｏＣの起動時の処理を示すフローチャート（その１）である。
【図１８】ＲｏＣの起動時の処理を示すフローチャート（その２）である。
【図１９】キャッシュ更新回数のカウント動作を示す図である。
【図２０】単独運用状態におけるキャッシュ更新回数のカウント動作を示す図である。
【図２１】第３の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その１）である。
【図２２】第３の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その２）である。
【図２３】第３の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
【図２４】第４の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
【図２５】キャッシュ更新フラグの設定動作を示す図である。
【図２６】キャッシュ更新フラグがセットされる際の処理手順を示すフローチャートである。
【図２７】第５の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
【図２８】第６の実施の形態において２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その１）である。
【図２９】第６の実施の形態において２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャート（その２）である。
【図３０】第６の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、実施の形態について図面を参照して詳細に説明する。
〔第１の実施の形態〕
図１は、第１の実施の形態に係るストレージシステムの構成例を示す図である。
【００１５】
図１に示すストレージシステム１は、記憶装置１０と、複数の制御装置とを有する。図１のストレージシステム１は、例として２つの制御装置２０ａ，２０ｂを有しているが、３つ以上の制御装置を有していてもよい。
【００１６】
記憶装置１０は、データを記憶する装置であり、例えば、複数のＨＤＤなどの記録媒体を内部に備える。制御装置２０ａ，２０ｂは、記憶装置１０へのアクセス処理を制御する。制御装置２０ａ，２０ｂは、例えば、図示しない上位装置からの記憶装置１０に対するアクセス要求に応じて、記憶装置１０にアクセスする。
【００１７】
ストレージシステム１内の各制御装置は、同じ構成を有している。制御装置２０ａは、アクセス制御部２１ａ、キャッシュメモリ２２ａ、再起動制御部２３ａ，２４ａおよび不揮発性記憶部２５ａを備えている。また、制御装置２０ｂは、アクセス制御部２１ｂ、キャッシュメモリ２２ｂ、再起動制御部２３ｂ，２４ｂおよび不揮発性記憶部２５ｂを備えている。アクセス制御部２１ａとアクセス制御部２１ｂ、再起動制御部２３ａと再起動制御部２３ｂ、再起動制御部２４ａと再起動制御部２４ｂは、それぞれ同じ処理を実行する。ここでは、制御装置２０ａが備える処理機能について説明し、制御装置２０ｂが備える処理機能の説明については省略する。
【００１８】
アクセス制御部２１ａは、記憶装置１０に記憶されたデータを制御装置２０ａ内のキャッシュメモリ２２ａに記憶しながら、上位装置からのアクセス要求に応じて記憶装置１０にアクセスする。例えば、アクセス制御部２１ａは、記憶装置１０に記憶されたデータの読み出し要求を上位装置から受け付けると、読み出しを要求されたデータを記憶装置１０から読み出し、上位装置に送信する。このとき、読み出しを要求されたデータがキャッシュメモリ２２ａに記憶されている場合には、読み出しを要求されたデータを記憶装置１０の代わりにキャッシュメモリ２２ａから読み出す。また、アクセス制御部２１ａは、記憶装置１０へのデータの書き込み要求を上位装置から受け付けると、書き込みを要求されたデータをキャッシュメモリ２２ａと記憶装置１０とに書き込む。
【００１９】
さらに、アクセス制御部２１ａは、キャッシュメモリ２２ａに記憶したデータと同じデータを、他方の制御装置２０ｂが備えるキャッシュメモリ２２ｂにも記録する。アクセス制御部２１ａは、例えば、キャッシュメモリ２２ａに記憶したデータと同じデータを、制御装置２０ｂのアクセス制御部２１ｂを通じてキャッシュメモリ２２ｂに記録する。また、他方の制御装置２０ｂのアクセス制御部２１ｂも同様に、制御装置２０ｂが備えるキャッシュメモリ２２ｂに記憶したデータと同じデータを、制御装置２０ａのキャッシュメモリ２２ａにも記録する。これにより、制御装置２０ａ，２０ｂのそれぞれにおけるキャッシュデータが二重化される。
【００２０】
再起動制御部２３ａは、他方の制御装置２０ｂにおけるアクセス制御部２１ｂの処理が、異常の発生などによって停止したことを検知する機能を備える。再起動制御部２３ａは、例えば、他方の制御装置２０ｂとの通信が途絶えた場合に、他方の制御装置２０ｂにおけるアクセス制御部２１ｂの処理が停止したと判定する。再起動制御部２３ａは、アクセス制御部２１ｂの処理が停止したことを検知すると、制御装置２０ｂを再起動させる。これとともに、再起動制御部２３ａは、他方の制御装置２０ｂ内の不揮発性記憶部２５ｂに対して、自装置（すなわち制御装置２０ｂ）以外の制御装置から再起動が指示されたことを示す起動情報２６ｂを記録する。
【００２１】
なお、起動情報２６ｂは、例えば、フラグ情報のように不揮発性記憶部２５ｂに常時記憶されている情報でもよい。この場合には、再起動制御部２３ａは、制御装置２０ｂを再起動させるとき、起動情報２６ｂを、自装置以外の制御装置から再起動が指示されたことを指示するように更新する。
【００２２】
さらに、再起動制御部２３ａは、アクセス制御部２１ｂの処理停止を検知したことを契機として制御装置２０ｂを再起動させるとき、自装置（すなわち制御装置２０ａ）のキャッシュメモリ２２ａに最新のキャッシュデータが記憶されていることを示すキャッシュ識別情報２７ａを、自装置の不揮発性記憶部２５ａに記録してもよい。
【００２３】
このキャッシュ識別情報２７ａは、例えば、起動情報２６ａと同様に、フラグ情報のように不揮発性記憶部２５ａに常時記憶されている情報でもよい。この場合には、再起動制御部２４ａは、制御装置２０ｂを再起動させたときに、キャッシュ識別情報２７ａを、キャッシュメモリ２２ａに最新のキャッシュデータが記憶されていることを示すように更新する。
【００２４】
再起動制御部２４ａは、自装置（すなわち制御装置２０ａ）が起動したとき、他方の制御装置２０ｂにおけるアクセス制御部２１ｂの処理が停止しているか否かを判定する機能を備える。再起動制御部２４ａは、自装置が起動したとき、制御装置２０ｂのアクセス制御部２１ｂの処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報２６ａが不揮発性記憶部２５ａに記憶されていた場合に、少なくとも制御装置２０ｂを、キャッシュメモリ２２ｂに記憶されたデータを保持した状態のまま再起動させる。
【００２５】
ここで、例として、制御装置２０ａのアクセス制御部２１ａの処理が停止した後、さらに制御装置２０ｂのアクセス制御部２１ｂの処理が停止した場合のストレージシステム１の動作について説明する。図２，図３は、制御装置の処理が連続的に停止した場合の動作を示す図である。
【００２６】
図２上段に示す状態１では、制御装置２０ａのアクセス制御部２１ａ、および制御装置２０ｂのアクセス制御部２１ｂは、ともに記憶装置１０に対するアクセス制御を正常に実行しているものとする。この状態から、制御装置２０ｂのアクセス制御部２１ｂの処理が異常発生などによって停止したものとする。このとき、図２下段の状態２に示すように、制御装置２０ａの再起動制御部２３ａは、アクセス制御部２１ｂの処理が停止したことを検知する。
【００２７】
再起動制御部２３ａは、アクセス制御部２１ｂの処理が停止したことを検知すると、制御装置２０ｂを再起動させる。これとともに、再起動制御部２３ａは、制御装置２０ｂ内の不揮発性記憶部２５ｂに対して、自装置（すなわち制御装置２０ｂ）以外の制御装置から再起動が指示されたことを示す起動情報２６ｂを記録する。さらに、再起動制御部２３ａは、制御装置２０ａ内の不揮発性記憶部２５ａに対して、キャッシュメモリ２２ａに最新のキャッシュデータが記憶されていることを示すキャッシュ識別情報２７ａを記録してもよい。
【００２８】
制御装置２０ｂは、再起動制御部２３ａからの指示に応じて再起動する。このとき例えば、制御装置２０ａのキャッシュメモリ２２ａに最新のキャッシュデータが記憶されていることから、制御装置２０ｂのキャッシュメモリ２２ｂに記憶されたデータは破棄されるものとする。
【００２９】
ここで、制御装置２０ｂが再起動したとき、他方の制御装置２０ａにおけるアクセス制御部２１ａの処理が正常に実行されているならば、制御装置２０ｂの再起動前にアクセス制御部２１ｂがキャッシュメモリ２２ｂに記憶したデータと同じデータ（以下、「ミラーキャッシュデータ」と呼ぶ）が、制御装置２０ａのキャッシュメモリ２２ａにも記憶されている。このため、制御装置２０ｂのアクセス制御部２１ｂは、制御装置２０ａのキャッシュメモリ２２ａからミラーキャッシュデータを読み込んでキャッシュメモリ２２ｂに格納することで、アクセス制御を再開することができる。
【００３０】
しかしながら、制御装置２０ｂが再起動してアクセス制御を開始できるようになるまでの間に、他方の制御装置２０ａにおけるアクセス制御部２１ａの処理が停止した場合には、制御装置２０ａのキャッシュメモリ２２ａに記憶されたミラーキャッシュデータを、制御装置２０ｂのアクセス制御部２１ｂが読み出すことができなくなってしまうという問題がある。
【００３１】
これに対して、図３上段に示す状態３のように、制御装置２０ｂの再起動制御部２４ｂは、制御装置２０ｂが再起動したとき、他方の制御装置２０ａにおけるアクセス制御部２１ａの処理が停止しており、かつ、制御装置２０ｂ内の不揮発性記憶部２５ｂに起動情報２６ｂが記憶されていた場合には、少なくとも制御装置２０ａを、キャッシュメモリ２２ａに記憶されたデータを保持した状態のまま再起動させる。
【００３２】
図３下段に示す状態４のように、制御装置２０ａは、再起動制御部２４ｂによる再起動指示を契機として再起動する。このとき、制御装置２０ａのキャッシュメモリ２２ａには、制御装置２０ａの再起動前に記憶されていたデータが残ったままである。従って、制御装置２０ｂのアクセス制御部２１ｂは、制御装置２０ａのキャッシュメモリ２２ａからミラーキャッシュデータを読み込んでキャッシュメモリ２２ｂに格納することで、アクセス制御を再開することができる。あるいは、制御装置２０ａのアクセス制御部２１ａは、例えば、キャッシュメモリ２２ａに記憶されたミラーキャッシュデータをキャッシュデータとして用いて、記憶装置１０へのアクセス制御を単独で再開してもよい。
【００３３】
以上の処理によれば、制御装置２０ｂにおけるアクセス制御部２１ｂの処理が停止した後、制御装置２０ｂが再起動してアクセス制御部２１ｂの処理を再開できる状態になる前に、制御装置２０ａにおけるアクセス制御部２１ａの処理が停止した場合でも、制御装置２０ａのキャッシュメモリ２２ａに記憶されていた最新のミラーキャッシュデータが失われるという事態を回避することができる。
【００３４】
なお、図３下段の状態４において、制御装置２０ａが再起動したとき、アクセス制御部２１ａまたはアクセス制御部２１ｂは、例えば、キャッシュメモリ２２ａ，２２ｂのうちキャッシュメモリ２２ａに最新のキャッシュデータが記憶されていることを、再起動した制御装置２０ａの不揮発性記憶部２５ａにキャッシュ識別情報２７ａが記憶されていることを基に判定できる。
【００３５】
また、各制御装置２０ａ，２０ｂは、例えば、自装置におけるアクセス制御部の処理、他の制御装置におけるアクセス制御部の処理の両方が停止したことを検出すると、アクセス制御部の処理が停止した両方の制御装置を、各制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる「両装置復旧機能」を備えていてもよい。この場合、図３上段の状態３において、制御装置２０ｂの再起動制御部２４ｂは、次のような処理によって制御装置２０ａ，２０ｂを再起動させてもよい。
【００３６】
再起動制御部２４ｂは、制御装置２０ｂが再起動したとき、他方の制御装置２０ａにおけるアクセス制御部２１ａの処理が停止しており、かつ、制御装置２０ｂ内の不揮発性記憶部２５ｂに起動情報２６ｂが記録されていた場合に、制御装置２０ｂのアクセス制御部２１ｂの処理を停止させる。すなわち、再起動制御部２４ｂは、制御装置２０ｂのアクセス制御部２１ｂの処理を停止させることで、制御装置２０ａがキャッシュメモリ２２ａの内容を保持したまま再起動するような環境を整える。
【００３７】
アクセス制御部２１ｂの処理が停止すると、制御装置２０ａまたは制御装置２０ｂが備える「両装置復旧機能」によってアクセス制御部２１ａ，２１ｂの両方の処理が停止したことが検出され、制御装置２０ａ，２０ｂは、それぞれキャッシュメモリ２２ａ，２２ｂのデータを保持したまま再起動する。従って、制御装置２０ａのキャッシュメモリ２２ａに記憶された最新のミラーキャッシュデータが失われるという事態が回避される。
【００３８】
ところで、上記の第１の実施の形態では、アクセス制御部２１ａ，２１ｂがともにアクセス制御を正常に実行しているとき、アクセス制御部２１ｂの処理が停止すると、制御装置２０ｂは、キャッシュメモリ２２ｂのデータを保持せずに再起動したが、キャッシュメモリ２２ｂのデータを保持したまま制御装置２０ｂを再起動させる方法も考えられる。しかしながら、キャッシュメモリ２２ｂのデータを保持したまま制御装置２０ｂが再起動したとしても、制御装置２０ｂが再起動するまでのアクセス制御部２１ａの処理の仕方によっては、キャッシュメモリ２２ｂのキャッシュデータが最新でなくなる場合があり得る。例えば、制御装置２０ｂが再起動されるまでの間、アクセス制御部２１ｂが処理停止前まで実行していたアクセス制御を、キャッシュメモリ２２ａに記憶されたミラーキャッシュデータを利用してアクセス制御部２１ａが単独で実行する場合には、キャッシュメモリ２２ｂのキャッシュデータが最新でなくなることがあり得る。
【００３９】
そこで、次の第２の実施の形態では、一方の制御装置におけるアクセス制御が停止した場合に、アクセス制御を他方の制御装置が単独で実行することが可能なストレージシステムの例について説明する。
【００４０】
〔第２の実施の形態〕
図４は、第２の実施の形態に係るストレージシステムの全体構成例を示す図である。
図４に示すストレージシステム１００は、ストレージ装置として複数のＨＤＤを備える。ストレージシステム１００内のＤＥ（Drive Enclosure）２００のそれぞれには、ストレージ装置を構成する複数のＨＤＤが格納されている。また、ストレージシステム１００は、ＤＥ２００内のＨＤＤに対するアクセスを制御する２つのＣＭ（Controller Module）３００ａ，３００ｂを備えている。さらに、ストレージシステム１００は、ＤＥ２００およびＣＭ３００ａ，３００ｂに対して電源を供給するＰＳＵ（Power Supply Unit）２１１，２１２を備えている。なお、ＤＥ２００およびＰＳＵ２１１，２１２は、例えば、ストレージシステム１００の外部に設けられていてもよい。また、ストレージ装置としては、ＨＤＤに限らず、例えばＳＳＤ（Solid State Drive）などの他の種類のストレージ装置が使用されてもよい。
【００４１】
ストレージシステム１００には、ホスト装置１２０と管理端末１３０とが接続されている。ホスト装置１２０は、ユーザの操作に応じて、ストレージシステム１００内のＣＭ３００ａまたはＣＭ３００ｂに対して、ＤＥ２００内のＨＤＤへのアクセスを要求する。なお、ホスト装置１２０とＣＭ３００ａ，３００ｂとは、例えば、ファイバチャネルを介して接続されている。
【００４２】
管理端末１３０は、管理者の操作に応じて、ストレージシステム１００の動作を管理する。例えば、管理者は、管理端末１３０を操作することで、ＣＭ３００ａ，３００ｂに対する動作設定を行うことができる。なお、管理端末１３０とＣＭ３００ａ，３００ｂとは、例えば、ＬＡＮ（Local Area Network）ケーブルを介して接続されている。
【００４３】
ＣＭ３００ａ，３００ｂは、それぞれ、ホスト装置１２０からのアクセス要求に応じてＤＥ２００内のＨＤＤへのアクセスを制御する。例えば、ＣＭ３００ａ，３００ｂは、それぞれ、ＨＤＤに記憶されたデータの読み出し要求をホスト装置１２０から受け付けると、読み出しを要求されたデータをＨＤＤから読み出し、ホスト装置１２０に送信する。あるいは、ＣＭ３００ａ，３００ｂは、それぞれ、ＨＤＤへのデータの書き込み要求をホスト装置１２０から受け付けると、書き込みを要求されたデータをＨＤＤに書き込む。
【００４４】
また、ＣＭ３００ａ，３００ｂは、ＤＥ２００内のＨＤＤに記憶されたデータをキャッシュする機能を備える。また、ＣＭ３００ａとＣＭ３００ｂとは互いにデータを送受信でき、ＣＭ３００ａ，３００ｂは、例えば、他方のＣＭが保持するキャッシュデータのミラーデータを互いに保持する。また、ＣＭ３００ａ，３００ｂは、他方のＣＭの動作を監視し、必要に応じて他方のＣＭを再起動させることも可能になっている。
【００４５】
図５は、ストレージシステム内のＣＭのハードウェア構成例を示す図である。
ＣＭ３００ａは、ＲｏＣ（RAID on Chip，RAID：Redundant Arrays of Inexpensive Disks）３０１ａ、ＲＡＭ（Random Access Memory）３０２ａ、ＳＳＤ（Solid State Drive）３０３ａ、ＬＡＮインタフェース３０４ａ、ＣＡ（Channel Adapter）３０５ａ，３０６ａ、ＳＡＳ（Serial Attached SCSI，SCSI：Small Computer System Interface）エクスパンダ３０７ａ、ＦＰＧＡ（Field Programmable Gate Array）３０８ａ、ＮＶＲＡＭ（Non Volatile RAM）３０９ａおよび電源回路３１０ａを備えている。
【００４６】
また、ＣＭ３００ｂは、ＣＭ３００ａと同じハードウェア構成によって実現される。すなわち、ＣＭ３００ｂ内のＲｏＣ３０１ｂ、ＲＡＭ３０２ｂ、ＳＳＤ３０３ｂ、ＬＡＮインタフェース３０４ｂ、ＣＡ３０５ｂ，３０６ｂ、ＳＡＳエクスパンダ３０７ｂ、ＦＰＧＡ３０８ｂ、ＮＶＲＡＭ３０９ｂおよび電源回路３１０ｂは、ＣＭ３００ａ内のＲｏＣ３０１ａ、ＲＡＭ３０２ａ、ＳＳＤ３０３ａ、ＬＡＮインタフェース３０４ａ、ＣＡ３０５ａ，３０６ａ、ＳＡＳエクスパンダ３０７ａ、ＦＰＧＡ３０８ａ、ＮＶＲＡＭ３０９ａおよび電源回路３１０ａにそれぞれ対応する。そこで、ここでは基本的に、ＣＭ３００ａのハードウェア構成について説明し、ＣＭ３００ｂのハードウェア構成の説明については省略する。
【００４７】
ＲｏＣ３０１ａは、ＣＭ３００ａ全体を統括的に制御するＣＰＵ（Central Processing Unit）、このＣＰＵとＳＡＳエクスパンダ３０７ａ，３０７ｂとの間をインタフェースするＳＡＳコントローラなどを備える。また、ＲｏＣ３０１ａ内のＣＰＵは、他方のＣＭ３００ｂのＲｏＣ３０１ａ内のＣＰＵと通信する機能も備えている。以下、ＲｏＣ３０１ａ内のＣＰＵとＲｏＣ３０１ｂ内のＣＰＵとの間の通信経路を「通信経路Ｐ１」と呼ぶ。
【００４８】
ＲＡＭ３０２ａは、ＣＭ３００ａの主記憶装置として使用され、ＲｏＣ３０１ａ内のＣＰＵに実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。また、ＲＡＭ３０２ａは、ＤＥ２００内のＨＤＤに記憶されたデータのキャッシュ領域としても使用される。
【００４９】
ＳＳＤ３０３ａは、ＣＭ３００ａの二次記憶装置として使用され、ＲｏＣ３０１ａにより実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、ＨＤＤなどの他の種類の不揮発性記憶装置が使用されてもよい。
【００５０】
ＬＡＮインタフェース３０４ａは、ＬＡＮケーブルを介して管理端末１３０と接続し、管理端末１３０との間でデータを送受信する。
ＣＡ３０５ａ，３０６ａは、ホスト装置１２０とＣＭ３００ａとの間でデータを送受信するインタフェース処理を実行する。なお、ＣＡ３０５ａ，３０６ａを、それぞれ個別の光ファイバケーブルを介してホスト装置１２０に接続することにより、ＣＭ３００ａとホスト装置１２０との間の通信経路が冗長化され、通信の信頼性を向上させることができる。
【００５１】
ＳＡＳエクスパンダ３０７ａは、ＲｏＣ内のＳＡＳコントローラとＳＡＳデバイスとの間でデータを中継する。また、ＳＡＳエクスパンダ３０７ａは、内部にＣＰＵや不揮発性メモリを備える。ＳＡＳエクスパンダ３０７ａのＣＰＵは、ＳＡＳエクスパンダ３０７ａ内部の不揮発性メモリに記憶されたファームウェアプログラムを実行することにより、例えば、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂの両方をＲＡＭ３０２ａに記憶されたキャッシュデータを保持したまま再起動させる「両ＣＭ復旧処理」を実行する。なお、ＳＡＳエクスパンダ３０７ａ内のＣＰＵは、ＲｏＣ３０１ａ内のＣＰＵとは独立して動作する。例えば、ＲｏＣ３０１ａにおける処理が異常の発生などによって停止した場合でも、ＳＡＳエクスパンダ３０７ａに電源が供給されていれば、ＳＡＳエクスパンダ３０７ａのＣＰＵは引き続き動作する。
【００５２】
なお、図５の例では、ＣＭ３００ａのＲｏＣ３０１ａは、ＣＭ３００ａ内のＳＡＳエクスパンダ３０７ａを通じてＤＥ２００と接続されているとともに、ＣＭ３００ｂ内のＳＡＳエクスパンダ３０７ｂを通じてＤＥ２００と接続されている。このように、ＲｏＣ３０１ａとＤＥ２００とが２つのＳＡＳエクスパンダ３０７ａ，３０７ｂを通じて接続されることで、ＲｏＣ３０１ａからＤＥ２００へのアクセス経路が冗長化されている。
【００５３】
同様に、ＣＭ３００ｂのＲｏＣ３０１ｂは、ＣＭ３００ｂのＳＡＳエクスパンダ３０７ｂを通じてＤＥ２００と接続されているとともに、ＣＭ３００ａ内のＳＡＳエクスパンダ３０７ａを通じてＤＥ２００と接続されている。このように、ＲｏＣ３０１ｂとＤＥ２００とが２つのＳＡＳエクスパンダ３０７ａ，３０７ｂを通じて接続されることで、ＲｏＣ３０１ｂからＤＥ２００へのアクセス経路も冗長化されている。
【００５４】
ＦＰＧＡ３０８ａは、ＣＭ３００ａのＲｏＣ３０１ａが正常に動作しているかを監視する機能を備える。一方、ＣＭ３００ｂ内のＦＰＧＡ３０８ｂも、ＣＭ３００ｂ内のＲｏＣ３０１ｂが正常に動作しているかを監視する機能を備える。ＦＰＧＡ３０７ａ，３０８ａは、互いに通信することで、他方のＣＭが正常に動作しているかを監視することができる。
【００５５】
ＦＰＧＡ３０８ａは、ＣＭ３００ａのＲｏＣ３０１ａとＣＭ３００ｂのＲｏＣ３０１ｂの両方の動作が異常発生により停止したことを検知すると、その旨をＳＡＳエクスパンダ３０７ａに通知する。ＳＡＳエクスパンダ３０７ａのＣＰＵは、ＲｏＣ３０１ａ，３０１ｂの両方の動作が停止したことを示す通知をＦＰＧＡ３０８ａから受け付けたとき、前述の「両ＣＭ復旧処理」を実行する。
【００５６】
また、ＦＰＧＡ３０８ａは、ＲｏＣ３０１ａ、ＳＡＳエクスパンダ３０７ａ、ＣＭ３００ｂのＦＰＧＡ３０８ｂからの要求に応じて、ＣＭ３００ａのＲｏＣ３０１ａを再起動させる機能を備える。ＦＰＧＡ３０８ａは、「通常モード」と「復旧モード」の２種類のモードによってＲｏＣ３０１ａを再起動させることができる。通常モードの再起動では、ＦＰＧＡ３０８ａは、電源回路３１０ａからＲｏＣ３０１ａおよびＲＡＭ３０２ａのそれぞれに対する電源供給を一時的に停止させることで、ＲＡＭ３０２ａに記憶されたデータをクリアした状態でＲｏＣ３０１ａを再起動させる。復旧モードの再起動では、ＦＰＧＡ３０８ａは、電源回路３１０ａからＲＡＭ３０２ａへの電源供給を継続して、ＲＡＭ３０２ａに記憶したデータを維持したまま、電源回路３１０ａからＲｏＣ３０１ａへの電源供給を一時的に停止させることで、ＲｏＣ３０１ａを再起動させる。なお、復旧モードの再起動では、ＲＡＭ３０２ａ内のキャッシュ領域のデータのみが保持された状態でＲｏＣ３０１ａが再起動してもよい。
【００５７】
さらに、ＦＰＧＡ３０８ａは、他方のＣＭ３００ｂのＦＰＧＡ３０８ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを再起動させるように要求することもできる。ＦＰＧＡ３０８ａは、ＦＰＧＡ３０８ｂに対してＲｏＣ３０１ｂの再起動を要求する際に、ＲｏＣ３０１ｂを通常モードあるいは復旧モードのどちらで再起動させるかを指定できる。
【００５８】
また、ＦＰＧＡ３０８ａは、ＲｏＣ３０１ａ、ＳＡＳエクスパンダ３０７ａ、ＣＭ３００ｂのＦＰＧＡ３０８ｂからの要求に応じて、ＮＶＲＡＭ３０９ａにデータを記録したり、ＮＶＲＡＭ３０９ａからデータを読み出す機能を備えている。
【００５９】
なお、ＦＰＧＡ３０８ａは、ＳＡＳエクスパンダ３０７ａのＣＰＵと同様に、ＲｏＣ３０１ａ内のＣＰＵとは独立して動作する。例えば、ＲｏＣ３０１ａにおける処理が異常の発生などによって停止した場合でも、ＦＰＧＡ３０８ａは引き続き動作する。
【００６０】
ＮＶＲＡＭ３０９ａは、ＦＰＧＡ３０８ａやＲｏＣ３０１ａでの処理に利用される各種データを記憶する不揮発性メモリである。
電源回路３１０ａは、ＦＰＧＡ３０８ａの制御の下で、ＰＳＵ２１１，２１２からの電源をＣＭ３００ａの内部に供給する電源回路である。
【００６１】
図６は、管理端末のハードウェア構成例を示す図である。
管理端末１３０は、図６に示すようなコンピュータとして実現される。このコンピュータは、ＣＰＵ１３１によって装置全体が制御されている。ＣＰＵ１３１には、バス１３８を介して、ＲＡＭ１３２と複数の周辺機器が接続されている。
【００６２】
ＲＡＭ１３２は、コンピュータの主記憶装置として使用される。ＲＡＭ１３２には、ＣＰＵ１３１に実行させるプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１３２には、ＣＰＵ１３１による処理に必要な各種データが格納される。
【００６３】
バス１３８に接続されている周辺機器としては、ＨＤＤ１３３、グラフィック処理装置１３４、入力インタフェース１３５、光学ドライブ装置１３６および通信インタフェース１３７がある。
【００６４】
ＨＤＤ１３３は、コンピュータの二次記憶装置として使用される。ＨＤＤ１３３には、ＣＰＵ１３１が実行するプログラムや、各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００６５】
グラフィック処理装置１３４には、モニタ１３４ａが接続されている。グラフィック処理装置１３４は、ＣＰＵ１３１からの命令に従って、画像をモニタ１３４ａの画面に表示させる。モニタ１３４ａとしては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００６６】
入力インタフェース１３５には、例えば、キーボード１３５ａとマウス１３５ｂとが接続されている。入力インタフェース１３５は、キーボード１３５ａやマウス１３５ｂから送られてくる信号をＣＰＵ１３１に送信する。マウス１３５ｂは、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００６７】
光学ドライブ装置１３６は、レーザ光などを利用して、光ディスク１３６ａに記録されたデータの読み取りを行う。光ディスク１３６ａは、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１３６ａには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００６８】
通信インタフェース１３７は、ＣＭ３００ａ，３００ｂとの間でＬＡＮケーブルを介してデータを送受信する。
なお、ホスト装置１２０についても、図６と同様のハードウェア構成によって実現できる。ただし、ホスト装置１２０が備える通信インタフェースは、ＣＭ３００ａ，３００ｂとの間で光ファイバを介してデータを送受信する。
【００６９】
図７は、ＣＭが備える処理機能の例を示すブロック図である。
ＣＭ３００ａは、Ｉ／Ｏ（In/Out）アクセス制御部３２１ａ、復旧制御部３２２ａ、監視部３２３ａおよび起動制御部３２４ａを備えている。これらのうち、Ｉ／Ｏアクセス制御部３２１ａの処理は、ＲｏＣ３０１ａのＣＰＵによって所定のプログラムが実行されることで実現される。また、復旧制御部３２２ａの処理は、ＳＡＳエクスパンダ３０７ａのＣＰＵによって所定のファームウェアが実行されることで実現される。また、監視部３２３ａおよび起動制御部３２４ａの処理は、ＦＰＧＡ３０８ａによって実現される。
【００７０】
ＣＭ３００ｂは、ＣＭ３００ａと同様の処理機能を備える。すなわち、ＣＭ３００ｂが備えるＩ／Ｏアクセス制御部３２１ｂ、復旧制御部３２２ｂ、監視部３２３ｂおよび起動制御部３２４ｂは、ＣＭ３００ａが備えるＩ／Ｏアクセス制御部３２１ａ、復旧制御部３２２ａ、監視部３２３ａおよび起動制御部３２４ａにそれぞれ対応する。そこで、ここでは基本的に、ＣＭ３００ａが備える処理機能について説明し、ＣＭ３００ｂが備える処理機能の説明については省略する。
【００７１】
なお、ＣＭ３００ａ内の処理機能と同様に、ＣＭ３００ｂ内のＩ／Ｏアクセス制御部３２１ｂの処理は、ＲｏＣ３０１ｂのＣＰＵによって所定のプログラムが実行されることで実現される。また、ＣＭ３００ｂ内の復旧制御部３２２ｂの処理は、ＳＡＳエクスパンダ３０７ｂのＣＰＵによって所定のファームウェアが実行されることで実現される。また、ＣＭ３００ｂ内の監視部３２３ｂおよび起動制御部３２４ｂの処理は、ＦＰＧＡ３０８ｂによって実現される。
【００７２】
Ｉ／Ｏアクセス制御部３２１ａは、ＤＥ２００内のＨＤＤに対するアクセスを制御するとともに、ＤＥ２００内のＨＤＤの記憶領域をＲＡＩＤによって管理する。Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０から発せられた、ＤＥ２００内のＨＤＤに対するアクセス要求を、ＣＡ３０５ａまたはＣＡ３０６ａから受け付け、ＳＡＳエクスパンダ３０７ａまたはＳＡＳエクスパンダ３０７ｂを通じて、ＤＥ２００内のＨＤＤにアクセスする。
【００７３】
また、Ｉ／Ｏアクセス制御部３２１ａは、ＤＥ２００内のＨＤＤに記憶されたデータをＲＡＭ３０２ａにキャッシュしながら、ＤＥ２００内のＨＤＤに対するアクセスを制御する。さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａにキャッシュしたキャッシュデータを、他方のＣＭ３００ｂのＲＡＭ３０２ｂにミラーリングする機能を備える。
【００７４】
また、Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂにおけるＲｏＣ３０１ｂの動作が異常発生によって停止したことを通信経路Ｐ１を通じて検知する機能を備える。Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ａの動作が停止したことを検知すると、起動制御部３２４ａを通じて、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるようにＣＭ３００ｂに要求する。なお、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させることにより、ＲｏＣ３０１ｂの動作が再開されるまでの期間にＣＭ３００ａが保持するキャッシュデータが更新されなかった場合、ＲｏＣ３０１ｂは最新のキャッシュデータを他方のＣＭ３００ｂから読み込むことなく、Ｉ／Ｏアクセス制御を再開することができる。
【００７５】
ＣＭ３００ｂのＮＶＲＡＭ３０９ｂには、起動フラグ３３２ｂが記憶されている。起動フラグ３３２ｂは、「１」であるとき、自ＣＭが他方のＣＭからの要求に応じて再起動したことを示す。Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるようにＣＭ３００ｂに要求したとき、起動制御部３２４ａを通じて、ＣＭ３００ｂ内のＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを「０」から「１」に更新するように、ＣＭ３００ｂに要求する。起動フラグ３３２ｂは、ＣＭ３００ｂのＲｏＣ３０１ｂが起動し、Ｉ／Ｏアクセス制御部３２１ｂによるＨＤＤのアクセス制御が開始される前に、Ｉ／Ｏアクセス制御部３２１ｂによって参照される。
【００７６】
また、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ａを復旧モードで再起動させるようにＣＭ３００ｂに要求したとき、ＣＭ３００ａのＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップする。後述するように、構成情報更新回数３３１ａは、Ｉ／Ｏアクセス制御部３２１ａが処理を実行する際に参照する制御データが設定された構成情報テーブルが更新されるたびに、カウントアップされる情報である。構成情報テーブルの更新に応じて構成情報更新回数３３１ａがカウントアップされる場合には、他方のＣＭ３００ｂ内のＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂもカウントアップされる。これにより構成情報更新回数３３１ａ，３３１ｂは、通常は同じ値となるように同期される。
【００７７】
しかし、ＣＭ３００ｂ内のＲｏＣ３０１ａを復旧モードで再起動させるようにＣＭ３００ｂに要求したときに、ＣＭ３００ａ内の構成情報更新回数３３１ａがカウントアップされた場合には、ＣＭ３００ｂが再起動処理中となることから、ＣＭ３００ｂ内の構成情報更新回数３３１ｂはカウントアップされない。この場合、構成情報更新回数３３１ａ，３３１ｂの各値は異なる値となる。そして、構成情報更新回数３３１ａ，３３１ｂの各値が異なる状態で、前述の両ＣＭ復旧処理が実行されてＣＭ３００ａ，３００ｂのＲｏＣ３０１ａ，３０１ｂが再起動したとき、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、構成情報更新回数３３１ａ，３３１ｂのうち値が大きい方に対応するＣＭ３００ａ内のキャッシュデータがより新しいデータであると判定することができる。
【００７８】
なお、Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ｂおよび起動フラグ３３２ａの読み書きを、ＦＰＧＡ３０８ａを通じて行う。
【００７９】
復旧制御部３２２ａは、監視部３２３ａによって、ＣＭ３００ａのＲｏＣ３０１ａとＣＭ３００ｂのＲｏＣ３０１ｂの両方の動作が異常発生などにより停止したことを検知すると、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂの両方を復旧モードで再起動させる両ＣＭ復旧処理を実行する。復旧制御部３２２ａは、ＣＭ３００ａの起動制御部３２４ａに対して、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させるように要求するとともに、起動制御部３２４ａを通じてＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように要求する。
【００８０】
監視部３２３ａは、ＣＭ３００ａのＲｏＣ３０１ａが正常に動作しているかを監視する。また、監視部３２３ａは、ＣＭ３００ｂの監視部３２３ｂを通じて、ＣＭ３００ｂのＲｏＣ３０１ｂが正常に動作しているかを監視する。監視部３２３ａは、ＣＭ３００ａのＲｏＣ３０１ａとＣＭ３００ｂのＲｏＣ３０１ｂの両方の動作が異常発生などにより停止したことを検知すると、その旨を復旧制御部３２２ａに通知する。
【００８１】
起動制御部３２４ａは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａ、ＣＭ３００ａの復旧制御部３２２ａ、ＣＭ３００ｂの起動制御部３２４ｂのいずれかからの要求に応じて、ＲｏＣ３０１ａを通常モードまたは復旧モードで再起動させる。通常モードの再起動では、起動制御部３２４ａは、電源回路３１０ａからＲｏＣ３０１ａおよびＲＡＭ３０２ａのそれぞれに対する電源供給を一時的に停止させることで、ＲＡＭ３０２ａに記憶されたデータをクリアした状態でＲｏＣ３０１ａを再起動させる。復旧モードの再起動では、起動制御部３２４ａは、電源回路３１０ａからＲＡＭ３０２ａへの電源供給を継続して、ＲＡＭ３０２ａに記憶したデータを維持したまま、電源回路３１０ａからＲｏＣ３０１ａへの電源供給を一時的に停止させることで、ＲｏＣ３０１ａを再起動させる。なお、復旧モードの再起動では、ＲＡＭ３０２ａ内のキャッシュ領域のデータのみが保持された状態でＲｏＣ３０１ａが再起動してもよい。
【００８２】
また、起動制御部３２４ａは、Ｉ／Ｏアクセス制御部３２１ａまたは復旧制御部３２２ａからの要求に応じて、他方のＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを通常モードまたは復旧モードで再起動させるように要求することもできる。
【００８３】
さらに、起動制御部３２４ａは、Ｉ／Ｏアクセス制御部３２１ａからの要求に応じて、ＣＭ３００ｂの起動制御部３２４ｂに対して、ＮＶＲＡＭ３０９ｂ内の起動フラグ３３２ｂの更新を要求する機能を備える。また、起動制御部３２４ａは、ＣＭ３００ｂの起動制御部３２４ｂからの要求に応じて、ＮＶＲＡＭ３０９ａ内の起動フラグ３３２ａを更新する機能も備える。
【００８４】
次に、ＣＭ３００ａ，３００ｂが実行する処理についてより詳しく説明する。まず、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂによる、ＤＥ２００内のＨＤＤへのアクセス制御について説明する。ＤＥ２００内のＨＤＤへのアクセス制御の状態には、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂの両方がアクセス制御を実行する「冗長運用状態」と、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂの一方のみによってアクセス制御が実行される「単独運用状態」とがある。
【００８５】
図８は、冗長運用状態におけるアクセス制御について示す図である。
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂの両方が正常に動作しているとき、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＤＥ２００内のＨＤＤの記憶領域のうち、それぞれ個別のボリューム（記憶領域）に対するアクセス制御を行う。図８の例では、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＤＥ２００内のＨＤＤの記憶領域のうちボリュームＶｏｌ＃０に対するアクセス制御を行う。また、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＤＥ２００内のＨＤＤの記憶領域のうち、ボリュームＶｏｌ＃０とは別の領域であるボリュームＶｏｌ＃１に対するアクセス制御を行う。
【００８６】
また、冗長運用状態において、Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃０に記憶されたデータを、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａにキャッシュする。同様に、Ｉ／Ｏアクセス制御部３２１ｂは、ボリュームＶｏｌ＃１に記憶されたデータを、ＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂにキャッシュする。
【００８７】
例えば、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０からボリュームＶｏｌ＃０内のデータのリード要求を受けたとき、リードが要求されたデータがローカルキャッシュ領域３４１ａに存在する場合には、リードが要求されたデータをローカルキャッシュ領域３４１ａから読み出し、ホスト装置１２０に返信する。また、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０から、ローカルキャッシュ領域３４１ａに存在するデータのライト要求を受けたとき、ローカルキャッシュ領域３４１ａ内のライト対象のデータをホスト装置１２０から受信したライトデータによって更新する。その後、Ｉ／Ｏアクセス制御部３２１ａは、ＤＥ２００内のＨＤＤにおけるライト対象データをライトデータによって更新する。
【００８８】
さらに、ローカルキャッシュ領域に記憶されたキャッシュデータは、他方のＣＭのＲＡＭに二重化される。図８において、ＣＭ３００ｂのＲＡＭ３０２ｂに生成されたミラーキャッシュ領域３４２ｂには、ＣＭ３００ａのローカルキャッシュ領域３４１ａに記憶されたものと同じキャッシュデータが格納される。また、ＣＭ３００ａのＲＡＭ３０２ａに生成されたミラーキャッシュ領域３４２ａには、ＣＭ３００ｂのローカルキャッシュ領域３４１ｂに記憶されたものと同じキャッシュデータが格納される。
【００８９】
Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａのデータを更新するたびに、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに対して、ミラーキャッシュ領域３４２ｂのデータをローカルキャッシュ領域３４１ａと同様に更新するように要求する。また、Ｉ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂのデータを更新するたびに、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａに対して、ミラーキャッシュ領域３４２ａのデータをローカルキャッシュ領域３４１ｂと同様に更新するように要求する。
【００９０】
図９は、単独運用状態におけるアクセス制御について示す図である。
Ｉ／Ｏアクセス制御部は、他方のＣＭ内のＲｏＣの動作が異常発生などによって停止すると、他方のＣＭ内のＲｏＣを復旧モードで再起動させるとともに、他方のＣＭ内のＲｏＣが復旧するまでの間、他方のＣＭ内のＩ／Ｏアクセス制御部が実行していたアクセス制御を、自装置内のミラーキャッシュ領域に記憶されたデータを用いて引き継ぐ。
【００９１】
図９では、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が停止した場合の例を示している。この場合、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＣＭ３００ｂの起動制御部３２４ｂに対して、ＲｏＣ３０１ｂを復旧モードで再起動させるように要求する。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、単独運用状態に遷移する。単独運用状態では、Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃０に対するアクセス制御だけでなく、ボリュームＶｏｌ＃１に対するアクセス制御も実行する。Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のミラーキャッシュ領域３４２ａのデータをキャッシュデータとして使用して、ボリュームＶｏｌ＃１に対するアクセス制御を継続して実行する。
【００９２】
なお、ＣＭ３００ｂのＲｏＣ３０１ｂが正常に再起動し、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂとの通信が回復すると、Ｉ／Ｏアクセス制御部３２１ａは、Ｉ／Ｏアクセス制御部３２１ｂを通じて、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａにそれぞれ記憶されたデータをＣＭ３００ｂ内のミラーキャッシュ領域３４２ｂおよびローカルキャッシュ領域３４１ｂに二重化する処理を行う。そして、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、冗長運用状態でのアクセス制御を開始する。ただし、ＣＭ３００ａが単独運用状態であった期間にローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａにおけるデータの更新がなかった場合には、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂのデータを更新することなく、ボリュームＶｏｌ＃１に対するアクセス制御を再開することが可能である。
【００９３】
ところで、Ｉ／Ｏアクセス制御部は、次の図１０に示すように、構成情報テーブルに設定された制御データに基づいてアクセス制御を行う。また、構成情報テーブルに設定された制御データが更新されるたびに、構成情報更新回数がカウントアップされる。
【００９４】
図１０は、構成情報テーブルおよび構成情報更新回数の更新処理について示す図である。
構成情報テーブル３５１ａは、例えば、ＣＭ３００ａのＳＳＤ３０３ａに記憶され、構成情報テーブル３５１ｂは、例えば、ＣＭ３００ｂのＳＳＤ３０３ｂに記憶される。構成情報テーブル３５１ａ，３５１ｂには、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂがＤＥ２００内のＨＤＤに対するアクセス制御を行う上で必要な制御データが設定されている。例えば、構成情報テーブル３５１ａ，３５１ｂには、ＲＡＩＤレベルを示す情報、ＲＡＩＤグループを構成する物理ボリュームに関する情報などが設定される。Ｉ／Ｏアクセス制御部３２１ａは、構成情報テーブル３５１ａに設定された制御データに基づいてアクセス制御を行い、Ｉ／Ｏアクセス制御部３２１ｂは、構成情報テーブル３５１ｂに設定された制御データに基づいてアクセス制御を行う。
【００９５】
また、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ，３００ｂに格納された構成情報テーブル３５１ａ，３５１ｂの内容が同一になるように制御する。例えば、図１０に示すように、管理端末１３０からＣＭ３００ａに対して、構成情報テーブル３５１ａの設定変更が要求される。ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、管理端末１３０からの要求に従って、構成情報テーブル３５１ａの設定変更を行う。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップする。
【００９６】
さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、構成情報テーブル３５１ａに対して行った設定変更を、ＣＭ３００ｂ内の構成情報テーブル３５１ｂにも反映して、構成情報テーブルを二重化する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａからの要求に応じて構成情報テーブル３５１ｂの設定変更を行うと、ＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂをカウントアップする。これにより、ＣＭ３００ａ内の構成情報更新回数３３１ａとＣＭ３００ｂ内の構成情報更新回数３３１ｂとが常に同じ値となるように同期がとられる。
【００９７】
以上のように、ＣＭ３００ａ内の構成情報テーブル３５１ａとＣＭ３００ｂ内の構成情報テーブル３５１ｂとが常に同じ内容になるように制御されることで、例えば、冗長運用状態から一方のＣＭが単独運用状態に移行した場合でも、単独運用状態に移行したＣＭに記憶された構成情報テーブルの制御データを利用して、ＨＤＤのアクセス制御を即座に開始できるようになる。
【００９８】
次に、図１１は、両ＣＭ復旧処理について示す図である。
両ＣＭ復旧処理は、ＣＭ３００ａ内のＲｏＣ３０１ａの動作とＣＭ３００ｂ内のＲｏＣ３０１ｂの動作とが同時に停止した場合に、各ＣＭ３００ａ，３００ｂ内に記憶されたキャッシュデータを失うことなく、各ＣＭ３００ａ，３００ｂによるＨＤＤへのアクセス制御を短時間で復旧させるものである。各ＣＭの復旧制御部は、自ＣＭ内のＲｏＣの動作と他方のＣＭ内のＲｏＣの動作がともに停止したことを検知すると、両ＣＭ復旧処理を開始する。
【００９９】
図１１では例として、ＣＭ３００ａ内の復旧制御部３２２ａの制御による両ＣＭ復旧処理について示している。ＣＭ３００ａの監視部３２３ａは、ＣＭ３００ａ内のＲｏＣ３０１ａが正常に動作しているか否かを監視し、ＲｏＣ３０１ａの動作が停止すると、その旨を復旧制御部３２２ａに通知する。また、ＣＭ３００ｂの監視部３２３ｂは、ＣＭ３００ｂ内のＲｏＣ３０１ｂが正常に動作しているか否かを監視する。ＣＭ３００ａの監視部３２３ａは、ＣＭ３２３ｂを通じて、ＣＭ３００ｂ内のＲｏＣ３０１ｂが正常に動作しているかを検知でき、ＲｏＣ３０１ｂの動作が停止したことを検知すると、その旨を復旧制御部３２２ａに通知する。
【０１００】
復旧制御部３２２ａは、監視部３２３ａからの通知に基づき、ＲｏＣ３０１ａ，３０１ｂの両方の動作が停止したことを検知すると、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂの両方を復旧モードで再起動させる。復旧制御部３２２ａは、ＣＭ３００ａの起動制御部３２４ａに対して、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させるように要求するとともに、起動制御部３２４ａを通じてＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように要求する。
【０１０１】
復旧制御部３２２ａからの要求に応じて、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂはともに再起動し、ＲｏＣ３０１ａとＲｏＣ３０１ｂとの通信が再開される。このとき、ＣＭ３００ａのＲＡＭ３０２ａには、ＲｏＣ３０１ａの動作が停止した際に記憶されていたキャッシュデータが保持されており、ＣＭ３００ｂのＲＡＭ３０２ｂには、ＲｏＣ３０１ｂの動作が停止した際に記憶されていたキャッシュデータが保持されている。従って、ＲｏＣ３０１ａが再起動すると、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａに記憶されたキャッシュデータを用いてボリュームＶｏｌ＃０に対するアクセス制御を即座に再開できる。同様に、ＲｏＣ３０１ｂが再起動すると、Ｉ／Ｏアクセス制御部３２１ｂは、ＲＡＭ３０２ｂに記憶されたキャッシュデータを用いてボリュームＶｏｌ＃１に対するアクセス制御を即座に再開できる。
【０１０２】
ところで、上記の両ＣＭ復旧処理は、２つのＲｏＣ３０１ａ，３０１ｂの動作が同時に停止してしまった場合に、キャッシュデータを失うことなくＨＤＤへのアクセス制御を復旧させるものであった。しかしながら、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合には、次の図１２に示すように、最新のキャッシュデータが失われてしまうことがあった。
【０１０３】
図１２は、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作の参考例を示すタイムチャートである。図１２では例として、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が先に停止し、その後にＣＭ３００ａ内のＲｏＣ３０１ａの動作が停止した場合の例を示す。
【０１０４】
図１２の初期状態では、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂが、冗長運用状態で動作しているものとする。この状態から、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が異常発生などによって停止すると（タイミングＴ１１）、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂの動作停止を検知し、ＲｏＣ３０１ｂを復旧モードで再起動させるようにＣＭ３００ｂの起動制御部３２４ｂに要求する（タイミングＴ１２）。
【０１０５】
ＣＭ３００ｂのＲｏＣ３０１ｂは、復旧モードでの再起動処理を開始する。この再起動処理では、ＲｏＣ３０１ｂがリセットされるものの、ＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂの各データは保持されたままになる。
【０１０６】
一方、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、単独運用状態に遷移し、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａをキャッシュ領域として用いて、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を継続する。また、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０からボリュームＶｏｌ＃０またはボリュームＶｏｌ＃１へのライト要求を受け付けると、ＲＡＭ３０２ａ内のキャッシュデータを更新する（タイミングＴ１３）。ＲＡＭ３０２ａ内のキャッシュデータが更新された場合、ＣＭ３００ｂのＲＡＭ３０２ｂに記憶されたキャッシュデータは、使用不可能な古いキャッシュデータとなる。
【０１０７】
ここで、ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了する前に、ＣＭ３００ａのＲｏＣ３０１ａの動作が異常発生などによって停止したとする（タイミングＴ１４）。ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了すると、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＣＭ３００ａのＲｏＣ３０１ａとの接続確認を行う（タイミングＴ１５）。しかし、ＣＭ３００ａのＲｏＣ３０１ａは停止状態であるので、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、接続不能と判定する。
【０１０８】
Ｉ／Ｏアクセス制御部３２１ｂは、他方のＲｏＣ３０１ａとの接続が不能であった場合、単独運用状態でアクセス制御を行うべきと判定し、ＣＭ３００ａの起動制御部３２４ａに対して、ＣＭ３００ａをＦａｕｌｔ状態（電源切断状態）に遷移させるように要求する。これとともに、Ｉ／Ｏアクセス制御部３２１ｂは、単独運用状態でアクセス制御を行うための初期設定処理を実行する（タイミングＴ１６）。Ｉ／Ｏアクセス制御部３２１ｂは、初期設定処理として、例えば、ＣＭ３００ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂをともにキャッシュ領域として使用するための設定や、ボリュームＶｏｌ＃０，Ｖｏｌ＃１をアクセス制御の対象とするための設定などを行う。Ｉ／Ｏアクセス制御部３２１ｂは、初期設定処理を完了すると、単独運用状態でのアクセス制御を開始する（タイミングＴ１７）。
【０１０９】
以上の図１２の処理において、例えば、タイミングＴ１２〜Ｔ１４の期間にＣＭ３００ａのＲＡＭ３０９ａ内のキャッシュデータが更新されなかった場合には、ＣＭ３００ｂのＲｏＣ３０１ｂが再起動した後も、ＣＭ３００ｂのＲＡＭ３０９ｂに記憶されたキャッシュデータは最新のものとなる。従って、タイミングＴ１７において、ＣＭ３００ｂのＲｏＣ３０１ｂは、ＲＡＭ３０９ｂのローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂの各データをキャッシュデータとして用いて、単独運用状態でのアクセス制御を問題なく実行できる。
【０１１０】
しかしながら、タイミングＴ１２〜Ｔ１４の期間にＣＭ３００ａのＲＡＭ３０９ａ内のキャッシュデータが更新された場合には、ＣＭ３００ｂのＲＡＭ３０９ｂ内のキャッシュデータは古いキャッシュデータとなる。この状態で、ＣＭ３００ａのＲｏＣ３０１ａの動作が停止して（タイミングＴ１４）、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂが単独運用状態でのアクセス制御を開始（タイミングＴ１７）すると、ＣＭ３００ａのＲｏＣ３０１ａが動作停止状態になることから、ＣＭ３００ａのＲＡＭ３０２ａに記憶されていた最新のキャッシュデータが失われてしまう。タイミングＴ１２〜Ｔ１４の期間にＩ／Ｏアクセス制御部３２１ａが受け付けたライトデータがＤＥ２００のＨＤＤに書き込まれる前に、ＣＭ３００ａのＲｏＣ３０１ａの動作が停止した場合には、ＨＤＤに書き込まれていないライトデータが失われてしまう。
【０１１１】
もし、ライトデータが失われた状態でアクセス制御が再開されてしまうと、各ＣＭ３００ａ，３００ｂにおけるログを調査して発生事象を突き止め、失ったライトデータを復旧するといった管理者による作業が必要となる。このため、アクセス制御を再開するまでに長い時間を要してしまう。
【０１１２】
そこで、本実施の形態のストレージシステム１００では、ＲｏＣが他方のＣＭからの要求に応じて起動したとき、他方のＣＭと接続できない場合には、他方のＣＭを復旧モードで再起動させることで、他方のＣＭに保持された最新のキャッシュデータが失われないようにする。
【０１１３】
図１３，図１４は、第２の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図１３，図１４では例として、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が先に停止し、その後にＣＭ３００ａ内のＲｏＣ３０１ａの動作が停止した場合の例を示す。
【０１１４】
図１３の初期状態では、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂが、冗長運用状態で動作しているものとする。この状態から、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が異常発生などによって停止すると（タイミングＴ２１）、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂの動作停止を検知する（タイミングＴ２２）。
【０１１５】
ＲｏＣ３０１ｂの動作停止を検知したＩ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを「０」から「１」にするように要求する。また、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように要求する。
【０１１６】
さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ａのＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップする。図１０で説明したように、ＲｏＣ３０１ａ，３０１ｂがともに正常動作中であれば、ＣＭ３００ａ内の構成情報更新回数３３１ａとＣＭ３００ｂ内の構成情報更新回数３３１ｂとは同じ値とされる。しかしながら、タイミングＴ２２では、ＣＭ３００ｂのＲｏＣ３０１ｂは動作停止状態であるので、ＣＭ３００ａ内の構成情報更新回数３３１ａのみがカウントアップされる。
【０１１７】
ＣＭ３００ｂのＲｏＣ３０１ｂは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、ＲｏＣ３０１ｂは、電源回路３１０ｂからの電源供給が一時的に停止されることでリセットされた後、ＳＳＤ３０３ａからプログラムを読み込んで、プログラムに従った最初の処理である接続確認処理を実行可能な状態になる。また、ＲｏＣ３０１ｂの再起動処理の間、ＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂの各データは保持される。
【０１１８】
一方、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、単独運用状態に遷移し、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａをキャッシュ領域として用いて、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を継続する。また、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０からボリュームＶｏｌ＃０またはボリュームＶｏｌ＃１へのライト要求を受け付けると、ＲＡＭ３０２ａ内のキャッシュデータを更新する（タイミングＴ２３）。
【０１１９】
ここで、ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了する前に、ＣＭ３００ａのＲｏＣ３０１ａの動作が異常発生などによって停止したとする（タイミングＴ２４）。ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了すると、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＣＭ３００ａのＲｏＣ３０１ａとの接続確認を行う（タイミングＴ２５）。しかし、ＣＭ３００ａのＲｏＣ３０１ａは停止状態であるので、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、接続不能と判定する。
【０１２０】
Ｉ／Ｏアクセス制御部３２１ｂは、他方のＲｏＣ３０１ａとの接続が不能であった場合、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを参照し、起動フラグ３３２ｂの値に応じた処理を実行する。Ｉ／Ｏアクセス制御部３２１ｂは、起動フラグ３３２ｂが「１」であった場合には、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作を停止させる（タイミングＴ２６）。
【０１２１】
なお、Ｉ／Ｏアクセス制御部３２１ｂは、他方のＲｏＣ３０１ａとの接続が不能であり、かつ、起動フラグ３３２ｂが「０」であった場合には、単独運用状態でアクセス制御を行うための初期設定処理を実行し、初期設定処理の後、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を単独で実行する。
【０１２２】
タイミングＴ２６においてＣＭ３００ｂのＲｏＣ３０１ｂが動作停止状態になると、図１４に示すように、ＣＭ３００ａの復旧制御部３２２ａまたはＣＭ３００ｂの復旧制御部３２２ｂが、ＲｏＣ３０１ａ，３０１ｂの両方の動作が停止したことを検知する。ここで例えば、ＣＭ３００ａの復旧制御部３２２ａがＲｏＣ３０１ａ，３０１ｂの動作停止を検知したものとすると、復旧制御部３２２ａは、ＲｏＣ３０１ａ，３０１ｂの両方を復旧モードで再起動させる両ＣＭ復旧処理を実行する（タイミングＴ２７）。復旧制御部３２２ａは、ＣＭ３００ａの起動制御部３２４ａに対して、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させるように要求するとともに、ＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように、起動制御部３２４ａを通じて要求する。
【０１２３】
復旧制御部３２２ａからの要求に応じて、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂは、ともにキャッシュデータを保持した状態のまま再起動処理を開始する。ＲｏＣ３０１ａ，３０１ｂのそれぞれによる再起動処理が完了すると、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂとの間で、通信経路Ｐ１を通じた接続確認が行われる（タイミングＴ２８）。このとき、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内のＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａと、ＣＭ３００ｂ内のＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂとを比較する。
【０１２４】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内の構成情報更新回数３３１ａの方がＣＭ３００ｂ内の構成情報更新回数３３１ｂより大きいことから、ＣＭ３００ａ内のキャッシュデータが有効である（すなわち最新のものである）と判定する。Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、冗長運用状態でアクセス制御を行うための初期設定処理を実行する（タイミングＴ２９）。なお、この初期設定処理の開始段階において、ＣＭ３００ｂ内の構成情報更新回数３３１ｂがカウントアップされ、構成情報更新回数３３１ａ，３３１ｂが同期した状態にされる。
【０１２５】
タイミングＴ２９からの初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内に保持されたキャッシュデータを二重化する処理を行う。Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａに記憶されたデータを、他方のＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送する。Ｉ／Ｏアクセス制御部３２１ｂは、ＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを破棄する。そして、ローカルキャッシュ領域３４１ａから転送されたデータをミラーキャッシュ領域３４２ｂに格納するとともに、ミラーキャッシュ領域３４２ａから転送されたデータをローカルキャッシュ領域３４１ｂに格納する。
【０１２６】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂのそれぞれの初期設定処理が完了すると、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、冗長運用状態でのアクセス制御を開始する（タイミングＴ３０）。
【０１２７】
以上の図１３，図１４の処理では、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、起動したとき、他方のＣＭ３００ａからの要求に応じて再起動したのか否かを、起動フラグ３３２ｂに基づいて判定することができる。ＣＭ３００ｂのＲｏＣ３０１ｂは、他方のＣＭ３００ａからの要求に応じて再起動したと判定したとき、他方のＣＭ３００ａのＲｏＣ３０１ａが動作停止状態である場合には、ＣＭ３００ｂのＲｏＣ３０１ｂ自身の動作を停止させる。ＲｏＣ３０１ｂは、ＲｏＣ３０１ｂ自身の動作を停止させて、両ＣＭ復旧処理が実行される状態を意図的につくり出すことで、有効なキャッシュデータが保持された他方のＲｏＣ３０１ａを復旧モードで再起動させる。これにより、ＲｏＣ３０１ａ，３０１ｂは、ＲｏＣ３０１ａに保持された有効なキャッシュデータを利用して、ＤＥ２００のＨＤＤに対するアクセス制御を再開することができる。
【０１２８】
従って、上記処理により、ＣＭ３００ｂのＲｏＣ３０１ｂの動作と、ＣＭ３００ａのＲｏＣ３０１ａの動作が間隔を置いて連続的に停止した場合でも、最新のキャッシュデータを失うことなく、アクセス制御を再開することができる。また、ＣＭ３００ｂのＲｏＣ３０１ｂの動作と、ＣＭ３００ａのＲｏＣ３０１ａの動作が間隔を置いて連続的に停止した場合でも、管理者が何ら作業を行うことなく、アクセス制御を短時間で自動的に再開させることができる。
【０１２９】
また、両ＣＭ復旧処理が実行され、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂとの間で接続確認が行われたとき（タイミングＴ２８）、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、構成情報更新回数３３１ａ，３３１ｂを比較することで、有効なキャッシュデータがＣＭ３００ａ，３００ｂのどちらにあるかを判定する。このように、有効なキャッシュデータがＣＭ３００ａ，３００ｂのどちらにあるかを、他の目的で使用されている情報である構成情報更新回数３３１ａ，３３１ｂを使って判定することで、判定に必要な情報を減らすことができる。
【０１３０】
なお、構成情報テーブル３５１ａ，３５１ｂには、ＲｏＣ３０１ａ，３０１ｂの動作が停止するなどの異常事象の発生履歴が記述されてもよい。この場合、例えば、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、図１３のタイミングＴ２２においてＣＭ３００ｂ内のＲｏＣ３０１ｂの動作停止を検知した際に、構成情報テーブル３５１ａ内の異常事象発生履歴にＲｏＣ３０１ｂの動作が停止したことを記述し、このような構成情報テーブル３５１ａ内の異常事象発生履歴の更新に伴って、構成情報更新回数３３１ａをカウントアップしてもよい。ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、その後、ＣＭ３００ａのＲｏＣ３０１ａが再起動してアクセス制御のための初期設定を開始する際（図１４のタイミングＴ２９、および後述する図１７のステップＳ３５に対応）に、構成情報テーブル３５１ａの内容をＣＭ３００ｂ内の構成情報テーブル３５１ｂに反映する二重化処理を行う。
【０１３１】
次に、第２の実施の形態に係るＣＭの処理を、フローチャートを用いて説明する。ここでは例として、ＣＭ３００ａにおける処理について説明するが、ＣＭ３００ｂも同様の処理を実行可能である。
【０１３２】
図１５は、Ｉ／Ｏアクセス制御部による他方のＲｏＣの動作監視処理を示すフローチャートである。この図１５の処理は、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａが冗長運用状態でアクセス制御を行っている際に、Ｉ／Ｏアクセス制御部３２１ａが実行するものである。
【０１３３】
［ステップＳ１１］Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が停止していないかを監視する。Ｉ／Ｏアクセス制御部３２１ａは、例えば、ＣＭ３００ｂのＲｏＣ３０１ｂとの間で、通信経路Ｐ１を通じて生存確認用の通信を定期的に行うことで、ＲｏＣ３０１ｂの動作が停止しているか否かを判定する。Ｉ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂの動作が停止したと判定すると（Ｓ１１：Ｙｅｓ）、ステップＳ１２の処理を実行する。
【０１３４】
［ステップＳ１２］Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内の起動フラグ３３２ｂを「０」から「１」に更新するように、起動制御部３２４ａを通じてＣＭ３００ｂ内の起動制御部３２４ｂに要求する。要求を受けたＣＭ３００ｂ内の起動制御部３２４ｂは、Ｉ／Ｏアクセス制御部３２１ａからの要求に応じて、ＮＶＲＡＭ３０９ｂに記憶した起動フラグ３３２ｂの値を「１」に更新する。
【０１３５】
［ステップＳ１３］Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように、起動制御部３２４ａを通じてＣＭ３００ｂ内の起動制御部３２４ｂに要求する。ＣＭ３００ｂ内の起動制御部３２４ｂは、Ｉ／Ｏアクセス制御部３２１ａからの要求に応じて、ＲＡＭ３０２ｂへの電源供給を継続したまま、ＲｏＣ３０１ｂへの電源供給を一時的に停止してＲｏＣ３０１ｂをリセットした後、ＲｏＣ３０１ｂを起動させる。
【０１３６】
［ステップＳ１４］Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ａのＮＶＲＡＭ３０９ａに記憶した構成情報更新回数３３１ａをカウントアップする。
図１６は、復旧制御部の処理を示すフローチャートである。
【０１３７】
［ステップＳ２１］ＣＭ３００ａの監視部３２３ａは、ＣＭ３００ａ内のＲｏＣ３０１ａが正常に動作しているか否かを監視し、ＲｏＣ３０１ａの動作が停止すると、その旨を復旧制御部３２２ａに通知する。また、ＣＭ３００ｂの監視部３２３ｂは、ＣＭ３００ｂ内のＲｏＣ３０１ｂが正常に動作しているか否かを監視する。ＣＭ３００ａの監視部３２３ａは、ＣＭ３２３ｂを通じて、ＣＭ３００ｂ内のＲｏＣ３０１ｂが正常に動作しているかを検知でき、ＲｏＣ３０１ｂの動作が停止したことを検知すると、その旨を復旧制御部３２２ａに通知する。
【０１３８】
復旧制御部３２２ａは、監視部３２３ａからの、ＲｏＣ３０１ａ，３０１ｂの各動作が停止したことの通知を監視する。復旧制御部３２２ａは、監視部３２３ａからの通知に基づき、ＲｏＣ３０１ａ，３０１ｂの動作がともに停止したことを検知すると（Ｓ２１：Ｙｅｓ）、ステップＳ２２の処理を実行する。
【０１３９】
［ステップＳ２２］復旧制御部３２２ａは、両ＣＭ復旧処理を実行する。復旧制御部３２２ａは、起動制御部３２４ａに対して、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させるように要求するとともに、起動制御部３２４ａを通じてＣＭ３００ｂの起動制御部３２４ｂに対して、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるように要求する。ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂは、復旧制御部３２２ａからの要求に応じて、それぞれキャッシュデータを保持した状態のまま再起動する。
【０１４０】
図１７，図１８は、ＲｏＣの起動時の処理を示すフローチャートである。なお、図１７のフローチャートの処理は、ＣＭ３００ａが電源切断状態から起動する場合や、ＣＭ３００ａが自身または他方のＣＭ３００ｂからの要求に応じて再起動する場合に、開始される。
【０１４１】
［ステップＳ３１］ＲｏＣ３０１ａの起動処理が実行される。この起動処理では、例えば、ＲｏＣ３０１ａ内のハードウェアの初期化や、ＳＳＤ３０３ａからＲｏＣ３０１ａへのアクセス制御プログラムの読み込みなどが実行される。ＲｏＣ３０１ａのＣＰＵがアクセス制御プログラムの実行を開始することにより、Ｉ／Ｏアクセス制御部３２１ａが起動する。
【０１４２】
［ステップＳ３２］Ｉ／Ｏアクセス制御部３２１ａは、通信経路Ｐ１を通じて、他方のＲｏＣ３０１ｂと接続可能であるか否かを判定する。Ｉ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂと接続できた場合（Ｓ３２：Ｙｅｓ）には、ステップＳ３３の処理を実行し、ＲｏＣ３０１ｂと接続できなかった場合（Ｓ３２：Ｎｏ）には、ステップＳ３９の処理を実行する。
【０１４３】
［ステップＳ３３］Ｉ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａを読み込む。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂを読み込む。
【０１４４】
Ｉ／Ｏアクセス制御部３２１ａは、読み込んだ構成情報更新回数３３１ａ，３３１ｂの各値を比較する。Ｉ／Ｏアクセス制御部３２１ａは、構成情報更新回数３３１ａ，３３１ｂの各値が一致した場合には、ステップＳ３４の処理を実行する。また、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂから読み込んだ構成情報更新回数３３１ｂより、ＣＭ３００ａ内の構成情報更新回数３３１ａの方が大きい場合には、ステップＳ３５の処理を実行する。また、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂから読み込んだ構成情報更新回数３３１ｂより、ＣＭ３００ａ内の構成情報更新回数３３１ａの方が小さい場合には、ステップＳ３７の処理を実行する。
【０１４５】
［ステップＳ３４］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。このとき、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａに記憶されたデータの転送や更新は、行われない。Ｉ／Ｏアクセス制御部３２１ａは、初期設定処理を完了すると、冗長運用状態でのアクセス制御を開始する。
【０１４６】
このステップＳ３４の処理は、例えば、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂが冗長運用状態でアクセス制御を正常に行っているときに、ＲｏＣ３０１ａ，３０１ｂの各動作が同時に停止することで両ＣＭ復旧処理が実行され、両ＣＭ復旧処理に伴ってＲｏＣ３０１ａが起動した場合に、実行される。この場合、ＣＭ３００ａ，３００ｂのどちらが保持するキャッシュデータも最新であるので、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュデータの二重化処理をあらためて行うことなく、冗長運用状態でのアクセス制御を再開する。
【０１４７】
［ステップＳ３５］ＣＭ３００ｂ内の構成情報更新回数３３１ｂよりＣＭ３００ａ内の構成情報更新回数３３１ａの方が大きい場合、Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａに記憶されたデータを、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに送信して、キャッシュデータの更新を要求する。ＣＭ３００ｂのアクセス制御部３２１ｂは、ＲＡＭ３０２ｂ内のキャッシュデータを破棄した後、ＣＭ３００ａ内のローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａから送信されたデータを、ＣＭ３００ｂ内のミラーキャッシュ領域３４２ｂおよびローカルキャッシュ領域３４１ｂにそれぞれ格納する。
【０１４８】
［ステップＳ３６］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＣＭ３００ｂ内の構成情報更新回数３３１ｂを構成情報更新回数３３１ａの値に更新するように、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、例えば、ＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂをカウントアップすることで、構成情報更新回数３３１ｂの値を構成情報更新回数３３１ａの値と一致させる。
【０１４９】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップＳ３１〜Ｓ３３，Ｓ３５，Ｓ３６と進行する処理は、例えば、図１４のタイミングＴ２７で再起動した後のＣＭ３００ａの処理に対応する。
【０１５０】
［ステップＳ３７］Ｉ／Ｏアクセス制御部３２１ｂは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のキャッシュデータを破棄した後、他方のＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから、ローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを受信する。Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂから送信されたデータを、ミラーキャッシュ領域３４２ａおよびローカルキャッシュ領域３４１ａにそれぞれ格納する。
【０１５１】
［ステップＳ３８］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから、ＣＭ３００ａ内の構成情報更新回数３３１ａについての更新要求を受け付ける。更新要求を受けたＩ／Ｏアクセス制御部３２１ａは、例えば、ＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップすることで、構成情報更新回数３３１ａの値を構成情報更新回数３３１ｂの値と一致させる。
【０１５２】
Ｉ／Ｏアクセス制御部３２１ｂは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップＳ３１〜Ｓ３３，Ｓ３７，Ｓ３８と進行する処理は、例えば、図１４のタイミングＴ２７で再起動した後のＣＭ３００ｂの処理に対応する。
【０１５３】
［ステップＳ３９］Ｉ／Ｏアクセス制御部３２１ａは、他方のＲｏＣ３０１ｂと接続できなかった場合、ＮＶＲＡＭ３０９ａに記憶された起動フラグ３３２ａを参照する。Ｉ／Ｏアクセス制御部３２１ａは、起動フラグ３３２ａの値が「１」である場合には、ステップＳ４０の処理を実行し、起動フラグ３３２ａの値が「０」である場合には、ステップＳ４２の処理を実行する。
【０１５４】
［ステップＳ４０］Ｉ／Ｏアクセス制御部３２１ａは、起動フラグ３３２ａの値を「０」に更新する。
［ステップＳ４１］Ｉ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ａの動作を停止させ、ＲｏＣ３０１ａの動作が異常発生により停止した場合と同じ状態を意図的につくり出す。
【０１５５】
なお、ステップＳ３１，Ｓ３２，Ｓ３９〜Ｓ４１と進行する処理は、例えば、図１３のタイミングＴ２２で再起動してからタイミングＴ２６でＲｏＣ３０１ｂの動作を停止するまでのＣＭ３００ｂの処理に対応する。従って、ステップＳ４１の処理の後、両ＣＭ復旧処理が実行されることで、ＲｏＣ３０１ａは復旧モードで再起動する。
【０１５６】
［ステップＳ４２］起動フラグ３３２ａが０であった場合、Ｉ／Ｏアクセス制御部３２１ａは、単独運用状態でアクセス制御を実行するための初期設定処理を実行する。Ｉ／Ｏアクセス制御部３２１ａは、初期設定処理において、例えば、アクセス制御の対象としてボリュームＶｏｌ＃０，Ｖｏｌ＃１を設定する処理や、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａのそれぞれに記憶されたデータをキャッシュデータとして利用するための設定処理などを行う。Ｉ／Ｏアクセス制御部３２１ａは、初期設定処理を完了すると、単独運用状態で、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を開始する。
【０１５７】
なお、ステップＳ３１，Ｓ３２，Ｓ３９，Ｓ４２と進行する処理は、例えば、図１４のタイミングＴ２７において両ＣＭ復旧処理が開始されて、ＣＭ３００ｂのＲｏＣ３０１ｂが再起動したときに、他方のＣＭ３００ａのＲｏＣ３０１ａが正常に起動できなかった場合の処理に対応する。この場合、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、他方のＣＭ３００ａのＲｏＣ３０１ａとの接続ができず（ステップＳ３２のＮｏ）、起動フラグ３３２ｂが「０」である（ステップＳ３９）ことから、単独運用状態でアクセス制御を行うための初期設定（ステップＳ４２）を行った後、単独運用状態でのアクセス制御を開始する。
【０１５８】
なお、図１４で説明した処理では、タイミングＴ２８においてＲｏＣ３０１ａとＲｏＣ３０１ｂとの接続確認が行われた後、タイミングＴ２９において、有効なキャッシュデータを保持していないＣＭ３００ｂのＲｏＣ３０１ｂに初期設定処理を開始させた。しかしながら、他の処理手順として、例えば、タイミングＴ２９において、ＣＭ３００ａのＩ／Ｏアクセス制御部３０１ａは、他方のＲｏＣ３０１ｂを通常モードで再起動させてもよい。この場合、ＲｏＣ３０１ｂは、ＲＡＭ３０２ｂに保持されたキャッシュデータを破棄して再起動する。Ｉ／Ｏアクセス制御部３０１ａは、例えば、ＲｏＣ３０１ｂが再起動してＲｏＣ３０１ｂとの接続が確認されるまでの間、単独運用状態でボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を実行する。Ｉ／Ｏアクセス制御部３２１ａは、再起動したＲｏＣ３０１ｂとの接続を確認した後、Ｉ／Ｏアクセス制御部３０１ｂが初期設定処理を実行する過程で、ＲＡＭ３０２ａに記憶されたキャッシュデータを他方のＣＭ３００ｂのＲＡＭ３０２ｂに二重化する処理を行う。Ｉ／Ｏアクセス制御部３０１ｂによる初期設定処理が完了すると、Ｉ／Ｏアクセス制御部３０１ａ，３０１ｂによる冗長運用状態でのアクセス制御が再開される。
【０１５９】
また、別の処理手順として、例えば、タイミングＴ２９において、ＣＭ３００ａのＩ／Ｏアクセス制御部３０１ａは、他方のＣＭ３００ｂをＦａｕｌｔ状態（電源切断状態）に遷移させ、単独運用状態でボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を実行してもよい。この場合、図１７のフローチャートでは、Ｉ／Ｏアクセス制御部は、ステップＳ３３において自ＣＭ内の構成情報更新回数の方が他方のＣＭ内の構成情報更新回数より大きい場合、ステップＳ３５の処理で、キャッシュデータの二重化処理を行わない代わりに、他方のＣＭ内のＲｏＣをＦａｕｌｔ状態に遷移させる。なお、ステップＳ３６の処理は実行されなくてよい。また、Ｉ／Ｏアクセス制御部は、ステップＳ３３において自ＣＭ内の構成情報更新回数の方が他方のＣＭ内の構成情報更新回数より小さい場合、ステップＳ３７，Ｓ３８を実行せずに、他方のＣＭからＦａｕｌｔ状態への遷移が要求されるのを待機する。
【０１６０】
このように、図１４のタイミングＴ２９で小さい構成情報更新回数を保持するＣＭ３００ｂをＦａｕｌｔ状態に遷移させるようにした場合には、タイミングＴ２９からＣＭ３００ａのＩ／Ｏアクセス制御部３０１ａによる初期設定処理が行われる間にキャッシュデータの二重化処理が行われない。従って、図１４のタイミングＴ２９で小さい構成情報更新回数を保持するＣＭ３００ｂをＦａｕｌｔ状態に遷移させる場合には、ＣＭ３００ａによってアクセス制御を短時間で再開できるというメリットがある。
【０１６１】
また、以上の第２の実施の形態では、Ｉ／Ｏアクセス制御部は、他方のＣＭ内のＲｏＣの動作が停止したことを検知したとき、他方のＣＭのＲｏＣを復旧モードで再起動させた。しかしながら、Ｉ／Ｏアクセス制御部は、他方のＣＭ内のＲｏＣの動作が停止したことを検知したとき、他方のＣＭのＲｏＣをキャッシュデータを維持しない通常モードで再起動させてもよい。この場合の処理を図１３の処理に適用した場合を考えると、タイミングＴ２２において、ＣＭ３００ａのＩ／Ｏアクセス制御部３０１ａは、ＣＭ３００ｂのＲｏＣ３０１ｂを通常モードで再起動させる。ＲｏＣ３０１ｂが再起動する過程で、ＣＭ３００ｂのＲＡＭ３０２ｂに記憶されたキャッシュデータは失われる。このため、タイミングＴ２２〜Ｔ２４の期間でＣＭ３００ａ内のキャッシュデータが更新されたか否かにかかわらず、ＣＭ３００ｂ内のキャッシュデータは無効なデータとなる。従って、タイミングＴ２４以降で図１３と同様の処理が実行されることで、ＣＭ３００ａに記憶された最新のキャッシュデータを利用して、ＣＭ３００ａ，３００ｂによるアクセス制御を再開することができる。
【０１６２】
〔第３の実施の形態〕
次に、第３の実施の形態に係るストレージシステムとして、第２の実施の形態に係るストレージシステムのＣＭ３００ａ，３００ｂに対して、キャッシュデータの更新回数をカウントする機能を追加したシステムについて説明する。第３の実施の形態におけるＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａおよびＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、両ＣＭ復旧処理によって再起動した際に、各ＣＭが保持する、キャッシュデータの更新回数を比較する。そして、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、更新回数の比較結果に応じて、キャッシュデータの二重化処理を行ってからアクセス制御を開始するか、あるいはキャッシュデータをそのまま使用してアクセス制御を開始するかを判定する。
【０１６３】
図１９は、キャッシュ更新回数のカウント動作を示す図である。
ＣＭ３００ａのＮＶＲＡＭ３０９ａには、キャッシュ更新回数３４３ａ，３４４ａが記憶される。キャッシュ更新回数３４３ａは、ローカルキャッシュ領域３４１ａにおけるデータの更新回数を示し、キャッシュ更新回数３４４ａは、ミラーキャッシュ領域３４２ａにおけるデータの更新回数を示す。一方、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂには、キャッシュ更新回数３４３ｂ，３４４ｂが記憶される。キャッシュ更新回数３４３ｂは、ローカルキャッシュ領域３４１ｂにおけるデータの更新回数を示し、キャッシュ更新回数３４４ｂは、ミラーキャッシュ領域３４２ｂにおけるデータの更新回数を示す。
【０１６４】
ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ａとが冗長運用状態でアクセス制御を行うとき、キャッシュ更新回数３４３ａとキャッシュ更新回数３４３ｂとが同じ値になるように制御されるとともに、キャッシュ更新回数３４４ａとキャッシュ更新回数３４４ｂとが同じ値になるように制御される。
【０１６５】
例えば、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ライトデータなどによってローカルキャッシュ領域３４１ａのデータを更新すると、キャッシュ更新回数３４３ａをカウントアップする。Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａのデータを更新するたびに、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに対して、更新したキャッシュデータを転送し、ミラーキャッシュ領域３４２ｂのデータをローカルキャッシュ領域３４１ａと同様に更新するように要求する。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４３ａをカウントアップするたびに、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに対して、キャッシュ更新回数３４４ｂをキャッシュ更新回数３４３ａと同じ値に更新するように要求する。なお、更新を要求されたＩ／Ｏアクセス制御部３２１ｂは、例えば、キャッシュ更新回数３４４ｂをカウントアップするか、あるいは、他方のＩ／Ｏアクセス制御部３２１ａから受信したキャッシュ更新回数３４３ａによってキャッシュ更新回数３４３ｂを書き替えることにより、キャッシュ更新回数を同期化する。
【０１６６】
ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａからの更新要求を受けたＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、Ｉ／Ｏアクセス制御部３２１ａから転送されたキャッシュデータによってミラーキャッシュ領域３４２ｂを更新する。これとともに、Ｉ／Ｏアクセス制御部３２１ｂは、例えばキャッシュ更新回数３４４ｂをカウントアップすることで、キャッシュ更新回数３４４ｂの値をキャッシュ更新回数３４３ａと同じ値に更新する。
【０１６７】
同様に、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ライトデータなどによってローカルキャッシュ領域３４１ｂのデータを更新すると、キャッシュ更新回数３４３ｂをカウントアップする。Ｉ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂのデータを更新するたびに、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａに対して、更新したキャッシュデータを転送し、ミラーキャッシュ領域３４２ａのデータをローカルキャッシュ領域３４１ｂと同様に更新するように要求する。これとともに、Ｉ／Ｏアクセス制御部３２１ｂは、キャッシュ更新回数３４３ｂをカウントアップするたびに、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａに対して、キャッシュ更新回数３４４ａをキャッシュ更新回数３４３ｂと同じ値に更新するように要求する。
【０１６８】
ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂからの更新要求を受けたＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、Ｉ／Ｏアクセス制御部３２１ｂから転送されたキャッシュデータによってミラーキャッシュ領域３４２ａを更新する。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、例えばキャッシュ更新回数３４４ａをカウントアップすることで、キャッシュ更新回数３４４ａの値をキャッシュ更新回数３４３ｂと同じ値に更新する。
【０１６９】
図２０は、単独運用状態におけるキャッシュ更新回数のカウント動作を示す図である。
前述のように、Ｉ／Ｏアクセス制御部は、他方のＣＭ内のＲｏＣの動作が異常発生などによって停止すると、他方のＣＭ内のＲｏＣを復旧モードで再起動させる。これとともに、Ｉ／Ｏアクセス制御部は、他方のＣＭ内のＲｏＣが復旧するまでの間、他方のＣＭ内のＩ／Ｏアクセス制御部が実行していたアクセス制御を、自装置内のミラーキャッシュ領域に記憶されたデータを用いて引き継ぐ。
【０１７０】
図２０では、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が停止した場合の例を示している。この場合、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させるとともに、単独運用状態に遷移する。単独運用状態では、Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃０に対するアクセス制御だけでなく、ボリュームＶｏｌ＃１に対するアクセス制御も実行する。Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のミラーキャッシュ領域３４２ａのデータをキャッシュデータとして使用して、ボリュームＶｏｌ＃１に対するアクセス制御を継続して実行する。
【０１７１】
このような単独運用状態において、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａのデータを更新するたびに、キャッシュ更新回数３４３ａをカウントアップする。また、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａのデータを更新するたびに、キャッシュ更新回数３４４ａをカウントアップする。
【０１７２】
図２１，図２２は、第３の実施の形態において、２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図２１，図２２では例として、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が先に停止し、その後にＣＭ３００ａ内のＲｏＣ３０１ａの動作が停止した場合の例を示す。
【０１７３】
図２１の初期状態では、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂが、冗長運用状態で動作しているものとする。この状態から、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が異常発生などによって停止すると（タイミングＴ４１）、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂの動作停止を検知する（タイミングＴ４２）。
【０１７４】
ＲｏＣ３０１ｂの動作停止を検知したＩ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを「０」から「１」に更新させるとともに、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させる。さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ａのＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップする。
【０１７５】
ＣＭ３００ｂのＲｏＣ３０１ｂは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、ＣＭ３００ｂのＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂの各データは保持される。
【０１７６】
一方、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、単独運用状態に遷移し、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａをキャッシュ領域として用いて、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を継続する。また、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０からボリュームＶｏｌ＃０またはボリュームＶｏｌ＃１へのライト要求を受け付けると、ＲＡＭ３０２ａ内のキャッシュデータを更新するとともに、更新したキャッシュ領域に対応するキャッシュ更新回数をカウントアップする（タイミングＴ４３）。このとき、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＲｏＣ３０１ｂと通信できない状態であるので、ＣＭ３００ａ内に記憶されたキャッシュ更新回数のみカウントアップし、ＣＭ３００ｂ内の記憶されたキャッシュ更新回数をカウントアップさせない。
【０１７７】
ここで、ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了する前に、ＣＭ３００ａのＲｏＣ３０１ａの動作が異常発生などによって停止したとする（タイミングＴ４４）。ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了すると、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＣＭ３００ａのＲｏＣ３０１ａとの接続確認を行う（タイミングＴ４５）。しかし、ＣＭ３００ａのＲｏＣ３０１ａは停止状態であるので、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、接続不能と判定する。
【０１７８】
Ｉ／Ｏアクセス制御部３２１ｂは、第２の実施の形態と同様に、他方のＲｏＣ３０１ａとの接続が不能であった場合、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを参照し、起動フラグ３３２ｂの値に応じた処理を実行する。Ｉ／Ｏアクセス制御部３２１ｂは、起動フラグ３３２ｂが「１」であった場合には、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作を停止させる（タイミングＴ４６）。
【０１７９】
タイミングＴ４６においてＣＭ３００ｂのＲｏＣ３０１ｂが動作停止状態になると、図２２に示すように、ＣＭ３００ａの復旧制御部３２２ａまたはＣＭ３００ｂの復旧制御部３２２ｂが、ＲｏＣ３０１ａ，３０１ｂの両方の動作が停止したことを検知する。ここで例えば、ＣＭ３００ａの復旧制御部３２２ａがＲｏＣ３０１ａ，３０１ｂの動作停止を検知したものとすると、復旧制御部３２２ａは、ＲｏＣ３０１ａ，３０１ｂの両方を復旧モードで再起動させる両ＣＭ復旧処理を実行する（タイミングＴ４７）。復旧制御部３２２ａは、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させるとともに、ＣＭ３００ｂのＲｏＣ３０１ｂも復旧モードで再起動させる。
【０１８０】
ＲｏＣ３０１ａ，３０１ｂのそれぞれによる再起動処理が完了すると、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂとの間で、通信経路Ｐ１を通じた接続確認が行われる（タイミングＴ４８）。このとき、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、第２の実施の形態と同様に、ＣＭ３００ａ内のＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａと、ＣＭ３００ｂ内のＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂとを比較する。
【０１８１】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内の構成情報更新回数３３１ａの方がＣＭ３００ｂ内の構成情報更新回数３３１ｂより大きい場合には、次に、ＣＭ３００ａ内のＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数と、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶されたキャッシュ更新回数とを比較する。
【０１８２】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きい場合、または、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、図１４に示したように、キャッシュデータの二重化処理を行った後、冗長運用状態でのアクセス制御を再開する。ただし、本実施の形態では、キャッシュ更新回数が一致しないキャッシュ領域に記憶されたデータのみ、二重化処理が行われればよい。
【０１８３】
一方、図２１のタイミングＴ４２〜Ｔ４４の期間において、ＣＭ３００ａ内のキャッシュデータが更新されなかった場合には、タイミングＴ４８において、ＣＭ３００ａが保持するキャッシュ更新回数とＣＭ３００ｂが保持するキャッシュ更新回数とは同じ値になる。Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、キャッシュ更新回数３４４ｂとキャッシュ更新回数３４３ａ、キャッシュ更新回数３４３ｂとキャッシュ更新回数３４４ａがいずれも一致する場合には、キャッシュデータの二重化処理を行わずに、冗長運用状態でのアクセス制御を再開する。従って、本実施の形態では、図２１のタイミングＴ４２〜Ｔ４４の期間において、ＣＭ３００ａ内のキャッシュデータが更新されなかった場合には、第２の実施の形態と比較して短時間で冗長運用状態でのアクセス制御を再開することができる。
【０１８４】
図２３は、第３の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
本実施の形態におけるＲｏＣの起動時の処理手順は、図１７，図１８に示したＲｏＣの処理手順において、ステップＳ３５，Ｓ３６の処理を図２３のステップＳ５１〜Ｓ５３に置き換え、ステップＳ３７，Ｓ３８の処理を図２３のステップＳ５４〜Ｓ５６に置き換えたものである。そこで、ここでは、図１７，図１８とは異なる処理についてのみ説明する。
【０１８５】
［ステップＳ５１］ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂと接続可能であり（ステップＳ３２の「Ｙｅｓ」）、かつ、ＣＭ３００ｂ内の構成情報更新回数３３１ｂよりＣＭ３００ａ内の構成情報更新回数３３１ａの方が大きい場合（ステップＳ３３）には、ＣＭ３００ａに保持されたキャッシュ更新回数とＣＭ３００ｂに保持されたキャッシュ更新回数とを比較する。
【０１８６】
Ｉ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数３４３ａ，３４４ａを読み込む。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶されたキャッシュ更新回数３４３ｂ，３４４ｂを読み込む。Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きい場合、または、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップＳ５２の処理を実行する。
【０１８７】
一方、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂとキャッシュ更新回数３４３ａ、キャッシュ更新回数３４３ｂとキャッシュ更新回数３４４ａがいずれも一致する場合には、ステップＳ３４の処理を実行する。この場合、Ｉ／Ｏアクセス制御部３２１ａは、アクセス制御のための初期設定処理（ステップＳ３４）の過程において、キャッシュデータの二重化処理を行わない。
【０１８８】
［ステップＳ５２］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを、ＣＭ３００ａ内のミラーキャッシュ領域３４２ａおよびローカルキャッシュ領域３４１ａに記憶されたデータによって更新する処理を行う。
【０１８９】
ステップＳ５１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのミラーキャッシュ領域３４２ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ミラーキャッシュ領域３４２ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ミラーキャッシュ領域３４２ｂに格納する。
【０１９０】
また、ステップＳ５１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのローカルキャッシュ領域３４１ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ローカルキャッシュ領域３４１ｂに格納する。
【０１９１】
［ステップＳ５３］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＣＭ３００ｂ内の構成情報更新回数３３１ｂを構成情報更新回数３３１ａの値に更新するように、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、例えば、ＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂをカウントアップすることで、構成情報更新回数３３１ｂの値を構成情報更新回数３３１ａの値と一致させる。
【０１９２】
さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに対して、ＣＭ３００ｂ内のキャッシュ更新回数を更新するように要求する。ここで、ステップＳ５１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４３ａの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、キャッシュ更新回数３４４ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、受信したキャッシュ更新回数３４３ａの値によって、キャッシュ更新回数３４４ｂを更新する。
【０１９３】
また、ステップＳ５１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ａの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、キャッシュ更新回数３４３ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、受信したキャッシュ更新回数３４４ａの値によって、キャッシュ更新回数３４３ｂを更新する。
【０１９４】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップＳ３１〜Ｓ３３，Ｓ５１〜Ｓ５３と進行する処理は、例えば、図２２のタイミングＴ４７で再起動した後、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂと接続できた場合のＣＭ３００ａの処理に対応する。
【０１９５】
［ステップＳ５４］ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂと接続可能であり（ステップＳ３２の「Ｙｅｓ」）、かつ、ＣＭ３００ｂ内の構成情報更新回数３３１ｂよりＣＭ３００ａ内の構成情報更新回数３３１ａの方が小さい場合（ステップＳ３３）には、ＣＭ３００ａに保持されたキャッシュ更新回数とＣＭ３００ｂに保持されたキャッシュ更新回数とを比較する。
【０１９６】
Ｉ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数３４３ａ，３４４ａを読み込む。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶されたキャッシュ更新回数３４３ｂ，３４４ｂを読み込む。Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さい場合、または、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップＳ５５の処理を実行する。
【０１９７】
一方、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂとキャッシュ更新回数３４３ａ、キャッシュ更新回数３４３ｂとキャッシュ更新回数３４４ａがいずれも一致する場合には、ステップＳ３４の処理を実行する。この場合、Ｉ／Ｏアクセス制御部３２１ａは、アクセス制御のための初期設定処理（ステップＳ３４）の過程において、キャッシュデータの二重化処理を行わない。
【０１９８】
［ステップＳ５５］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａまたはミラーキャッシュ領域３４２ａの少なくとも一方を、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから転送されたキャッシュデータによって更新する処理を行う。
【０１９９】
ステップＳ５１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したミラーキャッシュ領域３４２ｂ内のキャッシュデータを、ローカルキャッシュ領域３４１ａに格納する。また、ステップＳ５１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したローカルキャッシュ領域３４１ｂ内のキャッシュデータを、ミラーキャッシュ領域３４２ａに格納する。
【０２００】
［ステップＳ５６］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから、ＣＭ３００ａ内の構成情報更新回数３３１ａについての更新要求を受け付ける。更新要求を受けたＩ／Ｏアクセス制御部３２１ａは、例えば、ＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップすることで、構成情報更新回数３３１ａの値を構成情報更新回数３３１ｂの値と一致させる。
【０２０１】
Ｉ／Ｏアクセス制御部３２１ａは、さらに、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数３４３ａ，３４４ａの少なくとも一方を更新する。ここで、ステップＳ５１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから受信し、受信した値によってキャッシュ更新回数３４３ａを更新する。また、ステップＳ５１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４３ｂの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから受信し、受信した値によって、キャッシュ更新回数３４４ａを更新する。
【０２０２】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
なお、ステップＳ３１〜Ｓ３３，Ｓ５４〜Ｓ５６と進行する処理は、例えば、図２２のタイミングＴ４７で再起動した後、他方のＣＭ３００ａ内のＲｏＣ３０１ａと接続できた場合のＣＭ３００ｂの処理に対応する。
【０２０３】
〔第４の実施の形態〕
上記の第３の実施の形態では、構成情報更新回数とキャッシュ更新回数の両方に基づいて、アクセス制御を開始するまでの処理手順が決定された。これに対して、以下の第４の実施の形態では、ＣＭが起動した後、Ｉ／Ｏアクセス制御部は、キャッシュ更新回数を参照するものの、構成情報更新回数を参照せずに、アクセス制御を開始するまでの処理手順を決定する。
【０２０４】
図２４は、第４の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
本実施の形態におけるＲｏＣの起動時の処理手順は、図１７，図１８に示したＲｏＣの処理手順において、ステップＳ３３，Ｓ３５，Ｓ３６，Ｓ３７，Ｓ３８の処理を、図２４のステップＳ６１，Ｓ６２，Ｓ６３，Ｓ６４，Ｓ６５にそれぞれ置き換えたものである。そこで、ここでは、図１７，図１８とは異なる処理についてのみ説明する。
【０２０５】
［ステップＳ６１］ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂと接続可能であった場合（ステップＳ３２の「Ｙｅｓ」）には、ＣＭ３００ａに保持されたキャッシュ更新回数とＣＭ３００ｂに保持されたキャッシュ更新回数とを比較する。
【０２０６】
Ｉ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数３４３ａ，３４４ａを読み込む。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶されたキャッシュ更新回数３４３ｂ，３４４ｂを読み込む。
【０２０７】
Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きい場合、または、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップＳ６２の処理を実行する。
【０２０８】
また、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さい場合、または、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さい場合という条件のうち少なくとも一方の条件に合致する場合には、ステップＳ６４の処理を実行する。
【０２０９】
また、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂとキャッシュ更新回数３４３ａ、キャッシュ更新回数３４３ｂとキャッシュ更新回数３４４ａがいずれも一致する場合には、ステップＳ３４の処理を実行する。この場合、Ｉ／Ｏアクセス制御部３２１ａは、アクセス制御のための初期設定処理（ステップＳ３４）の過程において、キャッシュデータの二重化処理を行わない。
【０２１０】
［ステップＳ６２］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを、ＣＭ３００ａ内のミラーキャッシュ領域３４２ａおよびローカルキャッシュ領域３４１ａに記憶されたデータによって更新する処理を行う。
【０２１１】
ステップＳ６１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのミラーキャッシュ領域３４２ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ミラーキャッシュ領域３４２ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ミラーキャッシュ領域３４２ｂに格納する。
【０２１２】
また、ステップＳ６１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのローカルキャッシュ領域３４１ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ローカルキャッシュ領域３４１ｂに格納する。
【０２１３】
［ステップＳ６３］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに対して、ＣＭ３００ｂ内のキャッシュ更新回数を更新するように要求する。ここで、ステップＳ６１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４３ａの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、キャッシュ更新回数３４４ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、受信したキャッシュ更新回数３４３ａの値によって、キャッシュ更新回数３４４ｂを更新する。
【０２１４】
また、ステップＳ６１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が大きかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ａの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、キャッシュ更新回数３４３ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、受信したキャッシュ更新回数３４４ａの値によって、キャッシュ更新回数３４３ｂを更新する。
【０２１５】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
［ステップＳ６４］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａまたはミラーキャッシュ領域３４２ａの少なくとも一方を、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから転送されたキャッシュデータによって更新する処理を行う。
【０２１６】
ステップＳ６１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したミラーキャッシュ領域３４２ｂ内のキャッシュデータを、ローカルキャッシュ領域３４１ａに格納する。また、ステップＳ６１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したローカルキャッシュ領域３４１ｂ内のキャッシュデータを、ミラーキャッシュ領域３４２ａに格納する。
【０２１７】
［ステップＳ６５］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新回数３４３ａ，３４４ａの少なくとも一方を更新する。ここで、ステップＳ６１の比較処理において、キャッシュ更新回数３４４ｂよりキャッシュ更新回数３４３ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４４ｂの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから受信し、受信した値によってキャッシュ更新回数３４３ａを更新する。また、ステップＳ６１の比較処理において、キャッシュ更新回数３４３ｂよりキャッシュ更新回数３４４ａの方が小さかった場合、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新回数３４３ｂの値をＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから受信し、受信した値によって、キャッシュ更新回数３４４ａを更新する。
【０２１８】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
以上説明した第４の実施の形態によれば、ＣＭが起動した後、Ｉ／Ｏアクセス制御部は、キャッシュ更新回数を参照するものの、構成情報更新回数を参照せずに、アクセス制御を開始するまでの処理手順を決定する。このため、第３の実施の形態と比較して、処理手順が簡略化され、処理効率を高めることができる。
【０２１９】
〔第５の実施の形態〕
上記の第３，第４の実施の形態では、キャッシュ更新回数に基づいて、アクセス制御を開始するまでの処理手順が決定された。これに対して、以下の第４の実施の形態では、キャッシュ更新回数の代わりに、単独運用状態である期間においてキャッシュデータが更新されたか否かを示すキャッシュ更新フラグに基づいて、アクセス制御を開始するまでの処理手順を決定する。
【０２２０】
図２５は、キャッシュ更新フラグの設定動作を示す図である。
ＣＭ３００ａのＮＶＲＡＭ３０９ａには、キャッシュ更新フラグ３４５ａ，３４６ａが記憶される。キャッシュ更新フラグ３４５ａは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａが単独運用状態でアクセス制御を行った期間において、ローカルキャッシュ領域３４１ａのデータが更新されたか否かを示す。キャッシュ更新フラグ３４６ａは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａが単独運用状態でアクセス制御を行った期間において、ミラーキャッシュ領域３４２ａのデータが更新されたか否かを示す。キャッシュ更新フラグ３４５ａ，３４６ａのそれぞれの初期値は「０」である。
【０２２１】
一方、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂには、キャッシュ更新フラグ３４５ｂ，３４６ｂが記憶される。キャッシュ更新フラグ３４５ｂは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂが単独運用状態でアクセス制御を行った期間において、ローカルキャッシュ領域３４１ｂのデータが更新されたか否かを示す。キャッシュ更新フラグ３４６ｂは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂが単独運用状態でアクセス制御を行った期間において、ミラーキャッシュ領域３４２ｂのデータが更新されたか否かを示す。キャッシュ更新フラグ３４５ｂ，３４６ｂのそれぞれの初期値は「０」である。
【０２２２】
図２６は、キャッシュ更新フラグがセットされる際の処理手順を示すフローチャートである。なお、この図２６では、例としてＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａの処理について示すが、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂも同様の処理を実行可能である。
【０２２３】
［ステップＳ８１］図２６の初期状態では、ＣＭ３００ａが保持するキャッシュ更新フラグ３４５ａ，３４６ａは、ともに「０」である。この状態において、Ｉ／Ｏアクセス制御部３２１ａは、自身が単独運用状態でのアクセス制御を開始した場合（Ｓ８１：Ｙｅｓ）に、ステップＳ８２の処理を実行する。
【０２２４】
このステップＳ８１においてＩ／Ｏアクセス制御部３２１ａが単独運用状態でのアクセス制御を開始する場合とは、例えば、図１３のタイミングＴ２２、図２１のタイミングＴ４２など、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が停止したことをＩ／Ｏアクセス制御部３２１ａが検知した場合である。
【０２２５】
［ステップＳ８２］Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃０に対するライト要求などに応じて、ローカルキャッシュ領域３４１ａを更新したか否かを、一定時間ごとに判定する。Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａを更新した場合（Ｓ８２：Ｙｅｓ）にはステップＳ８４の処理を実行し、ローカルキャッシュ領域３４１ａを一定時間内に更新しなかった場合（Ｓ８２：Ｎｏ）には、ステップＳ８３の処理を実行する。
【０２２６】
［ステップＳ８３］Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃１に対するライト要求などに応じて、ミラーキャッシュ領域３４２ａを更新したか否かを、一定時間ごとに判定する。Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａを更新した場合（Ｓ８３：Ｙｅｓ）にはステップＳ８７の処理を実行し、ミラーキャッシュ領域３４２ａを一定時間内に更新しなかった場合（Ｓ８３：Ｎｏ）には、ステップＳ８２の処理を再度実行する。
【０２２７】
［ステップＳ８４］ステップＳ８２でローカルキャッシュ領域３４１ａを更新したと判定した場合、Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａ内のキャッシュ更新フラグ３４５ａを、「０」から「１」に更新する。
【０２２８】
［ステップＳ８５］Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃１に対するライト要求などに応じて、ミラーキャッシュ領域３４２ａを更新したか否かを監視する。Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａを更新した場合（Ｓ８５：Ｙｅｓ）に、ステップＳ８６の処理を実行する。
【０２２９】
［ステップＳ８６］Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａ内のキャッシュ更新フラグ３４６ａを、「０」から「１」に更新する。
［ステップＳ８７］ステップＳ８３でミラーキャッシュ領域３４２ａを更新したと判定した場合、Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａ内のキャッシュ更新フラグ３４６ａを、「０」から「１」に更新する。
【０２３０】
［ステップＳ８８］Ｉ／Ｏアクセス制御部３２１ａは、ボリュームＶｏｌ＃０に対するライト要求などに応じて、ローカルキャッシュ領域３４１ａを更新したか否かを監視する。Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａを更新した場合（Ｓ８８：Ｙｅｓ）に、ステップＳ８９の処理を実行する。
【０２３１】
［ステップＳ８９］Ｉ／Ｏアクセス制御部３２１ａは、ＮＶＲＡＭ３０９ａ内のキャッシュ更新フラグ３４５ａを、「０」から「１」に更新する。
以上の図２６の処理によれば、Ｉ／Ｏアクセス制御部３２１ａが単独運用状態でアクセス制御を開始した後、ローカルキャッシュ領域３４１ａが最初に更新されたとき、キャッシュ更新フラグ３４５ａが「１」に更新される。また、Ｉ／Ｏアクセス制御部３２１ａが単独運用状態でアクセス制御を開始した後、ミラーキャッシュ領域３４２ａが最初に更新されたとき、キャッシュ更新フラグ３４６ａが「１」に更新される。
【０２３２】
図２７は、第５の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
本実施の形態におけるＲｏＣの起動時の処理手順は、図２４に示したＲｏＣの処理手順において、ステップＳ６１，Ｓ６２，Ｓ６３の処理を、図２７のステップＳ１０１，Ｓ１０２，Ｓ１０３にそれぞれ置き換え、ステップＳ６４，Ｓ６５の処理を、図２７のステップＳ１０４に置き換えたものである。そこで、ここでは、図２４とは異なる処理についてのみ説明する。
【０２３３】
［ステップＳ１０１］ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のＲｏＣ３０１ｂと接続可能であった場合（ステップＳ３２の「Ｙｅｓ」）には、ＣＭ３００ａに保持されたキャッシュ更新フラグとＣＭ３００ｂに保持されたキャッシュ更新フラグとを比較する。
【０２３４】
Ｉ／Ｏアクセス制御部３２１ａは、起動制御部３２４ａを通じて、ＮＶＲＡＭ３０９ａに記憶されたキャッシュ更新フラグ３４５ａ，３４６ａを読み込む。これとともに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂを通じて、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶されたキャッシュ更新フラグ３４５ｂ、３４６ｂを読み込む。
【０２３５】
Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂ側のキャッシュ更新フラグ３４５ｂ、３４６ｂがともに「０」であり、ＣＭ３００ａ側のキャッシュ更新フラグ３４５ａ，３４６ａの少なくとも一方が「１」である場合には、ステップＳ１０２の処理を実行する。
【０２３６】
また、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ａ側のキャッシュ更新フラグ３４５ａ，３４６ａがともに「０」であり、ＣＭ３００ｂ側のキャッシュ更新フラグ３４５ｂ、３４６ｂの少なくとも一方が「１」である場合には、ステップＳ１０４の処理を実行する。
【０２３７】
また、Ｉ／Ｏアクセス制御部３２１ａは、キャッシュ更新フラグ３４５ａ，３４５ｂ，３４６ａ，３４６ｂのすべてが「０」である場合には、ステップＳ３４の処理を実行する。この場合、Ｉ／Ｏアクセス制御部３２１ａは、アクセス制御のための初期設定処理（ステップＳ３４）の過程において、キャッシュデータの二重化処理を行わない。
【０２３８】
［ステップＳ１０２］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、他方のＣＭ３００ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを、ＣＭ３００ａ内のミラーキャッシュ領域３４２ａおよびローカルキャッシュ領域３４１ａに記憶されたデータによって更新する処理を行う。
【０２３９】
ステップＳ１０１の比較処理において、キャッシュ更新フラグ３４５ａが「１」であった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのミラーキャッシュ領域３４２ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ミラーキャッシュ領域３４２ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ミラーキャッシュ領域３４２ｂに格納する。
【０２４０】
また、ステップＳ１０１の比較処理において、キャッシュ更新フラグ３４６ａが「１」であった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａに記憶されたデータをＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送し、ＣＭ３００ｂのローカルキャッシュ領域３４１ｂの更新を要求する。ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ローカルキャッシュ領域３４１ｂ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ａから受信したキャッシュデータを、ローカルキャッシュ領域３４１ｂに格納する。
【０２４１】
［ステップＳ１０３］Ｉ／Ｏアクセス制御部３２１ａは、上記の初期設定処理の過程で、ステップＳ１０１で「１」であったＣＭ３００ａ側のキャッシュ更新フラグを「０」にクリアする。
【０２４２】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
［ステップＳ１０４］Ｉ／Ｏアクセス制御部３２１ａは、冗長運用状態でアクセス制御を実行するための初期設定処理を実行する。この初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａまたはミラーキャッシュ領域３４２ａの少なくとも一方を、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂから転送されたキャッシュデータによって更新する処理を行う。
【０２４３】
ステップＳ１０１の比較処理において、キャッシュ更新フラグ３４６ｂが「１」であった場合、Ｉ／Ｏアクセス制御部３２１ａは、ローカルキャッシュ領域３４１ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したミラーキャッシュ領域３４２ｂ内のキャッシュデータを、ローカルキャッシュ領域３４１ａに格納する。また、ステップＳ１０１の比較処理において、キャッシュ更新フラグ３４５ｂが「１」であった場合、Ｉ／Ｏアクセス制御部３２１ａは、ミラーキャッシュ領域３４２ａ内のキャッシュデータを破棄した後、Ｉ／Ｏアクセス制御部３２１ｂから受信したローカルキャッシュ領域３４１ｂ内のキャッシュデータを、ミラーキャッシュ領域３４２ａに格納する。
【０２４４】
Ｉ／Ｏアクセス制御部３２１ａは、以上の初期設定処理を完了すると、冗長運用状態でのアクセス制御を再開する。
以上説明した第５の実施の形態によれば、ＣＭが起動した後、Ｉ／Ｏアクセス制御部は、キャッシュ更新フラグを参照して、アクセス制御を開始するまでの処理手順を決定する。キャッシュ更新フラグはそれぞれ１ビットのデータであればよいので、第４の実施の形態と比較して、アクセス制御を開始するまでの処理手順を決定するために用意すべき情報の記憶領域を小さくすることができる。また、第４の実施の形態におけるキャッシュ更新回数と比較して、キャッシュ更新フラグの更新頻度は明らかに少ない。このことから、キャッシュ更新フラグをＮＶＲＡＭのようなアクセス速度が比較的低速な不揮発性記録媒体に記憶した場合でも、キャッシュ更新フラグの更新に要する時間が全体の処理時間に与える影響が小さくなり、ＣＭ全体の処理効率が向上する。
【０２４５】
〔第６の実施の形態〕
上記の第２の実施の形態では、冗長運用状態において例えばＣＭ３００ｂのＲｏＣ３０１ｂの動作が停止した後、ＲｏＣ３０１ｂが起動処理を行っている間にＣＭ３００ａのＲｏＣ３０１ａの動作が停止した場合には、ＣＭ３００ｂのＲｏＣ３０１ｂの動作を停止させることで両ＣＭ復旧処理を実行させた。これに対して、以下の第６の実施の形態では、両ＣＭ復旧処理を実行させる代わりに、ＣＭ３００ｂのＲｏＣ３０１ｂから、動作停止したＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させる。
【０２４６】
図２８，図２９は、第６の実施の形態において２つのＲｏＣの動作が間隔を空けて連続的に停止した場合の動作例を示すタイムチャートである。なお、図２８，図２９では例として、ＣＭ３００ｂ内のＲｏＣ３０１ｂの動作が先に停止し、その後にＣＭ３００ａ内のＲｏＣ３０１ａの動作が停止した場合の例を示す。
【０２４７】
図２８の初期状態では、ＣＭ３００ａのＲｏＣ３０１ａおよびＣＭ３００ｂのＲｏＣ３０１ｂが、冗長運用状態で動作しているものとする。この状態から、ＣＭ３００ｂのＲｏＣ３０１ｂの動作が異常発生などによって停止すると（タイミングＴ６１）、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、ＲｏＣ３０１ｂの動作停止を検知する（タイミングＴ６２）。
【０２４８】
ＲｏＣ３０１ｂの動作停止を検知したＩ／Ｏアクセス制御部３２１ａは、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを「０」から「１」に更新させるとともに、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させる。さらに、Ｉ／Ｏアクセス制御部３２１ａは、ＣＭ３００ａのＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａをカウントアップする。
【０２４９】
ＣＭ３００ｂのＲｏＣ３０１ｂは、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａからの要求に応じて、復旧モードでの再起動処理を開始する。この再起動処理では、ＣＭ３００ｂのＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂの各データは保持される。
【０２５０】
一方、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａは、単独運用状態に遷移し、ローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａをキャッシュ領域として用いて、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を継続する。また、Ｉ／Ｏアクセス制御部３２１ａは、ホスト装置１２０からボリュームＶｏｌ＃０またはボリュームＶｏｌ＃１へのライト要求を受け付けた場合には、ＲＡＭ３０２ａ内のキャッシュデータを更新する（タイミングＴ６３）。
【０２５１】
ここで、ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了する前に、ＣＭ３００ａのＲｏＣ３０１ａの動作が異常発生などによって停止したとする（タイミングＴ６４）。ＣＭ３００ｂのＲｏＣ３０１ｂの再起動処理が完了すると、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、ＣＭ３００ａのＲｏＣ３０１ａとの接続確認を行う（タイミングＴ６５）。しかし、ＣＭ３００ａのＲｏＣ３０１ａは停止状態であるので、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、接続不能と判定する。
【０２５２】
Ｉ／Ｏアクセス制御部３２１ｂは、他方のＲｏＣ３０１ａとの接続が不能であった場合、ＣＭ３００ｂのＮＶＲＡＭ３０９ｂに記憶された起動フラグ３３２ｂを参照し、起動フラグ３３２ｂの値に応じた処理を実行する。Ｉ／Ｏアクセス制御部３２１ｂは、起動フラグ３３２ｂが「１」であった場合には、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させ（タイミングＴ６６）、それ以後、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとの接続が回復するまで待機する。
【０２５３】
ＣＭ３００ｂのＲｏＣ３０１ｂからの指示に応じたＣＭ３００ａのＲｏＣ３０１ａの再起動処理が完了すると、ＣＭ３００ａのＩ／Ｏアクセス制御部３２１ａとＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂとの間で、通信経路Ｐ１を通じた接続確認が行われる（タイミングＴ６７）。このとき、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内のＮＶＲＡＭ３０９ａに記憶された構成情報更新回数３３１ａと、ＣＭ３００ｂ内のＮＶＲＡＭ３０９ｂに記憶された構成情報更新回数３３１ｂとを比較する。
【０２５４】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内の構成情報更新回数３３１ａの方がＣＭ３００ｂ内の構成情報更新回数３３１ｂより大きいことから、ＣＭ３００ａ内のキャッシュデータが有効である（すなわち最新のものである）と判定する。Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、冗長運用状態でアクセス制御を行うための初期設定処理を実行する（タイミングＴ６８）。なお、この初期設定処理の開始段階において、ＣＭ３００ｂ内の構成情報更新回数３３１ｂがカウントアップされ、構成情報更新回数３３１ａ，３３１ｂが同期した状態にされる。
【０２５５】
タイミングＴ６８からの初期設定処理の過程で、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、ＣＭ３００ａ内に保持されたキャッシュデータを二重化する処理を行う。Ｉ／Ｏアクセス制御部３２１ａは、ＲＡＭ３０２ａ内のローカルキャッシュ領域３４１ａおよびミラーキャッシュ領域３４２ａに記憶されたデータを、他方のＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂに転送する。Ｉ／Ｏアクセス制御部３２１ｂは、ＲＡＭ３０２ｂ内のローカルキャッシュ領域３４１ｂおよびミラーキャッシュ領域３４２ｂに記憶されたデータを破棄する。そして、ローカルキャッシュ領域３４１ａから転送されたデータをミラーキャッシュ領域３４２ｂに格納するとともに、ミラーキャッシュ領域３４２ａから転送されたデータをローカルキャッシュ領域３４１ｂに格納する。
【０２５６】
Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂのそれぞれの初期設定処理が完了すると、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂは、冗長運用状態でのアクセス制御を開始する（タイミングＴ６９）。
【０２５７】
以上の動作では、ＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂは、タイミングＴ６５においてＣＭ３００ａのＲｏＣ３０１ａと接続できず、なおかつＣＭ３００ｂ内の起動フラグ３３２ｂが「１」であった場合には、両ＣＭ復帰処理を実行させずに、ＣＭ３００ａのＲｏＣ３０１ａを復旧モードで再起動させる。このような処理により、第２の実施の形態と比較して、Ｉ／Ｏアクセス制御部３２１ａ，３２１ｂによるアクセス制御をより短時間で再開させることができる。
【０２５８】
図３０は、第６の実施の形態におけるＲｏＣの起動時の処理を示すフローチャートである。
本実施の形態におけるＲｏＣの起動時の処理手順は、図１７，図１８に示したＲｏＣの処理手順において、ステップＳ４１の処理を図３０のステップＳ１１１，Ｓ１１２の処理に置き換えたものである。そこで、ここでは図１７，図１８とは異なる処理についてのみ説明する。
【０２５９】
［ステップＳ１１１］Ｉ／Ｏアクセス制御部３２１ａは、起動後にＣＭ３００ｂのＲｏＣ３０１ｂと接続不能であり（ステップＳ３２のＹｅｓ）、ＣＭ３００ａ内の起動フラグ３３２ａが「１」である（ステップＳ３９）場合には、起動フラグ３３２ａを「０」にした（ステップＳ４０）後、起動制御部３２４ａを通じて、ＣＭ３００ｂのＲｏＣ３０１ｂを復旧モードで再起動させる。なお、ステップＳ４０，Ｓ１１１の処理順は逆であってもよい。
【０２６０】
［ステップＳ１１２］Ｉ／Ｏアクセス制御部３２１ａは、再起動させたＣＭ３００ｂのＲｏＣ３０１ｂと接続が可能になるかを、ステップＳ１１１の実行から所定時間だけ監視する。このステップＳ１１２でＣＭ３００ｂのＲｏＣ３０１ｂと接続が可能になるかを監視する時間は、ＲｏＣ３０１ｂが復旧モードで再起動処理を行い、他方のＲｏＣ３０１ａと接続可能になるまでに要する時間と同じか、それより少し長い時間とされる。
【０２６１】
Ｉ／Ｏアクセス制御部３２１ａは、ステップＳ１１１の実行から所定時間以内にＣＭ３００ｂのＲｏＣ３０１ｂとの接続が回復した場合には、図１７のステップＳ３３を起点として処理を継続する。なお、ステップＳ４０，Ｓ１１１，Ｓ１１２，Ｓ３３と進行する処理は、例えば、図２８のタイミングＴ６５以後の処理に対応する。
【０２６２】
一方、Ｉ／Ｏアクセス制御部３２１ａは、ステップＳ１１１の実行から所定時間以内にＣＭ３００ｂのＲｏＣ３０１ｂとの接続が回復しなかった場合（すなわち、ＲｏＣ３０１ｂの再起動処理が完了しなかった場合）には、ステップＳ４２の処理を実行する。ステップＳ１１２からステップＳ４２へ進行する処理は、例えば、図２９のタイミングＴ６７においてＣＭ３００ｂのＩ／Ｏアクセス制御部３２１ｂがＣＭ３００ａのＲｏＣ３０１ａと接続できなかった場合に対応する。この場合、Ｉ／Ｏアクセス制御部３２１ｂは、単独運用状態で、ボリュームＶｏｌ＃０，Ｖｏｌ＃１に対するアクセス制御を開始する。
【０２６３】
なお、以上の図３０の処理は、第２の実施の形態を基礎として、図１８のステップＳ４１の処理を変形したものであった。しかしながら、第２の実施の形態の代わりに、第３〜第５の実施の形態のいずれかを基礎として処理が変形されてもよい。すなわち、図３０のステップＳ１１２で、他方のＲｏＣと所定時間以内に接続できた場合には、次に、図１７のステップＳ３３の代わりに、図２３のステップＳ３３、図２４のステップＳ６１、図２７のステップＳ１０１のいずれかの処理が実行されてもよい。
【０２６４】
以上の各実施の形態に関し、さらに以下の付記を開示する。
（付記１）  データを記憶する記憶装置と、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを、他方の制御装置内のキャッシュメモリにも記録するアクセス制御部をそれぞれ備える第１の制御装置および第２の制御装置と、
を有し、
前記第１の制御装置は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を再起動させるとともに、前記第２の制御装置内の不揮発性記憶部に対して、前記第２の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第１の再起動制御部を有し、
前記第２の制御装置は、自装置が起動したときに、前記第１の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第１の制御装置を、前記第１の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第２の再起動制御部を有する、
ことを特徴とするストレージシステム。
【０２６５】
（付記２）  前記第１の再起動制御部は、前記第２の制御装置を再起動させたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記録し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記１記載のストレージシステム。
【０２６６】
（付記３）  前記第１の再起動制御部は、前記第２の制御装置を再起動させたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記録し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置内のキャッシュメモリに記憶されたデータをキャッシュデータとして用いて前記記憶装置に対するアクセス処理を再開する、
ことを特徴とする付記１記載のストレージシステム。
【０２６７】
（付記４）  前記第１の再起動制御部は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を、前記第２の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させ、前記第２の制御装置を再起動させた後に自装置のキャッシュメモリ内のデータが更新されたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記１記載のストレージシステム。
【０２６８】
（付記５）  前記第１の制御装置および前記第２の制御装置は、それぞれ、前記キャッシュ識別情報として、自装置内のキャッシュメモリに記憶されたデータが更新された回数を示す更新回数情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置および前記第２の制御装置のアクセス制御部は、それぞれ、自装置内のキャッシュメモリに記憶されたデータを更新するたびに、自装置内の不揮発性記憶部に記憶された更新回数情報をカウントアップするとともに、他方の制御装置のアクセス制御部を通じて、他方の制御装置の不揮発性記憶部に記憶された更新回数情報が自装置内の不揮発性記憶部に記憶された更新回数情報と一致するように制御し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第２の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報の比較結果に基づいて自装置内のキャッシュメモリに最新のキャッシュデータが保持されていると判定した場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記４記載のストレージシステム。
【０２６９】
（付記６）  前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置および前記第２の制御装置のそれぞれの不揮発性記憶部に記憶された更新回数情報を比較し、各更新回数情報が同一である場合には、前記第２の制御装置のアクセス制御部とともに前記記憶装置に対するアクセス処理を再開することを特徴とする付記５記載のストレージシステム。
【０２７０】
（付記７）  前記第１の制御装置は、前記キャッシュ識別情報として、自装置内のキャッシュメモリに記憶されたデータが更新されたか否かを示す更新識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置のアクセス制御部は、
自装置内の前記第１の再起動制御部によって前記第２の制御装置におけるアクセス制御部の処理が停止したことが検知された後、自装置内のキャッシュメモリが少なくとも１回更新された場合に、自装置内の不揮発性記憶部に記憶された更新識別情報を初期値から別の値に更新し、
自装置が再起動したとき、自装置内の不揮発性記憶部に記憶された更新識別情報が初期値でなかった場合に、前記第２の制御装置内のキャッシュメモリに記憶されたキャッシュデータが、自装置内のキャッシュメモリに記憶されたキャッシュデータと同一になるように制御する、
ことを特徴とする付記４記載のストレージシステム。
【０２７１】
（付記８）  前記第１の再起動制御部は、前記第２の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記第２の制御装置を、前記第２の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させ、前記第２の制御装置を再起動させた後に自装置のキャッシュメモリ内のデータが更新されたときに、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報を、自装置内の不揮発性記憶部に記憶し、
前記第１の制御装置のアクセス制御部は、自装置が再起動したとき、自装置内のキャッシュメモリに最新のキャッシュデータが保持されていることを示すキャッシュ識別情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置内のキャッシュメモリに記憶されたデータをキャッシュデータとして用いて前記記憶装置に対するアクセス処理を再開する、
ことを特徴とする付記１記載のストレージシステム。
【０２７２】
（付記９）  前記第１の制御装置および前記第２の制御装置は、それぞれ、自装置におけるアクセス制御部の処理と、他方の制御装置におけるアクセス制御部の処理の両方が停止したことを検出すると、アクセス制御部の処理が停止した両方の制御装置を、各制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第３の再起動制御部をさらに有し、
前記第２の再起動制御部は、自装置が再起動したとき、前記第１の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、自装置におけるアクセス制御部の処理を停止して、自装置内または前記第１の制御装置内の第３の再起動制御部に、自装置および前記第１の制御装置の両方におけるアクセス制御部の処理の停止を検出させる、
ことを特徴とする付記１記載のストレージシステム。
【０２７３】
（付記１０）  データを記憶する記憶装置へのアクセス処理を制御する制御装置において、
前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュしながら、上位装置からのアクセス要求に応じて前記記憶装置にアクセスするとともに、自装置内のキャッシュメモリにキャッシュしたデータと同じデータを他の制御装置内のキャッシュメモリにも記録するアクセス制御部と、
前記他の制御装置におけるアクセス制御部の処理が停止したことを検知すると、前記他の制御装置を再起動させるとともに、前記他の制御装置内の不揮発性記憶部に対して、前記他の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録する第１の再起動制御部と、
自装置が起動したとき、前記他の制御装置におけるアクセス制御部の処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記他の制御装置を、前記他の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる第２の再起動制御部と、
を有することを特徴とする制御装置。
【０２７４】
（付記１１）  データを記憶する記憶装置と、前記記憶装置へのアクセス処理をそれぞれ制御する第１の制御装置および第２の制御装置とを有し、前記各制御装置が、前記記憶装置のデータを自装置内のキャッシュメモリにキャッシュするとともに、自装置内のキャッシュメモリにキャッシュしたデータを他方の制御装置内のキャッシュメモリにも記録する機能を備えたストレージシステムにおける制御方法であって、
前記第１の制御装置が、前記第２の制御装置における前記記憶装置へのアクセス処理が停止したことを検知すると、前記第２の制御装置を再起動させるとともに、前記第２の制御装置内の不揮発性記憶部に対して、前記第２の制御装置以外の制御装置から再起動が指示されたことを示す起動情報を記録し、
前記第２の制御装置が、自装置が起動したとき、前記第１の制御装置における前記記憶装置へのアクセス処理が停止しており、かつ、自装置以外の制御装置から再起動が指示されたことを示す起動情報が自装置内の不揮発性記憶部に記憶されていた場合に、前記第１の制御装置を、前記第１の制御装置内のキャッシュメモリに記憶されたデータを保持したまま再起動させる、
ことを特徴とする制御方法。
【符号の説明】
【０２７５】
１  ストレージシステム
１０  記憶装置
２０ａ，２０ｂ  制御装置
２１ａ，２１ｂ  アクセス制御部
２２ａ，２２ｂ  キャッシュメモリ
２３ａ，２３ｂ，２４ａ，２４ｂ  再起動制御部
２５ａ，２５ｂ  不揮発性記憶部
２６ａ，２６ｂ  起動情報
２７ａ，２７ｂ  キャッシュ識別情報
【図１】
0005488346.tif 000002
【図２】
0005488346.tif 000003
【図３】
0005488346.tif 000004
【図４】
0005488346.tif 000005
【図５】
0005488346.tif 000006
【図６】
0005488346.tif 000007
【図７】
0005488346.tif 000008
【図８】
0005488346.tif 000009
【図９】
0005488346.tif 000010
【図１０】
0005488346.tif 000011
【図１１】
0005488346.tif 000012
【図１２】
0005488346.tif 000013
【図１３】
0005488346.tif 000014
【図１４】
0005488346.tif 000015
【図１５】
0005488346.tif 000016
【図１６】
0005488346.tif 000017
【図１７】
0005488346.tif 000018
【図１８】
0005488346.tif 000019
【図１９】
0005488346.tif 000020
【図２０】
0005488346.tif 000021
【図２１】
0005488346.tif 000022
【図２２】
0005488346.tif 000023
【図２３】
0005488346.tif 000024
【図２４】
0005488346.tif 000025
【図２５】
0005488346.tif 000026
【図２６】
0005488346.tif 000027
【図２７】
0005488346.tif 000028
【図２８】
0005488346.tif 000029
【図２９】
0005488346.tif 000030
【図３０】
0005488346.tif 000031