以下、本実施の形態を図面を参照して説明する。
図1は、実施の形態の概要を示す図である。図1には、ディスクアレイ装置が有する機能を示している。ディスクアレイ装置は、複数のストレージ装置11〜14内の記憶領域を複数の単位記憶領域(ブロック)に分割して管理する。また、ディスクアレイ装置は、複数のデータと複数のデータに基づいて生成されるパリティデータとをパリティグループとする。そして、ディスクアレイ装置は、パリティグループ内のデータとパリティデータとを複数のストレージ装置11〜14内のブロックに分散格納する。
ここで、データおよびパリティデータを格納するとき、書き込み抜けが発生する可能性がある。書き込み抜けを検出する方法として、書き込み直後に書き込んだデータおよびパリティデータを読み出し、正しく書き込まれていることを確認する方法がある。しかし、このような方法を採ると、書き込み処理に時間がかかる。そこで、ディスクアレイ装置には、以下の機能を有する読み込み手段1、パリティデータ生成手段2、時系列情報生成手段3、時系列情報付与手段4、書き込み手段5、比較手段6、修復手段7、およびデータ出力手段8が設けられる。
読み込み手段1は、書き込み要求に応じて、書き込み要求で指定された更新データを書き込むべきブロック内の既存データと、更新データと同じパリティグループに属するパリティデータとを複数のストレージ装置から読み込む。
また、読み込み手段1は、書き込み要求に応じて書き込まれた更新データを指定した読み込み要求に応じて、更新データを時系列情報(証明用時系列情報)付きで複数のストレージ装置から読み込む。さらに、読み込み手段1は、読み込み要求に応じて、更新データが属するパリティグループ内の、複数の時系列情報(比較用時系列情報)付きのパリティデータを読み込む。パリティデータに付与されている複数の比較用時系列情報は、それぞれ、同じパリティグループ内の各データに関連付けられている。
パリティデータ生成手段2は、既存データ、更新データ、および読み込まれたパリティデータを用いて、更新データに応じた新たなパリティデータ(更新後パリティデータ)を生成する。
時系列情報生成手段3は、書き込み要求があるごとに、更新データを書き込むべき単位記憶領域に格納されている既存データと更新データとの間の書き込み時の前後関係を示す時系列情報を生成する。例えば、時系列情報生成手段3は、時系列情報として、書き込み要求の入力順が後である程大きな値を生成する。このような時系列情報としては、タイムスタンプや、カウンタにより書き込み要求ごとにカウントアップされるカウンタ値がある。
時系列情報付与手段4は、書き込み要求に応じて生成された時系列情報を証明用時系列情報として更新データに付与する。また、時系列情報付与手段4は、証明用時系列情報と同じ値の比較用時系列情報を更新データに関連付けて、更新後パリティデータに付与する。
書き込み手段5は、証明用時系列情報が付与された更新データと比較用時系列情報が付与された更新後パリティデータとを、異なるストレージ装置に書き込む。
比較手段6は、読み込み要求に応じて読み込まれた更新データの証明用時系列情報と、更新データに関連付けて更新後パリティデータに付与された比較用時系列情報とを比較する。
修復手段7は、比較手段6の比較結果に基づいて、更新データまたは更新後パリティデータの書き込み時の書き込み抜けの有無を判断する。例えば、更新データの証明用時系列情報の値が、更新データに関連付けて更新後パリティデータに付与された比較用時系列情報より小さい場合がある。この場合、修復手段7は、更新データの書き込み時に、書き込み抜けが発生していたと判断する。修復手段7は、更新データの書き込み抜けを検出すると、読み込み手段1に、更新データが属するパリティグループ内の他のデータを複数のストレージ装置から読み込ませる。そして、修復手段7は、更新データ以外のデータと更新後パリティデータとを用いて読み込み対象データを修復する。
データ出力手段8は、証明用時系列情報と比較用時系列情報とが一致した場合、読み込み要求の応答として、更新データを出力する。また、データ出力手段8は、更新データの修復が行われた場合、修復後の更新データを出力する。
このような機能を有するディスクアレイ装置によって、RAID5のように論理ブロック内のデータが1つの物理ブロックに書き込まれるようなシステムであっても、データの書き込み抜けを該当データの読み出し時に検出可能となる。
例えば、3つのデータ「Aold」、「Bold」、「Cold」と1つのパリティデータ「Pold」とを有するパリティグループを想定する。このパリティグループ内のデータとパリティデータは、ストレージ装置11〜14に分散格納されている。すなわち、データ「Aold」はストレージ装置11内のブロック11aに格納されている。データ「Bold」はストレージ装置12内のブロック12aに格納されている。データ「Cold」はストレージ装置13内のブロック13aに格納されている。パリティデータ「Pold」はストレージ装置14内のブロック14aに格納されている。
ここで、データ「Aold」の更新データ「Anew」、データ「Bold」の更新データ「Bnew」、データ「Cold」の更新データ「Cnew」のそれぞれ書き込み要求9a,9b,9cが順次入力されたものとする。
更新データ「Anew」の書き込み要求9aがあると、読み込み手段1により既存データ「Aold」と既存パリティデータ「Pold」とが読み込まれる。次に、パリティデータ生成手段2により、更新後パリティデータが生成される。例えば、パリティデータとしては、パリティグループ内の各データのビットごとの排他的論理和演算を用いることができる。このようなパリティデータの場合、データ「Aold」、パリティデータ「Pold」、および更新データ「Anew」のビットごとの排他的論理和演算によって、更新後パリティデータを生成できる。
また、更新データ「Anew」の書き込み要求に応じて、時系列情報生成手段3により時系列情報が生成される。時系列情報は、少なくとも既存データ「Aold」の書き込み要求と更新データ「Anew」の書き込み要求との時間的な前後関係を識別可能な情報である。例えば、タイムスタンプを時系列情報とすることができる。ここで、更新データ「Anew」の書き込み要求に応じて生成された時系列情報を「t(Anew)」とする。時系列情報生成手段3で生成された時系列情報は、更新データ「Anew」と、パリティデータ生成手段2で生成された更新後パリティデータとに付与される。
なお、更新後パリティデータに付与される時系列情報は、更新データ「Anew」と関連付けられている。例えば、更新後パリティデータに設定された複数の時系列情報記憶領域が、ストレージ装置11〜14のそれぞれに対応付けられている。そして、更新データ「Anew」の書き込み時に生成された時系列情報は、更新後タイムスタンプの複数の時系列情報記憶領域のうち、更新データ「Anew」が格納されるストレージ装置11に関連付けられた時系列情報記憶領域に格納される。これにより、時系列情報「t(Anew)」が、更新データ「Anew」との関連性を保ったままパリティデータに付与される。
時系列情報「t(Anew)」が付与された更新データ「Anew」は、書き込み手段5によって、ストレージ装置11内のブロック11aに上書きで書き込まれる。この際、更新データ「Anew」に付与された時系列情報「t(Anew)」もストレージ装置11に書き込まれる。
以後、更新データ「Bnew」と更新データ「Cnew」との書き込み要求9b,9cに応じて、書き込み処理が行われる。ここで、更新データ「Bnew」の書き込みは正常に実行されたが、更新データ「Cnew」の書き込み処理において書き込み抜けが発生したものとする。また、各書き込み要求実行時の更新後パリティデータの書き込みは正常に実行されたものとする。
このような場合、書き込み要求9a,9b,9cの実行により、ストレージ装置11のブロック11aには、更新データ「Anew」と時系列情報「t(Anew)」とが格納される。ストレージ装置12のブロック12aには、更新データ「Bnew」と時系列情報「t(Bnew)」とが格納される。ところが、ストレージ装置13のブロック13aには、依然として、更新前の既存データ「Cold」と、そのデータの書き込み時に生成された時系列情報「t(Cold)」とが格納されている。ストレージ装置14のブロック14aには、更新データ「Anew」、「Bnew」、「Cnew」に基づいて生成された更新後パリティデータ「Pnew」と、時系列情報「t(Anew)」、「t(Bnew)」、「t(Cnew)」とが格納されている。時系列情報「t(Anew)」、「t(Bnew)」、「t(Cnew)」は、それぞれ更新データ「Anew」、「Bnew」、「Cnew」に関連付けられている。
その後、更新データ「Anew」、「Bnew」、「Cnew」の読み込み要求が順次入力されたものとする。まず、更新データ「Anew」の読み込み要求が入力されると、読み込み手段1によって更新データ「Anew」と、パリティデータ「Pnew」との読み込みが行われる。この際、更新データ「Anew」やパリティデータ「Pnew」に付与された時系列情報も同時に読み込まれる。
次に、比較手段6により、パリティデータ「Pnew」に付与されていた時系列情報のうち、更新データ「Anew」に関連付けられた時系列情報「t(Anew)」が抽出される。そして、比較手段6により、抽出された時系列情報「t(Anew)」と、更新データ「Anew」に付与されていた時系列情報「t(Anew)」とが比較される。この場合、値が一致するため、書き込み抜けは発生していないと判断される。書き込み抜けが発生していなければ、データ出力手段8によって、読み込まれた更新データ「Anew」が出力される。
更新データ「Bnew」の読み込み要求においても、更新データ「Anew」の読み込みと同様の処理が行われる。ここで、更新データ「Bnew」に付与された時系列情報「t(Bnew)」は、更新後パリティデータ「Pnew」に付与されていた時系列情報のうち、更新データ「Bnew」に関連付けられた時系列情報「t(Bnew)」と同じ値である。従って、更新データ「Bnew」の書き込み時にも書き込み抜けは発生していないと判断され、データ出力手段8によって、読み込まれた更新データ「Anew」が出力される。
さらに、更新データ「Cnew」の読み込み要求においても、更新データ「Anew」の読み込みと同様の処理が行われる。更新データ「Cnew」が格納されているべきブロック13aには、既存データ「Cold」が格納されている。また、既存データ「Cold」に付与されている時系列情報「t(Cold)」は、パリティデータ「Pnew」に付与されていた時系列情報のうち、更新データ「Cnew」に関連付けられた時系列情報「t(Cnew)」と異なる。時系列情報がタイムスタンプであれば、「t(Cold)」は「t(Cnew)」よりも小さな値である。すると、比較手段6は、読み込み対象のデータに付与されている「t(Cold)」が更新後パリティデータに付与されている「t(Cnew)」よりも小さいことから、読み込み対象の単位記憶領域への書き込み時に書き込み抜けが発生したと判断する。
書き込み抜けが検出された場合、読み込み手段1によって、同じパリティグループ内の他の更新データ「Anew」、「Bnew」が読み込まれる。次に、修復手段7によって、更新データ「Anew」、「Bnew」とパリティデータ「Pnew」とを用いて、更新データ「Cnew」が修復される。例えば、更新データ「Anew」、「Bnew」とパリティデータ「Pnew」とのビットごとの排他的論理和演算の結果が、更新データ「Cnew」となる。そして、データ出力手段8により、修復された更新データ「Cnew」が出力される。
このように、タイムスタンプに対して、他のデータそれぞれに関連付けた時系列情報を格納するようにしたことで、ブロック単位のデータ書き込み時に、データとパリティデータとのそれぞれに対して同じ時系列情報を付与しておくことができる。同じ時系列情報を付与しておけば、読み込み要求があったときに、時系列情報の同一性を判断することで、書き込み抜けを検出することができる。
なお、時系列情報として、タイムスタンプのように時系列に沿って大きくなる値を用いることで、データの書き込み抜けがあったのか、パリティデータの書き込み抜けがあったのかを判定できる。時系列に沿って大きくなる値としては、書き込み要求が入力されるごとにカウントアップされるカウンタ値を用いることもできる。
次に、実施の形態の詳細を説明する。以下に説明する実施の形態では、仮想ディスク内の論理ブロックを指定したアクセスに応じて、その論理ブロックに対応する物理ブロックに書き込みを行うものとする。ここで、論理ブロックといった場合、データブロックとパリティブロックとを含むものとする。データブロックは、仮想ディスク内のデータを格納する仮想的な記憶領域である。パリティブロックは、複数のデータブロック内のデータに基づいて生成されるパリティデータを格納する仮想的な記憶領域である。論理ブロックに格納されるデータまたはパリティデータは、実際には、その論理ブロックに対応付けられたHDD内の物理ブロックに格納される。
また、時系列情報が付与されたデータおよびパリティデータは、時系列情報を付与した後にECCが計算され、そのECCが付与される。そして、データの読み込み時にECCによるエラー検出が行われるものとする。従って、時系列情報とデータの書き込み処理、時系列情報とパリティデータの書き込み処理は、それぞれアトミック(一体の処理)であることがECCによって保証される。すなわち、時系列情報の一部のみが書き込まれ、データまたはパリティデータの書き込み抜けが発生するような状況はECCチェックでエラーが検出される。従って、以下の実施の形態では、ブロックごとの書き込み処理がアトミックであることをECCによって保証したうえで、書き込み抜けの検出処理を行うものとする。
なお、以下の説明において、データまたはパリティデータのHDDへの書き込みといった場合、特に説明しなくても、データまたはパリティデータに付与された時系列情報(タイムスタンプ、カウンタ値、フラグ)も同時に書き込むものとする。同様に、データまたはパリティデータのHDDからの読み込みといった場合、特に説明しなくても、データまたはパリティデータに付与された時系列情報(タイムスタンプ、カウンタ値、フラグ)も同時に読み込むものとする。
[第1の実施の形態]
図2は、本実施の形態のシステム構成例を示す図である。RAID装置100は、ホストインタフェース110を介してホストコンピュータ10に接続されている。ホストコンピュータ10は、ユーザからの操作入力などに応答して、RAID装置100に対してデータの入出力を行う。また、RAID装置100は、ディスクインタフェース120を介して複数のHDD210,220,230,240,250に接続されている。各HDD210,220,230,240,250は、データの記憶領域が複数の物理ブロックに分割されている。
RAID装置100内では、コントローラ130が全体を制御している。コントローラ130は、NVRAM(Non Volatile Random Access Memory)131やRAM(Random Access Memory)132を有している。NVRAM131には、コントローラ130に実行させる処理が技術されたファームウェアのプログラムや、その他の管理情報などが格納される。NVRAM131としては、例えば、フラッシュメモリが使用できる。RAM132は、コントローラ130が実行する処理に必要なデータを一時的に記憶する。
ホストインタフェース110を介してホストコンピュータ10からの書き込み要求や読み込み要求を受け取る。そして、コントローラ130は、受け取った要求に従って、ディスクインタフェース120を介してHDD210,220,230,240,250へのデータの入出力を行う。
例えば、ホストコンピュータ10から論理ブロックを指定した書き込み要求が入力された場合、コントローラ130は書き込み対象の物理ブロックを判断し、該当する物理ブロックが属するHDDにデータの書き込み指示を出力する。また、ホストコンピュータ10から論理ブロックを指定した読み込み要求が入力された場合、コントローラ130は読み込み対象の物理ブロックを判断し、該当する物理ブロックが属するHDDからデータを読み出す。図1に示した読み込み手段1、パリティデータ生成手段2、時系列情報生成手段3、時系列情報付与手段4、書き込み手段5、比較手段6、修復手段7、およびデータ出力手段8は、コントローラ130が有する機能である。
なお、コントローラ130は、RAIDによるデータ管理機能を有している。例えば、コントローラ130は、RAID4やRAID5によるHDD210,220,230,240,250へのデータの入出力が可能である。以下の説明では、コントローラ130は、RAID5によりデータを管理するものとする。
HDD210,220,230,240,250は、所定のデータ長のブロック単位に物理フォーマットが施されている。また、HDD210,220,230,240,250はディスクキャッシュ用のキャッシュメモリを有している。HDD210,220,230,240,250は、書き込み対象のデータを一旦キャッシュメモリに格納し、その後の処理の空き時間などを利用して、キャッシュメモリ内のデータをディスクに書き込む。
図3は、HDDのフォーマットを示す図である。HDD210内の記憶領域には、複数の物理ブロック211が設けられている。物理ブロック211内はデータ領域211aとタイムスタンプ領域211bとに分けられる。データ領域211aには、割り当てられている論理ブロックのデータが格納される。タイムスタンプ領域221bには、複数のタイムスタンプ(タイムスタンプ群)が格納される。タイムスタンプ領域221bは、少なくともRAID5におけるパリティグループ内の論理ブロック数に相当するタイムスタンプを書き込み可能な記憶容量を有している。
ここで、RAID5のRAIDシステムに使用するHDDの台数がn(nは自然数)、各HDDの物理ブロック数がx(xは自然数)の場合を想定し、HDD内のデータを詳細に説明する。
図4は、RAID5におけるパリティグループの論理ブロックと物理ブロックとの関係を示す図である。パリティグループ20は、複数の論理ブロックを有している。論理ブロックには、複数のデータブロック21,22,・・・,2mと1つのパリティブロック2nとがある。
データブロック21,22,・・・,2mは、それぞれ所定データ長のデータd1,d2,・・・,dmを記憶する論理的な記憶領域である。パリティブロック2nは、データブロック21,22,・・・,2m内のデータd1,d2,・・・,dmに基づいて生成されたパリティデータdnを記憶する論理的な記憶領域である。パリティデータdnは、データd1,d2,・・・,dmの誤り訂正符号として用いられるデータである。例えば、パリティデータdnは、データブロック21,22,・・・,2m内の各データの排他的論理和演算によって生成される。
パリティグループ20内のブロック数は、RAID5のために使用されるHDD数と等しい。図4の例では、n台のHDD31,32,・・・,3m,3nがある。そのためパリティグループ20は、n−1個のデータブロック21,22,・・・,2mと1つのパリティブロック2nとを有することとなる。なお、HDD31,32,・・・,3m,3nには、それぞれ1からnまでのディスク番号(DISK#に続く数字)が割り当てられている。
各HDD31,32,・・・,3m,3n内のx個の物理ブロックには、それぞれ物理ブロック番号(block#に続く数字)が設定されている。そして、各物理ブロックは、データとタイムスタンプ群との記憶領域を有している。図4の例では、物理ブロック番号「i」(iは1以上x以下の整数)に格納されたデータを、d(i)と表している。
タイムスタンプ群の記憶領域には、HDDの台数分のタイムスタンプを格納できる。タイムスタンプ群の記憶領域は、HDDのディスク番号に対応付けられたタイムスタンプ領域に分けられている。各タイムスタンプ領域はそれぞれHDD31,32,・・・,3m,3nに対応付けられている。図4の例では、物理ブロック番号「i」におけるディスク番号「j」(jは1以上n以下の整数)に対応するタイムスタンプをt(i,j)と表している。
パリティグループ20内のデータブロック21,22,・・・,2mとパリティブロック2nとのデータは、個別のHDD31,32,・・・,3m,3nに格納される。すなわちRAID装置100のコントローラ130によって、データブロック21,22,・・・,2mとパリティブロック2nとに対応する物理ブロックが、それぞれ異なるHDDから選択される。図4の例では、データブロック21に対してHDD31の先頭の物理ブロックが対応付けられている。データブロック22に対してHDD32の先頭の物理ブロックが対応付けられている。データブロック2mに対してHDD3nの先頭の物理ブロックが対応付けられている。パリティブロック2nに対してHDD3mの先頭の物理ブロックが対応付けられている。
RAID装置100のコントローラ130は、ホストコンピュータ10からの要求に応じてデータブロックのデータを、対応する物理ブロックに格納する。その際、コントローラ130はデータブロックのデータおよびパリティデータにタイムスタンプを付与する。
図5は、データおよびパリティデータに設定されるタイムスタンプの例を示す図である。図5の例では、データブロック21のデータの書き込み時刻を「T1」、データブロック22のデータの書き込み時刻を「T2」、データブロック2mのデータの書き込み時刻を「Tm」としている。各データブロック21,22,・・・,2mのデータには、そのデータを書き込むHDDに対応する部分領域に、書き込み時刻を示すタイムスタンプが設定される。パリティブロック2nのパリティデータには、同じパリティグループに属する他のデータの書き込み時に設定されたタイムスタンプが、そのデータが書き込まれたHDDに対応するタイムスタンプ領域に設定されている。
各データブロックのデータが更新される場合、更新されたデータに付与されたタイムスタンプも更新される。また、パリティグループ内のデータが更新されると、パリティデータも更新される。その際、パリティデータに付与されている複数のタイムスタンプのうち、更新されたデータのタイムスタンプが更新される。すなわち、パリティデータに付与されている各タイムスタンプは、対応するデータに付与されているタイムスタンプとの同一性が保たれる。
次に、図2に示した様にHDDが5台の場合におけるデータの書き込み処理と読み込み処理について説明する。
図6は、データの書き込み処理手順を示すシーケンス図である。以下、図6に示す処理をステップ番号に沿って説明する。
[ステップS11]ホストコンピュータ10は、ユーザからの操作入力などに応答して、RAID装置100に対し、更新するデータの内容と、そのデータが属するデータブロックとを指定した書き込み要求を送信する。書き込み要求は、RAID装置100のホストインタフェース110を介してコントローラ130に入力される。この例では、書き込み対象のデータブロックは、HDD210内の物理ブロックに対応付けられているものとする。また、書き込み対象のデータブロックが属するパリティグループのパリティブロックには、HDD250内の物理ブロックが対応付けられているものとする。
[ステップS12]コントローラ130は、書き込み要求を受け取ると、書き込み対象のデータブロックに対応する物理ブロック内のデータの読み込み指示を、HDD210に対して出力する。
[ステップS13]コントローラ130はHDD210への読み込み指示と同時に、パリティブロックに対応する物理ブロック内のデータの読み込み指示を、HDD250に対して出力する。
[ステップS14]HDD210は、読み込み指示に応答して、指定された物理ブロック内のデータを読み出す。この際、データに付与されているタイムスタンプ群も読み出される。
[ステップS15]HDD250は、読み込み指示に応答して、指定された物理ブロック内のパリティデータを読み出す。この際、パリティデータに付与されているタイムスタンプ群も読み出される。
[ステップS16]HDD210は、タイムスタンプ付きのデータをコントローラ130に送信する。
[ステップS17]HDD250は、タイムスタンプ付きのパリティデータをコントローラ130に送信する。
[ステップS18]コントローラ130は、タイムスタンプを生成する。具体的には、コントローラ130は、RAID装置100内部の時計機能から現在の時刻を取得し、その時刻をタイムスタンプとする。
[ステップS19]コントローラ130は、書き込み要求に従って、HDD210から読み込んだデータの内容を更新する。さらにコントローラ130は、更新後のデータにステップS18で生成したタイムスタンプを付与する。そして、コントローラ130は、HDD210に対して、書き込み対象のデータブロックに対応する物理ブロックへの更新後のデータの書き込み指示を出力する。
[ステップS20]コントローラ130は、HDD210から読み込んだデータの更新内容に基づいて、HDD250から読み込んだパリティデータを更新する。さらにコントローラ130は、更新後のパリティデータにステップS18で生成したタイムスタンプを付与する。そして、コントローラ130は、HDD250に対して、パリティブロックに対応する物理ブロックへの更新後のパリティデータの書き込み指示を送信する。
[ステップS21]HDD210は、書き込み指示に含まれるタイムスタンプ付きのデータをキャッシュメモリに格納し、「OK」の応答をコントローラ130に送信する。
[ステップS22]HDD250は、書き込み指示に含まれるタイムスタンプ付きのパリティデータをキャッシュメモリに格納し、書き込みを実行したことを示す「OK」の応答をコントローラ130に送信する。
[ステップS23]コントローラ130は、HDD210,250から「OK」の応答を受け取ると、書き込み完了の応答をホストコンピュータ10に送信する。
[ステップS24]HDD210は、「OK」応答後の所定のタイミングで、キャッシュメモリ内のタイムスタンプ付きのデータを、物理ブロックに書き込む。
[ステップS25]HDD210は、「OK」応答後の所定のタイミングで、キャッシュメモリ内のタイムスタンプ付きのパリティデータを、物理ブロックに書き込む。
このようにして、データの書き込みの際に、そのデータを格納する物理ブロックと、そのデータのパリティデータを格納する物理ブロックとに、同じタイムスタンプが書き込まれる。
次に、データの読み込み処理について説明する。
図7は、データの読み込み処理手順を示すシーケンス図である。以下、図7に示す処理をステップ番号に沿って説明する。
[ステップS31]ホストコンピュータ10は、ユーザからの操作入力などに応答して、RAID装置100に対し、読み込み対象データが属するデータブロックを指定した読み込み要求を送信する。読み込み要求は、RAID装置100のホストインタフェース110を介してコントローラ130に入力される。この例では、読み込み対象のデータブロックは、HDD210内の物理ブロックに対応付けられているものとする。また、読み込み対象のデータブロックが属するパリティグループのパリティブロックには、HDD250内の物理ブロックが対応付けられているものとする。
[ステップS32]コントローラ130は、読み込み要求を受け取ると、読み込み対象のデータブロックに対応する物理ブロック内のデータの読み込み指示を、HDD210に対して出力する。
[ステップS33]コントローラ130はHDD210への読み込み指示と同時に、パリティブロックに対応する物理ブロック内のデータの読み込み指示を、HDD250に対して出力する。
[ステップS34]HDD210は、読み込み指示に応答して、指定された物理ブロック内のデータを読み出す。この際、データに付与されているタイムスタンプも読み出される。
[ステップS35]HDD250は、読み込み指示に応答して、指定された物理ブロック内のパリティデータを読み出す。この際、パリティデータに付与されているタイムスタンプも読み出される。
[ステップS36]HDD210は、タイムスタンプ付きのデータをコントローラ130に送信する。
[ステップS37]HDD250は、タイムスタンプ付きのパリティデータをコントローラ130に送信する。
[ステップS38]コントローラ130は、タイムスタンプを比較する。具体的には、コントローラ130は、パリティデータに付与されているタイムスタンプ群から、読み込み対象のデータに対応するタイムスタンプを抽出する。そして、コントローラ130は、抽出したタイムスタンプと、読み込み対象のデータに付与されていたタイムスタンプとを比較する。タイムスタンプの値が一致した場合、コントローラ130は、該当データの書き込み時に書き込み抜けが発生していないと判定する。
[ステップS39]コントローラ130は、書き込み抜けが発生していなければ、HDD210から読み込んだデータをホストコンピュータ10に送信する。
このように、データ書き込み時に、書き込み対象のデータと、パリティデータとに同一のタイムスタンプを付与し、読み込み時にそれらのタイムスタンプを比較することで、データの書き込み抜けを検出することができる。すなわち、データの書き込み抜けの検出をデータの読み込み時に行うことが可能となる。
データの読み込み時に書き込み抜けを検出可能であれば、データ書き込み時に書き込み抜けの検出処理を行わずに済む。すなわち、従来であれば、データ書き込み時に書き込み抜けの検出する必要があった。そのため、データの書き込み直後に、そのデータの読み込み処理を実行し、書き込み抜けが発生していないこと(所望のデータが書き込まれたこと)を確認していた。その結果、従来は、データ書き込み直後に該当データの読み込み処理が余計に発生していた。本実施の形態では、図6に示したように、データの書き込み直後に、そのデータの読み込みを行う必要はない。
また、従来は、データ書き込み直後に該当データの読み込み処理を行うため、ディスクキャッシュ処理を行うことができなかった。他方、本実施の形態では、書き込み抜けの検出処理をデータの読み込み時に行うことができる。そのため、データの書き込み時にはディスクキャッシュ処理を行うことができ、書き込み要求に対する応答時間を短縮することができる。
ところで、RAID5では、連続する複数の論理ブロックを同じHDDに格納することができる。
図8は、RAID5における論理ブロックのHDDへの割当例を示す図である。図8ではデータが格納されるデータブロックの論理ブロック番号を、文字「D」と数字との結合で表している。また、パリティデータが格納されるパリティブロックの論理ブロック番号を、文字「P」と数字との結合で表している。割当表40には、ディスク番号とブロック番号との交差する位置に、ディスク番号とブロック番号とで特定される物理ブロックに割り当てられた論理ブロックの論理ブロック番号が設定されている。
図8の例では、パリティグループ数が「5」、チャンク内ブロック数が「4」である。割当表40の横に並んだブロック、例えば論理ブロック番号「D1」、「D5」、「D9」、「D13」、「P1」が1つのパリティグループである。パリティブロック「P1」内のパリティデータは、論理ブロック「D1」、「D5」、「D9」、「D13」の各データの排他論理和である。
このようにチャンク内ブロック数が4の場合、論理ブロックにおける連続する4ブロックが、同じHDDに格納される。この4ブロックずつのブロックの集合がチャンクである。「D1」〜「D16」、「P1」〜「P4」のようにチャンクをパリティグループ数だけ集めたものがストライプ41〜44である。図8では、ストライプ41〜44を太線の枠で囲っている。各ストライプ41〜44では、そのストライプに含まれるパリティブロックに対応する物理ブロックは、共通のHDDに属している。
このようにチャンク単位で論理ブロックの振り分けを行う場合、HDDへのアクセス処理は物理ブロック単位で行う方法と、ストライプ単位で行う方法とがある。そこで、以下の説明では、タイムスタンプの制御方法についても、物理ブロック単位のデータアクセスの場合と、ストライプ単位のデータアクセスの場合とにわけて説明することとする。
まず、RAID装置100内のコントローラ130が有する処理機能について詳細に説明する。
図9は、コントローラの機能を示すブロック図である。コントローラ130は、データ入出力部133、RAID制御部134、HDDアクセス部135、タイムスタンプ生成部136、およびタイムスタンプ比較部137を有している。
データ入出力部133は、ホストコンピュータ10からのアクセス要求を受け付ける。アクセス要求には、書き込み要求と読み込み要求とがある。データ入出力部133は、受け付けたアクセス要求をRAID制御部134に渡す。その後、データ入出力部133は、RAID制御部134からアクセス要求の結果を受け取り、ホストコンピュータ10に対して送信する。
RAID制御部134は、アクセス要求に応じて、RAID技術を用いたHDD210,220,230,240,250へのアクセス制御を行う。本実施の形態では、RAID制御部134は、RAID5のアクセス制御を行うものとする。RAID制御部134は、RAID5のアクセス制御を行うために、図8に示したような論理ブロックと物理ブロックとの対応関係を管理している。そして、RAID制御部134は、アクセス要求で指定された論理ブロックに対応する物理ブロック、およびその物理ブロックを有するHDDを特定し、アクセス要求に応じたアクセス指示をHDDアクセス部135に対して出力する。
RAID制御部134は、アクセス要求が書き込み要求の場合、タイムスタンプ生成部136からタイムスタンプを取得する。そして、取得したタイムスタンプを書き込み対象のデータと、更新されたパリティデータとに付与する。そして、RAID制御部134は、タイムスタンプ付きのデータとパリティデータとのHDDへの書き込み指示を行う。
また、RAID制御部134は、アクセス要求が読み込み要求の場合、読み込んだデータおよびそのデータが属するパリティグループのパリティデータそれぞれに付与されたタイムスタンプ群から、読み込んだデータに対応するタイムスタンプを抽出する。そして、RAID制御部134は、抽出した2つのタイムスタンプをタイムスタンプ比較部137に渡す。RAID制御部134は、タイムスタンプ比較部137からタイムスタンプの比較結果を受け取り、その比較結果に基づいて書き込み抜けの有無を判定する。RAID制御部134は、書き込み抜けがなければ、読み込んだデータを読み込み要求への応答としてデータ入出力部133に渡す。
なお、RAID制御部134は、書き込み抜けがあると判定した場合、データの復旧処理を行う。そして、RAID制御部134は、復旧したデータを読み込み要求への応答としてデータ入出力部133に渡す。
HDDアクセス部135は、RAID制御部134からの指示に従って、HDD210,220,230,240,250に対して物理ブロック単位のデータの書き込み指示、または読み込み指示を行う。HDDアクセス部135は、HDDへのデータの書き込み指示を行った場合、書き込み対象HDDからの「OK」の応答を受け取ると、その応答をRAID制御部134に渡す。また、HDDアクセス部135は、データの読み込み指示を行った場合、読み込み対象HDDからデータを受け取り、RAID制御部134に渡す。
なお、HDDアクセス部135は、データまたはパリティデータをHDD210,220,230,240,250に書き込む場合、タイムスタンプ付与後のデータまたはパリティデータのECCを生成し、データまたはパリティデータに付与する。また、HDDアクセス部135は、データまたはパリティデータをHDD210,220,230,240,250にから読み込む場合、ECCによるエラー検出処理を行う。
タイムスタンプ生成部136は、RAID制御部134からの要求に応じてタイムスタンプを生成する。具体的には、タイムスタンプ生成部136は、RAID装置100の内部時計が示す時刻を取得し、タイムスタンプとする。
タイムスタンプ比較部137は、RAID制御部134からの要求に応じてタイムスタンプを比較する。
次に、コントローラ130における書き込み処理、読み込み処理について、ブロック単位およびストライプ単位で実行する場合に分けて詳細に説明する。なお、以下の説明では、データの書き込みおよび読み込みのアドレス制御やECC制御については省略している。
まず、ブロック単位の書き込み処理について説明する。
図10は、ブロック書き込み処理手順を示すフローチャートである。以下、図10に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からブロック単位でのデータの書き込み要求が入力されたときに実行される。なお、データの書き込み要求には、書き込み対象のデータ(更新データ)と、その更新データが属するデータブロックの論理ブロック番号が含まれている。
[ステップS41]RAID制御部134は、書き込み要求に応じたデータ書き込み対象の物理ブロック内のデータの読み込み指示を、HDDアクセス部135に対して出力する。具体的には、RAID制御部134は、まず、書き込み要求で指定された論理ブロック番号に対応する物理ブロックを特定する。そして、該当する物理ブロックが属するHDDのディスク番号と、該当する物理ブロックの物理ブロック番号を判断する。これらの判断は、図8に示した割当関係に基づいて行われる。そして、RAID制御部134は、データ書き込み対象の物理ブロックを指定して、その物理ブロック内のデータの読み込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135によって、指定された物理ブロック内のデータの読み込みが行われる。
[ステップS42]RAID制御部134は、パリティブロックに対応する物理ブロック内のパリティデータの読み込み指示を、HDDアクセス部135に対して出力する。具体的には、RAID制御部134は、まず、書き込み要求で指定された論理ブロック番号と同じパリティグループ内のパリティブロックに対応する物理ブロックを特定する。そして、該当する物理ブロックが属するHDDのディスク番号と、該当する物理ブロックの物理ブロック番号を判断する。これらの判断は、図8に示した割当関係に基づいて行われる。そして、RAID制御部134は、パリティブロックに対応する物理ブロックを指定して、その物理ブロック内のパリティブロックの読み込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135によって、指定された物理ブロック内のパリティデータの読み込みが行われる。
[ステップS43]RAID制御部134は、データの読み込みが完了したか否かを判断する。具体的には、RAID制御部134は、データの読み込み指示を出力したHDDからデータが応答された場合、データ読み込み完了と判断する。データ読み込みが完了した場合、処理がステップS44に進められる。データ読み込みが完了していなければステップS43の処理が繰り返され、RAID制御部134は読み込み待ち状態となる。
[ステップS44]RAID制御部134は、パリティデータの読み込みが完了したか否かを判断する。具体的には、RAID制御部134は、パリティデータの読み込み指示を出力したHDDからパリティデータが応答された場合、パリティデータ読み込み完了と判断する。パリティデータの読み込みが完了した場合、処理がステップS45に進められる。パリティデータ読み込みが完了していなければステップS44の処理が繰り返され、RAID制御部134は読み込み待ち状態となる。
RAID制御部134はデータとパリティデータとの読み込みが完了すると、RAM132内に処理対象データテーブルを作成し、読み込んだデータをその処理対象データテーブルに格納する。
[ステップS45]RAID制御部134は、パリティデータを計算する。具体的には、RAID制御部134は、HDDから読み込んだパリティデータ、HDDから読み込んだデータ、および更新データの排他的論理和演算を行う。その演算結果が、更新後のパリティデータとなる。
[ステップS46]タイムスタンプ生成部136は、タイムスタンプを取得する。具体的には、RAID制御部134からタイムスタンプ生成部136へ、タイムスタンプの生成要求が出される。その生成要求に応じて、タイムスタンプ生成部136がタイムスタンプを生成する。生成されたタイムスタンプは、タイムスタンプ生成部136からRAID制御部134に渡される。
[ステップS47]RAID制御部134は、データブロックの書き込み指示をHDDアクセス部135に対して出力する。具体的には、RAID制御部134は、書き込み要求で指定された更新データにタイムスタンプを付与する。そして、RAID制御部134は、更新データが属するデータブロックに対応する物理ブロックのディスク番号と物理ブロック番号とを指定して、タイムスタンプ付きの更新データの書き込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135によって、ディスク番号に対応するHDDに対して、タイムスタンプ付きの更新データの書き込みが行われる。
[ステップS48]RAID制御部134は、パリティデータの書き込み指示をHDDアクセス部135に対して出力する。具体的には、RAID制御部134は、書き込み要求で指定された更新データと同じパリティグループ内のパリティデータにタイムスタンプを付与する。付与されるパリティデータは、パリティデータ群内の更新データが格納されるHDDに対応付けられたタイムスタンプ領域に設定される。そして、RAID制御部134は、パリティブロックに対応する物理ブロックのディスク番号と物理ブロック番号とを指定して、タイムスタンプ付きのパリティデータの書き込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135によって、ディスク番号に対応するHDDに対して、タイムスタンプ付きのパリティデータの書き込みが行われる。
[ステップS49]RAID制御部134は、データの書き込みが完了したか否かを判断する。具体的には、RAID制御部134は、データの書き込み指示を出力したHDDから「OK」の応答が返信されると、データ書き込み完了と判断する。データ書き込みが完了した場合、処理がステップS50に進められる。データ書き込みが未完了であれば、ステップS49の処理が繰り返され、RAID制御部134はデータ書き込み完了待ち状態となる。
[ステップS50]RAID制御部134は、パリティデータの書き込みが完了したか否かを判断する。具体的には、RAID制御部134は、パリティデータの書き込み指示を出力したHDDから「OK」の応答が返信されると、パリティデータ書き込み完了と判断する。パリティデータ書き込みが完了した場合、処理が終了する。パリティデータ書き込みが未完了であれば、ステップS50の処理が繰り返され、RAID制御部134はパリティデータ書き込み完了待ち状態となる。
このようにして、ホストコンピュータ10からのブロック単位のデータ書き込み要求に応答して、データブロックとパリティブロックとのそれぞれに対応する物理ブロック内のデータが更新される。
以下、図11,図12を参照して、論理ブロック番号「D1」のデータを更新する書き込み要求が出された場合を例に採り、データブロックとパリティブロックとタイムスタンプの更新内容を説明する。
ホストコンピュータ10から論理ブロック番号「D1」内のデータの書き込み要求が入力されると、まず、そのデータブロックに対応する物理ブロック内のデータがHDDから読み出される(図10のステップS41〜S44)。図8を参照すると、論理ブロック番号「D1」に対応する物理ブロックは、ディスク番号が「DISK#1」のHDD210の物理ブロック番号「block#1」の物理ブロックである。そこで、HDD210の物理ブロック番号「block#1」の物理ブロック内のデータが読み出される。
また、論理ブロック番号「D1」と同じパリティグループに属するのは、論理ブロック番号「P1」のパリティブロックである。論理ブロック番号「P1」に対応する物理ブロックは、ディスク番号が「DISK#5」のHDD250の物理ブロック番号「block#1」の物理ブロックである。そこで、HDD250の物理ブロック番号「block#1」内のパリティデータが読み出される。
読み出されたデータおよびパリティデータは、処理対象データテーブルに設定される。
図11は、処理対象データテーブルのデータ構造例を示す図である。処理対象データテーブル132aは、図10のステップS44終了後に、RAID制御部134によってRAM132内に生成される。処理対象データテーブル132aには、論理ブロック番号、ディスク番号、物理ブロック番号、データ、およびタイムスタンプの欄が設けられている。
論理ブロック番号の欄には、読み出されたデータまたはパリティデータの論理ブロックを示す論理ブロック番号が設定される。
ディスク番号の欄には、論理ブロック番号で示される論理ブロックに対応する物理ブロックが属するHDDのディスク番号が設定される。
物理ブロック番号の欄には、論理ブロック番号で示される論理ブロックに対応する物理ブロックの物理ブロック番号が設定される。
データの欄には、読み出されたデータまたはパリティデータが設定される。
タイムスタンプの欄には、読み出されたデータまたはパリティデータに付与されていたパリティデータが設定される。パリティデータは、複数のHDD210,220,230,240,250それぞれに対応付けられている。
図11の例では、論理ブロック番号「D1」の論理ブロックは、データブロックである。このデータブロックのデータ「d1」には、ディスク番号「DISK#1」のHDD210に対応するタイムスタンプ「t11」が設定されている。また、論理ブロック番号「P1」の論理ブロックは、パリティブロックである。このパリティブロックのパリティデータ「p1」には、同じパリティグループ内のデータブロックのデータそれぞれ対応するタイムスタンプ「t21」、「t22」、「t23」、「t24」が設定されている。
このような処理対象データテーブル132a内のデータが、書き込み要求に示される更新データに基づいて更新される。
図12は、データ更新後の処理対象データテーブルの例を示す図である。図12に示すように、データ更新後の処理対象データテーブル132aでは、論理ブロック番号「D1」のデータ「d1」は、更新データ「d1_1」に変更されている。論理ブロック番号「P1」のパリティデータ「p1」は、更新後のパリティデータ「p1_1」に変更されている。なお更新後のパリティデータ「p1_1」は以下の式で計算される。
「p1_1」=「p1」^「d1」^「d1_1」
ここで、「^」は排他的論理和を表している(以後の他の式においても同様)。
データ更新後の処理対象データテーブル132aでは、論理ブロック番号「D1」のデータ「d1_1」におけるディスク番号「DISK#1」に対応するタイムスタンプ「t11」が、更新時のタイムスタンプ「t11_1」に変更されている。同様に、論理ブロック番号「P1」のパリティデータ「p1_1」におけるディスク番号「DISK#1」に対応するタイムスタンプ「t11」が、更新時のタイムスタンプ「t11_1」に変更されている。
データ更新後の処理対象データテーブル132a内のタイムスタンプ付きのデータおよびパリティデータが、元の物理ブロックに書き戻される。その結果、データの更新と共に、パリティデータの更新、およびデータとパリティデータとに付与されたタイムスタンプの更新が行われる。すなわち、更新時刻「t11_1」が、データブロックのデータを格納するHDDと、パリティブロックのパリティデータを格納するHDDとに、2重で格納される。
次に、ストライプ単位の書き込み処理について説明する。
図13は、ストライプ書き込み処理の手順を示すフローチャートである。以下、図13に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からストライプ単位でのデータの書き込み要求が入力されたときに実行される。なお、データの書き込み要求には、書き込み対象のデータ(更新データ)と、その更新データが属するストライプの指定(論理ブロック番号によるデータブロックの範囲指定)とが含まれている。
[ステップS61]RAID制御部134は、パリティデータを計算する。具体的には、RAID制御部134は、ストライプ内のデータを、各データが属する論理ブロックに応じてパリティグループに分ける。さらに、RAID制御部134は、パリティグループごとに、そのパリティグループに属するデータブロック内のデータの排他的論理和演算を行い、パリティグループごとのパリティデータを生成する。そして、RAID制御部134は、生成されたパリティデータを有する論理ブロックを、パリティデータの生成元となったデータブロックと同じパリティグループのパリティブロックとする。
[ステップS62]RAID制御部134は、タイムスタンプを取得する。タイムスタンプ取得処理の詳細は、図10のステップS46の処理と同様である。
[ステップS63]RAID制御部134は、ストライプ内の全論理ブロックのデータおよびパリティデータの書き込み指示を、HDDアクセス部135に対して出力する。具体的には、RAID制御部134は、書き込み要求で指定されたストライプ内のブロック単位の各更新データにタイムスタンプを付与する。また、RAID制御部134は、書き込み要求で指定されたストライプ内の各パリティブロックに、同じパリティグループ内の各更新データに対応するタイムスタンプを付与する。そして、RAID制御部134は、複数の更新データと、複数のパリティデータとの書き込み指示をHDDアクセス部135に対して出力する。更新データの書き込み指示には、更新データが属するデータブロックに対応する物理ブロックのディスク番号と物理ブロック番号とが指定される。パリティデータの書き込み指示には、パリティデータが属するパリティブロックに対応する物理ブロックのディスク番号と物理ブロック番号とが指定される。するとHDDアクセス部135によって、タイムスタンプ付きの更新データとパリティデータとが、それぞれについて指定されたHDD内の指定された物理ブロックに書き込まれる。
[ステップS64]RAID制御部134は、全データおよびパリティデータの書き込みが完了したか否かを判断する。具体的には、RAID制御部134は、すべてのHDDから「OK」の応答を受け取った場合、書き込み完了と判断する。全データの書き込みが完了すると、RAID制御部134は処理を終了する。少なくとも1つのHDDにおける書き込みが完了していなければ、ステップS64の処理が繰り返され、RAID制御部134は書き込み待ち状態となる。
このようにして、ホストコンピュータ10からのストライプ単位のデータ書き込み要求に応答して、データブロックとパリティブロックとのそれぞれに対応する物理ブロック内のデータが更新される。
以下、図14を参照して、論理ブロック番号「D1」〜「D16」のストライプ書き込み要求が出された場合を例に採り、タイムスタンプの更新内容を説明する。
ホストコンピュータ10から論理ブロック番号「D1」〜「D16」のストライプ書き込み要求が入力されると、RAID制御部134によって、RAM132内に処理対象データテーブルが生成される。
図14は、ストライプ書き込み時の処理対象データテーブルの例を示す図である。ストライプ書き込み時の処理対象データテーブル132bのテーブル構造は図11,図12に示したブロック書き込み時の処理対象データテーブル132aと同様である。ただし、ストライプ書き込み時の処理対象データテーブル132bには、ストライプに属するすべての論理ブロックに対応する情報が登録される。
図14の例では、図8に示したストライプ41の先頭のパリティグループに関する更新データの情報が示されている。このパリティグループは、論理ブロック番号「D1」、「D5」、「D9」、「D13」の各データブロックと、論理ブロック番号「P1」のパリティブロックとを有する。なお、図14では省略しているが、ストライプ41に含まれる他の3つのパリティグループの情報も、処理対象データテーブル132bに登録される。他の3つのパリティグループには、論理ブロック番号が「P2」、「P3」、「P4」のパリティブロックが含まれる(図8参照)。
論理ブロック番号「D1」〜「D16」それぞれのデータを「d1」〜「d16」と表したとき、論理ブロック番号「P1」〜「P4」の各パリティブロックのパリティデータ「p1」〜「p4」は、それぞれ以下の式で計算できる。
「p1」=「d1」^「d5」^「d9」^「d13」
「p2」=「d2」^「d6」^「d10」^「d14」
「p3」=「d3」^「d7」^「d11」^「d15」
「p4」=「d4」^「d8」^「d12」^「d16」
ここで、図14に示した各データ「d1」、「d5」、「d9」、「d13」に付与されるタイムスタンプは、同じ値「t1」である。個々のタイムスタンプの格納領域は、データが格納されるHDDに対応する領域である。データ「d1」、「d5」、「d9」、「d13」は、それぞれ格納されるHDDが異なるため、タイムスタンプの格納領域も異なっている。
パリティデータ「p1」には、データ「d1」、「d5」、「d9」、「d13」それぞれに対応する4つのタイムスタンプが付与される。パリティデータ「p1」に付与される各タイムスタンプの値は、すべて「t1」である。
このようにして、処理対象データテーブル132bを用いて、ストライプに含まれるデータとパリティデータとに対してタイムスタンプが付与される。そして、タイムスタンプが付与されたデータおよびパリティデータが、RAID5のストライプ書き込みより、対応付けられた物理ブロックに書き込まれる。その結果、各データに付与したタイムスタンプ「t1」は、データを格納したHDDとパリティデータを格納したHDDとに2重で格納される。
次に、データ読み込み処理について説明する。まず、ブロック単位の読み込み処理について説明する。
図15は、ブロック読み込み処理の手順を示すフローチャートである。以下、図15に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からブロック単位でのデータの読み込み要求が入力されたときに実行される。なお、データの読み込み要求には、読み込み対象のデータが属するデータブロックの論理ブロック番号が含まれている。
[ステップS71]RAID制御部134は、読み込み要求で指定されたデータブロックに対応する物理ブロックのデータの読み込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135により、指定された物理ブロックが属するHDDから、指定された物理ブロック内のデータが読み出される。
[ステップS72]RAID制御部134は、パリティブロックに対応する物理ブロックのパリティデータの読み込み指示を、HDDアクセス部135に対して出力する。すると、HDDアクセス部135により、指定された物理ブロックが属するHDDから、指定された物理ブロック内のデータが読み出される。
[ステップS73]RAID制御部134は、データの読み込みが完了したか否かを判断する。具体的には、RAID制御部134は、データの読み込み指示を出力したHDDからデータが応答された場合、データ読み込み完了と判断する。データ読み込みが完了した場合、処理がステップS74に進められる。データ読み込みが完了していなければステップS73の処理が繰り返され、RAID制御部134は読み込み待ち状態となる。
[ステップS74]RAID制御部134は、パリティデータの読み込みが完了したか否かを判断する。具体的には、RAID制御部134は、パリティデータの読み込み指示を出力したHDDからパリティデータが応答された場合、パリティデータ読み込み完了と判断する。パリティデータの読み込みが完了した場合、処理がステップS75に進められる。パリティデータ読み込みが完了していなければステップS74の処理が繰り返され、RAID制御部134は読み込み待ち状態となる。
RAID制御部134はデータとパリティデータとの読み込みが完了すると、RAM132内に処理対象データテーブルを作成し、読み込んだデータをそのデータ管理テーブルに格納する。
[ステップS75]タイムスタンプ比較部137は、パリティデータに付与された複数のタイムスタンプのうちの読み込み対象のデータに対応するタイムスタンプと、読み込み対象のデータに付与されたタイムスタンプとを比較する。読み込み対象のデータに付与されたタイムスタンプの値が、パリティデータに付与されたタイムスタンプの値以上の場合、処理がステップS76に進められる。そうでなければ、処理がステップS79に進められる。
[ステップS76]読み込み対象のデータのタイムスタンプが、パリティデータのタイムスタンプ以上の場合、RAID制御部134は、読み込んだデータをホストコンピュータ10に応答する。
[ステップS77]タイムスタンプ比較部137は、パリティデータに付与された読み込み対象のデータに対応するタイムスタンプと、読み込み対象のデータに付与されたタイムスタンプとを比較する。読み込み対象のデータに付与されたタイムスタンプの値が、パリティデータに付与されたタイムスタンプの値より大きければ、処理がステップS78に進められる。読み込み対象のデータに付与されたタイムスタンプの値と、パリティデータに付与されたタイムスタンプの値とが等しければ、処理が終了する。
[ステップS78]読み込み対象のデータに付与されたタイムスタンプの値が、パリティデータに付与されたタイムスタンプの値より大きい場合、RAID制御部134は、パリティ書き込み抜けの修復を行う。パリティ書き込み抜け修復処理の詳細は後述する(図17参照)。その後、処理が終了する。
[ステップS79]読み込み対象のデータのタイムスタンプが、パリティデータのタイムスタンプより小さい場合、RAID制御部134は、データ書き込み抜けの修復を行う。データ書き込み抜けの修復および応答処理の詳細は後述する(図20参照)。そして、RAID制御部134は、ホストコンピュータ10に対して、修復したデータを応答する。その後、処理が終了する。
このようにして、ブロック単位の読み込み処理が行われる。例えば、論理ブロック番号「D1」のデータブロックのデータ「d1」を読み出す場合について説明する。この場合、まず、データ「d1」を格納する物理ブロックからそのデータ「d1」が読み出される。また、論理ブロック番号「D1」のデータブロックと同じパリティグループに属するパリティブロック「P1」のパリティデータ「p1」を格納する物理ブロックから、パリティデータ「p1」が読み出される。そして、RAID制御部134によって、処理対象データテーブルが生成される。
図16は、処理対象データテーブルのデータ構造例を示す図である。処理対象データテーブル132cは、図15のステップS74終了後に、RAID制御部134によってRAM132内に生成される。処理対象データテーブル132cには、論理ブロック番号、ディスク番号、物理ブロック番号、データ、およびタイムスタンプの欄が設けられている。各欄には、図11に示した処理対象データテーブル132aの同名の欄と同種の情報が設定される。
図16の例では、処理対象データテーブル132cに、データ「d1」とパリティデータ「p1」との情報が登録されている。データ「d1」は、論理ブロック番号「D1」のデータブロックのデータである。「p1」は、論理ブロック番号「D1」のデータブロックと同じパリティグループ内のパリティブロック(論理ブロック番号「P1」)のパリティデータである。
ここで、データ「d1」に付与されていたタイムスタンプを「t11」とする。タイムスタンプ「t11」は、ディスク番号「DISK#1」のHDD210に対応付けられている。また、パリティデータ「p1」に付与されていたタイムスタンプを「t21」、「t22」、「t23」、「t24」とする。タイムスタンプ「t21」、「t22」、「t23」、「t24」は、それぞれディスク番号「DISK#1」、「DISK#2」、「DISK#3」、「DISK#4」のHDD210,220,230,240に対応付けられている。
タイムスタンプ比較部137は、データ「d1」に付与されていたタイムスタンプ「t1」と、データ「d1」の読み込み元のHDD210に対応付けてタイムスタンプに付与されていたタイムスタンプ「t21」とを比較する。ここで「t21」>「t11」の場合、タイムスタンプ比較部137は、データの書き込み抜けがあると判断する。他方、タイムスタンプ比較部137は、「t21」≦「t11」であれば、データの書き込み抜けは発生していないと判断する。ただし、「t21」<「t11」の場合、タイムスタンプ比較部137は、パリティデータの書き込み抜けが発生していると判断する。
RAID制御部134は、データの書き込み抜けが検出されなければ、読み込んだデータ「d1」をホストコンピュータ10に応答する。パリティデータの書き込み抜けが検出された場合には、RAID制御部134は、パリティデータ書き込み抜け修復処理を行う。データの書き込み抜けが検出された場合には、RAID制御部134は、データ書き込み抜け修復および応答処理を行う。
次に、パリティデータ書き込み抜け修復処理について説明する。
図17は、パリティデータ書き込み抜け修復処理の手順を示すフローチャートである。以下、図17に示す処理をステップ番号に沿って説明する。
[ステップS81]RAID制御部134は、残りのデータの読み込み指示をHDDアクセス部135に出力する。すると、HDDアクセス部135により残りのデータがHDDから読み出される。ここで残りのデータとは、読み込み要求で指定された論理ブロック番号のデータブロックと同じパリティグループに属する他のデータブロックそれぞれに対応する物理ブロックに格納されたデータである。
[ステップS82]RAID制御部134は、ステップS81で読み込み指示を出した全データの読み込みが完了したか否かを判断する。すべてのデータの読み込みが完了していれば、処理がステップS83に進められる。読み込みが未完了のデータがあれば、ステップS82の処理が繰り返され、RAID制御部134は、読み込み待ちの状態となる。
読み込み要求で指定されたデータブロックのデータとパリティブロックのデータとは、既にステップS71,72の処理で読み出されている。従って、ステップS81で残りの全データが読み出されることにより、読み込み要求で指定された論理ブロックが属するパリティグループ内のすべてのデータとパリティデータとが読み出されたこととなる。
[ステップS83]タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプと、新たに読み出された各データに付与されたタイムスタンプとを比較する。具体的には、タイムスタンプ比較部137は、パリティデータの付与された各タイムスタンプの格納場所に基づいて、そのタイムスタンプに対応するHDDを判断する。そして、タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプと、そのタイムスタンプに対応するHDDから読み出されたデータに付与されたタイムスタンプとを比較する。各タイムスタンプの比較の結果、すべてのデータについて、パリティデータに付与されたタイムスタンプ以上の値のタイムスタンプが付与されていた場合、処理がステップS85に進められる。他方、パリティデータに付与されたタイムスタンプよりも小さい値のタイムスタンプが付与されたデータが少なくとも1つある場合、処理がステップS84に進められる。
[ステップS84]RAID制御部134は、パリティデータよりも古いタイムスタンプが付与されたデータが格納されていた物理ブロックを特定する。そして、RAID制御部134は、特定した物理ブロックに対応する論理ブロックをバッドブロックとして記録する。すなわち、パリティデータよりも古いタイムスタンプが付与されたデータが格納されていた物理ブロックでは、データの書き込み抜けが発生している。また、パリティデータ書き込み抜け修復処理が実行される場合には、既にパリティデータの書き込み抜けが発生していることが分かっている。すなわち、同一のパリティグループにおいて複数の物理ブロックで書き込み抜けが発生していることとなる。
複数の物理ブロックで書き込み抜けが発生した場合、データを修復することができない。そこで、RAID制御部134は、書き込み抜けが発生した物理ブロックに対応する論理ブロックのデータが損失したことを示すため、その論理ブロックの属性をバッドブロックとする。以後、バッドブロックとして登録された論理ブロックのデータ読み込み要求があると、RAID制御部134はエラーを応答する。
[ステップS85]RAID制御部134は、読み出されているデータに基づいてパリティ計算を行い、パリティデータを生成する。具体的には、RAID制御部134は、読み込んだデータの排他的論理和演算を行い、演算結果をパリティデータとする。この際、RAID制御部134は、生成したパリティデータに、各データのタイムスタンプと同じ値のタイムスタンプを付与する。
[ステップS86]RAID制御部134は、パリティブロックに対応する物理ブロックへのタイムスタンプ付きのパリティデータの書き込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135により、修復されたパリティデータがHDD内の指定された論理ブロックに書き込まれる。
[ステップS87]RAID制御部134は、パリティデータの書き込みが完了したか否かを判断する。書き込みが完了した場合、処理が終了する。書き込みが完了していなければ、ステップS87の処理が繰り返され、RAID制御部134は書き込み完了待ちの状態となる。
このようにして、パリティデータの書き込み抜けがあった場合、パリティデータを修復することができる。
例えば、論理ブロック番号「D1」のデータブロック内のデータの読み込み処理において、パリティデータの書き込み抜けが検出された場合を想定する。この場合、論理ブロック「D1」と同じパリティグループに属する他のデータブロックのデータが読み出される。すなわち論理ブロック番号「D5」、「D9」、「D13」のデータブロックに対応する物理ブロックからデータ「d5」、「d9」、「d13」が読み出される。読み出されたデータは、図16に示した処理対象データテーブル132cに追加登録される。
図18は、パリティ書き込み抜け修復時の処理対象データテーブルの例を示す図である。処理対象データテーブル132cには、データ「d5」、「d9」、「d13」に関する情報が追加登録されている。
タイムスタンプ比較部137は、新たに読み出されたデータ「d5」、「d9」、「d13」に付与されているタイムスタンプと、パリティデータ「p1」に付与されているタイムスタンプとを比較する。すなわち、「t12」と「t22」とが比較され、「t13」と「t23」とが比較され、「t14」と「t24」とが比較される。比較の結果、以下の条件が成立するか否かが判断される。
(t12≧t22)AND(t13≧t23)AND(t14≧t24)
ここで「AND」は論理積を示している。この条件が成立するとき、タイムスタンプ比較部137は、論理ブロック番号「D5」、「D9」、「D13」に対応する物理ブロックに書き込み抜けはないと判断する。上記条件が成立しない場合、タイムスタンプ比較部137は、パリティデータに付与されたタイムスタンプより小さいタイムスタンプを有する物理ブロックにおいて書き込み抜けが発生したと判断する。この場合、RAID制御部134は、該当する論理ディスクのブロックをデータ損失したバッドブロックとして登録する。
RAID制御部134は、バッドブロックがない場合、各データブロックのデータ「d1」、「d5」、「d9」、「d13」を用いてパリティデータを計算する。新たに生成されるパリティデータを「p1_1」とすると、以下の計算が行われる。
「p1_1」=「d1」^「d5」^「d9」^「d13」
そして、新たに生成されたパリティデータ「p1_1」に、他のデータと同じタイムスタンプが付与される。
図19は、パリティデータ修復後の処理対象データテーブルの例を示す図である。図19に示すように、新たに生成されたパリティデータ「p1_1」には、他のデータ「d1」、「d5」、「d9」、「d13」と同じタイムスタンプ「t11」、「t12」「t13」、「t14」が付与されている。
そして、タイムスタンプ付きのパリティデータ「p1_1」が、論理ブロック番号「P1」に対応する物理ブロックに書き込まれる。その結果、書き込み抜けによって損失していたパリティデータが修復される。
次に、データ書き込み抜け修復および応答処理について説明する。
図20は、データ書き込み抜け修復および応答処理の手順を示すフローチャートである。以下、図20に示す処理をステップ番号に沿って説明する。
[ステップS91]RAID制御部134は、残りのデータの読み込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135により、読み込み要求で指定されたデータ以外の残りのデータがHDDから読み出される。
[ステップS92]RAID制御部134は、ステップS91で読み込み指示を出した全データの読み込みが完了したか否かを判断する。すべてのデータの読み込みが完了していれば、処理がステップS93に進められる。読み込みが未完了のデータがあれば、ステップS92の処理が繰り返され、RAID制御部134は、読み込み待ちの状態となる。
[ステップS93]タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプと、新たに読み出された各データに付与されたタイムスタンプとを比較する。具体的には、タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプの格納場所に基づいて、そのタイムスタンプに対応するHDDを判断する。そして、タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプと、そのタイムスタンプに対応するHDDから読み出されたデータに付与されたタイムスタンプとを比較する。各タイムスタンプの比較の結果、すべてのデータについて、パリティデータと同じ値のタイムスタンプが付与されていた場合、処理がステップS94に進められる。他方、パリティデータに付与されたタイムスタンプと異なるタイムスタンプが付与されたデータが少なくとも1つある場合、処理がステップS98に進められる。
[ステップS94]RAID制御部134は、新たに読み込んだすべてのデータについて、パリティデータと同じ値のタイムスタンプが付与されていた場合、それらのデータの書き込み抜けは発生していないと判断する。そこで、RAID制御部134は、書き込み抜けが発生していないデータとパリティデータとに基づいて、データを修復する。具体的には、RAID制御部134は、書き込み抜けがあったデータ以外の各データとパリティデータとの排他的論理和演算を行い、演算結果を修復後のデータとする。
[ステップS95]RAID制御部134は、読み込み要求に対応する応答として、ホストコンピュータ10にステップS94で修復したデータを送信する。
[ステップS96]RAID制御部134は、ステップS71(図15参照)における読み込み対象の物理ブロックへのステップS94で修復したデータの書き込み指示を、HDDアクセス部135に対して出力する。この際、書き込まれるデータには、パリティデータに付与されていたタイムスタンプ(該当データの書き込み先のHDDに対応するタイムスタンプ)が付与される。すると、HDDアクセス部135により、修復されたタイムスタンプ付きのデータがHDD内の指定された論理ブロックに書き込まれる。
[ステップS97]RAID制御部134は、データの書き込みが完了したか否かを判断する。データの書き込みが完了していれば、処理が終了する。データの書き込みが完了していなければ、ステップS97の処理が繰り返され、RAID制御部134は書き込み完了待ちの状態となる。
[ステップS98]RAID制御部134は、パリティデータより古いタイムスタンプが付与されていたデータの論理ブロックを、バッドブロックとして記録する。
[ステップS99]RAID制御部134は、ホストコンピュータ10に対してエラー応答を行う。
[ステップS100]RAID制御部134は、読み出されているデータのうち、バッドブロック化されていない論理ブロックのデータ(正常に読み出された)に基づいてパリティ計算を行い、パリティデータを生成する。具体的には、RAID制御部134は、正常に読み出されたデータの排他的論理和演算を行い、演算結果をパリティデータとする。この際、RAID制御部134は、生成したパリティデータに生成元となった各データのタイムスタンプと同じ値のタイムスタンプを付与する。
[ステップS101]RAID制御部134は、パリティデータの書き込み指示をHDDアクセス部135に対して出力する。すると、HDDアクセス部135により、タイムスタンプ付きのパリティデータがHDDに書き込まれる。
[ステップS102]RAID制御部134は、パリティデータの書き込みが完了したか否かを判断する。パリティデータの書き込みが完了した場合、処理が終了する。パリティデータの書き込みが完了していなければ、ステップS102の処理が繰り返され、RAID制御部134は書き込み待ち状態となる。
このようにして、データの書き込み抜けがあった場合、データの修復および修復したデータのホストコンピュータ10への応答ができる。
例えば、論理ブロック番号「D1」のデータブロック内のデータ「d1」の読み込み処理において、データの書き込み抜けが検出された場合を想定する。この場合、論理ブロック番号「D1」と同じパリティグループに属する他のデータブロックのデータが読み出される。すなわち論理ブロック番号「D5」、「D9」、「D13」のデータブロックに対応する物理ブロックからデータ「d5」、「d9」、「d13」が読み出される。読み出されたデータは、図16に示した処理対象データテーブル132cに追加登録される。その結果、RAID制御部134によって図18に示した処理対象データテーブル132cが生成される。このとき、論理ブロック番号「D1」のデータ「d1」に付与されたタイムスタンプ「t11」は、パリティデータ「p1」に付与されたタイムスタンプ「t21」より小さいことが分かっている。
そこで、RAID制御部134は、データ「d5」、「d9」、「d13」それぞれのタイムスタンプ「t12」、「t13」、「t14」と、パリティデータ「p1」のタイムスタンプ「t22」、「t23」、「t24」とを比較する。すなわち、「t12」と「t22」とが比較され、「t13」と「t23」とが比較され、「t14」と「t24」とが比較される。比較の結果、以下の条件が成立するか否かが判断される。
(t12=t22)AND(t13=t23)AND(t14=t24)
この条件が成立するとき、データ「d5」、「d9」、「d13」と、パリティデータ「p1」とに書き込み抜けはないと判断される。
論理ブロック番号「D1」のデータ「d1」以外に書き込み抜けがない場合、RAID制御部134は、論理ブロック番号「D1」のデータの修復を行う。修復されるデータを「d1_1」とすると、以下の計算が行われる。
「d1_1」=「d5」^「d9」^「d13」^「p1」
RAID制御部134は、修復したデータ「d1_1」に、パリティデータに付与されていたタイムスタンプ「t21」を付与する。そして、RAID制御部134は、処理対象データテーブル132c内の論理ブロック番号「D1」のデータとタイムスタンプとを更新する。
図21は、データ修復後の処理対象データテーブルを示す図である。図18と比較すると、処理対象データテーブル132cの論理ブロック番号「D1」のデータが「d1」から「d1_1」に変更されている。また、論理ブロック番号「D1」のタイムスタンプが「t11」から「t21」に変更されている。
その後、RAID制御部134は、タイムスタンプ「t21」が付与されたデータ「t1_1」の、ディスク番号「DISK#1」のHDD210の物理ブロック番号「block#1」への書き込み指示を行う。これにより、HDD210内のデータが更新される。
なお、(t12=t22)AND(t13=t23)AND(t14=t24)の条件が成立しない場合、タイムスタンプの小さい方のデータまたはパリティデータに書き込み抜けがある。データのタイムスタンプがパリティデータのタイムスタンプより小さい場合、データに書き込み抜けがあるが、多重故障にためデータの修復はできない。従ってデータのタイムスタンプがパリティより小さいデータを含む論理ブロックは、論理ブロック番号「D1」の論理ブロックを含めてすべてバッドブロックとして記録される。この場合、読み込み要求で指定された論理ブロック番号「D1」のデータを修復できないため、ホストコンピュータ10へはエラー応答が送信される。
修復ができない場合であっても読み込んだデータの排他的論理和演算によりパリティデータが生成される。新たなパリティデータを「p1_2」とすると以下の計算が行われる。
「p1_2」=「d1」^「d5」^「d9」^「d13」
生成されたタイムスタンプ「p1_2」には、生成元となった各データのタイムスタンプが付与される。そして、RAID制御部134は、処理対象データテーブル132c内の論理ブロック番号「P1」のパリティデータとタイムスタンプとを更新する。
図22は、データを修復できないときの処理対象データテーブルを示す図である。図18と比較すると、処理対象データテーブル132cの論理ブロック番号「P1」のパリティデータが「p1」から「p1_2」に変更されている。また、論理ブロック番号「P1」のタイムスタンプは、「t11」、「t12」、「t13」、「t14」に変更されている。
その後、RAID制御部134は、タイムスタンプは「t11」、「t12」、「t13」、「t14」が付与されたパリティデータ「p1_2」の、ディスク番号「DISK#5」のHDD250の物理ブロック番号「block#1」への書き込み指示を行う。これにより、HDD250内のパリティデータが更新される。
以上のように、RAID5のRAID装置100は、ブロック読み込み時にデータとパリティの物理ブロックを同時に読み込んでタイムスタンプを比較することで、書き込み抜きの検出と修正を行うことができる。
次に、ストライプ単位読み込み処理について説明する。
図23は、ストライプ読み込み処理の手順を示すフローチャートである。以下、図23に示す処理をステップ番号に沿って説明する。この処理は、ストライプを指定した読み込み要求に応じて実行される。
[ステップS111]RAID制御部134は、指定されたストライプを構成するすべての論理ブロックそれぞれに対応する物理ブロック内のデータの読み込み指示を、HDDアクセス部135に対して出力する。すると、HDDアクセス部135により、すべてのデータおよびパリティデータがHDDから読み出される。
[ステップS112]RAID制御部134は、すべてのデータとパリティデータとの読み込みが完了したか否かを判断する。すべてのデータおよびパリティデータの読み込みが完了していれば処理がステップS113に進められる。未読み込みのデータまたはパリティデータがあれば、ステップS112の処理が繰り返され、RAID制御部134は読み込み待ちの状態となる。
[ステップS113]タイムスタンプ比較部137は、パリティデータに付与された各タイムスタンプと、新たに読み出された各データに付与されたタイムスタンプとを比較する。各タイムスタンプの比較の結果、すべてのデータについて、パリティデータと同じ値のタイムスタンプが付与されていた場合、処理がステップS114に進められる。他方、パリティデータに付与されたタイムスタンプと異なるタイムスタンプが付与されたデータが少なくとも1つある場合、処理がステップS115に進められる。
[ステップS114]RAID制御部134は、ステップS111で読み込んだストライプのデータをホストコンピュータ10に応答する。その後、処理が終了する。
[ステップS115]RAID制御部134は、ストライプ修復および応答処理を行う。その後、処理が終了する。
このようにして、ストライプ単位のデータ読み込みが行われる。例えば、論理ブロック番号「D1」から「D16」までのデータブロック、およびそのデータブロックに対応するパリティブロックを含むストライプの読み込み要求が行われた場合を想定する。この場合、ストライプに含まれるすべての論理ブロックに対応する物理ブロックからデータおよびパリティデータが読み出される。RAID制御部134は、RAM132内に処理対象データテーブルを生成し、読み込んだデータを格納する。
図24は、ストライプ読み込み時の処理対象データテーブルの例を示す図である。図24に示す処理対象データテーブル132dでは、ストライプ内のパリティグループを太線で囲んでいる。このように、ストライプを指定した読み込み要求が行われた場合、指定されたストライプに含まれるすべての論理ブロックに対応する物理ブロックからデータおよびパリティデータが読み出され、処理対象データテーブル132dに格納される。
ここで、タイムスタンプ比較部137により、処理対象データテーブル132d内のすべてのデータブロックのタイムスタンプと、パリティブロック内のタイムスタンプとが比較される。すべての比較結果が一致した場合、該当するストライプの書き込み抜けはないと判断される。その場合、読み出されたすべてのデータが、ホストコンピュータ10に送信される。
他方、一致しないタイムスタンプがある場合は、RAID制御部134によりストライプ修復および応答処理が開始される。
図25は、ストライプ修復および応答処理の手順を示すフローチャートである。以下、図25に示す処理をステップ番号に沿って説明する。
[ステップS121]RAID制御部134は、タイムスタンプ比較部137による比較結果が、すべてのデータにおいて、データに付与されたタイムスタンプがパリティデータに付与されたタイムスタンプ以上の値であるか否かを判断する。すべてのデータのタイムスタンプが、パリティデータのタイムスタンプ以上の値であれば、処理がステップS123に進められる。少なくとも1つのデータにおいて、パリティデータより小さな値のタイムスタンプが付与されていれば、処理がステップS122に進められる。
[ステップS122]RAID制御部134は、パリティデータより古いタイムスタンプが付与されたデータがある場合、そのデータの書き込み時に書き込み抜けが発生したものと判断する。そこで、RAID制御部134は、データの修復および応答処理を行う。その後、処理が終了する。
[ステップS123]RAID制御部134は、すべてのデータにおいて、データに付与されたタイムスタンプがパリティデータに付与されたタイムスタンプ以上の値である場合、パリティデータの書き込み時に書き込み抜けが発生したものと判断する。その場合、データについては書き込み抜けは発生していないと判断し、RAID制御部134は、読み込んだデータをホストコンピュータ10に応答する。
[ステップS124]RAID制御部134は、タイムスタンプが不整合なままのパリティグループがあるか否かを判断する。すなわち、RAID制御部134は、タイムスタンプの不一致が存在するパリティグループのうち、ステップS125〜S128の処理をまだ実行していないパリティグループがあるか否かを判断する。タイムスタンプが不整合のパリティグループがある場合、処理がステップS125に進められる。タイムスタンプが不整合のパリティグループがない場合、処理が終了する。
[ステップS125]RAID制御部134は、タイムスタンプが不整合なままのパリティグループを1つ選択する。
[ステップS126]RAID制御部134は、読み出されているデータに基づいてパリティ計算を行い、パリティデータを生成する。具体的には、RAID制御部134は、正常に読み出されたデータの排他的論理和演算を行い、演算結果をパリティデータとする。この際、RAID制御部134は、生成したパリティデータに生成元となった各データのタイムスタンプと同じ値のタイムスタンプを付与する。
[ステップS127]RAID制御部134は、HDDアクセス部135に対してパリティブロックに対応する物理ブロックへのパリティデータの書き込みを指示する。すると、HDDアクセス部135によって指定された物理ブロックへのパリティデータの書き込みが行われる。
[ステップS128]RAID制御部134は、パリティデータの書き込みが完了したか否かを判断する。パリティデータの書き込みが完了した場合、処理がステップS124に進められる。パリティデータの書き込みが完了していなければ、ステップS128の処理が繰り返され、RAID制御部134は書き込み完了待ち状態となる。
このようにして、ストライプ修復および応答処理が行われる。例えば、図24に示したストライプの各データに関し、論理ブロック番号「D14」のデータブロックのデータ「d14」のタイムスタンプと、論理ブロック番号「P2」のパリティブロックのパリティデータ「p2」のタイムスタンプとが不一致の場合を想定する。この例では、データ「d14」のタイムスタンプ「t18」と、パリティデータ「p2」の「DISK#4」に対応するタイムスタンプ「t28」とが、「t18」>「t28」という関係であるものとする。
この場合、パリティデータに付与されたタイムスタンプの方が小さいため、パリティデータの書き込み時に書き込み抜けが発生したものと考えられる。そこで、RAID制御部134は、パリティ計算を行い、パリティデータを生成する。生成されたパリティデータは処理対象データテーブル132dに格納される。
図26は、書き込み抜けが発生したパリティデータを生成後の処理対象データテーブルを示す図である。図26に示すように、論理ブロック番号「P2」のパリティデータ「p2」は、「p2_1」に更新されている。パリティデータ「p2_1」を式で表すと以下の通りである。
「p2_1」=「d2」^「d6」^「d10」^「d14」
生成されたパリティデータ「p2_1」には、同じパリティグループ内の各データのタイムスタンプ「t15」、「t16」、「t17」、「t18」が付与される。生成されたパリティデータ「p2_1」とタイムスタンプとは、処理対象データテーブル132dに記憶される。そして、タイムスタンプ付きのパリティデータ「p2_1」が、ディスク番号「DISK#5」のHDD250の物理ブロック番号「block#2」の物理ブロックに書き込まれる。
次に、ストライプ中データ修復および応答処理について詳細に説明する。
図27は、ストライプ中データ修復および応答処理の手順を示すフローチャートである。以下、図27に示す処理をステップ番号に沿って説明する。
[ステップS131]RAID制御部134は、タイムスタンプが不整合なパリティグループがあるか否かを判断する。不整合なパリティグループがあれば、処理がステップS132に進められる。不整合なパリティグループがなければ処理がステップS142に進められる。
[ステップS132]RAID制御部134は、タイムスタンプが不整合なパリティグループを1つ選択する。
[ステップS133]RAID制御部134は、タイムスタンプ比較部137による比較結果において、パリティデータのタイムスタンプより小さな値のタイムスタンプが付与されたデータが格納されたデータブロックがあるか否かを判断する。該当するデータブロックが少なくとも1つあれば処理がステップS134に進められる。該当するデータブロックがなければ処理がステップS139に進められる。
[ステップS134]RAID制御部134は、パリティデータのタイムスタンプより小さな値のタイムスタンプが付与されたデータが格納されたデータブロックが1つだけか否かを判断する。該当するデータブロックが1つだけであれば、処理がステップS135に進められる。該当するデータブロックが2つ以上あれば、処理がステップS138に進められる。
[ステップS135]RAID制御部134は、データを修復する。具体的には、RAID制御部134は、パリティグループ内の他のデータおよびパリティデータの排他的論理和演算を行い、演算結果を修復後のデータとする。この際、RAID制御部134は、生成したデータに、パリティデータのタイムスタンプ(該当データの書き込み先のHDDに対応するタイムスタンプ)と同じ値のタイムスタンプを付与する。
[ステップS136]RAID制御部134は、HDDアクセス部135に対して、書き込み抜けがあったデータブロックに対応する物理ブロックへのデータの書き込みを指示する。すると、HDDアクセス部135によって指定された物理ブロックへのデータの書き込みが行われる。
[ステップS137]RAID制御部134は、データの書き込みが完了したか否かを判断する。データの書き込みが完了した場合、処理がステップS131に進められる。データの書き込みが完了していなければ、ステップS137の処理が繰り返され、RAID制御部134は書き込み完了待ち状態となる。
[ステップS138]RAID制御部134は、ステップS134で該当データブロックが複数あると判断された場合、そのデータブロックをバッドブロックとして記録する。
[ステップS139]RAID制御部134は、読み出されているデータに基づいてパリティ計算を行い、パリティデータを生成する。具体的には、RAID制御部134は、読み込んだデータの排他的論理和演算を行い、演算結果をパリティデータとする。この際、RAID制御部134は、生成したパリティデータに、各データのタイムスタンプと同じ値のタイムスタンプを付与する。
[ステップS140]RAID制御部134は、HDDアクセス部135に対してパリティブロックに対応する物理ブロックへのパリティデータの書き込みを指示する。すると、HDDアクセス部135によって指定された物理ブロックへのパリティデータの書き込みが行われる。
[ステップS141]RAID制御部134は、パリティデータの書き込みが完了したか否かを判断する。パリティデータの書き込みが完了した場合、処理がステップS131に進められる。パリティデータの書き込みが完了していなければ、ステップS141の処理が繰り返され、RAID制御部134は書き込み完了待ち状態となる。
[ステップS142]RAID制御部134は、ステップS131の判断においてタイムスタンプが不整合なパリティグループがないと判断された場合、バッドブロックとして記録された論理ブロックがあるか否かを判断する。バッドブロックがあれば、処理がステップS143に進められる。バッドブロックがなければ、処理がステップS144に進められる。
[ステップS143]RAID制御部134は、ホストコンピュータ10に対してエラー応答を行う。その後、処理が終了する。
[ステップS144]RAID制御部134は、正常応答として、ホストコンピュータ10に対して修復されたデータを含むストライプのデータを送信する。その後、処理が終了する。
このようにして、ストライプ中のデータ修復および応答処理が行われる。例えば、論理ブロック番号「D14」のデータブロックで書き込み抜けが発生した場合を想定する。
図28は、データ修復時の処理対象データテーブルの例を示す図である。この場合、論理ブロック番号「D14」のデータブロックのデータ「d14」に付与されていたタイムスタンプ「t18」と、論理ブロック番号「P2」のパリティブロックのパリティデータに付与されていたタイムスタンプ「t28」とが不整合となる。すなわち、比較の結果、「t18」<「t28」であることが判明する。
すると、RAID制御部134によって、タイムスタンプに不整合のあるパリティグループとして、論理ブロック番号「D2」、「D6」、「D10」、「D14」、「P2」を有するパリティグループが選択される。ここで、パリティデータよりも小さい値のタイムスタンプが付与されたデータが1つだけであれば、そのデータの書き込み抜けが発生したものと判断される。書き込み抜けが発生したデータが1つだけであれば、そのデータの修復が可能である。そこで、該当データの修復処理が行われる。
図28に示すように、書き込み抜けが発生したデータが1つだけであれば、該当データが修復される。修復されたデータを「d14_1」とすると、以下の計算が実行される。
「d14_1」=「d2」^「d6」^「d10」^「p2」
修復されたデータ「d14_1」には、パリティデータに付与されていたタイムスタンプ「t28」が付与される。さらに、修復されたデータが処理対象データテーブル132dに格納される。そして、タイムスタンプ付きのデータ「d14_1」が、ディスク番号「DISK#4」のHDD240の物理ブロック番号「block#2」の物理ブロックに書き込まれる。
このように、データが修復できた場合には、修復されたデータを含むストライプがホストコンピュータ10に応答される。
なお、書き込み抜けが2個以上のデータで発生した場合、RAID5ではデータの修復ができない。この場合、RAID制御部134は、書き込み抜けが発生したデータの論理ブロックをバッドブロックとする。そして、読み出されたデータとパリティデータとの不整合を是正するため、パリティデータが再計算される。
図29は、2つ以上のデータで書き込み抜けがあった場合の処理対象データテーブルの例を示す図である。図29の例では、論理ブロック番号「D6」、「D14」の2つのデータブロックのデータの書き込み時に書き込み抜けが発生したものとする。この場合、論理ブロック番号「D6」のデータブロックのデータ「d6」と、論理ブロック番号「D14」のデータブロックのデータ「d14」のタイムスタンプについて不整合が検出される。すなわち、比較の結果、「t16」<「t26」であり、かつ「t18」<「t28」であることが判明する。
このように2つのデータで書き込み抜けがある場合、該当データに対応する論理ブロックがバッドブロックとして記憶される。そして、読み出されているデータに基づいてパリティデータが計算され、新たなパリティデータが生成される。生成されたパリティデータを「p2_2」とすると、以下の計算が実行される。
「d2_2」=「d2」^「d6」^「d10」^「p14」
生成されたパリティデータ「p2_1」には、同じパリティグループ内の各データのタイムスタンプ「t15」、「t16」、「t17」、「t18」が付与される。生成されたパリティデータ「p2_2」とタイムスタンプとは、処理対象データテーブル132dに記憶される。そして、タイムスタンプ付きのパリティデータ「p2_2」が、ディスク番号「DISK#5」のHDD250の物理ブロック番号「block#2」の物理ブロックに書き込まれる。
このように、データが修復できずストライプ内にバッドブロックが発生した場合、ホストコンピュータ10にエラー応答が返される。
以上のように第1の実施の形態では、RAID5によるストライプ読み込み時に、データとパリティの物理ブロックを同時に読み込んでタイムスタンプを比較することで、書き込み抜きの検出と修正を行うことができる。すなわち、データの書き込み処理が正常終了したにも拘わらずデータが書き込まれていないという異常を、書き込み直後の読み込み処理を行うことなく検出可能となる。これにより、データの書き込み時に書き込み抜けの有無をチェックする必要がなくなり、データの書き込み処理の効率化が図れる。
しかも、読み込み要求が出されたときに書き込み抜けを検出した場合、パリティデータなどを用いてデータを修復することができる。従って、高い信頼性を維持することができる。
なお、ストライプ単位でデータの読み込みが行われる場合、書き込み抜けを検出した際のデータの修復を迅速に行うことができる。すなわち、データの修復には、同じパリティグループ内の他のデータとパリティデータとが用いられる。ストライプ単位での読み込みであれば、データの書き込み抜けを検出した時点で、修復に必要なデータおよびパリティデータも処理対象データテーブルに格納されている。そのため、迅速にデータの修復を行いホストコンピュータ10にストライプの全データを応答することができる。
また、データやパリティデータを修復した場合には、修復後のデータまたはパリティデータが、HDDに書き戻される。これにより、書き込み抜けによって発生していたパリティグループ内での不整合を、読み込み要求時に修正することができる。すなわち、データの読み込み要求の処理と、書き込み抜けのチェックおよび修復が同時に行われ、データ異常の修復を効率よく行うことができる。
[第2の実施の形態]
次に第2の実施の形態について説明する。第2の実施の形態は、第1の実施の形態におけるタイムスタンプに代えて、カウンタ値を用いたものである。
第2の実施の形態におけるシステムを構成する要素は、図2に示した第1の実施の形態と同じである。ただし、コントローラ130の機能とHDD210,220,230,240,250のデータフォーマットとが異なる。すなわち、HDDのデータフォーマットにおいて、第1の実施の形態ではタイムスタンプ領域211bとされていた記憶領域(図3参照)が、第2の実施の形態では複数のカウンタ値(カウンタ値群)を格納するカウンタ領域となる。ただし、第2の実施の形態では、1つのカウンタ値を2ビットで表すものとする。そのため、カウンタ領域は、第1の実施の形態におけるタイムスタンプ領域211bよりも記憶容量が少なくて済む。
図30は、第2の実施の形態におけるHDD内のカウンタ値格納例を示す図である。HDD31a内のx個の物理ブロックには、それぞれ物理ブロック番号(block#に続く数字)が設定されている。そして、各物理ブロックは、データとカウンタ値群との記憶領域を有している。カウンタ値群の記憶領域には、HDDの台数分のタイムスタンプを格納できる。カウンタ値群の記憶領域は、HDDのディスク番号に対応付けられたカウンタ値領域に分けられている。各カウンタ値領域はそれぞれ、RAID5に含まれる各HDDに対応付けられている。図4の例では、物理ブロック番号「i」におけるディスク番号「j」に対応するカウンタ値をc(i,j)と表している。このようなカウンタ値格納領域が、RAID5に含まれる各HDD内に設けられる。
次に、第2の実施の形態におけるコントローラの機能について説明する。
図31は、第2の実施の形態のコントローラの機能を示す図である。コントローラ130aは、データ入出力部133a、RAID制御部134a,HDDアクセス部135a、カウンタ136a、およびカウンタ値比較部137aを有している。ここで、データ入出力部133aとHDDアクセス部135aとの機能は、図9に示した第1の実施の形態における同名の要素の機能と同様である。
RAID制御部134aは、アクセス要求に応じて、RAID技術を用いたHDD210a,220a,230a,240a,250aへのアクセス制御を行う。本実施の形態では、RAID制御部134aは、RAID5のアクセス制御を行うものとする。RAID制御部134aは、RAID5のアクセス制御を行うために、図8に示したような論理ブロックと物理ブロックとの対応関係を管理している。そして、RAID制御部134aは、アクセス要求で指定された論理ブロックに対応する物理ブロック、およびその物理ブロックを有するHDDを特定し、アクセス要求に応じたアクセス指示をHDDアクセス部135aに対して出力する。
なお、RAID制御部134aは、新たに論理ディスクを生成する場合、その論理ディスクの論理ブロックに対応付けられる物理ブロックのカウンタ値記憶領域内のカウンタ値を「0」に初期化する。
また、RAID制御部134aは、アクセス要求が書き込み要求の場合、カウンタ136aからカウンタ値を取得する。具体的には、RAID制御部134aは、書き込み要求があると、書き込み対象のデータブロックに対応する物理ブロック内のデータと、そのデータブロックと同じパリティグループ内のパリティブロックに対応する物理ブロック内のパリティデータとを読み出す。そしてRAID制御部134aは、読み込んだデータに付与されていたカウンタ値をカウンタ136aに渡す。すると、カウンタ136aから更新されたカウンタ値が返される。RAID制御部134aは、取得したカウンタ値を書き込み対象のデータと、対応するパリティデータとに付与する。
また、RAID制御部134aは、アクセス要求が読み込み要求の場合、読み込んだデータおよびそのデータが属するパリティグループのパリティデータそれぞれに付与されたカウンタ値群から、読み込んだデータに対応するカウンタ値を抽出する。そして、RAID制御部134aは、抽出した2つのカウンタ値をカウンタ値比較部137aに渡す。RAID制御部134aは、カウンタ値比較部137aからカウンタ値の比較結果を受け取り、その比較結果に基づいて書き込み抜けの有無を判定する。RAID制御部134aは、書き込み抜けがなければ、読み込んだデータを読み込み要求への応答としてデータ入出力部133aに渡す。
なお、RAID制御部134aは、書き込み抜けがあると判定した場合、データの復旧処理を行う。そして、RAID制御部134aは、復旧したデータを読み込み要求への応答としてデータ入出力部133aに渡す。
カウンタ136aは、RAID制御部134aからの要求に応じてカウンタ値を生成する。具体的には、カウンタ136aは、RAID制御部134aから現在のカウンタ値を受け取ると、そのカウンタ値をカウントアップする。カウンタ値は2ビットで表されるため、「0」から「3」までのカウンタアップが行われる。現在のカウンタ値が「3」であれば、カウントアップによりカウンタ値は「0」に変更される。
カウンタ値比較部137aは、RAID制御部134aからの要求に応じてカウンタ値を比較する。カウンタ値の比較により、カウンタ値が同じか、いずれか一方のカウンタ値が「1」だけ進んでいるか、カウンタ値のずれが「2」であるかの比較結果が得られる。カウンタ値比較部137aは、比較結果をRAID制御部134aに渡す。
RAID制御部134aは、カウンタ値比較部137aからの比較結果に基づいて、書き込み抜けの有無を判定することができる。
図32は、カウンタ値比較結果に基づく書き込み抜け判定基準を示す図である。図32では、物理ブロック「U」から読み出されたデータのカウンタ値を「u」としている。また、物理ブロック「V」から読み出されたパリティデータに付与された複数のカウンタ値のうち、物理ブロック「U」を有するHDDに対応するカウンタ値を「v」としている。
カウンタ値「u」とカウンタ値「v」の値が同じであれば、書き込み抜けがないと判定される。カウンタ値「u」の値よりもカウンタ値「v」の値が「1」だけ進んでいれば、物理ブロック「U」に書き込み抜けがあると判定される。カウンタ値「v」の値よりもカウンタ値「u」の値が「1」だけ進んでいれば、物理ブロック「V」に書き込み抜けがあると判定される。すなわち、カウンタ値が「1」だけ遅れている方の物理ブロックに書き込み抜けが発生していると判定される。
カウンタ値「u」とカウンタ値「v」との差が「2」の場合、どちらのカウンタ値が進んでいるのかが不明となる。その場合、書き込み抜けの判定は不能となる。判定不能となった場合は、RAID制御部134aは、論理ブロック「U」内のデータを損失したとして、バッドブロックとして登録する。次にRAID制御部134aは、パリティグループのパリティデータを再度計算し、パリティデータのカウンタ値「v」をデータのカウンタ値「u」にセットする。そしてRAID制御部134aは、データブロックに対応する物理ブロック「U」のカウンタ値を更新すると共に、パリティブロックに対応する物理ブロック「V」のパリティデータを更新する。
なお、RAID制御部134aは、ストライプ書き込みを行う場合、すべてのデータおよびパリティデータのカウンタ値を更新する。具体的には、RAID制御部134aは、ストライプ書き込み要求があると、ストライプに含まれるすべての論理ブロックに対応する物理ブロックから、データおよびパリティデータを読み出す。さらにRAID制御部134aは、すべてのデータのカウンタ値をカウンタ136aに渡して更新させる。その後、RAID制御部134aは、書き込み対象のデータ、およびパリティデータに更新後のカウンタ値を付与して、HDDアクセス部135aに対して物理ブロックへの書き込み指示を行う。
このようにして、カウンタ値を用いて書き込み抜けの検出が可能である。カウンタ値記憶領域はタイムスタンプ記憶領域よりも少ない記憶容量で済むため、カウンタ値を用いることで、HDD内の記憶領域の利用効率を高めることができる。
なお、第2の実施の形態では、カウンタ値を2ビットで表している。この場合、カウンタ値「3」をカウントアップさせた場合、カウンタ値が「0」となる。このようにすることで、少ないビット数のカウンタ値を用いて、時系列上の前後関係が表現可能となる。例えば、カウンタ値「3」が付与されたデータより、カウンタ値「0」が付与されたパリティデータの方が遅い時刻に書き込まれたと判断することができる。その結果、カウンタ値「3」が付与されたデータについては、書き込み抜けが発生していると判断できる。
[第3の実施の形態]
第3の実施の形態は、タイムスタンプとカウンタ値とを併用して書き込み抜けを検出するものである。
第2の実施の形態に示したように、カウンタ値を用いた場合、カウンタ値のカウントアップをするために、ストライプ書き込みのときに事前読み込みを行うこととなる。そこで、ストライプ書き込み時の事前読み込みを行わずに済ませるため、タイムスタンプとカウンタを併用する。具体的には、各データおよびパリティデータにタイムスタンプが1つだけ付与される。また、データとパリティデータとには、RAID5のHDD数分のカウンタ値が設定されると共に、各カウンタ値に対して、タイムスタンプとカウンタ値とのどちらを使用しているか判別するためのフラグが設定される。
第3の実施の形態では、データとパリティデータとのそれぞれに付与されたタイムスタンプ、フラグ、およびカウンタ値を比較することで、書き込み抜けの有無が判断される。そこで、以下、タイムスタンプ、フラグ、およびカウンタ値をまとめて、比較対象情報と呼ぶこととする。
タイムスタンプとカウンタ値とを記憶するため、HDD内には、第1の実施の形態におけるタイムスタンプ記憶領域に代えて、比較対象情報記憶領域が物理ブロックごとに設けられる。比較対象情報記憶領域には、1つのタイムスタンプ、複数のカウンタ値、および複数のフラグが格納される。RAID装置が物理ブロック内のデータまたはパリティデータを読み込む際には、比較対象情報記憶領域内の情報も同時に読み込まれる。
図33は、第3の実施の形態における処理対象データテーブルのデータ構造例を示す図である。RAID装置は、1ストライプ分のデータの読み込みを行うと、RAM内に図33に示すようなデータ構造の処理対象データテーブル132eを生成する。
処理対象データテーブル132eは、論理ブロック、ディスク番号、物理ブロック、データ、タイムスタンプ、複数のフラグ、および複数のカウンタ値の欄が設けられている。
論理ブロックの欄には、ストライプに含まれる論理ブロックの論理ブロック番号が設定される。ディスク番号の欄には、論理ブロックに対応する物理ブロックを有するHDDのディスク番号が設定される。物理ブロックの欄には、論理ブロックに対応する物理ブロックの物理ブロック番号が設定される。データの欄には、物理ブロックから読み込まれたデータまたはパリティデータが設定される。
タイムスタンプの欄には、データの書き込み時刻を示すタイムスタンプが設定される。なお、パリティデータのタイムスタンプは、ストライプ書き込みを行ったときに更新される。
フラグの欄には、書き込み抜けの検査においてタイムスタンプを比較するのかカウンタ値を比較するのかを示すフラグが設定される。具体的には、比較対象のデータに付与されたフラグと、比較対象のパリティデータに付与されたフラグのうち比較対象のデータに対応するフラグとによって、書き込み抜けの比較対象が判断される。データのフラグとパリティデータのフラグが共に「0」であれば、カウンタ値が比較される。データのフラグとパリティデータのフラグが共に「1」であれば、タイムスタンプが比較される。データのフラグが「0」であり、パリティデータのフラグが「1」であれば、タイムスタンプが比較される。データのフラグが「1」であり、パリティデータのフラグが「0」であれば、カウンタ値が比較される。
図34は、第3の実施の形態のコントローラの機能を示す図である。コントローラ130bは、データ入出力部133b、RAID制御部134b、HDDアクセス部135b、タイムスタンプ生成部136b、タイムスタンプ比較部137b、カウンタ138b、およびカウンタ値比較部139bを有している。ここで、データ入出力部133b、HDDアクセス部135b、タイムスタンプ生成部136b、タイムスタンプ比較部137bの機能は、図9に示した第1の実施の形態における同名の要素の機能と同様である。また、カウンタ138bとカウンタ値比較部139bとの機能は、図31に示した第2の実施の形態における同名の要素の機能と同様である。
RAID制御部134bは、アクセス要求に応じて、RAID技術を用いたHDD210b,220b,230b,240b,250bへのアクセス制御を行う。本実施の形態では、RAID制御部134bは、RAID5のアクセス制御を行うものとする。RAID制御部134bは、RAID5のアクセス制御を行うために、図8に示したような論理ブロックと物理ブロックとの対応関係を管理している。そして、RAID制御部134bは、アクセス要求で指定された論理ブロックに対応する物理ブロック、およびその物理ブロックを有するHDDを特定し、アクセス要求に応じたアクセス指示をHDDアクセス部135bに対して出力する。
なお、RAID制御部134bは、新たに論理ディスクを生成する場合、その論理ディスクの論理ブロックに対応付けられる物理ブロックの比較対象情報記憶領域内の初期化を行う。初期化処理では、すべてのフラグを「0」に設定され、すべてのカウンタ値が「0」に設定され、すべてのタイムスタンプが「0」に設定される。RAID制御部134bは、全HDD210b,220b,230b,240b,250b内の比較対象情報記憶領域の初期化後に、その領域の読み込みを行い確実に書き込んでいることを保証する。
RAID制御部134bは、アクセス要求が書き込み要求の場合、カウンタ138bから比較対象情報を取得する。具体的には、RAID制御部134bは、書き込み要求があると、書き込み対象のデータブロックに対応する物理ブロック内のデータを比較対象情報と共に読み出す。また、RAID制御部134bは、読み出し対象のデータブロックと同じパリティグループ内のパリティブロックに対応する物理ブロック内のパリティデータを、比較対象情報と共に読み出す。そしてRAID制御部134bは、読み込んだデータに付与されていた比較対象情報内のカウンタ値をカウンタ138bに渡す。すると、カウンタ138bから更新されたカウンタ値が返される。RAID制御部134bは、取得したカウンタ値のフラグを「0」にして、フラグとカウンタ値とを、書き込み対象のデータと対応するパリティデータとに付与する。さらに、RAID制御部134bは、アクセス要求が書き込み要求の場合、タイムスタンプ生成部136bからタイムスタンプを取得する。そして、取得したタイムスタンプを書き込み対象のデータに付与する。この際、パリティデータのタイムスタンプは更新されない。
また、RAID制御部134bは、アクセス要求が読み込み要求の場合、読み込んだデータおよびそのデータが属するパリティグループのパリティデータそれぞれに付与された比較対象情報からフラグを抽出する。RAID制御部134bは、読み込んだデータとパリティデータとのフラグに基づいて、書き込み抜けの検査に用いる情報を判定する。そして、RAID制御部134bは、タイムスタンプまたはカウンタ値のいずれか一方を用いて、書き込み抜けの有無を判定を行う。RAID制御部134bは、書き込み抜けがなければ、読み込んだデータを読み込み要求への応答としてデータ入出力部133bに渡す。
なお、RAID制御部134bは、書き込み抜けがあると判定した場合、データの復旧処理を行う。そして、RAID制御部134bは、復旧したデータを読み込み要求への応答としてデータ入出力部133bに渡す。
以下、ホストコンピュータ10からの書き込み要求および読み出し要求に応じたコントローラ130bの処理を詳細に説明する。なお、第3の実施の形態においても、ブロック単位のアクセスとストライプ単位のアクセスとが可能であるものとする。そこで、ブロック単位のアクセスとストライプ単位のアクセスとのそれぞれについて、書き込み要求および読み出し要求時の処理を説明する。
図35は、第3の実施の形態におけるブロック書き込み処理手順を示すフローチャートである。以下、図35に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からブロック単位でのデータの書き込み要求が入力されたときに実行される。
[ステップS151]RAID制御部134bは、書き込み要求に対応するデータの読み込み指示を、HDDアクセス部135bに対して出力する。すると、HDDアクセス部135bによって、指定された物理ブロック内のデータの読み込みが行われる。
[ステップS152]RAID制御部134bは、書き込み要求に対応するパリティデータの読み込み指示を、HDDアクセス部135bに対して出力する。すると、HDDアクセス部135bによって、指定された物理ブロック内のパリティデータの読み込みが行われる。
[ステップS153]RAID制御部134bは、データの読み込みが完了したか否かを判断する。データ読み込みが完了した場合、処理がステップS154に進められる。データ読み込みが完了していなければステップS153の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
[ステップS154]RAID制御部134bは、パリティデータの読み込みが完了したか否かを判断する。パリティデータ読み込みが完了した場合、処理がステップS155に進められる。パリティデータ読み込みが完了していなければステップS154の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
RAID制御部134bは、ステップS153,S154におけるデータとパリティデータとの読み込みが完了すると、RAM内に処理対象データテーブルを作成し、読み込んだデータをその処理対象データテーブルに格納する。
[ステップS155]RAID制御部134bは、パリティデータを計算する。
[ステップS156]RAID制御部134bは、データのカウンタ値をカウントアップする。具体的には、RAID制御部134bは、ステップS151で取得したデータに付与された比較対象情報からカウンタ値を抽出し、そのカウンタ値をカウンタ138bに渡す。すると、カウンタ138bがカウンタ値に1を加算する。なお、カウンタ値は、第2の実施の形態と同様に2ビットで表されている。読み出したデータのカウンタ値が「3」の場合、カウントアップによりカウンタ値が「0」に更新される。カウンタ138bは、カウントアップしたカウンタ値をRAID制御部134bに返す。RAID制御部134bは、取得したカウンタ値のフラグに「0」を設定する。
[ステップS157]RAID制御部134bは、パリティデータのカウンタ値をカウントアップする。具体的には、RAID制御部134bは、ステップS152で取得したパリティデータに付与された比較対象情報から、ステップS151で読み出したデータに対応するカウンタ値を抽出し、そのカウンタ値をカウンタ138bに渡す。すると、カウンタ138bによってカウンタ値がカウントアップされ、結果がRAID制御部134bに返される。RAID制御部134bは、取得したカウンタ値のフラグに「0」を設定する。
[ステップS158]タイムスタンプ生成部136bは、タイムスタンプを取得する。具体的には、RAID制御部134bからタイムスタンプ生成部136bへ、タイムスタンプの生成要求が出される。その生成要求に応じて、タイムスタンプ生成部136bがタイムスタンプを生成する。生成されたタイムスタンプは、タイムスタンプ生成部136bからRAID制御部134bに渡される。
[ステップS159]RAID制御部134bは、データブロックの書き込み指示をHDDアクセス部135bに対して出力する。具体的には、RAID制御部134bは、書き込み要求で指定された更新データに比較対象情報を付与する。付与される比較対象情報には、ステップS156で更新されたカウンタ値と、ステップS158で取得されたタイムスタンプとが含まれている。そして、RAID制御部134bは、更新データが属するデータブロックに対応する物理ブロックのディスク番号と物理ブロック番号とを指定して、タイムスタンプ付きの更新データの書き込み指示をHDDアクセス部135bに対して出力する。すると、HDDアクセス部135bによって、ディスク番号に対応するHDDに対して、タイムスタンプ付きの更新データの書き込みが行われる。
[ステップS160]RAID制御部134bは、パリティデータの書き込み指示をHDDアクセス部135bに対して出力する。具体的には、RAID制御部134bは、パリティブロックに対応する物理ブロックのディスク番号と物理ブロック番号とを指定して、比較対象情報付きのパリティデータの書き込み指示をHDDアクセス部135bに対して出力する。このこき付与される比較対象情報は、パリティデータ読み込み時の比較対象情報に対してカウンタ値のカウントアップを行ったものである。HDDアクセス部135bは、パリティデータの書き込み指示に応じて、指定されたディスク番号に対応するHDDに対して、タイムスタンプ付きのパリティデータの書き込みを行う。
[ステップS161]RAID制御部134bは、データの書き込みが完了したか否かを判断する。データ書き込みが完了した場合、処理がステップS162に進められる。データ書き込みが未完了であれば、ステップS161の処理が繰り返され、RAID制御部134bはデータ書き込み完了待ち状態となる。
[ステップS162]RAID制御部134bは、パリティデータの書き込みが完了したか否かを判断する。パリティデータ書き込みが完了した場合、処理が終了する。パリティデータ書き込みが未完了であれば、ステップS162の処理が繰り返され、RAID制御部134bはパリティデータ書き込み完了待ち状態となる。
このようにして、ブロック単位でのデータの書き込みが行われる。例えば、図33に示したストライプ内の論理ブロック番号「D1」のデータブロックへの書き込み要求があった場合を想定する。この場合、論理ブロック番号「D1」のデータブロックに対応する物理ブロックからデータが読み込まれ、論理ブロック番号「P1」のパリティブロックに対応する物理ブロックからパリティデータが読み込まれる。読み込まれたデータとパリティデータとは、処理対象データテーブルに格納される。
図36は、書き込み要求時の処理対象データテーブルの例を示す図である。データとパリティデータとの読み込みが行われると、RAM内に図36に示すような処理対象データテーブル132fが生成される。処理対象データテーブル132f内の情報は、書き込み要求に応じて更新される。
図37は、更新後の処理対象データテーブルの例を示す図である。図37に示すように、処理対象データテーブル132fにおいて、論理ブロック番号「D1」のデータブロック内のデータ「d1」は、書き込み要求で指定されたデータ「d1_1」に更新される。また、データ「d1_1」に基づいて新たなパリティデータ「p1_1」が算出される。パリティデータ「p1_1」は、更新前のデータ「d1」、更新前のパリティデータ「p1」、および書き込み対象のデータ「p1_1」の排他的論理和で計算される。
また、データ「d1」に付与されていたカウンタ値「c1」はカウントアップされる。カウントアップ後のカウンタ値を「c1_1」とする。カウンタ値「c1_1」は、「c1+1」であるが、「c1」が「3」の場合にはカウンタ値「c1_1」は「0」となる。
パリティデータ「p1」に付与されていた複数のカウンタ値のうち、データ「d1」が格納されていたHDDに対応する「c11」もカウントアップされる。カウントアップ後のカウンタ値を「c11_1」とする。カウンタ値「c11_1」は、「c11+1」であるが、「c11」が「3」の場合にはカウンタ値「c11_1」は「0」となる。
さらに、更新されたカウンタ値「c1_1」、「C11_1」それぞれに対応するフラグには、共に「0」が設定される。ここで、両方のフラグを「0」に設定することは、書き込み抜け検査時の比較対象がカウンタ値であることを意味している。すなわち、データとパリティデータとの書き込みが正しく(書き込み抜けが発生せずに)実行された場合、読み込み時に両方のフラグが「0」であることから、カウンタ値が比較対象であると判断される。
このような処理対象データテーブル132f内のデータとパリティデータとが、対応する物理ブロックに書き込まれる。
次に、スライス単位の書き込み要求の処理について説明する。
図38は、第3の実施の形態におけるスライス書き込み処理の手順を示すフローチャートである。以下、図38に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からストライプ単位でのデータの書き込み要求が入力されたときに実行される。
[ステップS171]RAID制御部134bは、パリティグループごとのパリティデータを計算する。そして、RAID制御部134bは、生成されたパリティデータを有する論理ブロックを、パリティデータの生成元となったデータブロックと同じパリティグループのパリティブロックとする。
[ステップS172]RAID制御部134bは、タイムスタンプ生成部136bからタイムスタンプを取得する。
[ステップS173]RAID制御部134bは、ストライプのすべてのフラグを「1」に設定する。
[ステップS174]RAID制御部134bは、ストライプのすべてのカウンタ値を「0」(初期値)に設定する。
[ステップS175]RAID制御部134bは、ストライプ内の全論理ブロックのデータおよびパリティデータの書き込み指示を、HDDアクセス部135bに対して出力する。するとHDDアクセス部135bによって、タイムスタンプ付きの更新データとパリティデータとが、それぞれについて指定されたHDD内の指定された物理ブロックに書き込まれる。
[ステップS176]RAID制御部134bは、全データおよびパリティデータの書き込みが完了したか否かを判断する。全データおよびパリティデータの書き込みが完了すると、RAID制御部134bは処理を終了する。少なくとも1つのHDDにおける書き込みが完了していなければ、ステップS136の処理が繰り返され、RAID制御部134bは書き込み待ち状態となる。
このようにして、ストライプ単位でのデータの書き込み処理が行われる。書き込み処理を行う場合、RAID制御部134bは、RAM内に処理対象データテーブルを生成し、その処理対象データテーブル内でタイムススタンプ、フラグ、およびカウンタ値の設定を行う。
図39は、ストライプ書き込み時に生成される処理対象データテーブルの例を示す図である。ストライプ書き込み時に生成される処理対象データテーブル132gでは、すべてのデータおよびパリティデータに対して、同じ値のタイムスタンプ「t1_2」が設定されている。また、すべてのカウンタ値のフラグに「1」が設定されている。ここで、すべてのフラグを「1」に設定することは、書き込み抜け検査時の比較対象がタイムスタンプであることを意味している。すなわち、データとパリティデータとの書き込みが正しく(書き込み抜けが発生せずに)実行された場合、読み込み時に両方のフラグが「1」であることから、タイムスタンプが比較対象であると判断される。なお、すべてのカウンタ値には、初期値「0」が設定されている。
次に、読み込み処理について詳細に説明する。
図40は、ブロック読み込み処理の手順を示すフローチャートである。以下、図40に示す処理をステップ番号に沿って説明する。この処理は、ホストコンピュータ10からブロック単位でのデータの読み込み要求が入力されたときに実行される。
[ステップS181]RAID制御部134bは、アクセス対象の論理ブロックが属するパリティグループ用のアクセス管理テーブルを初期化する。アクセス管理テーブルは、論理ブロックごとのデータの書き込み抜けの有無を登録するための、データテーブルである。アクセス管理テーブルの初期化処理では、パリティグループに属する各論理ブロックの書き込み抜けの有無を示す情報として、「不明(null)」が設定される。
[ステップS182]RAID制御部134bは、書き込み要求に応じたデータ書き込み対象の物理ブロック内のデータの読み込み指示を、HDDアクセス部135bに対して出力する。すると、HDDアクセス部135bによって、指定された物理ブロック内のデータの読み込みが行われる。
[ステップS183]RAID制御部134bは、パリティブロックに対応する物理ブロック内のパリティデータの読み込み指示を、HDDアクセス部135bに対して出力する。すると、HDDアクセス部135bによって、指定された物理ブロック内のパリティデータの読み込みが行われる。
[ステップS184]RAID制御部134bは、データの読み込みが完了したか否かを判断する。データ読み込みが完了した場合、処理がステップS185に進められる。データ読み込みが完了していなければステップS184の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
[ステップS185]RAID制御部134bは、パリティデータの読み込みが完了したか否かを判断する。パリティデータの読み込みが完了した場合、処理がステップS186に進められる。パリティデータ読み込みが完了していなければステップS185の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
RAID制御部134bはデータとパリティデータとの読み込みが完了すると、RAM132内に処理対象データテーブルを作成し、読み込んだデータをその処理対象データテーブルに格納する。
[ステップS186]RAID制御部134bは、データとパリティデータとの比較処理を行う。比較処理によって、異常の有無が判定される。この比較処理の詳細は後述する(図46参照)。
[ステップS187]RAID制御部134bは、ステップS186における比較処理の結果、異常がなかったか否かを判断する。異常がない場合、処理がステップS191に進められる。異常がある場合、処理がステップS188に進められる。
[ステップS188]RAID制御部134bは、データとパリティデータとの比較により異常が検出された場合、パリティグループ修復処理を行う。修復処理の結果は、アクセス管理テーブルに反映される。すなわち、アクセス管理テーブルを参照することで、修復の成功の有無が判断できる。この処理の詳細は後述する(図48参照)。
[ステップS189]RAID制御部134bは、パリティグループの修復が成功したか否かを判断する。RAID制御部134bは、少なくとも1つのデータの修復が失敗していれば、パリティデータの修復が失敗したと判断する。修復に成功した場合、処理がステップS191に進められる。修復に失敗した場合、処理がステップS190に進められる。
[ステップS190]RAID制御部134bは、パリティグループの修復に失敗した場合、ホストコンピュータ10にエラー応答を返す。その後、処理が終了する。
[ステップS191]RAID制御部134bは、パリティグループ内のデータをホストコンピュータ10に応答する。その後、処理が終了する。
このようにして、ブロック読み込み処理が行われる。ここで、図39に示したようなストライプにおける論理ブロック番号「D1」の論理ブロックを指定したデータの読み込み要求があったものとする。その場合、論理ブロック番号「D1」の論理ブロックが属するパリティグループに対応するアクセス管理テーブルが初期化される。
図41は、初期化されたアクセス管理テーブルの例を示す図である。アクセス管理テーブル132hには、論理ブロック番号と状態との欄が設けられている。論理ブロック番号の欄には、処理対象となるパリティグループに属する論理ブロックの論理ブロック番号が設定される。
状態の欄には、各論理ブロックの状態が設定される。状態には、「null」、「OK」、「NG」、および「修復」がある。状態「null」は、書き込み抜けの検査を行っていないことを示している。状態「OK」は、書き込み抜けの検査により書き込み抜けなしと判定されたことを示している。状態「NG」は、書き込み抜けの検査により書き込み抜けありと判定されたことを示している。状態「修復」は、書き込み抜けを修復したことを示している。
論理ブロック番号「D1」の論理ブロックが属するパリティグループには、それ以外に、論理ブロック番号「D5」、「D9」、「D13」、「P1」の各論理ブロックが含まれる。そこで、アクセス管理テーブル132hの状態の欄には、各論理ブロックの論理ブロック番号が設定される。また、アクセス管理テーブル132hは、初期化によってすべての論理ブロックの状態に「null」が設定される。
その後、読み込み要求に応じたデータと、そのデータに対応するパリティデータとが宇読み込まれ、処理対象データテーブルに登録される。このときの処理対象データテーブルの内容は、図36に示した通りである。その後、読み出されたデータとパリティデータとの比較処理が行われる。
ここで、比較処理の手順を説明する前に、書き込み方式の違いによる時系列情報(フラグ、カウンタ値、タイムスタンプ)の発生パタンについて、図42〜図45を参照して説明する。以下の例では、1つのパリティグループに含まれる任意のデータブロックと、パリティブロックとに着目する。そして、同じ書き込み方式による書き込みが連続する場合、および書き込み方式が切り替わる場合それぞれについて、どのようなパタンの時系列情報が生じうるかについて説明する。
なお、各物理ブロックへの書き込みは、ECCによりアトミックである(処理が一体である)ことが確認できる。すなわち、データ、フラグ、カウンタ値、タイムスタンプの一部のみが書き込まれ、他の情報に書き込み抜けが発生した場合、HDDアクセス部135bによるECCチェックにより排除される。従って、書き込み抜けは、時系列情報とデータの組み、時系列情報とパリティデータの組み、それぞれ一体で発生する。換言すると、フラグだけの書き込み抜けや、カウンタ値だけの書き込み抜けといった部分的な書き込み抜けは考慮しない。
また、書き込み抜けはまれな現象である。そのため、想定する書き込み抜け以前の書き込みはすべて正常に行われているものとする。例えば、定期的に論理ブロックの読み込みを行うように運用することで、書き込み抜けが発生した論理ブロックに対して繰り返して書き込み抜けが発生する可能性を極めて小さくすることができる。さらに、書き込み抜けはまれな現象であることから、書き込み抜けは、1つの書き込み要求で実行されるデータブロックとパリティブロックとのいずれか一方でのみ発生するものとする。
このようなことから、時系列情報発生パタンは、ほとんどの場合、図42〜図45に示す12個のパタンのいずれかに該当するものと考えられる。
図42は、ブロック書き込みが連続する場合の時系列情報発生パタンを示す図である。図42には、ブロック書き込みが正常に実行された後、さらにブロック書き込みが行われた場合に発生し得る時系列情報発生パタンが示されている。なお、図42に示すパリティブロックに付与されたフラグとカウンタ値のうち、書き込みが行われたデータブロックに対応するフラグとカウンタ値のみが示されている(図43〜図45においても同様)。
先のブロック書き込みが正常に行われた場合、データブロック(論理ブロック「D」)のフラグとパリティブロック(論理ブロック「P」)のフラグは、共に「0」である。データブロックとパリティブロックとのカウンタ値は、同じ値である。図42の例では、カウンタ値は共に「1」であるものとしている。データブロックのタイムスタンプには、ブロック書き込み時を示す時刻「T1」が設定される。他方、パリティブロックのタイムスタンプには、ストライプ書き込みを最後に行った時刻「Tx」がそのまま設定されている。
図42では、正常に(書き込み抜けが発生することなく)実行された論理ブロックの状態を「正常」と表し、書き込み抜けが発生した論理ブロックの状態を「書き込み抜け」と表している(図43〜図45においても同様)。
正常にブロック書き込みが実行された論理ブロックに対し、別のブロック書き込み要求が発生した場合、パタン「1」〜「3」の時系列情報パタンが生じうる。
パタン「1」は、データブロック、パリティブロック共に正常に書き込みが行われた場合のパタンである。この場合、両方の論理ブロックのカウンタ値がカウントアップされる。図42の例では、カウンタ値が共に「2」に更新されている。また、データブロックのタイムスタンプが、後のブロック書き込み時刻「T2」に更新されている。このような場合、書き込み抜けの検出処理として、後述する第1のカウンタ値比較処理が行われる。
パタン「2」は、パリティブロックは正常に書き込みが行われているが、データブロックに書き込み抜けが発生した場合のパタンである。この場合、パリティブロックのカウンタ値のみがカウントアップされる。図42の例では、パリティブロックのカウンタ値が「2」に更新されているが、データブロックのカウンタ値は「1」のままである。また、データブロック、パリティブロック共に、タイムスタンプは変更されない。このような場合、書き込み抜けの検出処理として、後述する第1のカウンタ値比較処理が行われる。
パタン「3」は、データブロックは正常に書き込みが行われているが、パリティブロックに書き込み抜けが発生した場合のパタンである。この場合、データブロックのカウンタ値のみがカウントアップされる。図42の例では、データブロックのカウンタ値が「2」に更新されているが、パリティブロックのカウンタ値は「1」のままである。また、データブロックのタイムスタンプが、後のブロック書き込み時刻「T2」に更新されている。このような場合、書き込み抜けの検出処理として、後述する第1のカウンタ値比較処理が行われる。
このように、パタン「1」〜「3」では、カウンタ値の比較によって書き込み抜けの検出が可能である。
図43は、ストライプ書き込みが連続する場合の時系列情報発生パタンを示す図である。図43には、ストライプ書き込みが正常に実行された後、さらにストライプ書き込みが行われた場合に発生し得る時系列情報発生パタンが示されている。
先のストライプ書き込みが正常に行われた場合、データブロックのフラグとパリティブロックのフラグは、共に「1」である。データブロックとパリティブロックとのカウンタ値は共に「0」である。データブロックとパリティブロックとのタイムスタンプには、共にストライプ書き込みを行った時刻「T3」が設定される。
正常にストライプ書き込みが実行された論理ブロックに対し、別のストライプ書き込み要求が発生した場合、パタン「4」〜「6」の時系列情報パタンが生じ得る。
パタン「4」は、データブロック、パリティブロック共に正常に書き込みが行われた場合のパタンである。この場合、両方の論理ブロックのタイムスタンプが、後のストライプ書き込み時刻「T4」に更新される。このような場合、書き込み抜けの検出処理として、後述する第1のタイムスタンプ比較処理が行われる。
パタン「5」は、パリティブロックは正常に書き込みが行われているが、データブロックに書き込み抜けが発生した場合のパタンである。この場合、パリティブロックのタイムスタンプのみが、後のストライプ書き込み時刻「T4」に更新される。このような場合、書き込み抜けの検出処理として、後述する第1のタイムスタンプ比較処理が行われる。
パタン「6」は、データブロックは正常に書き込みが行われているが、パリティブロックに書き込み抜けが発生した場合のパタンである。この場合、データブロックのタイムスタンプのみが後のストライプ書き込み時刻「T4」に更新される。このような場合、書き込み抜けの検出処理として、後述する第1のタイムスタンプ比較処理が行われる。
このように、パタン「4」〜「6」では、タイムスタンプの比較によって書き込み抜けの検出が可能である。
図44は、ストライプ書き込み後にブロック書き込みが行われた場合の時系列情報発生パタンを示す図である。図44には、ストライプ書き込みが正常に実行された後、さらにブロック書き込みが行われた場合に発生し得る時系列情報発生パタンが示されている。先のストライプ書き込み後の状態は、図43と同様である。
正常にストライプ書き込みが実行された論理ブロックに対し、別のブロック書き込み要求が発生した場合、パタン「7」〜「9」の時系列情報パタンが生じ得る。
パタン「7」は、データブロック、パリティブロック共に正常に書き込みが行われた場合のパタンである。この場合、両方の論理ブロックのフラグが「0」に変更される。また、両方の論理ブロックのカウンタ値がカウントアップされる。図44の例では、カウンタ値が共に「1」に更新されている。また、データブロックのタイムスタンプが、後のブロック書き込み時刻「T5」に更新されている。このような場合、書き込み抜けの検出処理として、後述する第1のカウンタ値比較処理が行われる。
パタン「8」は、パリティブロックは正常に書き込みが行われているが、データブロックに書き込み抜けが発生した場合のパタンである。この場合、パリティブロックのフラグが「1」に変更される。また、パリティブロックのカウンタ値のみがカウントアップされる。図44の例では、パリティブロックのカウンタ値が「1」に更新されているが、データブロックのカウンタ値は「0」のままである。また、データブロック、パリティブロック共に、タイムスタンプは変更されない。このような場合、書き込み抜けの検出処理として、後述する第2のタイムスタンプ比較処理と第2のカウンタ値比較処理とが行われる。
パタン「9」は、データブロックは正常に書き込みが行われているが、パリティブロックに書き込み抜けが発生した場合のパタンである。この場合、データブロックのカウンタ値のみがカウントアップされる。図44の例では、データブロックのカウンタ値が「1」に更新されているが、パリティブロックのカウンタ値は「0」のままである。また、データブロックのタイムスタンプが、後のブロック書き込み時刻「T5」に更新されている。このような場合、書き込み抜けの検出処理として、後述する第2のタイムスタンプ比較処理が行われる。
このように、パタン「8」、「9」では、フラグが一致しない。この場合、まずタイムスタンプを比較することで、パタン「9」のような書き込み抜けが検出できる。また、フラグとタイムスタンプとが一致した場合にはカウンタ値を比較することによって、パタン「8」のような書き込み抜けが検出できる。
図45は、ブロック書き込み後にストライプ書き込みが行われた場合の時系列情報発生パタンを示す図である。図45には、ブロック書き込みが正常に実行された後、さらにストライプ書き込みが行われた場合に発生し得る時系列情報発生パタンが示されている。先のブロック書き込み後の状態は、図42と同様である。
正常にブロック書き込みが実行された論理ブロックに対し、別のストライプ書き込み要求が発生した場合、パタン「10」〜「12」の時系列情報パタンが生じ得る。
パタン「10」は、データブロック、パリティブロック共に正常に書き込みが行われた場合のパタンである。この場合、両方の論理ブロックのフラグが「1」に変更され、カウンタ値は「0」に初期化される。また、両方の論理ブロックのタイムスタンプは、後のストライプ書き込み時刻「T6」に更新される。このような場合、書き込み抜けの検出処理として、後述する第1のタイムスタンプ比較処理が行われる。
パタン「11」は、パリティブロックは正常に書き込みが行われているが、データブロックに書き込み抜けが発生した場合のパタンである。この場合、パリティブロックのフラグが「1」に変更され、カウンタ値が「0」に初期化される。また、パリティブロックのタイムスタンプのみが、後のストライプ書き込み時刻「T6」に更新される。このような場合、書き込み抜けの検出処理として、後述する第2のタイムスタンプ比較処理が行われる。
パタン「12」は、データブロックは正常に書き込みが行われているが、パリティブロックに書き込み抜けが発生した場合のパタンである。この場合、データブロックのフラグが「1」に変更され、カウンタ値が「0」に初期化される。また、データブロックのタイムスタンプのみが後のストライプ書き込み時刻「T6」に更新される。このような場合、書き込み抜けの検出処理として、後述する第2のタイムスタンプ比較処理が行われる。
このように、パタン「11」、「12」では、フラグが一致しない。この場合、まずタイムスタンプを比較することで、書き込み抜けが検出できる。
次に、図42〜図45に示したような各パタンの書き込み抜けを検出するための処理手順を詳細に説明する。
図46は、データとパリティデータとの比較処理手順を示すフローチャートである。以下、図46に示す処理をステップ番号に沿って説明する。
[ステップS201]RAID制御部134bは、データとパリティデータとのフラグを検査する。具体的には、RAID制御部134bは、処理対象データテーブル132fのデータ「d1」に付与されているカウンタ値#1「c1」のフラグ「f1」と、パリティデータ「p1」に付与されているカウンタ値#1「c11」のフラグ「f11」とを取得する。そして、RAID制御部134bは、各フラグの値に応じて処理を分岐させる。データのフラグが「0」、パリティデータのフラグが「0」であれば、処理がステップS202に進められる。データのフラグが「1」、パリティデータのフラグが「1」であれば、処理がステップS203に進められる。データのフラグが「1」、パリティデータのフラグが「0」の場合、およびデータのフラグが「0」、パリティデータのフラグが「1」の場合には、処理がステップS204に進められる。
[ステップS202]カウンタ値比較部139bは、データとパリティデータとのフラグが共に「0」の場合、第1のカウンタ比較処理を実行する。データとパリティデータとのフラグが共に「0」となるのは、パタン「1」、「2」、「3」、「7」である。この処理の詳細は後述する(図47参照)。その後、処理が終了する。
[ステップS203]タイムスタンプ比較部137bは、データとパリティデータとのフラグが共に「1」の場合、第1のタイムスタンプ比較処理を実行する。データとパリティデータとのフラグが共に「1」となるのは、パタン「4」、「5」、「6」、「10」である。この処理の詳細は後述する(図49参照)。その後、処理が終了する。
[ステップS204]タイムスタンプ比較部137bは、データのフラグとパリティデータとのフラグが不一致の場合、第2のタイムスタンプ比較処理を実行する。データのフラグとパリティデータとのフラグが不一致となるのは、パタン「8」、「9」、「11」、「12」である。この処理の詳細は後述する(図50参照)。その後、処理が終了する。
次に、各比較処理の詳細について説明する。
図47は、第1のカウンタ値比較処理の手順を示すフローチャートである。以下、図47に示す処理をステップ番号に沿って説明する。
[ステップS211]カウンタ値比較部139bは、データとパリティデータとのカウンタ値を比較する。カウンタ値比較部139bは、カウンタ値が一致すれば書き込み抜けがないと判断し、処理をステップS212に進める。カウンタ値が一致するのは、パタン「1」、「7」である。
カウンタ値比較部139bは、パリティデータのカウンタ値の方が1だけ進んでいればデータに書き込み抜けが発生していると判断し、処理をステップS213に進める。パリティデータのカウンタ値の方が進んでいるのは、パタン「2」である。カウンタ値比較部139bは、データのカウンタ値の方が1だけ進んでいればパリティデータに書き込み抜けが発生していると判断し、処理をステップS214に進める。データのカウンタ値の方が進んでいるのは、パタン「3」である。
カウンタ値比較部139bは、カウンタ値の差が「2」であれば判定不能と判断し、処理をステップS215に進める。図42〜図45に示したパタンでは、同じ論理ブロックで書き込み抜けが繰り返し発生することを想定していない。そのため、パタン「1」〜「12」には、カウンタ値の差が「2」となるパタンは含まれていない。
[ステップS212]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「OK」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS213]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS214]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「OK」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
[ステップS215]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
このようにして、カウンタ値の比較結果に応じて、アクセス管理テーブル132hの内容が更新される。
図48は、第1のカウンタ値比較処理実施後のアクセス管理テーブルを示す図である。図48では、論理ブロック番号「D1」のデータブロックと、論理ブロック番号「P1」のパリティブロック「P1」との状態が更新されている。
(A)は、カウンタ値一致時のアクセス管理テーブル132hの内容を示す図である。カウンタ値が一致したことで、データブロックとパリティブロックとの両方の状態が「OK」となる。(B)は、データ書き込み抜け検出時のアクセス管理テーブル132hの内容を示す図である。データ書き込み抜けが検出されたことで、データブロックの状態が「NG」となり、パリティブロックの状態が「OK」となる。(C)は、パリティデータ書き込み抜け検出時のアクセス管理テーブル132hの内容を示す図である。パリティデータ書き込み抜けが検出されたことで、データブロックの状態が「OK」となり、パリティブロックの状態が「NG」となる。(D)は、判定不能の場合のアクセス管理テーブル132hの内容を示す図である。判定不能であるため、データブロックとパリティブロックとの両方の状態が「NG」となる。
図49は、第1のタイムスタンプ比較処理の手順を示すフローチャートである。以下、図49に示す処理をステップ番号に沿って説明する。
[ステップS221]タイムスタンプ比較部137bは、データとパリティデータとのタイムスタンプを比較する。タイムスタンプ比較部137bは、タイムスタンプが一致すれば書き込み抜けがないと判断し、処理をステップS222に進める。タイムスタンプが一致するのは、パタン「4」、「10」である。
タイムスタンプ比較部137bは、パリティデータのタイムスタンプの方が大きければデータに書き込み抜けが発生していると判断し、処理をステップS223に進める。パリティデータのタイムスタンプの方が大きいのは、パタン「5」である。タイムスタンプ比較部137bは、データのタイムスタンプの方が大きければパリティデータに書き込み抜けが発生していると判断し、処理をステップS224に進める。データのタイムスタンプの方が大きいのは、パタン「6」である。
[ステップS222]タイムスタンプ比較部137bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「OK」に変更する。また、タイムスタンプ比較部137bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS223]タイムスタンプ比較部137bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、タイムスタンプ比較部137bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS224]タイムスタンプ比較部137bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「OK」に変更する。また、タイムスタンプ比較部137bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
図50は、第2のタイムスタンプ比較処理の手順を示すフローチャートである。以下、図50に示す処理をステップ番号に沿って説明する。
[ステップS231]タイムスタンプ比較部137bは、データとパリティデータとのタイムスタンプを比較する。タイムスタンプ比較部137bは、タイムスタンプが一致すれば書き込み抜けがないと判断し、処理をステップS232に進める。タイムスタンプが一致するのは、パタン「8」である。タイムスタンプ比較部137bは、パリティデータのタイムスタンプの方が大きければデータに書き込み抜けが発生していると判断し、処理をステップS233に進める。パリティデータのタイムスタンプの方が大きいのは、パタン「11」である。タイムスタンプ比較部137bは、データのタイムスタンプの方が大きければパリティデータに書き込み抜けが発生していると判断し、処理をステップS234に進める。データのタイムスタンプの方が大きいのは、パタン「9」、「12」である。
[ステップS232]カウンタ値比較部139bは、第2のカウンタ値比較処理を実行する。この処理の詳細は後述する(図51参照)。その後、処理が終了する。
[ステップS233]タイムスタンプ比較部137bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、タイムスタンプ比較部137bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS234]タイムスタンプ比較部137bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「OK」に変更する。また、タイムスタンプ比較部137bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
図51は、第2のカウンタ値比較処理の手順を示す図である。以下、図51に示す処理をステップ番号に沿って説明する。
[ステップS241]カウンタ値比較部139bは、データとパリティデータとのカウンタ値を比較する。カウンタ値比較部139bは、カウンタ値が一致すれば書き込み抜けがないと判断し、処理をステップS242に進める。なお、ステップS241においてカウンタ値が一致するパタンは、図42〜図45に例示したパタンの中にはない。
カウンタ値比較部139bは、パリティデータのカウンタ値の方が1だけ進んでいればデータに書き込み抜けが発生していると判断し、処理をステップS243に進める。ステップS241においてパリティデータのカウンタ値の方が1だけ進んでいると判断されるのは、パタン「8」である。
カウンタ値比較部139bは、データのカウンタ値の方が1だけ進んでいればパリティデータに書き込み抜けが発生していると判断し、処理をステップS244に進める。なお、ステップS241においてカウンタ値が一致するパタンは、図42〜図45に例示したパタンの中にはない。
カウンタ値比較部139bは、カウンタ値の差が2であれば、判定不要と判断し、処理をステップS245に進める。なお、ステップS241においてカウンタ値の差が2となるパタンは、図42〜図45に例示したパタンの中にはない。
[ステップS242]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
[ステップS243]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「OK」に変更する。その後、処理が終了する。
[ステップS244]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
[ステップS245]カウンタ値比較部139bは、アクセス管理テーブル132hにおいて、比較したデータに対応するデータブロックの状態を「NG」に変更する。また、カウンタ値比較部139bは、比較したパリティデータに対応するパリティブロックの状態を「NG」に変更する。その後、処理が終了する。
このようにして、書き込み抜けの検査処理が行われ、その結果がアクセス管理テーブル132hに反映される。アクセス管理テーブル132hにおいて状態が「NG」の論理ブロックがある場合、RAID制御部134bによってパリティグループ修復処理が行われる。以下、パリティグループ修復処理を詳細に説明する。
図52は、パリティグループ修復処理の手順を示すフローチャートである。以下、図52に示す処理をステップ番号に沿って説明する。
[ステップS251]RAID制御部134bは、パリティグループ内の未読の論理ブロックのデータを、対応する物理ブロックから読み込む。すなわち、読み込み要求に応じて、図40に示すブロック読み込み処理におけるステップS182,S183において、1つのデータとパリティデータとが読み込まれている。この読み込み時に書き込み抜けが検出された場合、ステップS182で読み込んだデータと同じパリティグループに属する他のデータの読み込み指示が、HDDアクセス部135bに出される。その結果、HDDアクセス部135bによって他のデータがHDDから読み込まれる。
[ステップS252]RAID制御部134bは、修復すべきパリティグループ内のすべての論理ブロックのデータの読み込みが完了したか否かを判断する。すべての論理ブロックのデータの読み込みが完了した場合、処理がステップS253に進められる。読み込まれていないデータがある場合、ステップS252の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
[ステップS253]RAID制御部134bは、パリティグループ比較処理を行う。パリティグループ比較処理では、ステップS251で読み出したデータに関しても、書き込み抜けの検査が行われる。その結果、パリティグループに属するすべてのデータおよびパリティデータについて書き込み抜けの有無が検査され、検査結果がアクセス管理テーブル132hに反映される。なお、パリティグループ比較処理の詳細は後述する(図53参照)。
[ステップS254]RAID制御部134bは、パリティグループ再計算処理を実行する。パリティグループ再計算処理は、アクセス管理テーブル132hにおいて「NG」とされている論理ブロックのデータまたはパリティデータを再計算する処理である。なお、パリティグループ再計算処理の詳細は後述する(図54参照)。
[ステップS255]RAID制御部134bは、修復した論理ブロックのデータまたはパリティデータを、その論理ブロックに対応する物理ブロックに書き込む。
[ステップS256]RAID制御部134bは、ステップS255における書き込み処理が完了したか否かを判断する。書き込みが完了した場合、処理がステップS257に進められる。書き込みが完了していなければステップS256の処理が繰り返され、RAID制御部134bは書き込み待ち状態となる。
[ステップS257]RAID制御部134bは、HDD210b,220b,230b,240b,250bにおけるディスクキャッシュを無効化する。これは、ステップS258における読み込み処理においてキャッシュされたデータが読み込まれたのでは、書き込みが正しく実行できたか否かの検証ができないためである。
[ステップS258]RAID制御部134bは、修復した論理ブロックのデータまたはパリティデータを書き込んだ物理ブロックから、データまたはパリティデータを読み込む。
[ステップS259]RAID制御部134bは、ステップS258による読み込みが完了したか否かを判断する。読み込みが完了した場合、処理がステップS260に進められる。読み込みが完了していなければ、RAID制御部134bは、ステップS259の処理を繰り返し、読み込み待ち状態となる。
[ステップS260]RAID制御部134bは、ステップS255における書き込みが正常に行われたか否かを判断する。具体的には、RAID制御部134bは、ステップS255で書き込んだデータまたはパリティデータと、ステップS258で読み込んだデータまたはパリティデータとを比較する。比較の結果、データまたはパリティデータの内容が一致すれば、書き込みは正常に行われたと判断される。比較の結果、データまたはパリティデータの内容が不一致であれば、書き込みは正常に行われていないと判断される。
書き込みが正常に行われなかった場合、処理がステップS255に進められ、再度書き込みが行われる。書き込みが正常に行われた場合、処理が終了する。
次に、パリティグループ比較処理の詳細について説明する。
図53は、パリティグループ比較処理の手順を示すフローチャートである。以下、図53に示す処理をステップ番号に沿って説明する。
[ステップS271]RAID制御部134bは、処理対象のパリティグループのアクセス管理テーブル132hに示されている論理ブロックの中に、ステップS273の処理を実行していない未比較のデータブロックがあるか否かを判断する。アクセス管理テーブル132hにおいて状態が「null」となっているデータブロックが、未選択のデータブロックである。未比較のデータブロックがある場合、処理がステップS272に進められる。未比較のデータブロックがない場合、処理が終了する。
[ステップS272]RAID制御部134bは、アクセス管理テーブル132hから未比較のデータブロックを1つ選択する。
[ステップS273]RAID制御部134bは、ステップS272で選択したデータブロックのデータと、パリティブロックのパリティデータとの比較処理を実行する。この処理の詳細は、図46〜図51に示した通りである。パリティブロックのパリティデータとの比較処理の結果、アクセス管理テーブル132hにおいて、選択したデータブロックに対して「OK」または「NG」の状態が設定される。その後、処理がステップS271に進められる。
次に、パリティグループ再計算処理の詳細について説明する。
図54は、パリティグループ再計算処理の手順を示すフローチャートである。以下、図54に示す処理をステップ番号に沿って説明する。
[ステップS281]RAID制御部134bは、アクセス管理テーブルを検査し、状態が「NG」となっている論理ブロック数を数える。「NG」の論理ブロックが1個のみであれば、処理がステップS282に進められる。「NG」の論理ブロックが2個以上あれば、処理がステップS284に進められる。
[ステップS282]RAID制御部134bは、「NG」の論理ブロックが1個のみであれば、「NG」の論理ブロックのデータまたはパリティデータを修復する。具体的には、RAID制御部134bは、正常な他のデータおよびパリティデータのビットごとの排他的論理和演算を行い、演算結果を修復後のデータまたはパリティデータとする。RAID制御部134bは、修復したデータまたはパリティデータを、修復対象の論理ブロックに対応する物理ブロックに書き込む。
[ステップS283]RAID制御部134bは、アクセス管理テーブル132hにおいて、データまたはパリティデータを修復した論理ブロックの状態を「修復」に更新する。その後、処理が終了する。
[ステップS284]RAID制御部134bは、「NG」の論理ブロックが2個以上であれば、「NG」の論理ブロックの論理ブロック番号をバッドブロックリストに追加する。
[ステップS285]RAID制御部134bは、パリティブロックのパリティデータを修復する。具体的には、RAID制御部134bは、各データブロックのデータのビットごとの排他的論理和演算を行い、演算結果をパリティデータとする。そして、RAID制御部134bは、修復したパリティデータを、パリティブロックに対応する物理ブロックに書き込む。
[ステップS286]RAID制御部134bは、アクセス管理テーブル132hにおいて、パリティブロックの状態を「修復」に更新する。その後、処理が終了する。
このようにして、書き込み抜けが発生した論理ブロックのデータまたはパリティデータが修復される。
図55は、パリティグループ修復処理が実行されたときのアクセス管理テーブルの状態遷移例を示す図である。図55では、読み込み要求の対象となったデータブロックで書き込み抜けが検出され、同じパリティグループ内の他の論理ブロックは正常であった場合の例である。
第1の状態(ST1)は、読み込み要求に応じて読み出されたデータとパリティデータとの書き込み抜け検証後のアクセス管理テーブル132hの状態を示している。図55の例では、論理ブロック番号「D1」のデータブロックに書き込み抜けが検出され、状態が「NG」となっている。パリティブロックは書き込み抜けが検出されず、状態が「OK」となっている。
書き込み抜けが検出されると、RAID制御部134bは修復処理の実行を開始し、まず、他のデータブロックのデータの書き込み抜けを検証する。
第2の状態(ST2)は、修復処理における書き込み抜け検証後のアクセス管理テーブル132hの状態を示している。各データブロックの書き込み抜け検証により、書き込み抜けがないことが確認されている。そこで、論理ブロック番号「D2」、「D3」、「D4」の各データブロックの状態が「OK」となっている。
その後、RAID制御部134bは修復処理を続行し、書き込み抜けが発生した論理ブロックのデータを修復する。
第3の状態(ST3)は、データ修復後のアクセス管理テーブル132hの状態を示している。書き込み抜けが発生した論理ブロック番号「D1」のデータブロックのデータが修復されたことにより、そのデータブロックの状態が「修復」に変更されている。
以上のようにして、ブロック読み込み時の書き込み抜け検出、および修復が行われる。
次に、ストライプ読み込み処理について説明する。
図56は、ストライプ読み込み処理の手順を示すフローチャートである。以下、図56に示す処理をステップ番号に沿って説明する。
[ステップS291]RAID制御部134bは、アクセス対象のストライプに含まれる各パリティグループ用のアクセス管理テーブルを初期化する。初期化されたアクセス管理テーブルには、対応するパリティグループに属する各論理ブロックの状態として「不明(null)」が設定される。
図57は、ストライプ読み込み時に初期化されたアクセス管理テーブルの例を示す図である。この例では、図39に示すストライプの読み込み要求が入力された場合を想定している。図39のストライプや、4つのパリティグループを含んでいる。従って、各パリティグループに対応する4つのアクセス管理テーブル132h,132i,132j,132kが生成される。各アクセス管理テーブル132h,132i,132j,132kは、対応するパリティグループに含まれる論理ブロックの論理ブロック番号が設定されている。また、各論理ブロック番号に対応付けて、論理ブロックの状態が設定されている。論理ブロックの状態は、初期化によってすべて「null」となっている。
以下、図56の説明に戻る。
[ステップS292]RAID制御部134bは、ストライプに含まれるパリティグループに属するすべての論理ブロックのデータおよびパリティデータを、各論理ブロックに対応する物理ブロックから読み込む。
[ステップS293]RAID制御部134bは、すべてのデータとパリティデータとの読み込みが完了したか否かを判断する。読み込みが完了した場合、処理がステップS294に進められる。読み込みが完了していない場合、ステップS293の処理が繰り返され、RAID制御部134bは読み込み待ち状態となる。
[ステップS294]RAID制御部134bは、すべてのデータとパリティデータとの比較処理を行う。この比較処理により、すべての論理ブロックについての書き込み抜けの有無が検証される。なお、この処理の詳細は後述する(図58参照)。
[ステップS295]RAID制御部134bは、ステップS294における比較処理の結果、異常がなかったか否かを判断する。異常がない場合、処理がステップS299に進められる。異常がある場合、処理がステップS296に進められる。
[ステップS296]RAID制御部134bは、データとパリティデータとの比較により異常が検出された場合、すべてのパリティグループ修復処理を行う。修復処理の結果は、アクセス管理テーブルに反映される。この処理の詳細は後述する(図59参照)。
[ステップS297]RAID制御部134bは、すべてのデータブロックにおいて異常がないか否かを判断する。少なくとも1つのバッドブロックが検出された場合、異常ありと判断される。異常がない場合、処理がステップS299に進められる。異常がある場合、処理がステップS298に進められる。
[ステップS298]RAID制御部134bは、パリティグループの修復に失敗した場合、ホストコンピュータ10にエラー応答を返す。その後、処理が終了する。
[ステップS299]RAID制御部134bは、ストライプ内のデータをホストコンピュータ10に応答する。その後、処理が終了する。
このようにして、ストライプ読み込み時には、ストライプ内のすべてのデータおよびパリティデータの書き込み抜けが検査される。
次に、全データとパリティデータとの比較処理について詳細に説明する。
図58は、全データとパリティデータとの比較処理の手順を示すフローチャートである。以下、図58に示す処理をステップ番号に沿って説明する。
[ステップS301]RAID制御部134bは、アクセス管理テーブル132h,132i,132j,132kに示されている論理ブロックの中に、ステップS303の処理を実行していない未比較のデータブロックがあるか否かを判断する。アクセス管理テーブル132hにおいて状態が「null」となっているデータブロックが、未選択のデータブロックである。未比較のデータブロックがある場合、処理がステップS302に進められる。未比較のデータブロックがない場合、処理が終了する。
[ステップS302]RAID制御部134bは、アクセス管理テーブル132h,132i,132j,132kから未比較のデータブロックを1つ選択する。
[ステップS303]RAID制御部134bは、ステップS302で選択したデータブロックのデータと、パリティブロックのパリティデータとの比較処理を実行する。この処理の詳細は、図46〜図51に示した通りである。パリティブロックのパリティデータとの比較処理の結果、アクセス管理テーブル132h,132i,132j,132kにおいて、選択したデータブロックに対して「OK」または「NG」の状態が設定される。その後、処理がステップS301に進められる。
次に、全パリティグループの修復処理について説明する。
図59は、全パリティグループ修復処理の手順を示すフローチャートである。以下、図59に示す処理をステップ番号に沿って説明する。
[ステップS311]RAID制御部134bは、すべてのパリティグループについて、パリティグループ再計算処理が完了したか否かを判断する。すべてのパリティグループについてパリティグループ再計算処理が完了していれば、処理がステップS314に進められる。未処理のパリティグループがあれば処理がステップS312に進められる。
[ステップS312]RAID制御部134bは、パリティグループ再計算を行っていないパリティグループを1つ選択する。
[ステップS313]RAID制御部134bは、パリティグループ再計算処理を行う。この処理の詳細は、図54に示した通りである。その後、処理がステップS311に進められる。
[ステップS314]RAID制御部134bは、処理対象のストライプに含まれる全論理ブロックのデータまたはパリティデータを、その論理ブロックに対応する物理ブロックに書き込む。
[ステップS315]RAID制御部134bは、ステップS314における書き込み処理が完了したか否かを判断する。書き込みが完了した場合、処理がステップS316に進められる。書き込みが完了していなければステップS315の処理が繰り返され、RAID制御部134bは書き込み待ち状態となる。
[ステップS316]RAID制御部134bは、HDD210b,220b,230b,240b,250bにおけるディスクキャッシュを無効化する。
[ステップS317]RAID制御部134bは、処理対象のストライプに含まれるすべての論理ブロックに対応する物理ブロックから、データまたはパリティデータを読み込む。
[ステップS318]RAID制御部134bは、ステップS317による読み込みが完了したか否かを判断する。読み込みが完了した場合、処理がステップS319に進められる。読み込みが完了していなければ、RAID制御部134bは、ステップS318の処理を繰り返し、読み込み待ち状態となる。
[ステップS319]RAID制御部134bは、ステップS314における書き込みが正常に行われたか否かを判断する。具体的には、RAID制御部134bは、ステップS314で書き込んだデータまたはパリティデータと、ステップS317で読み込んだデータまたはパリティデータとを比較する。比較の結果、データまたはパリティデータの内容が一致すれば、書き込みは正常に行われたと判断される。比較の結果、データまたはパリティデータの内容が不一致であれば、書き込みは正常に行われていないと判断される。
書き込みが正常に行われなかった場合、処理がステップS314に進められ、再度書き込みが行われる。書き込みが正常に行われた場合、処理が終了する。
以上のように、タイムスタンプとカウンタとを併用することにより、ストライプ書き込み時の事前読み込みを行わずに済ませることができる。しかも、タイムスタンプのみを用いる場合に比べ、時系列情報(タイムスタンプ、フラグ、カウンタ値)の格納領域を小さくできる。すなわち、書き込み抜け検査のための付加的な情報の記憶領域をできる限り小さくし、かつ、ストライプ書き込み時の全データの読み込みを不要とすることができる。
[その他の応用例]
上記の実施の形態はRAID5の例を用いて処理の詳細を説明したが、RAID4にも同様に適用できる。
図60は、RAID4における論理ブロックのHDDへの割当例を示す図である。図60ではデータが格納されるデータブロックの論理ブロック番号を、文字「D」と数字との結合で表している。また、パリティデータが格納されるパリティブロックの論理ブロック番号を、文字「P」と数字との結合で表している。割当表70には、ディスク番号とブロック番号との交差する位置に、ディスク番号とブロック番号とで特定される物理ブロックに割り当てられた論理ブロックの論理ブロック番号が設定されている。図60の例では、パリティグループ数が「5」、チャンク内ブロック数が「4」である。割当表70の横に並んだブロック、が1つのパリティグループであるチャンクをパリティグループ数だけ集めたものがストライプ71〜74である。図60では、ストライプ71〜74を太線の枠で囲っている。RAID4では、各パリティグループにおけるパリティブロックは、すべて1つのHDDに格納されている。
このようにRAID4では、図8に示したRAID5のデータ割当と比較し、パリティブロックに割り当てる物理ブロックの所在が、1つのHDDに統一されていることのみが異なる。すると、上記の第1〜第3の実施の形態の処理はそのままRAID4に適用することができる。
また、上記の処理機能は、コンピュータによって実現することができる。
図61は、本実施の形態に用いるコンピュータのハードウェア構成例を示す図である。コンピュータ300は、CPU(Central Processing Unit)301によって装置全体が制御されている。CPU301には、バス309を介してRAM302と複数の周辺機器が接続されている。
RAM302は、コンピュータ300の主記憶装置として使用される。RAM302には、CPU301に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM302には、CPU301による処理に必要な各種データが格納される。
バス309に接続されている周辺機器としては、HDD303、グラフィック処理装置304、入力インタフェース305、光学ドライブ306、通信インタフェース307、およびディスクインタフェース308がある。
HDD303は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD303は、コンピュータ300の二次記憶装置として使用される。HDD303には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
グラフィック処理装置304には、モニタ81が接続されている。グラフィック処理装置304は、CPU301からの命令に従って、画像をモニタ81の画面に表示させる。モニタ81としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース305には、キーボード82とマウス83とが接続されている。入力インタフェース305は、キーボード82やマウス83から送られてくる信号をCPU301に送信する。なお、マウス83は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ306は、レーザ光などを利用して、光ディスク84に記録されたデータの読み取りを行う。光ディスク84は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク84には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
通信インタフェース307は、ネットワーク90に接続されている。通信インタフェース307は、ネットワーク90を介して、サーバ91などの他のコンピュータとの間でデータの送受信を行う。
ディスクインタフェース308は、RAID5を実現するための複数のHDD210,220,230,240が接続されている。ディスクインタフェース308は、HDD210,220,230,240へのデータの入出力を制御する。
この場合、RIAID装置が有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。その場合、図1に示した読み込み手段1、パリティデータ生成手段2、時系列情報生成手段3、時系列情報付与手段4、書き込み手段5、比較手段6、修復手段7、およびデータ出力手段8は、コンピュータ300が有することとなる。
処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置(HDD)、フレキシブルディスク(FD)、磁気テープなどがある。光ディスクには、DVD、DVD−RAM、CD−ROM、CD−R/RWなどがある。光磁気記録媒体には、MO(Magneto-Optical disc)などがある。
プログラムを流通させる場合には、例えば、そのプログラムが記録されたDVD、CD−ROMなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成を組み合わせたものであってもよい。
以上説明した実施の形態の主な技術的特徴は、以下の付記の通りである。
(付記1) 複数のストレージ装置内の記憶領域を複数の単位記憶領域に分割し、複数のデータと前記複数のデータに基づいて生成されるパリティデータとをパリティグループとし、同一パリティグループ内の前記データと前記パリティデータとを前記複数のストレージ装置内の単位記憶領域に分散格納するディスクアレイ装置において、
更新データを含む書き込み要求に応じて、前記更新データが属するパリティグループの更新後パリティデータを生成するパリティデータ生成手段と、
前記更新データを書き込むべき単位記憶領域に格納されている既存データと、前記更新データとの間の書き込み時の前後関係を示す時系列情報を生成する時系列情報生成手段と、
前記書き込み要求に応じて生成された前記時系列情報を証明用時系列情報として前記更新データに付与すると共に、前記証明用時系列情報と同じ値の比較用時系列情報を前記更新データに関連付けて前記更新後パリティデータに付与する時系列情報付与手段と、
前記証明用時系列情報が付与された前記更新データと前記比較用時系列情報が付与された前記更新後パリティデータとを、前記複数のストレージ装置に分散して書き込む書き込み手段と、
を有することを特徴とするディスクアレイ装置。
(付記2) さらに、
前記更新データを指定した読み込み要求に応じて、前記証明用時系列情報付きの前記更新データと、前記更新データに関連付けられた前記比較用時系列情報付きの前記更新後パリティデータとを、前記複数のストレージ装置から読み込む読み込み手段と、
前記更新データの前記証明用時系列情報と、前記更新データに関連付けられた前記比較用時系列情報とを比較する比較手段と、
前記証明用時系列情報と前記比較用時系列情報とが一致した場合、前記更新データを出力するデータ出力手段と、
を有することを特徴とする付記1記載のディスクアレイ装置。
(付記3) 前記時系列情報生成手段は、前記時系列情報として、前記書き込み要求の入力順が後である程大きな値を生成し、
さらに、
前記比較手段の比較の結果、前記証明用時系列情報の値が、前記更新データに関連付けられた前記比較用時系列情報より小さい場合、前記更新データが属するパリティグループ内の他のデータを前記複数のストレージ装置から読み込み、前記他のデータと前記更新後パリティデータとを用いて前記更新データを修復する修復手段を有し、
前記データ出力手段は、前記更新データの修復が行われた場合、修復後の前記更新データを出力することを特徴とする付記2記載のディスクアレイ装置。
(付記4) 前記時系列情報付与手段は、前記更新データが修復された場合、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報を、修復後の前記更新データに付与し、
前記書き込み手段は、前記比較用時系列情報が付与された修復後の前記更新データを、前記複数のストレージ装置内の読み込み元の単位記憶領域に書き戻すことを特徴とする付記3記載のディスクアレイ装置。
(付記5) さらに、
前記読み込み手段は、前記更新データの前記証明用時系列情報の値が、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報より大きい場合、前記更新データが属するパリティグループ内の他のデータを、前記他のデータの書き込み時に生成された前記証明用時系列情報付きで前記複数のストレージ装置から読み込み、
前記修復手段は、前記他のデータと前記更新データとを用いて前記更新後パリティデータを修復し、
前記時系列情報付与手段は、前記更新後パリティデータが修復された場合、前記更新データが属するパリティグループ内の複数のデータそれぞれの前記証明用時系列情報と同じ値の前記比較用時系列情報を、修復された前記更新後パリティデータに付与し、
前記書き込み手段は、前記更新後パリティデータが修復された場合、複数の前記比較用時系列情報が付与された修復後の前記更新後パリティデータを、前記複数のストレージ装置内の読み込み元の単位記憶領域に書き戻すことを特徴とする付記3記載のディスクアレイ装置。
(付記6) 前記時系列情報生成手段は、前記時系列情報として、前記書き込み要求の入力時刻を示すタイムスタンプを生成することを特徴とする付記3記載のディスクアレイ装置。
(付記7) 前記パリティデータ生成手段は、前記書き込み要求が1以上のパリティグループ内のすべてのデータの書き込みを指示するストライプ書き込み要求の場合、前記書き込み要求で指定された複数の更新データに基づいて前記更新後パリティデータを生成し、
前記時系列情報付与手段は、前記書き込み要求が前記ストライプ書き込み要求の場合、前記複数の更新データそれぞれに対して同じ値の前記証明用時系列情報を付与し、生成された前記更新後パリティデータに対して、前記更新後パリティデータと同じパリティグループ内の前記複数の更新データそれぞれに対応する前記比較用時系列情報を付与することを特徴とする付記1記載のディスクアレイ装置。
(付記8) さらに、
前記書き込み要求が1つの単位記憶領域への書き込みを指示するブロック書き込み要求の場合、前記書き込み要求に応じて、前記更新データを書き込むべき単位記憶領域に格納された前記既存データと、前記更新データと同じパリティグループに属する既存パリティデータとを、前記複数のストレージ装置から読み込む読み込み手段を有し、
前記パリティデータ生成手段は、前記既存データ、前記更新データ、および前記既存パリティデータを用いて、前記更新後パリティデータを生成することを特徴とする付記1記載のディスクアレイ装置。
(付記9) 前記時系列情報生成手段は、前記時系列情報として、前記既存データに付与されていた前記証明用時系列情報の値をカウントアップした値を生成することを特徴とする付記8記載のディスクアレイ装置。
(付記10) 前記時系列情報生成手段は、前記既存データに付与されていた前記証明用時系列情報の値が所定の最大値の場合、所定の初期値を前記時系列情報とすることを特徴とする付記9記載のディスクアレイ装置。
(付記11) 前記読み込み手段は、前記更新データを指定した読み込み要求に応じて、前記証明用時系列情報付きの前記更新データと、前記更新データに関連付けられた前記比較用時系列情報付きの前記更新後パリティデータとを、前記複数のストレージ装置から読み込み、
さらに、
前記更新データの前記証明用時系列情報と、前記更新データに関連付けられた前記比較用時系列情報とを比較する比較手段と、
前記比較手段による比較の結果、前記更新データの前記証明用時系列情報の値が、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報のカウントアップ前の値である場合、前記更新データが属するパリティグループ内の他のデータを前記複数のストレージ装置から読み込み、前記他のデータと前記更新後パリティデータとを用いて前記更新データを修復する修復手段と、
前記証明用時系列情報と前記比較用時系列情報とが一致した場合、前記複数のストレージ装置から読み込んだ前記更新データを出力し、前記更新データの修復が行われた場合、修復後の前記更新データを出力するデータ出力手段とを有することを特徴とする付記10記載のディスクアレイ装置。
(付記12) 前記読み込み手段は、前記読み込み要求に応じて読み込んだ前記更新データの前記証明用時系列情報の値が、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報のカウントアップ後の値の場合、前記更新データが属するパリティグループ内の他のデータを前記証明用時系列情報付きで前記複数のストレージ装置から読み込み、
前記修復手段は、前記他のデータと前記更新データとを用いて前記更新後パリティデータを修復し、
前記時系列情報付与手段は、前記更新後パリティデータが修復された場合、前記更新データと前記他のデータとのそれぞれに付与された複数の前記証明用時系列情報と同じ値の前記比較用時系列情報を、修復された前記更新後パリティデータに付与し、
前記書き込み手段は、前記更新後パリティデータが修復された場合、複数の前記比較用時系列情報が付与された修復後の前記更新後パリティデータを、前記複数のストレージ装置内の読み込み元の単位記憶領域に書き戻すことを特徴とする付記11記載のディスクアレイ装置。
(付記13) 前記時系列情報生成手段は、
前記書き込み要求が前記ブロック書き込み要求の場合、前記時系列情報として、前記書き込み要求の入力順が後である程大きな値の第1の時系列情報と、前記既存データに付与されていた前記証明用時系列情報の値をカウントアップした値の第2の時系列情報とを生成し、
前記書き込み要求が1以上のパリティグループ内のすべてのデータの書き込みを指示するストライプ書き込み要求の場合、前記時系列情報として前記第1の時系列情報と、所定の初期値の前記第2の時系列情報とを生成し、
前記時系列情報付与手段は、
前記書き込み要求が前記ブロック書き込み要求の場合、前記第1の時系列情報と前記第2の時系列情報とを含む前記証明用時系列情報と、前記第2の時系列情報が比較対象であることを示す第1のフラグとを前記更新データに付与すると共に、前記第2の時系列情報を含む前記比較用時系列情報と前記第1のフラグとを前記更新データに関連付けて前記更新後パリティデータに付与し、
前記書き込み要求が前記ストライプ書き込み要求の場合、前記第1の時系列情報が比較対象であることを示す第2のフラグ、前記第1の時系列情報、および前記第2の時系列情報を含む前記証明用時系列情報を前記更新データに付与すると共に、前記更新データに関連付けられた前記第2のフラグと前記第2の時系列情報との組み、および前記第1の時系列情報を含む前記証明用時系列情報を前記更新後パリティデータに付与することを特徴とする付記8記載のディスクアレイ装置。
(付記14) 前記読み込み手段は、前記更新データを指定した読み込み要求に応じて、前記証明用時系列情報付きの前記更新データと、前記更新データに関連付けられた前記比較用時系列情報付きの前記更新後パリティデータとを、前記複数のストレージ装置から読み込み、
さらに、
前記更新データの前記証明用時系列情報と、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報とが共に前記第1のフラグを有する場合、前記証明用時系列情報と前記比較用時系列情報とのそれぞれの前記第2の時系列情報を比較し、前記更新データの前記証明用時系列情報と、前記更新データに関連付けて前記更新後パリティデータに付与された前記比較用時系列情報とが共に前記第2のフラグを有する場合、前記証明用時系列情報と前記比較用時系列情報とのそれぞれの前記第1の時系列情報を比較する比較手段と、
比較の結果、値が一致した場合、前記更新データを出力するデータ出力手段と、
を有することを特徴とする付記13記載のディスクアレイ装置。
(付記15) 複数のストレージ装置内の記憶領域を複数の単位記憶領域に分割し、複数のデータと前記複数のデータに基づいて生成されるパリティデータとをパリティグループとし、同一パリティグループ内の前記データと前記パリティデータとを前記複数のストレージ装置内の単位記憶領域に分散格納するデータ分散管理方法において、
更新データを含む書き込み要求に応じて、前記更新データが属するパリティグループの更新後パリティデータを生成し、
前記更新データを書き込むべき単位記憶領域に格納されている既存データと、前記更新データとの間の書き込み時の前後関係を示す時系列情報を生成し、
前記書き込み要求に応じて生成された前記時系列情報を証明用時系列情報として前記更新データに付与すると共に、前記証明用時系列情報と同じ値の比較用時系列情報を前記更新データに関連付けて前記更新後パリティデータに付与し、
前記証明用時系列情報が付与された前記更新データと前記比較用時系列情報が付与された前記更新後パリティデータとを、前記複数のストレージ装置に分散して書き込む、
ことを特徴とするデータ分散管理方法。
(付記16) 複数のストレージ装置内の記憶領域を複数の単位記憶領域に分割し、複数のデータと前記複数のデータに基づいて生成されるパリティデータとをパリティグループとし、同一パリティグループ内の前記データと前記パリティデータとを前記複数のストレージ装置内の単位記憶領域に分散格納するデータ分散管理を、コンピュータに実行させるためのデータ分散管理プログラムにおいて、
前記コンピュータに、
更新データを含む書き込み要求に応じて、前記更新データが属するパリティグループの更新後パリティデータを生成し、
前記更新データを書き込むべき単位記憶領域に格納されている既存データと、前記更新データとの間の書き込み時の前後関係を示す時系列情報を生成し、
前記書き込み要求に応じて生成された前記時系列情報を証明用時系列情報として前記更新データに付与すると共に、前記証明用時系列情報と同じ値の比較用時系列情報を前記更新データに関連付けて前記更新後パリティデータに付与し、
前記証明用時系列情報が付与された前記更新データと前記比較用時系列情報が付与された前記更新後パリティデータとを、前記複数のストレージ装置に分散して書き込む、
処理を実行させることを特徴とするデータ分散管理プログラム。