以下、本発明の実施例を、図面を用いて説明する。ただし、本発明は以下に示す実施の形態の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
図面等において示す各構成の位置、大きさ、形状、及び範囲等は、発明の理解を容易にするため、実際の位置、大きさ、形状、及び範囲等を表していない場合がある。したがって、本発明では、図面等に開示された位置、大きさ、形状、及び範囲等に限定されない。
まず、実施例1に係る計算機システムについて説明する。
図1は、実施例1に係るストレージシステムのライト処理の概要を説明する図である。図1は、二重化先のコントローラ22(#1、#2)それぞれのキャッシュ領域243(#1、#2)に対して逐次にデータを転送するライト処理の流れを示している。
本実施例に係る計算機システム100のストレージシステム2は、複数のコントローラ22(コントローラ#0,#1,#2)を備えている。複数のコントローラ22は、相互に接続されている。コントローラ22は、例えば、ストレージシステム専用のコントローラではなくて、汎用のコントローラである。コントローラ22は、FE-I/F210と、プロセッサ部の一例としてのCPU230と、メモリ240とを有する。メモリ240は、バッファ領域242及びキャッシュ領域243を有するとともに、転送状態管理情報247を格納している。
ストレージシステム2においては、各コントローラ22がホスト計算機(ホストともいう)1からのI/O要求を並列に処理できるよう、I/O処理対象の空間(例えば、論理ユニット:LU)ごとに処理担当(この処理担当である権利を、オーナ権という)のコントローラ22を定めている。例えば、コントローラ#1が、LUN#0のLUに対するオーナ権を持っているとき、LUN#0のLUに対するI/O要求は、このコントローラ#1の制御により処理される。
ホスト計算機1(ホスト計算機#0、#1、#2)は、通信ネットワーク11を介して、ストレージシステム2と接続されている。ホスト計算機1は、例えば、それぞれ1つのコントローラ22と接続する。
コントローラ22は、ホスト計算機1からのライト要求に従うライトデータを、記憶デバイスユニット20に書き込まず、複数のコントローラ22内のキャッシュ領域243に二重化して格納した後に、ホスト計算機1に対してライト処理の完了を通知する。これにより、高速なライト処理を実現することができる。
コントローラ22は、ライト要求とは非同期にキャッシュ領域243内のライトデータを記憶デバイスユニット20に書き込む。既にキャッシュ領域243に二重化されたライトデータが格納されていて、まだ記憶デバイスユニット20に書き込まれていない状態(ダーティ状態といい、このライトデータをダーティデータという)において、ホスト計算機1から同じ書き込み先への新たなライトデータを受領するときには、コントローラ22は、キャッシュ領域243内のライトデータの破壊を避けるために、新たなライトデータをバッファ領域242に格納する。その後、コントローラ22は、バッファ領域242内に格納した新たなライトデータを複数(二重化の場合には2つ)のコントローラ内のそれぞれのキャッシュ領域243に逐次に転送することでライトデータの一貫性を保持する。転送状態管理情報247は、二重化先のコントローラ22のそれぞれのキャッシュ領域243に対してライトデータを逐次に転送する際の進捗状況(転送状態)を管理する情報である。
ここで、ライト要求を受領したコントローラ22以外のコントローラ22のバッファ領域242を介さずに、一のコントローラ22のキャッシュ領域243にライトデータを転送し、転送が完了した後、他のコントローラ22のキャッシュ領域243にライトデータを転送することを「逐次転送」という。
ここで、コントローラ#0が、コントローラ#1がオーナ権を有するLUに対するライト要求をホスト計算機#0から受け取った場合のライト処理について説明する。
コントローラ#0は、ホスト計算機#0からライト要求を受信した場合、コントローラ#0のCPU#0は、ライト要求の対象となるLUのオーナ権を有するコントローラ#1のCPU#1にライト要求を転送する。
CPU#1は、バッファ領域#0上にライトデータを格納する領域を確保させ、ライトデータに対応するキャッシュ領域243(本例では、キャッシュ領域#1、#2)上に格納されているデータの状態を確認する。本実施形態では、キャッシュ領域243のデータは、ダーティ状態であることとする。キャッシュ領域243のデータがダーティ状態(ダーティデータ)であるので、CPU#1は、逐次転送が必要と判断する。
その後、コントローラ#0のCPU#0は、FE-IF#0を介してバッファ領域#0に確保された領域にライトデータを格納する(ステップS1)。
次いで、CPU#1は、HCA#0に、バッファ領域#0からキャッシュ領域#2へライトデータをコピー(転送)し、その後、キャッシュ領域#1にライトデータをコピー(転送)すること(逐次転送)を依頼する(ステップS2)。
HCA#0は、HCA#2を介して、バッファ領域#0からキャッシュ領域#2へライトデータをコピーする(以降、第一転送という)(ステップS3)。この際、HCA#0は、データコピー時にデータに付与された保証コードを確認する。保証コードは、データの格納位置を示す情報(VOL番号やVOLのアドレス等)やデータの一貫性を確認する情報(CRC(Cyclic Redundancy Check)等)から構成されてもよい。
次に、HCA#0は、HCA#2を介して、転送状態管理情報#2に、キャッシュ領域#2へのライトデータの転送受領を格納させ、HCA#2に、転送状態管理情報#1にキャッシュ領域#2へのライトデータの転送完了を格納させることを依頼する(ステップS4)。依頼を受けたHCA#2は、HCA#1を介して、転送状態管理情報#1にキャッシュ領域#2へのライトデータの転送完了を格納させる(ステップS5)。
次に、HCA#0は、HCA#1を介して、バッファ領域#0からキャッシュ領域#1へライトデータをコピーする(以降、第二転送という)(ステップS6)。
次に、HCA#0は、HCA#1を介して、転送状態管理情報#1にキャッシュ領域#1へのライトデータの転送完了を格納させる(ステップS7)。
CPU#1は、転送状態管理情報#1を参照し、ライトデータの二重化完了を確認する(ステップS8)。次に、CPU#1は、CPU#0及びFE-I/F#0を介して、ホスト計算機#0にライト要求完了を報告する(ステップS9)。これにより、ホスト計算機1からのライトデータは、キャッシュ領域#1と、キャッシュ領域#2とに二重化して格納される。
なお、上記例では、キャッシュ領域#2、#1の順でライトデータを順次転送させていたが、キャッシュ領域#1、#2の順としてもよい。
図2は、実施例1に係るストレージシステムの障害発生時のライト処理の概要を説明する図である。図2は、図1に示すライト処理の途中に障害が発生した時のライト処理の概要を示している。
HCA#0が、CPU#1から逐次転送の依頼を受け、逐次転送を実施中にHCA250やHCA250を繋ぐネットワーク(図3のHCAネットワーク23)のパス等に障害が発生すると(ステップS11)、キャッシュ領域#1または#2内のダーティ状態のライトデータ(ダーティデータ)を破壊してしまう虞がある(ステップS12)。つまり、ダーティデータの一部分だけが新たなライトデータの一部分によって上書きされた別のデータとなってしまう虞がある。
そこで、ライトデータを管理するCPU#1は、転送状態管理情報247を参照し、正常なダーティデータを保持するキャッシュ領域243を特定する(ステップS13)。その後、CPU#1は、特定したキャッシュ領域243内のダーティデータをデステージ(すなわち、記憶デバイスユニット20に転送)する(ステップS14)。さらに、CPU#1は、デステージを完了後に、キャッシュ領域#1及び#2内のダーティデータを破棄する。なお、以降の説明では、特に記載しない場合には、デステージの完了後に、そのデステージしたデータに対応するデータが格納されていた複数のキャッシュ領域243のデータを破棄するものとする。
以上の処理により、正常なダーティデータを選択して記憶デバイスユニット20に書き込むことができ、ライトデータの一貫性を保証できる。
次に、本実施例に係る計算機システムについて詳細に説明する。
図3は、実施例1に係る計算機システムの構成図である。
計算機システム100は、1以上のホスト計算機1と、ストレージシステム2とを備える。ホスト計算機1と、ストレージシステム2とは、ネットワーク11を介して接続されている。ネットワーク11は、例えば、SAN(Storage Area Network)である。
ストレージシステム2は、複数(例えば、3台以上)のコントローラ22(コントローラ22#0,・・・,#N)と、記憶デバイスユニット20とを有する。複数のコントローラ22は、HCAネットワーク23を介して相互に接続されている。ストレージシステム2の可用性を向上させるため、コントローラ22毎に専用の電源を用意し、それぞれのコントローラ22に対して、その専用の電源を用いて給電するようにしてもよい。
コントローラ22は、通信インタフェースと、記憶デバイスと、それらに接続されたプロセッサとを有する。通信インタフェースは、例えば、FE-I/F(Front End Inter/Face)210、BE-I/F(Back End Inter/Face)220、及びHCA250である。記憶デバイスは、例えば、メモリ240である。プロセッサは、例えば、CPU(Central Processing Unit)230である。なお、図3においては、コントローラ22は、1つのメモリ240を備えている構成としているが、メモリ240を複数備えてもよい。
FE-I/F210は、ホスト計算機1等のフロントエンドに存在する外部デバイスと通信するためのインタフェースデバイスである。BE-I/F220は、コントローラ22が記憶デバイスユニット20と通信するためのインタフェースデバイスである。HCA250は、各コントローラ22のメモリ240を操作するために他のHCA250と通信するためのインタフェースデバイスである。
メモリ240は、例えば、RAM(Random Access Memory)であり、バッファ領域242と、キャッシュ領域243とを含む。また、メモリ240は、制御モジュール241、コントローラ状態管理情報244、キャッシュ状態管理情報245、転送管理情報246、及び転送状態管理情報247を記憶する。なお、メモリ240は、不揮発性メモリであっても、揮発性メモリであってもよい。
制御モジュール241は、CPU230に実行されることにより、ストレージシステム2全体を制御するためのモジュール(プログラム)である。より具体的には、制御モジュール241は、CPU230に実行されることにより、I/O処理の制御等を行う。
バッファ領域242は、ホスト計算機1から受領したライトデータを一時的に格納する領域である。
キャッシュ領域243は、ホスト計算機1から記憶デバイスユニット20へ送信されるライトデータをキャッシュする領域である。キャッシュ領域243は、ダーティデータを格納することもあるので、バックアップ電源等により不揮発化されていてもよい。
コントローラ状態管理情報244は、コントローラ22が正常状態か、故障状態かを管理するための情報である。キャッシュ状態管理情報245は、二重化に使用されているキャッシュ領域243を有するコントローラ22とキャッシュの状態を管理するための情報である。転送管理情報246は、逐次転送で転送するライトデータを受信したコントローラ22と、転送状態管理情報247のエントリのアドレスを管理するための情報である。転送状態管理情報247は、逐次転送の進捗状況(転送状態)を管理するための情報である。コントローラ状態管理情報244、キャッシュ状態管理情報245、転送管理情報246、及び転送状態管理情報247の詳細は、図4乃至図7を参照して後述する。
記憶デバイスユニット20は、複数のPDEV200を有する。PDEV200は、HDD(Hard Disk Drive)でよいが、他種の記憶デバイス(不揮発性の記憶デバイス)、例えば、SSD(Solid State Drive)のようなFM(Flash Memory)デバイスでもよい。記憶デバイスユニット20は、異なる種類のPDEV200を有してよい。また、複数の同種のPDEV200でRAIDグループが構成されてよい。RAIDグループには、所定のRAIDレベルに従いデータが格納される。コントローラ22がホスト計算機1から受信したライトデータに対しては、FE-I/F210によって保証コードが付与される。この保証コードが付与されたデータは、RAIDグループに格納される。
HCA250は、CPU230から指示を受け、自コントローラ22のメモリ240に対する操作や、HCAネットワーク23を経由して、他コントローラ22のメモリ240に対する操作を行う。
次に、コントローラ状態管理情報244を詳細に説明する。
図4は、実施例1に係るコントローラ状態管理情報のデータ構造の一例を示す図である。
コントローラ状態管理情報244は、コントローラ22ごとのエントリを格納する。コントローラ状態管理情報233のエントリは、コントローラID401及び状態402のフィールドを含む。コントローラID401には、エントリに対応するコントローラ22の識別子(コントローラID)が格納される。状態402には、エントリに対応するコントローラ22の動作状態が格納される。動作状態としては、正常、故障等がある。
次に、キャッシュ状態管理情報245を詳細に説明する。
図5は、実施例1に係るキャッシュ状態管理情報のデータ構造の一例を示す図である。
キャッシュ状態管理情報245は、データアドレス毎のエントリを格納する。キャッシュ状態管理情報245のエントリは、データアドレス501、第一転送先コントローラID502、第二転送先コントローラID503、及びキャッシュ状態504のフィールドを含む。
データアドレス501には、エントリに対応するストレージシステム2内のユーザデータの格納位置を示す値(データアドレス)が格納される。
第一転送先コントローラID502には、エントリに対応するデータアドレスのデータが二重化されてキャッシュされている、第一転送の転送先のキャッシュ領域243を有するコントローラ22(転送先コントローラの一例)の識別子(コントローラID:第一転送先コントローラID)が格納される。
第二転送先コントローラID503には、エントリに対応するデータアドレスのデータが二重化されてキャッシュされている、第二転送の転送先のキャッシュ領域243を有するコントローラ22(担当コントローラの一例)の識別子(コントローラID:第二転送先コントローラID)が格納される。本実施形態では、第二転送先コントローラID503には、エントリに対応するデータアドレスのデータが属する論理ユニットのオーナ権を有するコントローラ(オーナコントローラ)22のコントローラIDが格納される。
キャッシュ状態504には、エントリに対するデータアドレスのデータのキャッシュの状態を示す情報が格納される。キャッシュの状態としては、記憶デバイスユニット20にデステージされていないことを示すダーティと、デステージされていることを示すクリーンとがある。
次に、転送管理情報246を詳細に説明する。
図6は、実施例1に係る転送管理情報のデータ構造の一例を示す図である。
転送管理情報246は、データアドレス毎のエントリを格納する。転送管理情報246のエントリは、データアドレス601、コントローラID602、及び転送状態管理情報アドレス603のフィールドを含む。データアドレス601には、エントリに対応するストレージシステム2内のユーザデータの格納位置(記憶空間)を示す値(データアドレス)が格納される。コントローラID602には、エントリに対応するデータアドレスのライトデータをホスト1から受信したコントローラ(受信コントローラ)22の識別情報(コントローラID)が格納される。転送状態管理情報アドレス603には、エントリに対応するデータアドレスの転送状態管理情報247における対応するエントリの格納場所を示す値(アドレス)が格納される。
次に、転送状態管理情報247を詳細に説明する。
図7は、実施例1に係る転送状態管理情報のデータ構造の一例を示す図である。
転送状態管理情報247は、データアドレス毎のエントリを格納する。転送状態管理情報247のエントリは、データアドレス701、第一転送データ受領済フラグ702、第一転送完了フラグ703、及び第二転送完了フラグ704のフィールドを含む。
データアドレス701は、エントリに対応するストレージシステム2内のユーザデータの格納位置を示す値(データアドレス)が格納される。第一転送データ受領済フラグ702には、HCA250によって、データアドレス701のデータアドレスに対応するライトデータの第一転送のデータが受領されたか否かを示す値(受領済みフラグ)が格納される。受領済みフラグは、受領された場合には、「1」が設定され、受領されていない場合には、「0」が設定される。第一転送完了フラグ703には、HCA250によって、データアドレス701に対応するデータアドレスのライトデータの第一転送が完了したか否かを示す値(第一転送完了フラグ)が格納される。第一転送完了フラグは、第一転送が完了された場合には、「1」が設定され、第一転送が完了されていない場合には、「0」が設定される。第二転送完了フラグ704には、HCA250によって、データアドレス701に対応するデータアドレスのライトデータの第二転送が完了したか否かを示す値(第二転送完了フラグ)が格納される。第二転送完了フラグは、第二転送が完了された場合には、「1」が設定され、第二転送が完了されていない場合には、「0」が設定される。
次に、実施例1に係る計算機システムによる処理動作について説明する。
まず、逐次転送依頼処理について説明する。
図8は、実施例1に係る逐次転送依頼処理のフローチャートである。
逐次転送依頼処理は、ライト要求に対応するライトデータ(新データ)が対象とする記憶デバイスユニット20における論理ユニット(記憶空間)のオーナ権を有するコントローラ22(オーナコントローラ22という。:担当コントローラの一例)がライト要求を受信した場合に実行される。ここで、オーナコントローラ22にライト要求が送信される場合としては、ホスト計算機1から直接オーナコントローラ22に送られる場合と、ライト要求に対応するライトデータに対応するキャッシュ領域243を有さず、FE-I/F210を介してホスト計算機1からライトデータを受領したコントローラ22(FEコントローラ22という。受信コントローラの一例)からオーナコントローラ22に転送される場合と、がある。
本例では、FEコントローラ22からオーナコントローラ22にライト要求が転送された場合を例に説明する。
オーナコントローラ22は、ライト要求を受信する(ステップS101)。次いで、オーナコントローラ22は、キャッシュ状態管理情報245を参照し、ライト要求のデータアドレスに対応するエントリのキャッシュ状態504からキャッシュ状態を取得し(ステップS102)、キャッシュ状態がダーティであるか否かを判定する(ステップS103)。
この結果、ダーティでないと判定された場合(ステップS103:NO)には、キャッシュ領域243のデータ(旧データ)が既に記憶デバイスユニット20に格納されていることを示すので、オーナコントローラ22は、ライトデータを2つのコントローラ22のキャッシュ領域243に同時に(並行して)転送し、処理を終了する(S106)。
一方、ダーティであると判定された場合(ステップS103:YES)には、オーナコントローラ22は、ライト要求のデータアドレスに対応する転送状態管理情報247のエントリの格納先を示す値(転送状態管理情報アドレス)を取得し、転送管理情報246にエントリを追加する。オーナコントローラ22は、追加したエントリのデータアドレス601、コントローラID602、及び転送状態管理情報アドレス603に、それぞれ、ライトデータのデータアドレス、FEコントローラ22のコントローラID、及び転送状態管理情報247のエントリの転送状態管理情報アドレスを設定する(ステップS104)。
次に、オーナコントローラ22は、ライトデータの逐次転送をFEコントローラ22内のHCA250に依頼し(ステップS105)、次の処理(図9の逐次転送完了待ち処理)を実行する(L0)。なお、FEコントローラ22のHCA250への依頼は、自コントローラ22のHCA250を経由して通知してもよい。
次に、逐次転送完了待ち処理について説明する。
図9は、実施例1に係る逐次転送完了待ち処理のフローチャートである。
オーナコントローラ22は、逐次転送が完了しているか否かを判定する(ステップS201)。すなわち、オーナコントローラ22は、転送状態管理情報247を参照し、ライトデータのデータアドレスに対応するエントリ、すなわち、データアドレス701の値がライトデータのデータアドレスであるエントリにおける第一転送完了フラグ703及び第二転送完了フラグ704のフラグが立っているか否か、すなわち、フラグの値が“1”であるか否かを判定する。なお、本ステップの処理は、一定の周期で行ってもよい。
この結果、逐次転送が完了していると判定した場合(ステップS201:YES)には、オーナコントローラ22は、FEコントローラ22を経由してホスト1にライト処理が終了したことを意味するGood応答を送信し(ステップS202)、処理を終了する。一方、逐次転送が完了していないと判定した場合(ステップS201:NO)には、オーナコントローラ22は、コントローラ状態管理情報244から他のコントローラ22の状態を取得し、状態が故障であるコントローラID(故障コントローラID)を特定する(ステップS203)。
次いで、オーナコントローラ22は、第一転送の転送先コントローラ22(第一転送先コントローラ22)が故障しているか否かを判定する(ステップS204)。具体的には、オーナコントローラ22は、ステップS203で特定した故障コントローラIDに、データアドレスに対応するキャッシュ状態管理情報245のエントリにおけるデータアドレス501に格納された第一転送先コントローラID502の第一転送先コントローラIDと一致するものが存在するか否かにより、第一転送先コントローラ22が故障しているか否かを判定する。
この結果、第一転送先コントローラ22が故障していると判定した場合(ステップS204:YES)には、オーナコントローラ22は、第二転送が完了しているか否かを判定する(ステップS205)。すなわち、オーナコントローラ22は、転送状態管理情報247を参照し、データアドレスに対応するエントリの第二転送完了フラグ704のフラグが立っているか否かを判定する。
この結果、第二転送が完了していると判定した場合(ステップS205:YES)には、第二転送により、第二転送先コントローラ(オーナコントローラ22)のキャッシュ領域243に対してライトデータが格納されていることを意味しているので、オーナコントローラ22は、オーナコントローラ22のキャッシュ領域243に格納されているライトデータ(保証データ)をデステージ(記憶デバイスユニット20に転送)する(ステップS207)。次に、オーナコントローラ22は、FEコントローラ22を経由してホスト1に失敗応答を送信し、処理を終了する(ステップS211)。
ここで、第二転送が完了している場合(ステップS205:YES)には、第二転送の転送先のコントローラ22(第二転送先コントローラ22、オーナコントローラ)のキャッシュ領域243のライトデータは壊れていないことを示しているため、キャッシュ領域243のライトデータをデステージすることで、データの一貫性を保証できる。
一方、第二転送が完了していないと判定した場合(ステップS205:NO)には、オーナコントローラ22は、第一転送が完了しているか否かを判定する(ステップS206)。すなわち、オーナコントローラ22は、転送状態管理情報247を参照し、データアドレスに対応するエントリの第一転送完了フラグ703のフラグが立っているか否か判定する。
この結果、第一転送が完了していると判定した場合(ステップS206:YES)には、オーナコントローラ22は、処理をステップS201に進め、第二転送の完了を待つ。
一方、第一転送が完了していないと判定した場合(ステップS206:NO)、オーナコントローラ22は、処理をステップS207に進める。
ここで、第一転送が完了していない場合、第二転送の開始前に第一転送先コントローラ22が故障していることを意味しているので、第二転送先コントローラであるオーナコントローラ22のキャッシュ領域243のダーティデータは更新されておらず、このキャッシュ領域243のダーティデータ(保証データ)をデステージすることで、データの一貫性を保証できる。
一方、ステップS204で、第一転送先コントローラ22が故障していないと判定した場合(S204:NO)には、オーナコントローラ22は、FEコントローラ22が故障しているか否かを判定する(ステップS208)。すなわち、オーナコントローラ22は、転送管理情報246を参照し、データアドレスに対応するエントリのコントローラID602のコントローラIDを取得し、このコントローラIDと一致するものがステップS203で特定した故障コントローラIDに存在するか否かにより、FEコントローラ22が故障しているか否かを判定する。
この結果、FEコントローラ22が故障していないと判定した場合(ステップS208:NO)には、オーナコントローラ22は、処理をステップS201に戻し、逐次転送の完了を待つ。
一方、FEコントローラ22が故障していると判定した場合(ステップS208:YES)には、オーナコントローラ22は、第一転送が完了しているか否かを判定する(ステップS209)。すなわち、オーナコントローラ22は、転送状態管理情報247を参照し、データアドレスに対応するエントリの第一転送完了フラグ703のフラグが立っているか否か判定する。なお、第一転送完了フラグ703のフラグで判定する代わりに、第一転送データ受領済フラグ702のフラグが立っているか否かを判定してもよい。また、ステップS209の前に、第二転送が完了しているか否かを判定し、第二転送が完了している場合、ホスト1にGood応答を送信し、処理を終了してもよい。
この結果、第一転送が完了していると判定した場合(ステップS209:YES)、オーナコントローラ22は、第一転送先のコントローラ22にそのコントローラ22のキャッシュ領域243からのデータ(保証データ)のデステージを依頼し(ステップS210)、処理をステップ211に進める。なお、第一転送先のコントローラ22は、依頼に対応して、キャッシュ領域243のデータをデステージすることとなる。ここで、第一転送が完了している場合、第一転送先コントローラ22のキャッシュ領域243のライトデータは壊れていないため、このキャッシュ領域243のライトデータがデステージされることによりデータの一貫性を保証できる。
一方、第一転送が完了していないと判定した場合(ステップS209:NO)には、オーナコントローラ22は、処理をステップS207に進め、自コントローラ22のキャッシュ領域243のライトデータ(保証データ)をデステージする。ここで、第一転送が完了していない場合、第二転送の開始前にFEコントローラ22が故障しているため、オーナコントローラ22のキャッシュ領域243のダーティデータは更新されておらず、このキャッシュ領域243のダーティデータをデステージすることでデータの一貫性を保証できる。
次に、逐次転送処理について説明する。
図10は、実施例1に係る逐次転送処理のフローチャートである。
FEコントローラ22(具体的には、FEコントローラ22のHCA250)は、オーナコントローラ22から送信された逐次転送依頼を受信し、逐次転送依頼からライトデータのデータアドレスを取得する(ステップS301)。次に、FEコントローラ22は、キャッシュ状態管理情報245を参照し、データアドレスに対応するエントリの第一転送先コントローラID502及び第二転送先コントローラID503から、第一転送先コントローラID及び第二転送先コントローラIDを取得する(ステップS302)。
次に、FEコントローラ22のHCA250は、第一転送を実行する(ステップS303)。具体的には、FEコントローラ22のHCA250は、ライトデータをバッファ領域242から取り出し、第一転送先コントローラ22のHCA250を介して、ライトデータをキャッシュ領域243に転送する(ステップS303)。この際、ライトデータは、第一転送先コントローラ22のバッファ領域240を経由することなく、また、第一転送先コントローラ22のCPU230の関与なしに、キャッシュ領域243に転送される。
次に、FEコントローラ22のHCA250は、ライトデータの転送が成功したか否かを判定する(ステップS304)。
この結果、転送が失敗したと判定した場合(ステップS304:NO)には、FEコントローラ22のHCA250は、逐次転送処理を終了する。
一方、転送が成功したと判定した場合(ステップS304:YES)には、FEコントローラ22のHCA250は、第一転送先コントローラ22のメモリ240内に存在する転送状態管理情報247のデータアドレスに対応するエントリの第一転送データ受領済フラグ702のフラグを立てる、すなわち、フラグを1に設定する(ステップS305)。
次に、FEコントローラ22のHCA250は、第一転送先コントローラ22のHCA250に第二転送先コントローラ22のメモリ240内に存在する転送状態管理情報247のデータアドレスに対応するエントリの第一転送完了フラグ703のフラグを立てることを指示する(ステップS306)。
次に、FEコントローラ22のHCA250は、第二転送を実行する(ステップS307)。具体的には、FEコントローラ22のHCA250は、ライトデータをバッファ領域242から取り出し、第二転送先コントローラ22のHCA250を介して、ライトデータをキャッシュ領域243に転送する(ステップS307)。
次に、FEコントローラ22のHCA250は、ライトデータの転送が成功したか否かを判定する(ステップS308)。
この結果、転送が失敗したと判定した場合(ステップS308:NO)には、FEコントローラ22は、逐次転送処理を終了する。
一方、転送が成功したと判定した場合(ステップS308:YES)には、FEコントローラ22のHCA250は、第二転送先コントローラ22のメモリ240内に存在する転送状態管理情報247のデータアドレスに対応するエントリの第二転送完了フラグ704のフラグを立てる、すなわち、フラグを1に設定し(ステップS309)、処理を終了する。
次に、障害対応処理について説明する。
図11は、実施例1に係る障害対応処理のフローチャートである。障害対応処理は、オーナコントローラ22以外のコントローラ22により実行される処理である。障害対応処理は、一定時間ごとに一度実行されてもよく、コントローラ22により障害が検知された場合に実行されてもよい。
コントローラ22は、コントローラ状態管理情報244から他のコントローラ22の状態を取得し、状態が故障であるコントローラID401(故障コントローラID)を特定する(ステップS401)。
次に、コントローラ22は、オーナコントローラ22(第二転送先コントローラ22)が故障しているか否かを判定する(ステップS402)。すなわち、オーナコントローラ22は、障害コントローラIDに、データアドレスに対応するキャッシュ状態管理情報245のエントリにおける第二転送先コントローラID503のコントローラIDと一致するものが存在しているか否かにより、オーナコントローラ22が故障しているか否かを判定する。
この結果、オーナコントローラ22が故障していないと判定した場合(ステップS402:NO)には、コントローラ22は、処理をステップS401に戻す。一方、オーナコントローラ22が故障していると判定した場合(ステップS402:YES)には、コントローラ22は、自身(自コントローラ)が第一転送先コントローラであるか否かを判定する(ステップS403)。すなわち、コントローラ22は、自身のコントローラID(自コントローラID)と、データアドレスに対応するキャッシュ状態管理情報245のエントリにおける第一転送先コントローラID503のコントローラIDとが同一であるか判定する。なお、上記処理の代わりに、自コントローラがFEコントローラであるか否かを判定し、すなわち、自コントローラIDと、転送管理情報246のデータアドレスに対応するエントリのコントローラID602のコントローラIDとが同一であるか否かを判定し、自コントローラがFEコントローラである場合に、以降の処理を行ってもよい。
ステップS403の判定の結果、自コントローラが第一転送先コントローラでないと判定した場合(ステップS403:NO)には、コントローラ22は、処理をステップS401に進める。
一方、自コントローラが第一転送先コントローラであると判定した場合(ステップS403:YES)には、コントローラ22は、第一転送が完了しているか否かを判定する(ステップS404)。すなわち、コントローラ22は、転送管理情報246のデータアドレスに対応するエントリの転送状態管理情報アドレス603のアドレスを用いて、転送状態管理情報247のエントリを参照し、このエントリの第一転送データ受領済フラグ702のフラグが立っているか否かを判定する。
この判定結果、第一転送が完了していないと判定した場合(ステップS404:NO)には、コントローラ22は、処理をステップS401に進め、第一転送の完了を待つ。
一方、第一転送が完了していると判定した場合(ステップS404:YES)には、コントローラ22は、キャッシュ領域243のライトデータ(保証データ)をデステージし(ステップS405)、FEコントローラ22を経由してホスト1に失敗応答を送信し(ステップS406)、処理を終了する。ここで、第一転送が完了している場合(ステップS404:YES)、第一転送先コントローラ22のキャッシュ領域243のライトデータは壊れていないため、キャッシュ領域243のライトデータをデステージすることでデータの一貫性を保証できる。
以上説明したように、上記実施例に係る計算機システムでは、ライトデータの二重化の処理の進捗に合わせて、障害発生時に記憶デバイスユニット20に書き込むキャッシュ領域243を使い分けることで、ライトデータの一貫性を保証できる。
次に、実施例2に係る計算機システムについて説明する。
実施例2に係る計算機システムは、図3に示す実施例1に係る計算機システムにおいて、論理ユニットを担当するコントローラ22を特定のコントローラ22に限定しない、すなわち、論理ユニットのオーナ権を設定しないようにしたシステムである。この計算機システムにおいては、例えば、ホスト1からのライト要求を受信したコントローラ(受信コントローラ)が担当コントローラとなる。
実施例2に係る計算機システムでは、図8に示す逐次転送依頼処理を、ホスト1からライト要求を受信したコントローラ22(FEコントローラ22)が実行する。
次に、逐次転送完了待ち処理について説明する。
図12は、実施例2に係る逐次転送完了待ち処理のフローチャートである。
FEコントローラ22は、逐次転送が完了しているか否かを判定する(ステップS501)。すなわち、FEコントローラ22は、転送状態管理情報247を参照し、ライトデータのデータアドレスに対応するエントリ、すなわち、データアドレス701の値がライトデータのデータアドレスであるエントリにおける第一転送完了フラグ703及び第二転送完了フラグ704のフラグが立っているか否か、すなわち、フラグの値が“1”であるか否かを判定する。
この結果、逐次転送が完了していると判定した場合(ステップS501:YES)には、FEコントローラ22は、ホスト1にGood応答を送信し(ステップS502)、処理を終了する。一方、逐次転送が完了していないと判定した場合(ステップS501:NO)には、FEコントローラ22は、コントローラ状態管理情報244から他のコントローラ22の状態を取得し、状態が故障であるコントローラID(故障コントローラID)を特定する(ステップS503)。
次いで、オーナコントローラ22は、第一転送の転送先コントローラ22(第一転送先コントローラ22)が故障しているか否かを判定する(ステップS504)。
この結果、第一転送先コントローラ22が故障していると判定した場合(ステップS504:YES)には、FEコントローラ22は、第二転送が完了しているか否かを判定する(ステップS505)。すなわち、FEコントローラ22は、転送状態管理情報247を参照し、データアドレスに対応するエントリの第二転送完了フラグ704のフラグが立っているか否かを判定する。
この結果、第二転送が完了していると判定した場合(ステップS505:YES)には、FEコントローラ22は、第二転送先のコントローラ22のキャッシュ領域243に格納されているライトデータ(保証データ)のデステージを依頼する(ステップS507)。次に、FEコントローラ22は、ホスト1に失敗応答を送信し、処理を終了する(ステップS511)。
ここで、第二転送が完了している場合(ステップS505:YES)には、第二転送の転送先のコントローラ22(第二転送先コントローラ22)のキャッシュ領域243のライトデータは壊れていないことを示しているため、キャッシュ領域243のライトデータをデステージすることで、データの一貫性を保証できる。
一方、第二転送が完了していないと判定した場合(ステップS505:NO)には、FEコントローラ22は、第一転送が完了しているか否かを判定する(ステップS506)。
この結果、第一転送が完了していると判定した場合(ステップS506:YES)には、FEコントローラ22は、処理をステップS501に進め、第二転送の完了を待つ。
一方、第一転送が完了していないと判定した場合(ステップS506:NO)、FEコントローラ22は、処理をステップS507に進める。
ここで、第一転送が完了していない場合、第二転送の開始前に第一転送先コントローラ22が故障していることを意味しているので、第二転送先コントローラのキャッシュ領域243のダーティデータは更新されておらず、このキャッシュ領域243のダーティデータをデステージすることで、データの一貫性を保証できる。
一方、ステップS504で、第一転送先コントローラ22が故障していないと判定した場合(S504:NO)には、FEコントローラ22は、第二転送先コントローラ22が故障しているか否かを判定する(ステップS508)。すなわち、FEコントローラ22は、キャッシュ状態管理情報245を参照し、データアドレスに対応するエントリの第二転送先コントローラID503のコントローラIDを取得し、このコントローラIDと一致するものがステップS503で特定した故障コントローラIDに存在するか否かにより、第二転送先コントローラ22が故障しているか否かを判定する。
この結果、第二転送先コントローラ22が故障していないと判定した場合(ステップS508:NO)には、FEコントローラ22は処理をステップS501に戻し、逐次転送の完了を待つ。
一方、第二転送先コントローラ22が故障していると判定した場合(ステップS508:YES)には、FEコントローラ22は、第一転送が完了しているか否かを判定する(ステップS509)。
この結果、第一転送が完了していないと判定した場合(ステップS509:NO)には、FEコントローラ22は、処理をステップS501に進め、第一転送が終わるのを待つ。
一方、第一転送が完了していると判定した場合(ステップS509:YES)、FEコントローラ22は、第一転送先のコントローラ22にそのコントローラ22のキャッシュ領域243からのデータ(保証データ)のデステージを依頼し(ステップS510)、処理をステップS511に進める。ここで、第一転送が完了している場合、第一転送先コントローラ22のキャッシュ領域243のライトデータは壊れていないため、このキャッシュ領域243のライトデータをデステージすることでデータの一貫性を保証できる。
次に、逐次転送処理について説明する。
実施例2に係る計算機システムの逐次転送処理は、図10に示す逐次転送処理とは、ステップS306とステップS309における処理内容が異なる。
実施例2に係る計算機システムにおいては、ステップS306では、コントローラ22のHCA250は、自コントローラ22のメモリ240内に存在する、データアドレスに対応する転送状態管理情報247のエントリの第一転送完了フラグ703のフラグを立てる。また、ステップS309では、コントローラ22のHCA250は、自コントローラ22のメモリ240内に存在する、データアドレスに対応する転送状態管理情報247のエントリの第二転送完了フラグ704のフラグを立てる。
次に、障害対応処理について説明する。
図13は、実施例2に係る障害対応処理のフローチャートである。
障害対応処理は、FEコントローラ22以外のコントローラ(他コントローラ)が実行する処理である。障害対応処理は、一定時間に一度実施してもよいし、他コントローラ22の障害検知時に実施してもよい。
コントローラ22は、コントローラ状態管理情報244から他のコントローラ22の状態を取得し、状態が故障であるコントローラID(故障コントローラID)を特定する(ステップS601)。次に、コントローラ22は、FEコントローラ22が故障しているか否かを判定する(ステップS602)。
この結果、FEコントローラ22が故障していないと判定した場合(ステップS602:NO)には、コントローラ22は、処理をステップS601に戻す。一方、FEコントローラ22が故障していると判定した場合(ステップS602:YES)には、コントローラ22は、自身(自コントローラ)が第一転送先コントローラであるか否かを判定する(ステップS603)。なお、上記処理の代わりに、自コントローラが第二転送先コントローラであるか否かを判定し、以降の処理を行ってもよい。
ステップS603の判定の結果、自コントローラ22が第一転送先コントローラでないと判定した場合(ステップS603:NO)には、コントローラ22は、処理をステップS601に進める。
一方、自コントローラが第一転送先コントローラであると判定した場合(S603:YES)には、コントローラ22は、第一転送が完了しているか否かを判定する(ステップS604)。
この判定結果、第一転送が完了していると判定した場合(ステップS604:YES)には、コントローラ22は、キャッシュ領域243のライトデータ(保証データ)をデステージし(ステップS606)、FEコントローラ22を経由してホスト1に失敗応答を送信し(ステップS607)、処理を終了する。ここで、第一転送が完了している場合(ステップS604:YES)、第一転送先コントローラ22のキャッシュ領域243のライトデータは壊れていないため、キャッシュ領域243のライトデータをデステージすることでデータの一貫性を保証できる。
一方、第一転送が完了していないと判定した場合(ステップS604:NO)には、コントローラ22は、第二転送先のコントローラ22にキャッシュ領域243に格納されているライトデータ(保証データ)のデステージを依頼し(ステップS605)、処理をステップS607に進める。ここで、第一転送が完了していない場合(ステップS604:NO)、第二転送の開始前に第一転送先コントローラ22が故障しているため、第二転送先コントローラ22のキャッシュ領域243のダーティデータは更新されておらず、このキャッシュ領域243のダーティデータをデステージすることでデータの一貫性を保証できる。
以上説明したように、上記実施例に係る計算機システムでは、ライトデータの二重化の処理の進捗に合わせて、障害発生時に記憶デバイスユニット20に書き込むキャッシュ領域243を使い分けることで、ライトデータの一貫性を保証できる。
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。また、例えば、上記した実施例は本発明を分かりやすく説明するために構成を詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、各実施例の構成の一部について、他の構成に追加、削除、置換することが可能である。
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、本発明は、実施例の機能を実現するソフトウェア(データ管理プログラム)のプログラムコードによって実現してもよい。この場合、プログラムコードを記録した記憶媒体をコンピュータに提供し、そのコンピュータが備えるプロセッサが記憶媒体に格納されたプログラムコードを読み出す。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施例の機能を実現することになり、そのプログラムコード自体、及びそれを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、CD-ROM、DVD-ROM、ハードディスク、SSD(Solid State Drive)、光ディスク、光磁気ディスク、CD-R、磁気テープ、不揮発性のメモリカード、ROMなどがある。
また、本実施例に記載の機能を実現するプログラムコードは、例えば、アセンブラ、C/C++、perl、Shell、PHP、Java(登録商標)等の広範囲のプログラム又はスクリプト言語で実装してもよい。
さらに、実施例の機能を実現するソフトウェアのプログラムコードを、ネットワークを介して配信することによって、それをコンピュータのハードディスクやメモリ等の記憶手段又はCD-RW、CD-R等の記憶媒体に格納し、コンピュータが備えるプロセッサが当該記憶手段や当該記憶媒体に格納されたプログラムコードを読み出して実行するようにしてもよい。
上記実施例において、制御線や情報線は、説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。全ての構成が相互に接続されていてもよい。
また、上記実施例では、複数のコントローラ22のキャッシュ領域243上での二重化ができない場合に、正常なデータを記憶デバイスユニット20にデステージすることにより、データの一貫性を保証できるようにしていたが、本発明はこれに限られず、例えば、複数のコントローラ22のキャッシュ領域243上での二重化ができない場合に、正常なデータを、正常な動作が可能なコントローラ22のキャッシュ領域243にコピーして、複数のコントローラ22のキャッシュ領域243上で二重化させるようにしてもよい。
また、上記実施形態では、ライトデータを複数のコントローラ22のキャッシュ領域243上で二重化をさせるようにしていたが、本発明はこれに限られず、3以上の多重化をさせるようにしてもよく。