以下、実施の形態につき図面を参照して説明する。
図1は一つの実施形態に係るストレージシステムの典型的なハードウェア構成を示すブロック図である。ストレージシステムは、ストレージ装置10と、ホスト計算機(ホスト)20とを含む。ストレージ装置10(より、詳細には、ストレージ装置10のストレージコントローラ12)は、ファイバチャネル(FC)、スモールコンピュータシステムインタフェース(SCSI)、シリアルアタッチドSCSI(SAS)、インターネットSCSI(iSCSI)、イーサネット(登録商標)、或いはシリアルATアタッチメント(SATA)のような、ホストインタフェースバス30を介してホスト20と接続されている。なお、ストレージ装置10が、ストレージエリアネットワーク(SAN)、インターネット或いはイントラネットのようなネットワークを介してホスト20と接続されていても良い。
ストレージ装置10は、ストレージ11と、ストレージコントローラ12とを含む。ストレージ11は、FC、SCSI、SAS、iSCSI、イーサネット、或いはSATAのようなストレージインタフェースバス13を介してストレージコントローラ12と接続されている。
ストレージ11は、例えばハードディスクドライブ(HDD)である。しかし、ストレージ11が、複数のHDDから構成されるRAID(Redundant Arrays of Inexpensive Disks、またはRedundant Arrays of Independent Disks)のようなディスクアレイであっても構わない。またストレージ11が、HDDとの互換性を有するソリッドステートドライブ(SSD)、或いはフラッシュアレイのようなフラッシュストレージであっても構わない。SSD及びフラッシュストレージは、一般に、複数のフラッシュメモリを用いて構成される、
ストレージコントローラ12は、ホスト20からのアクセス要求(より詳細には、ライトコマンドまたはリードコマンド)に応じて、例えばセクタと呼ばれるデータの塊を単位にストレージ11にアクセスする。ストレージコントローラ12はまた、ストレージ11にデータをライトする場合、セクタ単位にエラー訂正コード(ECC)を生成する。ECCは、当該ECCの生成に用いられたデータのエラーの検出及び訂正に用いられる。そしてストレージコントローラ12は、セクタ単位に、データとECCを含む付加情報との組をストレージ11にライトする。付加情報が、ECCに加えて、メタデータ、或いはデータ保護情報を含んでいても構わない。
ホスト20は、ストレージインタフェース(SIF)コントローラ21と、メモリ22と、HDD23と、CPU24とを含む。SIFコントローラ21は、CPU24とストレージ装置10のストレージコントローラ12との間のデータ転送を制御する。SIFコントローラ21は、CPU24からのアクセス要求をストレージコントローラ12に送信し、当該アクセス要求に対するストレージコントローラ12からの応答を受信する。SIFコントローラ21は、ストレージコントローラ12からの応答を受信すると、当該応答を、CPU24に伝達する。
メモリ22は、ダイナミックRAM(DRAM)のような書き換えが可能な揮発性メモリである。メモリ22の一部の記憶領域は、HDD23からロードされるオペレーティングシステム(OS)及び種々のプログラムを格納するのに用いられる。メモリ22の他の一部の記憶領域は、CPU24のためのワーク領域として用いられる。
HDD23には、OS及び複数のプログラムが格納されている。複数のプログラムは、アプリケーションプログラム(以下、アプリケーションと称する)及びユーティリティプログラムを含む。CPU24は、ホスト機器20が起動されたときに、ROMまたはフラッシュROM(FROM)のような不揮発性メモリに格納されているIPLを実行することにより、HDD23に格納されているOSをメモリ22にロードする。またCPU24は、HDD23に格納されているプログラムを適宜メモリ22にロードする。
CPU24は、メモリ22にロードされたプログラムに従い、アクセス要求部203、ECC取得部204、重複排除コントローラ205、及びアクセス部206(図2)として機能する。本実施形態では、CPU24は、アプリケーションに従い、アクセス要求部203として機能し、特定のユーティリティプログラムに従い、ECC取得部204及び重複排除コントローラ205として機能し、OSに従い、アクセス部206として機能する。
図2は、図1に示されるホスト20の典型的な機能構成を主として示すブロック図である。ホスト20のメモリ22の一部の記憶領域は、重複管理テーブル201及びアドレステーブル202を格納するのに用いられる。ホスト20は、重複管理テーブル201及びアドレステーブル202に加えて、前述のアクセス要求部203、ECC取得部204、重複排除コントローラ205、及びアクセス部206を含む。
アクセス要求部203は、例えばアプリケーションからの要求に応じて、アクセス部206に対してストレージ装置10へのアクセスを要求する。本実施形態では、アクセス要求部203からのアクセス要求に応じて、ストレージ装置10へのアクセスが、ブロックと呼ばれる固定長または可変長のデータの塊を単位に実行されるものとする。ブロックのデータは、例えば、チャンクと呼ばれるデータの塊に分割される。チャンクのデータは、ストレージ装置10においては、例えば、複数のセクタに分散して格納される。
図3は、本実施形態におけるチャンクのデータ構造の例を示す。図3の例では、チャンク31はn個のセクタ310_1乃至310_nに分割される。即ちチャンク31はn個のセクタ310_1乃至310_nから構成される。本実施形態では、説明の簡略化のために、チャンク31のデータのサイズ(チャンクサイズ)は4KB(キロバイト)の固定長であるものとするが、可変長であっても構わない。
チャンク31のデータは、セクタ310_1乃至310_nに均等に分散されて格納される。本実施形態において、セクタ310_1乃至310_nのサイズ、つまりセクタ310_1乃至310_nのデータ311_1乃至311_nのサイズ(セクタサイズ)は、512Bの固定長である。したがって、チャンク31のチャンクサイズが本実施形態のように4KBである場合、nは8である。これに対してチャンクサイズが可変長である場合、nは必ずしも8に一致せず、例えば1の場合もあり得る。
セクタ310_1乃至310_n(より詳細には、セクタ310_1乃至310_nのデータ311_1乃至311_n)には、ECC312_1乃至312_nを含む付加情報が付加されている。ECC312_1乃至312_nは、データ311_1乃至311_nに基づいてストレージコントローラ12によって生成される。図3では、ECC312_1乃至312_n以外の付加情報は省略されている。
データ311_1乃至311_nのサイズ(つまり、セクタサイズ)が512Bの場合、ECC312_1乃至312_nのサイズ(ECCサイズ)は一般に数十ビット程度である。しかし、ECCサイズが、必ずしも数十ビット程度でなくても構わない。
図2においてECC取得部204は、ストレージ装置10に格納されたチャンクを単位に、ECCの群を取得する。ECC取得部204は、取得されたECCの群に基づいて、それぞれのECCの値を重複管理テーブル201に格納する。
図4は、図2に示される重複管理テーブル201のデータ構造の例を示す。重複管理テーブル201の各エントリは、重複管理レコードを格納するのに用いられる。重複管理レコードは、物理アドレス、ECC値及び参照カウントを含む。重複管理テーブル201の主キーは物理アドレスである。
重複管理レコード中の物理アドレスは、当該重複管理レコード中のECC値に対応するECC群を含むセクタ群から構成されるチャンクが格納されている、ストレージ装置10(ストレージ11)の記憶領域(物理記憶領域)を示す。重複管理レコード中の参照カウントは、当該重複管理レコード中の物理アドレスが、割り当て(対応付け)られている論理アドレスの数を示す。つまり、重複管理レコード中の参照カウントは、当該重複管理レコード中の物理アドレスを論理的に参照する論理アドレスの数を示す。論理アドレスと物理アドレスとの対応は、アドレステーブル202によって示される。また、重複管理レコード中の参照カウントは、当該重複管理レコード中の物理アドレスで示されるストレージ装置10の記憶領域に格納されたチャンクのデータと同一内容のデータを含むチャンクの数(つまり、重複数または重複カウント)をも示す。
図4に示される重複管理テーブル201において、例えば、物理アドレスADR2を含む重複管理レコードのECC値及び参照カウントは、それぞれECC2及び3である。この重複管理レコード中の参照カウント=3は、物理アドレスADR2(で指定される記憶領域)に格納されたチャンクのデータと同一内容のデータを含むチャンクが合計3つ存在することを示す。
図5は、図2に示されるアドレステーブル202のデータ構造例を示す。アドレステーブル202の各エントリは、アドレスレコードを格納するのに用いられる。アドレスレコードは、論理アドレス、及び当該論理アドレスに割り当て(対応付け)られる物理アドレスを含む。本実施形態において、論理アドレスは、ストレージ装置10の記憶領域(物理記憶領域)が割り当てられる論理ボリューム(論理ディスク)内の記憶領域(論理記憶領域)のアドレス、例えば論理ブロックアドレス(LBA)を示す。
図5に示されるアドレステーブル202は、論理アドレスLBA1乃至LBA6を含むアドレスレコードの群を有する。論理アドレスLBA1乃至LBA6で指定される論理ボリューム内の記憶領域には、チャンクCHK1乃至CHK6が論理的に格納されているものとする。つまりLBA1乃至LBA6は、チャンクCHK1乃至CHK6の論理アドレスである。
図5の例では、論理アドレスLBA1,LBA4及びLBA5には、1つの物理アドレスADR2が共通に割り当てられている。このことは、チャンクCHK1,CHK4及びCHK5のデータは同一であり、ストレージ装置10内では、この同一のデータが、重複排除により、物理アドレスADR2で指定されるストレージ装置10内の記憶領域にまとめて格納されていることを示す。ADR2は、チャンクCHK1,CHK4及びCHK5の物理アドレスである。
図2において、重複排除コントローラ205は、重複管理テーブル201を参照することにより同一のECC値を含む重複管理レコードを探索するための重複チャンク探索処理を実行する。重複排除コントローラ205は、同一のECC値を含む複数の重複管理レコードを探索できた場合、同一のECC値に対応するECC群を含む複数のチャンクを探索できたと判定する。
重複排除コントローラ205は、探索された複数のチャンクのデータを比較することにより、当該探索された複数のチャンクのデータが同一であるかを判定する。この判定を、重複チャンク判定(または重複判定)と呼ぶ。重複排除コントローラ205は、探索された複数のチャンクのデータが同一である場合、当該探索された複数のチャンクのデータがストレージ装置10において重複して存在すると判定する。この場合、重複排除コントローラ205は、この重複を排除するために、探索された複数のチャンクをストレージ装置10において一つにまとめるための重複チャンクマージ処理を実行する。
重複チャンクマージ処理において重複排除コントローラ205は、例えば、第1及び第2のチャンクのデータが同一であるならば、第2のチャンクに対応する重複管理レコード中の参照カウント(第2の参照カウント)を、第1のチャンクに対応する重複管理レコード中の参照カウント(第1の参照カウント)に引き継ぐ。つまり、重複排除コントローラ205は、第1の参照カウントを、第2の参照カウントだけインクリメントし、且つ第2の参照カウントを0に設定する。また、重複排除コントローラ205は、第1のチャンクの第1の物理アドレスが、第1のチャンクの第1の論理アドレスだけでなく、第2のチャンクの第2の論理アドレスにも割り当てられるように、アドレステーブル202(より詳細には、第2の論理アドレスを含むアドレスレコード中の物理アドレス)を更新する、
アクセス部206は、アクセス要求部203からのアクセス要求に応じて、例えば要求されたファイルに、ブロックを単位にアクセスする。このブロック単位のアクセスは、各ブロックを構成する複数のチャンクへのアクセスを含む。アクセス部206は、例えば、チャンクCHKiにアクセスする場合、チャンクCHKiの論理アドレスLBAiに基づいてアドレステーブル202を参照する。そしてアクセス部206は、論理アドレスLBAiに対応付けられた物理アドレスADRj(つまりチャンクCHKiの物理アドレスADRj)を、アクセスされるべき物理記憶領域を示す物理アドレスとして取得して、当該取得された物理アドレスADRjに基づいてストレージ装置10にアクセスする。
次に、本実施形態においてECC取得部204によってチャンク単位に実行されるECC設定処理について、図6を参照して説明する。図6は、ECC設定処理の典型的な手順を示すフローチャートである。本実施形態においてECC設定処理は、スケジューリングされた時刻が到来した場合(例えば定期的)に、或いはユーザ指定のタイミングで実行される。
ECC取得部204は、チャンク単位のECC設定処理のために、アドレステーブル202を先頭エントリから順に参照する。この例では、ECC設定処理の先頭で、ECC取得部204が、アドレステーブル202内のi番目のエントリを参照したものとする(ステップS101)。このi番目のエントリには、論理アドレスLBAiと物理アドレスADRjとを含むアドレスレコードが格納されているものとする。この場合、ステップS101においてECC取得部204は、参照されたi番目のエントリから論理アドレスLBAiに対応付けられた物理アドレスADRjを取得する。論理アドレスLBAiで指定される論理ボリューム内の記憶領域には、チャンクCHKiのデータが論理(仮想)的に格納されており、物理アドレスADRjで指定されるストレージ装置10(ストレージ11)内の記憶領域には、チャンクCHKiのデータが物理的(実際)に格納されているものとする。
次にECC取得部204は、取得された物理アドレスADRjを含む重複管理レコード(ターゲットの重複管理レコード)を、重複管理テーブル201から探索する(ステップS102)。そしてECC取得部204は、ターゲットの重複管理レコードを探索できたかを判定する(ステップS103)。
もし、ターゲットの重複管理レコードを探索できなかったならば(ステップS103のNo)、ECC取得部204は、チャンクCHKiに関するECC設定処理を終了する。この場合、ECC取得部204は、次のチャンクに関するECC設定処理を開始する。
これに対し、ターゲットの重複管理レコードを探索できたならば(ステップS103のYes)、ECC取得部204は、探索された重複管理レコード中のECC値を参照する(ステップS104)。そしてECC取得部204は、参照されたECC値が無効であるかを判定する(ステップS105)。本実施形態では、この判定は、参照されたECC値がクリアされているかに基づいて実行される。
もし、参照されたECC値が無効でないならば(ステップS105のNo)、つまり、参照されたECC値が有効であるならば、ECC取得部204は、チャンクCHKiに関するECC値は既に取得されて設定されているとして、ECC設定処理を終了する。
これに対して、参照されたECC値が無効であるならば(ステップS105のYes)、ECC取得部204は、チャンクCHKiに関するECC値を取得するためのECC取得処理(ステップS106)を実行する。ECC取得部204は、このECC取得処理(ステップS106)において、後述のように、チャンクCHKiを構成する全セクタ中のECC(例えば、n個のECC)を取得する。
次にECC取得部204は、取得されたn個のECCを例えば結合し(ステップS107)、結合されたECC(つまり、ECC列)をECCjとして設定する(ステップS108)。そしてECC取得部204は、探索された重複管理レコード中のECC値(無効なECC値)を、ECCj(有効なECC値)に更新する(ステップS109)。するとECC取得部204は、チャンクCHKiに関するECC設定処理を終了する。
次に、ECC取得処理(ステップS106)について説明する。ECC取得処理は、チャンクCHKiを構成する全セクタ中のECCを取得するための処理手順を含む。あるセクタ中のECCを取得するには、以下の2つの方法のいずれかが適用可能である。1つは、セクタ中のデータと付加情報をまとめてリードし、しかる後に付加情報中のECCのみを取り出す方法(第1の方法)である。もう1つは、ストレージ装置10のストレージコントローラ12が有する、セクタ中のECCのみをリードする機能を利用する方法(第2の方法)である。このECCのみのリードをストレージコントローラ12に要求するためのコマンドは、ECCリードコマンドと呼ばれる。
ストレージ装置10とホスト20との間のインタフェースに例えばSCSIが適用される場合、当該インタフェースでは、一般に、セクタ中のデータをリードするためのコマンド(通常のリードコマンド)に加えて、セクタ中のデータと付加情報をまとめてリードするためのリードロングと呼ばれるコマンド(リードロングコマンド)が用意されている。第1の方法は、このリードロングコマンドを利用する。
以下、図6に示されるECC設定処理において実行されるECC取得処理(ステップS106)の詳細について図7を参照して説明する。図7は、ECC取得処理の典型的な手順を示すフローチャートである。本実施形態におけるECC取得処理の特徴は、第1の方法を用いて、チャンクCHKiを構成する全セクタ中のECCを取得することにある。
まずECC取得部204は、図6のステップS101で取得された物理アドレスADRjを、ECC取得処理で用いられるリードアドレスADRrとして設定する(ステップS201)。次にECC取得部204は、リードアドレスADRrを含むリードロングコマンドを、ストレージ装置10のストレージコントローラ12に発行する(ステップS202)。
ECC取得処理の1回目のステップS202において、ECC取得部204は、リードアドレスADRrを含むリードロングコマンドを用いて、当該リードアドレスADRrで指定されるストレージ装置10のストレージ11内の物理位置から、チャンクCHKiに対応するn個のセクタ群の先頭セクタのデータ及び付加情報をまとめてリードする。そしてECC取得部204は、リードされたデータ及び付加情報をメモリ22に格納する(ステップS203)。
次にECC取得部204は、チャンクCHKi内の全セクタのリードが完了したかを判定する(ステップS204)。もし、ステップS204の判定がNoであるならば、ECC取得部204は、リードアドレスADRrがチャンクCHKiの次のセクタの物理位置を指し示すように、当該リードアドレスADRrを更新(例えばインクリメント)する(ステップS205)。するとECC取得部204は、ステップS202に戻り、インクリメントされたリードアドレスADRrを含むリードロングコマンドを用いて、チャンクCHKiの次のセクタのデータ及び付加情報をまとめてリードする。そしてECC取得部204は、リードされたデータ及び付加情報をメモリ22に格納する(ステップS203)。
以下同様に、ECC取得部204は、S205及びS202乃至S204を繰り返す。これにより、チャンクCHKi内の全セクタのリードが完了したものとする(ステップS204のYes)。このときメモリ22には、チャンクCHKiの全セクタ中のデータ及び付加情報が格納されている。そこでECC取得部204は、チャンクCHKiの全セクタ中の付加情報からECC群を取得する(ステップS206)。これによりECC取得部204は、チャンクCHKiに関するECC取得処理(ステップS106)を終了する。
<ECC取得処理の変形例>
次に、本実施形態の変形例におけるECC取得処理について、図8を参照して説明する。図8は、本実施形態の変形例におけるECC取得処理の典型的な手順を示すフローチャートである。本変形例におけるECC取得処理の特徴は、第2の方法を用いて、チャンクCHKiを構成する全セクタ中のECCを取得することにある。
まずECC取得部204は、図6のステップS101で取得された物理アドレスADRjを、ECC取得処理で用いられるリードアドレスADRrとして設定する(ステップS211)。次にECC取得部204は、リードアドレスADRrを含むECCリードコマンドを、ストレージ装置10のストレージコントローラ12に発行する(ステップS212)。
ECC取得処理の1回目のステップS212において、ECC取得部204は、リードアドレスADRrを含むECCリードコマンドを用いて、当該リードアドレスADRrで指定されるストレージ装置10のストレージ11内の物理位置に格納されているチャンクCHKiの先頭セクタから、ECCのみをリードする。そしてECC取得部204は、リードされたECCをメモリ22に格納する(ステップS213)。
次にECC取得部204は、チャンクCHKi内の全セクタからのECCのリードが完了したかを判定する(ステップS214)。もし、ステップS214の判定がNoであるならば、ECC取得部204は、リードアドレスADRrがチャンクCHKiの次のセクタの物理位置を指し示すように、当該リードアドレスADRrを更新(例えばインクリメント)する(ステップS215)。するとECC取得部204は、ステップS212に戻り、インクリメントされたリードアドレスADRrを含むECCリードコマンドを用いて、チャンクCHKiの次のセクタ中のECCをリードする。そしてECC取得部204は、リードされたECCをメモリ22に格納する(ステップS213)。
以下同様に、ECC取得部204は、S215及びS212乃至S214を繰り返す。これにより、チャンクCHKi内の全セクタからのECCのリードが完了したものとする(ステップS214のYes)。このときメモリ22には、チャンクCHKiの全セクタからリードされたECC群が格納されている。そこでECC取得部204は、メモリ22からこのECC群を取得する(ステップS216)。これによりECC取得部204は、チャンクCHKiに関するECC取得処理(ステップS106)を終了する。
なお、チャンクを単位に、チャンクを構成する全セクタからデータと付加情報をまとめてリードするためのインタフェースを、ストレージコントローラ12に用意しても構わない。同様に、チャンクを単位に、チャンクを構成する全セクタからECCのみを取り出すためのインタフェースを、ストレージコントローラ12に用意しても構わない。
ところで、ストレージ11が例えばRAID(ディスクアレイ)により構成されている場合、ECC取得部204は、リードロングコマンドを用いてECCを含む付加情報を当該ストレージ11から直接リードすることはできない。このような場合に第1の方法(つまり、セクタ中のデータと付加情報をまとめてリードする方法)を適用するためには、ストレージコントローラ12(つまり、RAIDコントローラとして機能するストレージコントローラ12)に、リードロングコマンドと同等のインタフェースを用意すれば良い。一方、第2の方法(つまり、セクタ中のECCのみをリードする方法)を適用するためには、ストレージコントローラ12に、ストレージ11からリードされたデータからECCのみを取り出す機能を用意すれば良い。
上述のECC設定処理においてECC取得部204は、チャンクCHKiの全セクタから取得したECC群を結合し(ステップS107)、当該結合されたECC群を、チャンクCHKiの物理アドレスADRjを含む重複管理レコード中のECC値として用いる(ステップS108及びS109)。しかし、ECC取得部204が、SHA1のようなハッシュ関数を用いて、結合されたECC群のハッシュ値を計算し、このハッシュ値をECC値として用いても構わない。
ハッシュ値をECC値として用いる場合、たとえ可変長のチャンクサイズが適用されたとしても、ECC値のサイズは一定となる。このため重複チャンクの判定(探索)に、チャンクサイズに無関係に同一の方法が適用可能となる。また、セクタサイズに対してECCのサイズが比較的大きい場合も、ECC値のサイズを小さくできるため、重複管理テーブル201の格納に必要な記憶容量を小さくできる。
次に、本実施形態において重複排除コントローラ205によってチャンク単位に実行される重複チャンク探索処理について、図9を参照して説明する。図9は、重複チャンク探索処理の典型的な手順を示すフローチャートである。重複チャンク探索処理は、例えば、ECC設定処理とは非同期に、ホスト20のCPU24の負荷が一定レベルより低い場合、或いはスケジューリングされた時刻が到来した場合に実行されるものとする。しかし重複チャンク探索処理が、全てのチャンクについてECC設定処理が実行された場合に実行されても構わない。
重複排除コントローラ205は、チャンク単位に実行される重複チャンク探索処理のために、アドレステーブル202を先頭エントリから順に参照する。この例では、重複チャンク探索処理の先頭で、重複排除コントローラ205が、アドレステーブル202内のi番目のエントリを参照したものとする(ステップS301)。このi番目のエントリには、チャンクCHKiの論理アドレスLBAiを含むアドレスレコードが格納されている。したがって、ステップS301は、重複排除コントローラ205がチャンクCHKiを選択することと等価である。つまり、ステップS301において重複排除コントローラ205は、重複判定対象としてチャンクCHKiを選択する。
次に重複排除コントローラ205は、アドレステーブル202内のi番目のエントリから、論理アドレスLBAiと対応付けられている物理アドレスADRj、つまり選択されたチャンクCHKiの物理アドレスADRjを取得する(ステップS302)。そして重複排除コントローラ205は、物理アドレスADRjに基づいて、重複管理テーブル201から物理アドレスADRjに対応付けられたECC値ECCjを取得する(ステップS303)。即ち重複排除コントローラ205は、重複管理テーブル201に格納されている、物理アドレスADRjを含む重複管理レコードから、ECC値ECCjを取得する。
次に重複排除コントローラ205は、ECCjと同じECC値を持つ他の重複管理レコード(ターゲットの重複管理レコード)を、重複管理テーブル201から探索する(ステップS304)。そしてECC取得部204は、ターゲットの重複管理レコードを探索できたかを判定する(ステップS305)。
もし、ターゲットの重複管理レコードを探索できなかったならば(ステップS305のNo)、重複排除コントローラ205は、チャンクCHKiのデータと同一内容のデータを持つ他のチャンクは存在しないものと判断して、チャンクCHKiに関する重複チャンク探索処理を終了する。この場合、重複排除コントローラ205は、次のチャンクに関する重複チャンク探索処理を開始する。
これに対し、ターゲットの重複管理レコードを探索できたならば(ステップS305のYes)、重複排除コントローラ205は、探索された重複管理レコードに対応するチャンク(以下、チャンクCHKxと称する)は、チャンクCHKiのデータと同一内容のデータを持つ可能性があると判断する。そこで重複排除コントローラ205は、データ重複の有無を確認するために、ステップS306乃至S309を次のように実行する。
まず重複排除コントローラ205は、探索された重複管理レコード中の物理アドレスADRyを取得する(ステップS306)。そして重複排除コントローラ205は、物理アドレスADRj及びADRyに基づいて、チャンクCHKi及びCHKxのデータを、ストレージ装置10からリードする(ステップS307)。即ち重複排除コントローラ205は、物理アドレスADRjを含むリードコマンドをストレージコントローラ12に発行することにより、当該物理アドレスADRjで指定されるストレージ11の記憶領域に格納されているチャンクCHKiのデータをリードする。同様に重複排除コントローラ205は、物理アドレスADRyを含むリードコマンドをストレージコントローラ12に発行することにより、当該物理アドレスADRyで指定されるストレージ11の記憶領域に格納されているチャンクCHKxのデータをリードする。
次に重複排除コントローラ205は、リードされたチャンクCHKiのデータとリードされたチャンクCHKxのデータとを比較して(ステップS308)、当該両データが一致するかを判定する(ステップS309)。もし、両データが一致しないならば(ステップS309のNo)、重複排除コントローラ205は、チャンクCHKx及びCHKi間でデータが重複していないと判断する。この場合、重複排除コントローラ205はステップS304に戻って、ECCjと同じECC値を持つ新たな重複管理レコードを、重複管理テーブル201から探索する。
これに対し、両データが一致するならば(ステップS309のYes)、チャンクCHKx及びCHKi間でデータが重複していると判断する。この場合、重複排除コントローラ205は、例えばチャンクCHKxを、チャンクCHKiにマージするための重複チャンクマージ処理(ステップS310)を実行する。そして重複排除コントローラ205は、ステップS304に戻って、ECCjと同じECC値を持つ新たな重複管理レコードを、重複管理テーブル201から探索する。
重複排除コントローラ205は、このステップS304から始まる処理を、ECCjと同じECC値を持つ新たな重複管理レコードが探索できなくなるまで(ステップS305のNo)、繰り返す。以下の説明では、チャンクCHKx及びチャンクCHKiを、それぞれ、マージ元(またはマージ元チャンク)及びマージ先(またはマージ先チャンク)と称する。なお、マージ元とマージ先は逆であっても構わない。
次に、図9に示される重複チャンク探索処理において実行される重複チャンクマージ処理(ステップS310)の詳細について図10を参照して説明する。図10は、本実施形態における重複チャンクマージ処理の典型的な手順を示すフローチャートである。
まず重複排除コントローラ205は、アドレステーブル202において、マージ元の物理アドレスADRyをマージ先の物理アドレスADRjに変更する(ステップS401)。次に重複排除コントローラ205は、重複管理テーブル201に格納されている、マージ先の物理アドレスADRjを含む重複管理レコード中の参照カウントを、マージ元の物理アドレスADRyを含む重複管理レコード中の参照カウントの値だけインクリメントする(ステップS402)。つまり重複排除コントローラ205は、マージ元の物理アドレスADRyを含む重複管理レコード中の参照カウントの値を、マージ先の物理アドレスADRjを含む重複管理レコード中の参照カウントに引き継がせる。
次に重複排除コントローラ205は、重複管理テーブル201に格納されている、マージ元の物理アドレスADRyを含む重複管理レコード中の参照カウントを0に設定する(ステップS403)。また、ステップS403において重複排除コントローラ205は、マージ元の物理アドレスADRyを含む重複管理レコード中のECC値を、例えばクリアすることにより無効化する。
次に重複排除コントローラ205は、マージ元の物理アドレスADRyで指定される、ストレージ装置10内のマージ元のチャンクCHKxのデータ、つまりマージ元チャンクCHKxを構成するn個のセクタのデータを削除する(ステップS404)。これにより、チャンクCHKxは、チャンクCHKiにマージされる。
なお本実施形態では、値が0の参照カウントを含む重複管理レコード中の物理アドレスで指定される記憶領域は、空き記憶領域として管理される。したがって、マージ元の物理アドレスADRyで指定される記憶領域も空き記憶領域として管理される。このため重複排除コントローラ205は、必ずしもマージ元のチャンクCHKxのデータを削除する必要はない。
次に、上述の重複チャンクマージ処理を含む重複チャンク探索処理の具体例について、図11及び図12を参照して説明する。図11及び図12は重複チャンク探索処理に起因する、それぞれ重複管理テーブル201及びアドレステーブル202の状態の変化の例を示す。
まず、図11及び図12において、矢印A1及びA2の基端側には、重複チャンク探索処理が開始される前の重複管理テーブル201及びアドレステーブル202の状態が示されている。この重複管理テーブル201及びアドレステーブル202の状態は、図4及び図5に示されるそれらの状態と同一である。
この状態では、重複管理テーブル201において、物理アドレスADR1を含む重複管理レコード中のECC値ECC1は、物理アドレスADR3を含む重複管理レコード中のECC値ECC3に等しいものとする。また、アドレステーブル202において、物理アドレスADR1は論理アドレスLBA3と対応付けられており、物理アドレスADR3は論理アドレスLBA2及びLBA6と対応付けられている。つまり、物理アドレスADR3は、2つの論理アドレスLBA2及びLBA6(チャンクCHK2及びCHK6)から参照されており、したがって物理アドレスADR3を含む重複管理レコード中の参照カウントは2である。
以上のような重複管理テーブル201及びアドレステーブル202の状態で、アドレステーブル202が1回目の重複チャンク探索処理を開始して、チャンクCHK1を選択したものとする(ステップS301)。チャンクCHK1の論理アドレスLBA1は、アドレステーブル202によって物理アドレスADR2に対応付けられている。
重複排除コントローラ205は、重複管理テーブル201から、チャンクCHK1の物理アドレスADR2に対応付けられたECC値ECC2を取得する(ステップS302及びS303)。そして重複排除コントローラ205は、ECC2と同じECC値を持つ他の重複管理レコードを、重複管理テーブル201から探索する(ステップS304)。
本実施形態では、ECC2と同じECC値を持つ他の重複管理レコードは存在しない(ステップS305のNo)。この場合、重複排除コントローラ205は、2回目の重複チャンク探索処理を開始して、チャンクCHK2を選択する(ステップS301)。チャンクCHK2の論理アドレスLBA2は、アドレステーブル202によって物理アドレスADR3に対応付けられている。
重複排除コントローラ205は、重複管理テーブル201から、チャンクCHK2の物理アドレスADR3に対応付けられたECC値ECC3を取得する(ステップS302及びS303)。そして重複排除コントローラ205は、ECC3と同じECC値を持つ他の重複管理レコードを、重複管理テーブル201から探索する(ステップS304)。
本実施形態では、ECC3と同じECC値はECC1であり、したがってECC3と同じECC値を持つ他の重複管理レコードは存在する(ステップS305のYes)。この重複管理レコード(つまり、ECC1を含む重複管理レコード)は、物理アドレスとしてADR1を含む。ADR1は、アドレステーブル202によって論理アドレスLBA3に対応付けられており、チャンクCHK3の物理アドレスを示す。この場合、重複排除コントローラ205は、チャンクCHK2の物理アドレスADR3及びチャンクCHK3の物理アドレスADR1に基づいて、チャンクCHK2及びCHK3のデータをストレージ装置10からリードする(ステップS306及びS307)。そして重複排除コントローラ205は、チャンクCHK2及びCHK3のデータを比較する(ステップS308)。
本実施形態では、チャンクCHK2及びCHK3のデータは等しいものとする(ステップS309のYes)。この場合、重複排除コントローラ205は、チャンクCHK3をチャンクCHK2にマージするための重複チャンクマージ処理(ステップS310)を実行する。即ち重複排除コントローラ205は、アドレステーブル202においてチャンクCHK3の論理アドレスLBA3に対応付けられた物理アドレスADR1(つまりチャンクCHK3の物理アドレスADR1)を、図12において矢印A2で示されるように、チャンクCHK2の物理アドレスADR3に変更する(ステップS401)。
また重複排除コントローラ205は、重複管理テーブル201において物理アドレスADR3に対応付けられた参照カウント(=2)を、重複管理テーブル201において物理アドレスADR1に対応付けられた参照カウント(=1)だけインクリメントする(ステップS402)。これにより物理アドレスADR3に対応付けられた参照カウントは、図11において矢印A1で示されるように、2から3にインクリメントされる。更に重複排除コントローラ205は、図11において矢印A1で示されるように、重複管理テーブル201において物理アドレスADR1に対応付けられた参照カウントを0に設定し、且つ物理アドレスADR1に対応付けられたECC値を無効化(クリア)する(ステップS402)。
上述のように、本実施形態において重複排除コントローラ205は、重複管理レコード中のECC値、つまりストレージ装置10に既に格納されている各チャンクを構成する全セクタ中のECCの列を、重複チャンクの探索(判定)に利用する。このように本実施形態においては、セクタのデータのエラー検出及びエラー訂正のために当該セクタに付されるECCを、データの重複を検出するための指標として利用する。これに対して、従来技術(第1の重複排除技術)では、各チャンクのデータをストレージ装置にライトする際に、当該データのハッシュ値が計算される。そして、このハッシュ値が重複管理レコード中に設定されて、重複チャンクの探索に利用される。また、別の従来技術(第2の重複排除技術)では、ストレージ装置に格納されている全データがリードされて比較される。
本実施形態においては、ECCの値をハッシュ値の代替として用い、ECCの値が等しい場合にのみデータを比較することで、チャンクのデータの重複を検出する。したがって本実施形態によれば、重複チャンクの探索に利用される情報を生成するための計算(ハッシュ計算)、或いは全データの比較を不要にして、チャンクのデータの重複検出に要するコストを低減することができる。
次に、本実施形態においてアクセス部206によって実行されるライト処理について、チャンクCHKsに新たなデータをライトする場合を例に、図13を参照して説明する。図13は、ライト処理の典型的な手順を示すフローチャートである。本実施形態においてライト処理は、アクセス要求部203からのライトアクセス要求に応じて実行される。
まずアクセス部206が、アクセス要求部203からのライトアクセス要求に応じて、チャンクCHKsへのデータライトを開始するものとする。この場合、アクセス部206は、チャンクCHKsの論理アドレスLBAsに対応付けられた有効な物理アドレスADRtを含むアドレスレコード(ターゲットのアドレスレコード)を、アドレステーブル202から探索する(ステップS501)。そしてアクセス部206は、ターゲットのアドレスレコードを探索できたかを判定する(ステップS502)。
もし、ターゲットのアドレスレコードを探索できたならば(ステップS502のYes)、アクセス部206は、探索されたアドレスレコードから、物理アドレスADRtを取得する(ステップS503)。そしてアクセス部206は、取得された物理アドレスADRtに基づいて重複管理テーブル201を探索することにより、当該取得された物理アドレスADRtを含む重複管理レコード中の参照カウントを取得する(ステップS504)。次にアクセス部206は、取得された参照カウントが1であるかを判定する(ステップS505)。
もし、取得された参照カウントが1でないならば(ステップS505のNo)、アクセス部206は、現在のチャンクCHKsのデータは他の1つ以上のチャンクのデータと重複しており、したがって新たなデータを、現在のチャンクCHKsのデータ(より詳細には、重複データ)に上書きすることはできないと判断する。つまりアクセス部206は、新たなデータを、現在のチャンクCHKsのデータがライトされている記憶領域(より詳細には、物理アドレスADRtによって指定される記憶領域)とは別の記憶領域にライトする必要があると判断する。明らかなように、今回のライト処理によりチャンクCHKsにライトされる新たなデータは、上述の他の1つ以上のチャンクのデータと重複しないものである。そこでアクセス部206は、取得された参照カウント(より詳細には、取得された物理アドレスADRtを含む重複管理レコード中の参照カウント)を1デクリメントして(ステップS506)、ステップS507に進む。一方、ターゲットのアドレスレコードを探索できなかったならば(ステップS502のNo)、アクセス部206は、ステップS503乃至S506をスキップしてステップS507に進む。
ステップS507においてアクセス部206は、新たなデータ(つまり、アクセス要求部203によって要求されたライトデータ)がチャンクCHKsのデータとしてライトされるべき、ストレージ装置10(ストレージ11)内の空き記憶領域(つまり、空きチャンク領域)を確保する(ステップS507)。アクセス部206は、この空きチャンク領域を次のように確保する。まずアクセス部206は、重複管理テーブル201から、値が0の参照カウントを含む重複管理レコードを探索する。そしてアクセス部206は、探索された重複管理レコード中の物理アドレスADRuを、ライト先の空きチャンク領域の物理アドレスとして取得する。これによりアクセス部206は、ライト先の空きチャンク領域を確保する。アクセス部206は、ステップS507を実行すると、ステップS508に進む。
一方、取得された参照カウントが1であるならば(ステップS505のYes)、アクセス部206は、現在のチャンクCHKsのデータは他の1つ以上のチャンクのデータと重複しておらず、したがって新たなデータを、現在のチャンクCHKsのデータに上書きすることが可能であると判断する。この場合、新たなデータのライト先は、現在のチャンクCHKsのデータがライトされている記憶領域(チャンク領域)であり、物理アドレスADRtによって指定される。ステップS505の判定がYesの場合、アクセス部206は、ステップS506及びS507をスキップしてステップS508に進む。
ステップS508においてアクセス部206は、ライト先のチャンク領域の物理アドレスを含む重複管理レコード中のECC値をクリアし、且つ当該重複管理レコード中の参照カウントを1に設定する。ここで、ライト先のチャンク領域は、ステップS507を介してステップS508が実行される場合、当該ステップS507で確保された空きチャンク領域であり、当該ライト先のチャンク領域の物理アドレスはADRuである。これに対し、ステップS507をスキップしてステップS508が実行される場合、ライト先のチャンク領域は、現在チャンクCHKsのデータ(旧データ)が格納されているチャンク領域であり、当該ライト先のチャンク領域の物理アドレスはADRtである。
アクセス部206は、ステップS508を実行すると、アクセス要求部203によって要求されたライトデータを、チャンクCHKsの新たなデータとして、ストレージ装置10(ストレージ11)におけるライト先のチャンク領域にストレージコントローラ12によりライトさせる(ステップS509)。これにより、チャンクCHKsの新データは、n個のセクタに分散してライトされる。n個のセクタの各々にはECCを含む付加情報が付されている。ECCは、n個のセクタに分散してライトされるデータに基づいてストレージコントローラ12によって生成される。
なお、図2に示される、ECC取得部204、重複排除コントローラ205及びアクセス部206がストレージコントローラ12に設けられても構わない。この場合、重複管理テーブル201及びアドレステーブル202は、ストレージコントローラ12が有するメモリに格納されれば良い。
前記実施形態では、ストレージ装置10は、単一のホスト20と接続されている。しかし、ストレージ装置10が、ホスト20を含む複数のホストと、ホストインタフェースバス30(またはネットワーク)を介して接続されていても良い。この場合、ホスト20以外のホストからのストレージ装置10へのアクセスに関しても、例えば、ホスト20のみが、重複排除のための前記実施形態と同様の処理を行えば良い。また、ホスト20を含む複数のホストが、それぞれ、図2に示される構成を有し、当該複数のホストが重複排除のための前記実施形態と同様の処理を行っても構わない。この場合、複数のホストがそれぞれ重複管理テーブル201及びアドレステーブル202を有し、当該重複管理テーブル201及びアドレステーブル202を複数のホスト間で同期化しても良い。
以上説明した少なくとも1つの実施形態によれば、データの重複の検出に要するコストを低減することができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。