(57)【特許請求の範囲】
【請求項１】
ストレージ装置と、
前記ストレージ装置へのアクセスを制御するストレージコントローラと、
第１の数のエントリを有する第１のテーブル及び前記第１の数より大きい第２の数のエントリを有する第２のテーブルを含むハッシュテーブルとを具備し、
前記ストレージコントローラは、
ホストコンピュータからの書き込み要求によって指定されたデータを複数のチャンクに分割する分割部と、
前記複数のチャンクの各々のデータに基づいて、前記複数のチャンクの各々の第１の長さを持つハッシュ値を計算するハッシュ生成部と、
前記ストレージ装置にチャンクを書き込むアクセスコントローラと、
前記ストレージ装置に第１のチャンクが書き込まれる場合、前記第１のチャンクの第１のハッシュ値を、前記第１のチャンクと対応付けて前記ハッシュテーブルの前記第１のテーブルに優先的に登録する重複管理部と、
第２のチャンクの第２のハッシュ値が計算された場合、前記第２のハッシュ値に一致する第３のハッシュ値を前記ハッシュテーブルから探索する処理を、前記第１のテーブルからの探索を優先して実行することにより、前記第２のチャンクと同一内容を持つ第３のチャンクが前記ストレージ装置に格納されているかを判定する重複判定部とを具備し、
前記重複管理部は、前記第３のチャンクが前記ストレージ装置に格納されていると判定された場合、前記第２のチャンクが前記ストレージ装置に書き込まれるのを抑止し、
前記第１のテーブルは、前記第１の長さをそれぞれ持つ複数のハッシュ値を当該複数のハッシュ値に基づいて複数のグループに分類して登録するための、前記複数のグループを指し示す複数のグループインデックスにそれぞれ対応付けられた複数の第１のページを備え、
前記複数の第１のページの各々は第３の数のエントリを有し、
前記複数の第１のページの総エントリ数は前記第１の数に等しく、
前記第２のテーブルは、前記複数のグループインデックスにそれぞれ対応付けられた複数の第２のページを備え、
前記複数の第２のページの各々は前記第３の数よりも大きい第４の数のエントリを有し、
前記複数の第２のページの総エントリ数は前記第２の数に等しく、
前記重複判定部は、前記第２のチャンクの前記第２のハッシュ値に基づいて、当該第２のハッシュ値が属するグループを特定し、前記特定されたグループのグループインデックスに対応付けられた前記第１のページを優先的に選択して、前記第３のハッシュ値を前記選択された第１のページから探索し、前記選択された第１のページから前記第３のハッシュ値を探索できず、且つ少なくとも前記選択された第１のページの前記第３の数のエントリが全て使用されている場合に、前記特定されたグループのグループインデックスに対応付けられた前記第２のページを選択して、前記第３のハッシュ値を前記選択された第２のページから探索し、
前記重複管理部は、前記第３のチャンクが前記ストレージ装置に格納されていないと判定された場合に、前記第１のページ及び前記第２のページのうち最後に選択されたページに前記第１のハッシュ値を登録する
ストレージシステム。
【請求項２】
前記ハッシュ生成部は、前記第１の長さを持つハッシュ値に基づいて、前記第１の長さよりも短い第２の長さを持ち、且つ前記グループインデックスとして用いられるハッシュ値を計算し、
前記重複判定部は、前記第３のハッシュ値を前記ハッシュテーブルから探索する場合、前記第２のハッシュ値に基づいて計算される前記第２の長さを持つ第４のハッシュ値を、前記第３のハッシュ値が探索されるべきグループを指定するグループインデックスとして用いる
請求項１記載のストレージシステム。
【請求項３】
前記ストレージコントローラは、揮発性のメモリを更に具備し、
前記ハッシュテーブルは、前記ストレージ装置、または前記ストレージコントローラが有するローカルなストレージ装置に格納されており、
前記複数の第１のページの各々は、当該第１のページ内で使用されているエントリの数と、当該第１のページが属するグループのグループインデックスに対応付けられた前記第２のページ内で使用されているエントリの数とを示す管理情報を含み、
前記重複判定部は、前記第１のページが選択された場合、当該選択された第１のページを前記メモリにロードして、前記第３のハッシュ値を前記ロードされた第１のページから探索し、前記ロードされた第１のページから前記第３のハッシュ値を探索できず、且つ前記ロードされた第１のページに含まれている前記管理情報によって示される前記第２のページ内で使用されているエントリの数が零でない場合に、前記第２のページを選択して、当該選択された第２のページを前記メモリにロードして、前記第３のハッシュ値を前記ロードされた第２のページから探索する
請求項１記載のストレージシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、データの重複をハッシュテーブルに基づいて排除するためのストレージシステムに関する。
【背景技術】
【０００２】
近年、情報処理システムで扱われる大規模なデータ（ビッグデータ）を格納するために、ストレージ装置の大容量化が進んでいる。ビッグデータは、一般に多くの重複するデータを含む。このため、ストレージ装置にビッグデータが格納された場合、当該ストレージ装置の記憶領域の一部が多くの重複するデータで占められる。このことは、ストレージ装置の記憶容量が無駄に使われることを意味する。そこで、ストレージ装置の限られた記憶容量を有効に使用するために、当該ストレージ装置に格納されるべきデータから、重複するデータを排除することが必要となる。【０００３】
以下、従来技術で適用される重複するデータを排除する方法の例について述べる。ストレージコントローラは、ストレージ装置にデータを書き込む場合、当該書き込まれるべきデータと同一のデータが既に当該ストレージ装置に書き込まれているかを判定する。この判定のためにストレージコントローラは、書き込まれるべきデータ（ファイル）をチャンクと呼ばれる固定長のデータの塊に分割する。【０００４】
ストレージコントローラは、チャンク毎にハッシュ関数を用いてハッシュ値を計算する。ストレージコントローラは、ハッシュ値の計算に用いられたチャンクをストレージ装置に書き込む際に、当該ハッシュ値を当該チャンクに対応付けてハッシュテーブルに登録する。【０００５】
そこでストレージコントローラは、ストレージ装置に新たに書き込まれるべき第１のチャンクのハッシュ値を計算した際に、当該ハッシュ値と同一のハッシュ値がハッシュテーブルに登録されているかを判定する。より具体的に述べるならば、ストレージコントローラは、同一のハッシュ値がハッシュテーブルに登録されているかに基づいて、第１のチャンクと重複するデータが既にストレージ装置に書き込まれているかを判定する。ストレージコントローラは、第１のチャンクと重複するデータが書き込まれていない場合だけ、当該第１のチャンクをストレージ装置に書き込む。これにより、ストレージ装置から重複するデータが排除される。【０００６】
ストレージ装置に書き込まれるチャンクの数が増えると、これらのチャンクに対応付けてハッシュテーブルに登録されるハッシュ値の数も増える。そこで従来技術は、多数のハッシュ値を登録するために、同一の数のエントリを有する複数のテーブルを用いて多段に構成されたハッシュテーブルを適用している。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平３−２８２９６６号公報
【特許文献２】特表２０１２−５０５４４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上述のように、ハッシュテーブルが多数のハッシュ値を登録するのに用いられる場合、当該ハッシュテーブルを格納するのに必要な記憶容量も大きくなる。このようなハッシュテーブル全体をストレージコントローラが有するメモリに格納することは難しい。そこで、ハッシュテーブルは、ビッグデータを格納するのに用いられる大容量のストレージ装置、或いはストレージコントローラが有するハードディスクドライブ（ＨＤＤ）のようなローカルなストレージ装置に格納されるのが一般的である。一方、従来技術は、同一の数のエントリを有する複数のテーブルを用いて多段に構成されたハッシュテーブルを適用している。【０００９】
したがって、ストレージコントローラがハッシュ値を比較するために、このような構成のハッシュテーブルを探索する場合、当該ストレージコントローラとストレージ装置との間で多くの入出力（Ｉ／Ｏ）処理が発生する。このように、データの重複を排除するためのハッシュ値の比較に伴って多くのＩ／Ｏ処理が発生すると、ストレージ装置の書き込み性能（書き込み速度）が低下する。【００１０】
本発明が解決しようとする課題は、データの重複を排除するためのハッシュテーブル探索を高速化できるストレージシステムを提供することにある。
【課題を解決するための手段】
【００１１】
実施形態によれば、ストレージシステムは、ストレージ装置と、ストレージコントローラと、ハッシュテーブルとを具備する。前記ストレージコントローラは、前記ストレージ装置へのアクセスを制御する。前記ハッシュテーブルは、第１の数のエントリを有する第１のテーブル及び前記第１の数より大きい第２の数のエントリを有する第２のテーブルを含む。前記ストレージコントローラは、分割部と、ハッシュ生成部と、アクセスコントローラと、重複管理部と、重複判定部とを具備する。前記分割部は、ホストコンピュータからの書き込み要求によって指定されたデータを複数のチャンクに分割する。前記ハッシュ生成部は、前記複数のチャンクの各々のデータに基づいて、前記複数のチャンクの各々の第１の長さを持つハッシュ値を計算する。前記アクセスコントローラは、前記ストレージ装置にチャンクを書き込む。前記重複管理部は、前記ストレージ装置に第１のチャンクが書き込まれる場合、前記第１のチャンクの第１のハッシュ値を、前記第１のチャンクと対応付けて前記ハッシュテーブルの前記第１のテーブルに優先的に登録する。前記重複判定部は、第２のチャンクの第２のハッシュ値が計算された場合、前記第２のハッシュ値に一致する第３のハッシュ値を前記ハッシュテーブルから探索する処理を、前記第１のテーブルからの探索を優先して実行することにより、前記第２のチャンクと同一内容を持つ第３のチャンクが前記ストレージ装置に格納されているかを判定する。前記重複管理部は、前記第３のチャンクが前記ストレージ装置に格納されていると判定された場合、前記第２のチャンクが前記ストレージ装置に書き込まれるのを抑止する。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施形態に係るコンピュータシステムの典型的なハードウェア構成を示すブロック図である。
【図２】図２は、図１に示されるストレージコントローラの典型的な機能構成を主として示すブロック図である。
【図３】図３は、ホストコンピュータからの書き込み要求で指定されたファイルのデータとチャンクとの関係の例を示す図である。
【図４】図４は、図２に示されるハッシュテーブルのデータ構造例を示す図である。
【図５】図５は、図４に示されるハッシュテーブルに含まれている１段目のテーブルが有するリーフページのデータ構造例を示す図である。
【図６】図６は、図５に示される管理情報のフォーマットの例を示す図である。
【図７】図７は、図５に示される他の管理情報のフォーマットの例を示す図である。
【図８】図８は、図２に示されるメタテーブルのデータ構造例を示す図である。
【図９】図９は、図２に示されるチャンクテーブルのデータ構造例を示す図である。
【図１０】図１０は、同実施形態におけるデータ書き込み処理の典型的な手順を説明するためのフローチャートの一部を示す図である。
【図１１】図１１は、同データ書き込み処理の典型的な手順を説明するためのフローチャートの他の一部を示す図である。
【図１２】図１２は、同データ書き込み処理の典型的な手順を説明するためのフローチャートの残りを示す図である。
【図１３】図１３は、同実施形態におけるハッシュ値探索処理の典型的な手順を説明するためのフローチャートの一部を示す図である。
【図１４】図１４は、同ハッシュ値探索処理の典型的な手順を説明するためのフローチャートの残りを示す図である。
【図１５】図１５は、ホストコンピュータから順に送られる３つのファイル書き込み要求によって指定される３つのファイルと、当該３つのファイルが一定のサイズ毎に区切るられることにより取得されるチャンクとの関係の例を示す図である。
【図１６】図１６は、ハッシュテーブルに含まれている１段目のテーブルの内容の変化の例を示す図である。
【図１７】図１７は、メタテーブルの内容の変化の例を示す図である。
【図１８】図１８は、チャンクテーブルの内容の変化の例を示す図である。
【発明を実施するための形態】
【００１３】
以下、実施の形態につき図面を参照して説明する。  
図１は、実施形態に係るコンピュータシステムの典型的なハードウェア構成を示すブロック図である。前記コンピュータシステムは、ストレージシステム１０及びホストコンピュータ（以下、ホストと称する置）２０から構成される。ストレージシステム１０は、ネットワーク３０を介してホスト２０と接続されている。
【００１４】
ホスト２０は、サーバ、或いはクライアントパーソナルコンピュータ（クライアントＰＣ）のような物理計算機である。ホスト２０内では、ストレージシステム１０内のデータにアクセスするためのアプリケーションプログラムが動作する。このアプリケーションプログラムに従い、ホスト２０は、ストレージシステム１０（より詳細には、ストレージシステム１０の後述するＨＤＤ／ＳＳＤアレイ１１）を外部記憶装置としてネットワーク３０を介して利用する。ネットワーク３０は、例えば、ストレージエリアネットワーク（ＳＡＮ）、インターネット或いはイントラネットである。インターネット或いはイントラネットは、例えばイーサネット（登録商標）により構成される。なお、ホスト２０が、ファイバチャネル（ＦＣ）、スモールコンピュータシステムインタフェース（ＳＣＳＩ）バス、シリアルアタッチドＳＣＳＩ（ＳＡＳ）バス、或いはシリアルＡＴアタッチメント（ＳＡＴＡ）バスのようなホストインタフェースバスを介してストレージシステム１０と接続されていても構わない。
【００１５】
ストレージシステム１０は、ＨＤＤ／ＳＳＤアレイ１１及びストレージコントローラ１２を備えている。本実施形態において、ＨＤＤ／ＳＳＤアレイ１１及びストレージコントローラ１２はストレージ装置を構成する。ＨＤＤ／ＳＳＤアレイ１１は、例えば複数のハードディスクドライブ及び複数のソリッドステートドライブ（ＳＳＤ）を用いて構成されるＲＡＩＤ（Redundant Arrays of Inexpensive DisksまたはRedundant Arrays of Independent Disks）アレイである。ＨＤＤ／ＳＳＤアレイ１１は、ストレージインタフェースバス１３を介してストレージコントローラ１２（より詳細には、ストレージコントローラ１２の図示せぬストレージインタフェース）と接続されている。本実施形態においてストレージインタフェースバス１３はＦＣ（ファイバチャネル）である。しかしストレージインタフェースバス１３が、ＳＣＳＩバス、ＳＡＳバス、或いはＳＡＴＡバスのような、ＦＣ以外のインタフェースバスであっても構わない。
【００１６】
ストレージコントローラ１２は、ストレージインタフェースバス１３を介してＨＤＤ／ＳＳＤアレイ１１へのアクセスを制御する。ストレージコントローラ１２は、ネットワーク３０を介してホスト２０と接続されている。ストレージコントローラ１２は、ホスト２０から論理アドレスの指定による読み出し要求または書き込み要求を受け付ける。ストレージコントローラ１２は、指定された論理アドレスを、アドレス変換機能により、当該論理アドレスがマッピングされたＨＤＤ／ＳＳＤアレイ１１内の物理領域を示す物理アドレスに変換する。データ読み出しの場合を例に、より詳細に述べるならば、ストレージコントローラ１２は、論理アドレスを、当該論理アドレスで指定されるデータ（チャンク）に割り当てられるチャンク番号に変換する。チャンクについては後述する。ストレージコントローラ１２は、チャンク番号を当該チャンク番号の示すチャンクが格納されているＨＤＤ／ＳＳＤアレイ１１内の物理領域を示す物理アドレスに変換する。ストレージコントローラ１２は、この物理アドレスに基づいて、ＨＤＤ／ＳＳＤアレイ１１にアクセスする。
【００１７】
ストレージコントローラ１２は、ＣＰＵ１２１、メモリ１２２及びハードディスクドライブ（ＨＤＤ）１２３を備えている。ＣＰＵ１２１は、メモリ１２２内の後述する制御プログラム領域１２２ａに格納されている制御プログラムのプログラムコードに従い、ストレージコントローラ１２に要求される処理を実行する。メモリ１２２は、例えば、複数のＤＲＡＭを用いて構成される揮発性メモリである。ＨＤＤ１２３は、ローカルなストレージ装置であり、制御プログラム及び各種テーブルを格納するのに用いられる。なお、ＨＤＤ１２３に代えて、複数のフラッシュメモリが搭載されたストレージ装置を用いることも可能である。
【００１８】
本実施形態においてストレージコントローラ１２は、ＨＤＤ／ＳＳＤアレイ１１を含むストレージ装置に備えられている。しかし、ストレージコントローラ１２が、ストレージ装置から独立して備えられていても構わない。この場合、ストレージコントローラ１２が、ホスト２０に内蔵されていても構わない。また、ストレージコントローラ１２（より詳細には、ストレージコントローラ１２の機能）が、ホスト２０の有するオペレーティングシステム（ＯＳ）の機能の一部を用いて実現されても構わない。
【００１９】
また、ストレージコントローラ１２が、ホスト２０のカードスロットに装着して用いられるカードに備えられていても構わない。また、ストレージコントローラ１２の一部がホスト２０に内蔵され、当該ストレージコントローラ１２の残りが前記カードに備えられていても構わない。
【００２０】
また、ＨＤＤ／ＳＳＤアレイ１１に代えて、例えば複数のＨＤＤを用いて構成されるＲＡＩＤアレイ、または複数のＳＳＤを用いて構成されるＲＡＩＤアレイを適用しても構わない。また、ＨＤＤ／ＳＳＤアレイ１１（つまりＲＡＩＤアレイ）に代えて、ＲＡＩＤ構成を持たない、単なる複数のストレージドライブの集合（ドライブアレイ）を適用しても構わない。
【００２１】
図２は、図１に示されるストレージコントローラ１２の典型的な機能構成を主として示すブロック図である。ストレージコントローラ１２は、分割部２００、重複管理部２０１、重複判定部２０２、ハッシュ生成部２０３及びアクセスコントローラ２０４を備えている。分割部２００、重複管理部２０１、重複判定部２０２、ハッシュ生成部２０３及びアクセスコントローラ２０４の機能については後述する。これらの機能要素２００乃至２０４は、図１に示されるストレージコントローラ１２のＣＰＵ１２１が制御プログラムを実行することにより実現されるソフトウェアモジュールである。しかし、機能要素２００乃至２０４の一部または全部がハードウェアモジュールによって実現されても構わない。
【００２２】
メモリ１２２は、制御プログラム領域１２２ａ、テーブル領域１２２ｂ及びワーク領域１２２ｃを含む。制御プログラム領域１２２ａは、ＣＰＵ１２１によって実行される制御プログラムの少なくとも一部を格納するのに用いられる。この制御プログラムは、前述したようにＨＤＤ１２３に予め格納されており、当該制御プログラムの少なくとも一部は、ストレージコントローラ１２の起動時に当該ＨＤＤ１２３から制御プログラム領域１２２ａにロードされる。
【００２３】
テーブル領域１２２ｂは、ＨＤＤ１２３に格納されている各種のテーブルの少なくとも一部を格納するのに用いられる。ワーク領域１２２ｃは、ＣＰＵ１２１が制御プログラムを実行する際に利用される一時的なデータを格納するのに用いられる。
【００２４】
ＨＤＤ１２３（つまり、ローカルストレージ装置）は、上述の制御プログラムに加えて、後述するハッシュテーブル２０５、メタテーブル２０６及びチャンクテーブル２０７を格納する。つまりＨＤＤ１２３は、制御プログラム、ハッシュテーブル２０５、メタテーブル２０６及びチャンクテーブル２０７がそれぞれ格納される記憶領域を含む。
【００２５】
図３は、ホスト２０からの書き込み要求で指定されたファイルのデータとチャンクとの関係の例を示す。分割部２００は、図３に示されるファイルを、固定長、例えば４キロバイト（４Ｋバイト）のデータの塊に分割する。この４Ｋバイト毎のデータの塊をチャンクと呼ぶ。重複管理部２０１は、チャンク毎に重複の有無を管理する。図３の例では、ファイルＦのサイズは４ＮＫバイトである。この場合、ファイルＦは、Ｎ個のチャンク＃０乃至＃Ｎ−１に分割される。重複管理部２０１は、チャンク＃０乃至＃Ｎ−１にユニークな識別番号であるチャンク番号を付与する。本実施形態において、チャンク番号は８バイトで表される。
【００２６】
次に、ＨＤＤ１２３に格納されるハッシュテーブル２０５の概要について説明する。ハッシュテーブル２０５は、チャンク番号が付与されたチャンク毎に、ハッシュ情報を登録するのに用いられる。ハッシュ情報は、例えば、対応するチャンクに基づいて計算された３２バイトのハッシュ値と当該チャンクの８バイトのチャンク番号との対を含む。つまり、ハッシュテーブル２０５は、チャンクのハッシュ値と当該チャンクのチャンク番号とを関連付けるハッシュ情報を登録するのに用いられる。
【００２７】
ハッシュテーブル２０５は、ＨＤＤ／ＳＳＤアレイ１１に書き込まれるべきチャンクと同一内容を持つチャンクが、当該ＨＤＤ／ＳＳＤアレイ１１に既に書き込まれているかを重複判定部２０２が判定するのに用いられる。重複管理部２０１は、この重複判定部２０２による判定の結果に基づいて、同一内容を持つ複数のチャンクがＨＤＤ／ＳＳＤアレイ１１に重複して書き込まれるのを排除する。これにより、データの重複排除が実現できる。
【００２８】
ここで、本実施形態で適用されるデータの重複排除の概要について説明する。まず、ホスト２０からストレージシステム１０のストレージコントローラ１２に、チャンクＡを含むファイルの書き込みが要求されたことを想定する。また、チャンクＡのハッシュ値がＨ（Ａ）であるものとする。重複判定部２０２は、チャンクＡのハッシュ値Ｈ（Ａ）をハッシュテーブル２０５に登録されているハッシュ値と順次比較する。この比較の結果に基づいて、重複判定部２０２は、ＨＤＤ／ＳＳＤアレイ１１にチャンクＡと同一内容を持つチャンク（以下、代表チャンクＡと称する）が格納されているを判定する。
【００２９】
もし、ハッシュテーブル２０５にハッシュ値Ｈ（Ａ）に一致するハッシュ値（つまり、ハッシュ値Ｈ（Ａ））が登録されているならば、重複判定部２０２は、ＨＤＤ／ＳＳＤアレイ１１に代表チャンクＡが格納されていると判定する。つまり重複判定部２０２は、チャンクＡが重複すると判定する。一方、ハッシュテーブル２０５にハッシュ値Ｈ（Ａ）が登録されていないならば、重複判定部２０２は、チャンクＡが重複しないと判定する。
【００３０】
チャンクＡが重複しないと判定された場合、アクセスコントローラ２０４は、書き込み要求によって指定されたＨＤＤ／ＳＳＤアレイ１１のアドレスに、チャンクＡを書き込む。より詳細には、アクセスコントローラ２０４は、ホスト２０からの書き込み要求によって指定された論理アドレスに割り当てられる物理アドレスの示すＨＤＤ／ＳＳＤアレイ１１の物理領域に、チャンクＡを書き込む。このとき重複管理部２０１は、ハッシュ値Ｈ（Ａ）とチャンクＡのチャンク番号との対を含むハッシュ情報を、ハッシュテーブル２０５に登録する。
【００３１】
一方、チャンクＡが重複すると判定された場合には、重複管理部２０１は、アクセスコントローラ２０４がチャンクＡをＨＤＤ／ＳＳＤアレイ１１に書き込むのを抑止する。この場合、重複管理部２０１は、ホスト２０からの書き込み要求によって指定された論理アドレスに、代表チャンクＡが既にＨＤＤ／ＳＳＤアレイ１１に書き込まれている物理アドレスを割り当てる（つまりマッピングする）。
【００３２】
図４は、図２に示されるハッシュテーブル２０５のデータ構造例を示す。ハッシュテーブル２０５は、複数のテーブルを用いて多段に構成されている。図４の例では、ハッシュテーブル２０５は、７つのテーブルＴＢＬ＿１，ＴＢＬ＿２，ＴＢＬ＿３，ＴＢＬ＿４，ＴＢＬ＿５，ＴＢＬ＿６及びＴＢＬ＿７を用いて構成されている。つまりハッシュテーブル２０５は、７段構成のテーブルである。ここでテーブルＴＢＬ＿ｈ（ｈ＝１，２，３，４，５，６，７）は、ハッシュテーブル２０５におけるｈ段目のテーブルである。
【００３３】
テーブルＴＢＬ＿１乃至ＴＢＬ＿７は、いずれも“ｋｍａｘ＋１”個のページ（以下、リーフページと称する）を含む。ここで、テーブルＴＢＬ＿ｈのｋ番目（ｋ＝０，１，…，ｋｍａｘ）のリーフページをＬＰ＿ｋ（ｈ）のように表記する。リーフページＬＰ＿ｋ（ｈ）は、後述するグループＧ＿ｋ（グループ番号ｋまたはグループインデックスｋ）に対応付けられている。リーフページＬＰ＿ｋ（ｈ）は、グループＧ＿ｋに属するハッシュ値（より詳細には、後述する１段ハッシュ値）と当該ハッシュ値の計算に用いられたチャンクを特定するためのチャンク番号との対を含むハッシュ情報を登録するのに用いられる。
【００３４】
テーブルＴＢＬ＿１乃至ＴＢＬ＿７のリーフページＬＰ＿ｋ（１）乃至ＬＰ＿ｋ（７）のサイズは異なり、したがって、ハッシュ情報を登録するのに用いられるエントリの数も異なる。ここで、テーブルＴＢＬ＿１，ＴＢＬ＿２，ＴＢＬ＿３，ＴＢＬ＿４，ＴＢＬ＿５，ＴＢＬ＿６及びＴＢＬ＿７のリーフページＬＰ＿ｋ（１），ＬＰ＿ｋ（２），ＬＰ＿ｋ（３），ＬＰ＿ｋ（４），ＬＰ＿ｋ（５），ＬＰ＿ｋ（６）及びＬＰ＿ｋ（７）のサイズ（エントリ数）が、それぞれＳＩＺＥ＿１（ＥＮ＿１），ＳＩＺＥ＿２（ＥＮ＿２），ＳＩＺＥ＿３（ＥＮ＿３），ＳＩＺＥ＿４（ＥＮ＿４），ＳＩＺＥ＿５（ＥＮ＿５），ＳＩＺＥ＿６（ＥＮ＿６）及びＳＩＺＥ＿７（ＥＮ＿７）であるものとする。この場合、これらのサイズ（エントリ数）の間には、次のような関係
ＳＩＺＥ＿１＜ＳＩＺＥ＿２＜ＳＩＺＥ＿３＜ＳＩＺＥ＿４＜ＳＩＺＥ＿５＜ＳＩＺＥ＿６＜ＳＩＺＥ＿７
ＥＮ＿１＜ＥＮ＿２＜ＥＮ＿３＜ＥＮ＿４＜ＥＮ＿５＜ＥＮ＿６＜ＥＮ＿７
がある。
【００３５】
つまり、本実施形態では、ハッシュテーブル２０５を構成する７つのテーブルＴＢＬ＿１，ＴＢＬ＿２，ＴＢＬ＿３，ＴＢＬ＿４，ＴＢＬ＿５，ＴＢＬ＿６及びＴＢＬ＿７が有するリーフページＬＰ＿ｋ（１），ＬＰ＿ｋ（２），ＬＰ＿ｋ（３），ＬＰ＿ｋ（４），ＬＰ＿ｋ（５），ＬＰ＿ｋ（６）及びＬＰ＿ｋ（７）のサイズ（エントリ数）中で、テーブルＴＢＬ＿１（つまり１段目のテーブルＴＢＬ＿１）のそれが最も小さい。以下、テーブルＴＢＬ＿２，ＴＢＬ＿３，ＴＢＬ＿４，ＴＢＬ＿５，ＴＢＬ＿６及びＴＢＬ＿７の順に、リーフページのサイズ（エントリ数）が大きくなる。
【００３６】
テーブルＴＢＬ＿１の各リーフページＬＰ＿ｋ（１）は、例えば９６エントリを有する。テーブルＴＢＬ＿２の各リーフページＬＰ＿ｋ（２）は、例えば１９２エントリ（つまり、リーフページＬＰ＿ｋ（１）のそれの２倍のエントリ）を有する。テーブルＴＢＬ＿３の各リーフページＬＰ＿ｋ（３）は、例えば３８４エントリ（つまり、リーフページＬＰ＿ｋ（２）のそれの２倍のエントリ）を有する。テーブルＴＢＬ＿４の各リーフページＬＰ＿ｋ（４）は、例えば７６８エントリ（リーフページＬＰ＿ｋ（３）のそれの２倍のエントリ）を有する。テーブルＴＢＬ＿５の各リーフページＬＰ＿ｋ（５）は、例えば１５３６エントリ（つまり、リーフページＬＰ＿ｋ（４）のそれの２倍のエントリ）を有する。テーブルＴＢＬ＿６の各リーフページＬＰ＿ｋ（６）は、例えば３，０７２エントリ（つまり、リーフページＬＰ＿ｋ（５）のそれの２倍のエントリ）を有する。テーブルＴＢＬ＿７の各リーフページＬＰ＿ｋ（７）は、例えば６，１４４エントリ（つまり、リーフページＬＰ＿ｋ（６）のそれの２倍のエントリ）を有する。
【００３７】
本実施形態では、ハッシュテーブル２０５は、当該ハッシュテーブル２０５へのアクセスの高速化のために、ＨＤＤ１２３からメモリ１２２のテーブル領域１２２ｂにロードされて用いられる。但し、メモリ１２２のテーブル領域１２２ｂの容量の制約から、ハッシュテーブル２０５全体がメモリ１２２にロードされるのではなく、ハッシュテーブル２０５から選択された１つのリーフページだけがメモリ１２２のテーブル領域１２２ｂにロードされる。
【００３８】
本実施形態では、チャンク（４Ｋバイトのチャンク）のハッシュ値として３２バイトのハッシュ値が用いられる。ハッシュ生成部２０３は、この３２バイトのハッシュ値を計算するのに、例えば“ＳＨＡ−２５６”と呼ばれる第１のハッシュ関数を適用する。この３２バイトのハッシュ値を１段ハッシュ値と呼ぶ。
【００３９】
ここで、ＨＤＤ／ＳＳＤアレイ１１に格納される全てのチャンクの１段ハッシュ値とチャンク番号の対が、分類されることなくテーブルＴＢＬ＿１乃至ＴＢＬ＿７に分散して登録されるものとする。この場合、テーブルＴＢＬ＿１〜ＴＢＬ＿７に格納される１段ハッシュ値とチャンク番号との対の数は膨大となる。このため、例えば前述のハッシュ値Ｈ（Ａ）に一致するハッシュ値を、テーブルＴＢＬ＿ｈ（ｈ＝１，２，３，４，５，６，７）から探索するのに多大な時間を要する。
【００４０】
そこで本実施形態において重複管理部２０１は、テーブルＴＢＬ＿１〜ＴＢＬ＿７に登録されるべき１段ハッシュ値（つまり、３２バイトのハッシュ値）の集合を、当該１段ハッシュ値に基づいて、“ｋｍａｘ＋１”個のグループＧ＿０乃至Ｇ＿ｋｍａｘに分類する。グループＧ＿０乃至Ｇ＿ｋｍａｘは、それぞれグループ番号０乃至ｋｍａｘに対応付けられる。テーブルＴＢＬ＿１〜ＴＢＬ＿７のそれぞれの“ｋｍａｘ＋１”個のリーフページは、グループＧ＿０乃至Ｇ＿ｋｍａｘ（つまりグループ番号０乃至ｋｍａｘ）に対応付けられている。例えば、テーブルＴＢＬ＿ｈのリーフページＬＰ＿０（ｈ）乃至ＬＰ＿ｋｍａｘ（ｈ）は、グループＧ＿０乃至Ｇ＿ｋｍａｘに対応付けられている。ここで、ｋｍａｘ”は、例えば１６，７７７，２１６（１６進表現で０ｘＦＦＦＦＦＦ）である。０ｘＦＦＦＦＦＦにおける“０ｘ”は、当該“０ｘ”が付されているＦＦＦＦＦＦが１６進表現であることを示す。
【００４１】
重複管理部２０１による上述の分類のために、ハッシュ生成部２０３は、１段ハッシュ値が属するグループを特定するためのグループ番号としてのインデックス（以下、グループインデックスと称する）を当該１段ハッシュ値に基づいて生成する。本実施形態では、このグループインデックスに、１段ハッシュ値に基づいて算出される３バイトのハッシュ値が用いられる。この３バイトのハッシュ値を２段ハッシュ値と呼ぶ。この２段ハッシュ値（つまりグループインデックス）の計算には、第２のハッシュ関数が用いられる。この第２のハッシュ関数については後述する。
【００４２】
重複管理部２０１は、例えば、２段ハッシュ値（グループインデックス）０（＝０ｘ００００００）に対応する１段ハッシュ値の集合を、グループ番号０を有するグループＧ＿０として管理する。同様に重複管理部２０１は、２段ハッシュ値１（０ｘ０００００１）に対応する１段ハッシュ値の集合を、グループ番号１を有するグループＧ＿１として管理し、２段ハッシュ値２（０ｘ０００００２）に対応する１段ハッシュ値の集合を、グループ番号２を有するグループＧ＿２として管理する。同様に、重複管理部２０１は、２段ハッシュ値ｋｍａｘ（０ｘＦＦＦＦＦＦ）に対応する１段ハッシュ値の集合を、グループ番号ｋｍａｘを有するグループＧ＿ｋｍａｘとして管理する。つまり重複管理部２０１は、２段ハッシュ値ｋに対応する１段ハッシュ値の集合を、グループ番号ｋを有するグループＧ＿ｋとして管理する。
【００４３】
このように本実施形態では、重複管理部２０１は、２段ハッシュ値（つまりグループインデックス）を用いて、対応する１段インデックス値の集合を１６，７７７，２１６個（つまり“ｋｍａｘ＋１”個）のグループに分類する。これにより、１段インデックス値の集合がグループ化されない場合と比較して、ハッシュテーブル２０５における探索範囲を１６，７７７，２１６分の１に減らすことができる。
【００４４】
ここで、第２のハッシュ関数について説明する。前述したように、第２のハッシュ関数は、グループインデックスとしての２段ハッシュ値の計算に用いられる。本実施形態では、この第２のハッシュ関数に、除算関数が用いられる。この除数関数は、除数として所定の素数を用いる。具体的には、この除数には、例えば、３バイトで表現される最大の数値（１６，７７７，２１６）よりも小さく、且つ当該最大の数値に最も小さい素数（１６，７７７，２１３）が用いられる。２段ハッシュ値は、除算関数（第２のハッシュ関数）に基づいて、１段ハッシュ値を素数１６，７７７，２１３で除することによって取得される剰余である。除算関数の除数に、このような素数を用いることにより、グループＧ＿０乃至Ｇ＿ｋｍａｘにそれぞれ属する１段ハッシュ値の集合をランダム化することができる。
【００４５】
上述の第２のハッシュ関数を適用した場合、２段ハッシュ値の総数（つまり、グループインデックスの総数）は、１６，７７７，２１３（０ｘＦＦＦＦＦＣ）である。この場合、２段ハッシュ値“ｋｍａｘ−２”（＝１６，７７７，２１４），“ｋｍａｘ−１”（＝１６，７７７，２１５）及びｋｍａｘ（＝１６，７７７，２１６）は存在しない。しかし本実施形態では管理の簡略化のために、重複管理部２０１は、２段ハッシュ値“ｋｍａｘ−２”，“ｋｍａｘ−１”及びｋｍａｘにそれぞれ対応するグループＧ＿（ｋｍａｘ−２），Ｇ＿（ｋｍａｘ−１）及びＧ＿ｋｍａｘも管理する。なお、グループＧ＿（ｋｍａｘ−２），Ｇ＿（ｋｍａｘ−１）及びＧ＿ｋｍａｘは必ずしも必要ではない。
【００４６】
次に、テーブルＴＢＬ＿１乃至ＴＢＬ＿７の各リーフページのデータ構造について、例を挙げて説明する。図５は、図４に示されるハッシュテーブル２０５に含まれているテーブルＴＢＬ＿１（つまり１段目のテーブルＴＢＬ＿１）が有するｋ番目のリーフページＬＰ＿ｋ（１）のデータ構造例を示す。リーフページＬＰ＿ｋ（１）は、グループＧ＿ｋに対応付けられている。
【００４７】
リーフページＬＰ＿ｋ（１）は、８つのセクタＳＴ＿０乃至ＳＴ＿７から構成される。セクタは、周知のように、ハードディスクドライブ（ＨＤＤ）、或いはソリッドステートドライブ（ＳＳＤ）のようなストレージドライブにアクセスする際の最小単位である。本実施形態において、１セクタのサイズは５１２バイトである。セクタＳＴ＿０乃至ＳＴ＿７は、それぞれハッシュ情報を登録するのに用いられる１２個のエントリを含む。したがって、リーフページＬＰ＿ｋ（１）は、前述したように９６（８×１２＝９６）個のエントリを有する。ハッシュ情報のサイズは例えば４０バイトである。ハッシュ情報は、３２バイトのハッシュ値（１段ハッシュ値）と８バイトのチャンク番号との対を含む。セクタＳＴ＿０乃至ＳＴ＿７は更に、管理情報ＭＩ１＿０乃至ＭＩ１＿７を含む。管理情報ＭＩ１＿０乃至ＭＩ１＿７の各々のサイズは、例えば３２バイトである。管理情報ＭＩ１＿ｉ（ｉ＝０，１，…，ｉ（１）ｍａｘ）については後述する。なお、ｉ（１）ｍａｘは、リーフページＬＰ＿ｋ（１）が有するセクタの数から１を減じることにより得られる数であり、７である。
【００４８】
テーブルＴＢＬ＿２乃至ＴＢＬ＿７が有するｋ番目のリーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）のデータ構造も、図５に示されるリーフページＬＰ＿ｋ（１）のそれと同様である。但し、リーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）が有するセクタの数は前述のエントリ数の相違から明らかなように異なる。
【００４９】
例えば、リーフページＬＰ＿ｋ（２），ＬＰ＿ｋ（３）及びＬＰ＿ｋ（４）は、それぞれ、１６セクタ（１９２エントリ），３２セクタ（３８４エントリ）及び６４セクタ（７６８エントリ）を有する。つまり、ｉ（２）ｍａｘ，ｉ（３）ｍａｘ及びｉ（４）ｍａｘは、それぞれ、１５，３１及び６３である。また、リーフページＬＰ＿ｋ（５），ＬＰ＿ｋ（６）及びＬＰ＿ｋ（７）は、それぞれ１２８セクタ（１，５３６エントリ），２５６セクタ（３，０７２エントリ）及び５１２セクタ（６，１４４エントリ）を有する。つまり、ｉ（５）ｍａｘ，ｉ（６）ｍａｘ及びｉ（７）ｍａｘは、それぞれ、１２８，２５６及び５１２である。
【００５０】
次に、上述のようなデータ構造のハッシュテーブル２０５へのハッシュ情報登録（つまりハッシュテーブル２０５の更新）の概要について説明する。前述したように、ハッシュテーブル２０５は、テーブルＴＢＬ＿１乃至ＴＢＬ＿７から構成される。テーブルＴＢＬ＿１は、３バイトの２段ハッシュ値０ｘ００００００乃至０ｘＦＦＦＦＦＦ（つまりグループインデックス）に基づいて分類される“ｋｍａｘ＋１”個（つまり１６，７７７，２１６個）のリーフページＬＰ＿０（１）乃至ＬＰ＿ｋｍａｘ（１）を有する。
【００５１】
例えば２段ハッシュ値０ｘ００００００を持つ第１のチャンクがＨＤＤ／ＳＳＤアレイ１１に書き込まれた場合、重複管理部２０１は、当該２段ハッシュ値０ｘ００００００で指定される１段目のテーブルＴＢＬ＿１のリーフページＬＰ＿０（１）に第１のハッシュ情報を登録する。この第１のハッシュ情報は、第１のチャンクの１段ハッシュ値と当該第１のチャンクのチャンク番号との対を含む。同様に、例えば２段ハッシュ値０ｘ０００００１を持つ第２のチャンクがＨＤＤ／ＳＳＤアレイ１１に書き込まれた場合、重複管理部２０１は、当該２段ハッシュ値０ｘ０００００１で指定される１段目のテーブルＴＢＬ＿１のリーフページＬＰ＿１（１）に第２のハッシュ情報を登録する。この第２のハッシュ情報は、第２のチャンクの１段ハッシュ値と当該第２のチャンクのチャンク番号との対を含む。
【００５２】
１段目のテーブルＴＢＬ＿１のリーフページＬＰ＿ｋ（１）（ｋ＝０，１，…，ｋｍａｘ）は、９６エントリ（ＥＮ＿１＝９６）を有する。このため、例えば２段ハッシュ値０ｘ００００００を持つ９６のチャンクがＨＤＤ／ＳＳＤアレイ１１に既に書き込まれている場合、リーフページＬＰ＿０（１）は満杯となっている。この状態では、例えば上述の第１のハッシュ情報をリーフページＬＰ＿０（１）に登録することはできない。つまり、増設のリーフページが必要となる。
【００５３】
そこで本実施形態においてハッシュテーブル２０５は、増設のリーフページＬＰ＿ｋ（２）を提供する２段目のテーブルＴＢＬ＿２を更に備えている。２段目のテーブルＴＢＬ＿２のリーフページＬＰ＿ｋ（２）は、１段目のテーブルＴＢＬ＿１においてリーフページＬＰ＿ｋ（１）が満杯となった場合に用いられる。このことから、テーブルＴＢＬ＿１（つまり１段目のテーブルＴＢＬ＿１）は、ハッシュテーブル２０５における基本のテーブルであるといえる。
【００５４】
さて、１段目のテーブルＴＢＬ＿１のリーフページＬＰ＿０（１）が満杯となっている状態で、上述のように第１のチャンク（つまり、２段ハッシュ値０ｘ００００００を持つ第１のチャンク）がＨＤＤ／ＳＳＤアレイ１１に書き込まれたものとする。この場合、重複管理部２０１は、２段目のテーブルＴＢＬ＿２のリーフページＬＰ＿０（２）に第１のハッシュ情報を登録する。２段目のテーブルＴＢＬ＿２のリーフページＬＰ＿ｋ（２）（ｋ＝０，１，…，ｋｍａｘ）は、１９２エントリ（ＥＮ＿２＝１９２）を有する。したがって、例えばリーフページＬＰ＿０（２）の１９２エントリも満杯となった場合、当該リーフページＬＰ＿０（２）に新たなハッシュ情報を登録することはできない。
【００５５】
そこでハッシュテーブル２０５は、増設のリーフページＬＰ＿ｋ（３）を提供する３段目のテーブルＴＢＬ＿３を更に備えている。リーフページＬＰ＿ｋ（３）は、２段目のテーブルＴＢＬ＿２においてリーフページＬＰ＿ｋ（２）が満杯となった場合に用いられる。３段目のテーブルＴＢＬ＿３のリーフページＬＰ＿ｋ（３）は、３８４エントリ（ＥＮ＿３＝３８４）を有する。同様に、ハッシュテーブル２０５は、増設のリーフページＬＰ＿ｋ（４）を提供する４段目のテーブルＴＢＬ＿４を更に備えている。リーフページＬＰ＿ｋ（４）は、３段目のテーブルＴＢＬ＿３においてリーフページＬＰ＿ｋ（３）が満杯となった場合に用いられる。４段目のテーブルＴＢＬ＿４のリーフページＬＰ＿ｋ（４）は、７６８エントリ（ＥＮ＿４＝７６８）を有する。
【００５６】
同様に、ハッシュテーブル２０５は、増設のリーフページＬＰ＿ｋ（５）を提供する５段目のテーブルＴＢＬ＿５を更に備えている。５段目のテーブルＴＢＬ＿５のリーフページＬＰ＿ｋ（５）は、１，５３６エントリ（ＥＮ＿５＝１，５３６）を有する。同様に、ハッシュテーブル２０５は、増設のリーフページＬＰ＿ｋ（６）を提供する６段目のテーブルＴＢＬ＿６と、増設のリーフページＬＰ＿ｋ（７）を提供する７段目のテーブルＴＢＬ＿７とを更に備えている。６段目のテーブルＴＢＬ＿６のリーフページＬＰ＿ｋ（６）は、３，０７２エントリ（ＥＮ＿６＝３，０７２）を有し、７段目のテーブルＴＢＬ＿７のリーフページＬＰ＿ｋ（７）は、６，１４４エントリ（ＥＮ＿６＝６，１４４）を有する。つまり、ハッシュテーブル２０５は、２段ハッシュ値（つまりグループインデックス）毎に１２，１９２個のエントリを有する。
【００５７】
ここで、上述のようなハッシュテーブル２０５の構成の意義について説明する。ハッシュテーブル２０５に登録されるハッシュ値の量は、ＨＤＤ／ＳＳＤアレイ１１に格納されるデータの量（チャンク数）が多くなるに従って増大する。このような状況では、ハッシュテーブル２０５に必要な記憶容量も、一般にメモリ１２２に格納することができない大きさ（例えば、数ギガバイトを超える大きさ）となる。このためハッシュテーブル２０５は、本実施形態のようにＨＤＤ１２３（つまり、ローカルなストレージ装置）に格納される。なお、ハッシュテーブル２０５が、ＨＤＤ／ＳＳＤアレイ１１に格納されても構わない。
【００５８】
ハッシュテーブル２０５に必要な記憶容量が大きくなると、ストレージコントローラ１２（より詳細には、ストレージコントローラ１２の重複判定部２０２）はハッシュ値を探索するために、当該ハッシュテーブル２０５の全エントリの一部をメモリ１２２に読み込む動作を繰り返す必要がある。このため、ストレージコントローラ１２とストレージ装置との間で多くの入出力（Ｉ／Ｏ）処理が発生する。
【００５９】
さて、一般的なストレージシステムでは、論理ボリュームに最初に割り当てられた記憶容量（例えば、最小の単位の記憶容量）で運用が開始される。論理ボリュームとは、ホストによって論理的なストレージドライブとして認識される記憶領域を指す。論理ボリュームには、例えば４Ｋ（キロ）バイト毎にＨＤＤ／ＳＳＤアレイ１１の記憶領域（物理領域）が適宜割り当てられる。この種のストレージシステムは、運用開始後の状況に応じて、論理ボリュームの記憶容量をフレキシブルに増加させる機能を有する。本実施形態におけるストレージシステム１０も同様である。
【００６０】
このような記憶容量増設機能を有し、且つ重複排除機能を有するストレージシステムでは、運用開始時に、最小の単位の記憶容量が割り当てられた論理ボリュームに対応する基準の大きさＲＳのハッシュテーブルが用意される。そして、論理ボリュームに割り当てられる記憶容量が最小の単位のＭ倍（Ｍは１より大きい整数）に増加された場合に、ハッシュテーブルも基準の大きさＲＳのＭ倍に増加される。
【００６１】
本実施形態では、論理ボリュームに割り当て可能な記憶容量の最小の単位は、６テラ（Ｔ）バイトである。この６Ｔバイトのデータが前述したように４Ｋバイトのチャンクに分割されるものとする。
【００６２】
重複管理部２０１は、各チャンクの３２バイトのハッシュ値（１段ハッシュ値）に基づいて、同一内容を持つ複数のチャンク（つまり重複するチャンク）がＨＤＤ／ＳＳＤアレイ１１に格納されるのを排除する。この場合、ハッシュテーブル２０５に登録されるチャンクの数（つまり、重複が排除されたチャンクの数）は、確率的に１６，７７７，２１６×９６を超えないことが知られている。
【００６３】
１６，７７７，２１６は、前述したように、１段ハッシュ値の集合が２段ハッシュ値で分類された場合に得られるグループＧ＿０乃至Ｇ＿ｋｍａｘ（グループインデックス）の総数である。９６は、各グループＧ＿ｋ（ｋ＝０，１，…，ｋｍａｘ）に対応付けられたテーブルＴＢＬ＿１のリーフページＬＰ＿ｋ（１）が有するエントリの数（ＥＮ＿１）である。よって、テーブルＴＢＬ＿１は、６Ｔバイトの論理ボリュームのデータの重複排除に適用可能である。つまり、論理ボリュームの記憶容量が６Ｔバイトの場合、１６，７７７，２１６×９６エントリを有するテーブルＴＢＬ＿１の大きさは、上述の基準の大きさＲＳである。
【００６４】
ここで、論理ボリュームの記憶容量が、例えば６Ｔバイトから１２Ｔバイトまたは２４Ｔバイトに増やされる場合、テーブルＴＢＬ＿１だけではエントリ数が不足する。この場合、ハッシュテーブル２０５の大きさを、基準の大きさＲＳの２倍または４倍に拡張する必要がある。同様に、論理ボリュームの記憶容量が、例えば６Ｔバイトから５１６Ｔバイトに増やされる場合、ハッシュテーブル２０５の大きさを基準の大きさＲＳの８６倍に拡張する必要がある。
【００６５】
従来技術であれば、この拡張のために、基準の大きさＲＳを有する８５個の第２乃至第８６のテーブルが、基準の大きさＲを有する第１のテーブル（つまり運用開始時におけるハッシュテーブルを構成する第１のテーブル）に追加される。明らかなように、第２乃至第８６のテーブルは、いずれも、第１のテーブルが有するエントリの数と同一の数のエントリを有する。第１のテーブルは、多段構成のハッシュテーブルの１段目のテーブルとして用いられる。第２乃至第８６のテーブルは、それぞれ、多段構成のハッシュテーブルの２段目乃至８６段目のテーブルとして用いられる。
【００６６】
この場合、ストレージコントローラが、第１乃至第８６のテーブルからハッシュ値を探索するためには、当該第１乃至第８６のテーブルを順次メモリに読み込む必要がある。したがって従来技術では、ハッシュテーブルに関し、メモリが１６，７７７，２１６×９６エントリを格納するためのテーブル領域を有しているとしても、８６回のＩ／Ｏ処理が必要となる。
【００６７】
これに対して本実施形態では、１段目のテーブルＴＢ＿１に、２段目のテーブルＴＢＬ＿２乃至７段目のテーブルＴＢＬ＿７が追加される。２段目のテーブルＴＢＬ＿２、３段目のテーブルＴＢＬ＿３及び４段目のテーブルＴＢＬ＿４は、それぞれ１段目のテーブルＴＢ＿１が有するエントリの数の２倍、４倍及び８倍のエントリを有する。また、４段目のテーブルＴＢＬ＿４、５段目のテーブルＴＢＬ＿５及び６段目のテーブルＴＢＬ＿６は、それぞれ１段目のテーブルＴＢ＿１が有するエントリの数の１６倍、３２倍及び６４倍のエントリを有する。
【００６８】
この場合、ハッシュテーブル２０５の総エントリ数は、１段目のテーブルＴＢ＿１のそれの１２７倍となり、５１６Ｔバイトの記憶容量の論理ボリュームをサポートするのに必要な総エントリ数（つまり、１段目のテーブルＴＢ＿１の総エントリ数の８６倍）を十分に超えている。このような構成のハッシュテーブル２０５が適用される本実施形態では、ストレージコントローラ１２が、１段目のテーブルＴＢ＿１乃至７段目のテーブルＴＢＬ＿７からハッシュ値を探索する場合、多くても７回のＩ／Ｏ処理で済む。
【００６９】
よって本実施形態によれば、ハッシュ値の探索に伴うテーブルアクセスのために必要となるＩ／Ｏ処理の回数を、従来技術と比較して大幅に減らすことができる。これにより本実施形態によれば、ハッシュ値探索の高速化を実現して、重複排除に関する処理能力を向上し、更にはストレージシステム１０の書き込み性能（書き込み速度）を向上することができる。
【００７０】
しかも本実施形態では、ストレージコントローラ１２はハッシュ値を探索するために、１段目のテーブルＴＢ＿１乃至７段目のテーブルＴＢＬ＿７の各々の全体をメモリ１２２に読み込む必要はない。つまりストレージコントローラ１２は、１段目のテーブルＴＢ＿１乃至７段目のテーブルＴＢＬ＿７に含まれていて、且つ２段ハッシュ値（より詳細には、２段ハッシュ値で特定されるグループ）に対応付けられたリーフページのみをメモリ１２２に読み込むだけで良い。
【００７１】
更に本実施形態において、最も大きいサイズのリーフページは、７段目のＴＢＬ＿７のリーフページＬＰ＿ｋ（７）である。このリーフページＬＰ＿ｋ（７）は６，１４４個のエントリを有している。したがって本実施形態においてストレージコントローラ１２は、上述のＩ／Ｏ処理で、最大でも６，１４４個のエントリを有するリーフページをストレージ装置（より詳細には、ＨＤＤ１２３）からメモリ（より詳細には、メモリ１２２）に読み込むだけで良い。換言するならば、メモリ１２２はハッシュテーブル２０５に関し、６，１４４エントリを格納するためのテーブル領域を有するだけで良い。
【００７２】
よって本実施形態によれば、ハッシュ値探索の範囲を、従来技術に比較して大幅に掘らすことができる。これにより本実施形態によれば、ハッシュ値探索の一層の高速化を実現して、ストレージシステム１０の書き込み性能をより向上することができる。
【００７３】
図６は図５に示される管理情報ＭＩ１＿０のフォーマットの例を示す。管理情報ＭＩ１＿０は、前述したように、テーブルＴＢＬ＿１が有するリーフページＬＰ＿ｋ（１）の先頭のセクタＳＴ＿０に登録される。管理情報ＭＩ１＿０は、８つのフィールドＦ０乃至Ｆ７を含む。フィールドＦ０乃至Ｆ７の各々の長さは２バイトである。
【００７４】
管理情報ＭＩ１＿０のフィールドＦ０は、使用エントリカウントＣＮＴを設定するのに用いられる。使用エントリカウントＣＮＴは、管理情報ＭＩ１＿０（つまり、フィールドＦ０を含む管理情報ＭＩ１＿０）が登録されるセクタＳＴ＿０においてハッシュ情報の登録に使用されているエントリの数を示す。
【００７５】
管理情報ＭＩ１＿０のフィールドＦ１乃至Ｆ７は、使用エントリカウントＣＮＴ１乃至ＣＮＴ７を設定するのに用いられる。使用エントリカウントＣＮＴ１乃至ＣＮＴ７は、テーブルＴＢＬ＿１乃至ＴＢＬ＿７のリーフページＬＰ＿ｋ（１）乃至ＬＰ＿ｋ（７）においてハッシュ情報の登録に使用されているエントリの数を示す。
【００７６】
図７は、図５に示される管理情報ＭＩ１＿ｉ（ｉ＝１，２，…，７）のフォーマットの例を示す。管理情報ＭＩ１＿ｉは、前述したように、テーブルＴＢＬ＿１が有するリーフページＬＰ＿ｋ（１）のセクタＳＴ＿ｉ（つまり、セクタＳＴ＿０を除くセクタ）に登録される。管理情報ＭＩ１＿ｉは、フィールドＦ０を含む。フィールドＦ０の長さは２バイトである。
【００７７】
管理情報ＭＩ１＿ｉのフィールドＦ０は、管理情報ＭＩ１＿０と同様に、使用エントリカウントＣＮＴを設定するのに用いられる。この使用エントリカウントＣＮＴは、管理情報ＭＩ１＿ｉが登録されるセクタＳＴ＿ｉにおいてハッシュ情報の登録に使用されているエントリの数を示す。図７に示される管理情報ＭＩ１＿ｉのフォーマットは、テーブルＴＢＬ＿２乃至ＴＢＬ＿７が有するリーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）の全てのセクタに登録される管理情報にも適用される。
【００７８】
図８は、図２に示されるメタテーブル２０６のデータ構造例を示す。メタテーブル２０６は、論理ボリュームを４Ｋ（キロ）バイト毎に区切ることにより得られる各領域（４Ｋバイト領域）に書き込まれているチャンクを管理するのに用いられる。メタテーブル２０６は、論理ボリュームのそれぞれの４Ｋバイト領域（より詳細には、４Ｋバイト領域に格納されるチャンク）を指し示す論理アドレスに対応付けられたエントリの集合を有する。
【００７９】
メタテーブル２０６の各エントリは、当該エントリに対応付けられた論理アドレスの示す４Ｋバイト領域に格納されるチャンクのチャンク番号を登録するのに用いられる。つまりメタテーブル２０６は、各４Ｋバイト領域に書き込まれているチャンクを示すために、当該４Ｋバイト領域の論理アドレスと、当該チャンクに割り当てられたチャンク番号とを対応付けるテーブルである。したがって重複管理部２０１は、メタテーブル２０６を参照することにより、目的の論理アドレスで指定される領域に格納されているチャンクを特定できる。
【００８０】
図９は、図２に示されるチャンクテーブル２０７のデータ構造例を示す。チャンクテーブル２０７は、チャンク番号に対応付けられたエントリの集合を有する。チャンクテーブル２０７の各エントリは、当該エントリと対応付けられたチャンク番号を有するチャンクに関するチャンク情報を登録するのに用いられる。チャンク情報は、物理アドレス及び参照カウントＲＣＮＴを含む。
【００８１】
チャンクテーブル２０７の各エントリは、物理アドレスフィールド及び参照カウントフィールドを有する。物理アドレスフィールドは、当該物理アドレスフィールドを有するエントリ（以下、対応エントリと称する）に対応付けられたチャンク番号を持つチャンクの物理位置を指し示す物理アドレスを登録するのに用いられる。チャンクの物理位置とは、当該チャンクが実際に格納されているＨＤＤ／ＳＳＤアレイ１１の記憶領域の位置を指す。
【００８２】
参照カウントフィールドは、参照カウントＲＣＮＴを登録するのに用いられる。参照カウントＲＣＮＴは、対応エントリに対応付けられたチャンク番号で特定されるチャンク（以下、対応チャンクと称する）が、幾つの論理アドレス（４Ｋバイト領域）に対応付けられているかを示す。
【００８３】
例えば、参照カウントＲＣＮＴが“１”の場合、当該参照カウントＲＣＮＴは、対応チャンクが重複排除の対象となることなくＨＤＤ／ＳＳＤアレイ１１に書き込まれていることを示す。換言するならば、参照カウントＲＣＮＴは、対応チャンクが、論理ボリューム内の１つの論理アドレスの指し示す４Ｋバイト領域だけに書き込まれていることを示す。これに対し、参照カウントＲＣＮが例えば“２”の場合、当該参照カウントＲＣＮは、重複排除により、ＨＤＤ／ＳＳＤアレイ１１には実体として１つのチャンクが書き込まれているものの、当該チャンクが２つの論理アドレスに対応付けられていることを示す。換言するならば、ホスト２０からは、同一内容を持つチャンクが論理ボリューム内の２つの論理アドレスの指し示す４Ｋバイト領域に書き込まれていることを示す。
【００８４】
次に、本実施形態の動作について、図１０乃至図１２を参照して説明する。図１０は、ストレージシステム１０のストレージコントローラ１２がホスト２０からデータ書き込み要求を受信した場合に実行されるデータ書き込み処理の典型的な手順を説明するためのフローチャートの一部を示す図である。図１１は、同データ書き込み処理の典型的な手順を説明するためのフローチャートの他の一部を示す図であり、図１２は、同データ書き込み処理の典型的な手順を説明するためのフローチャートの残りを示す図である。
【００８５】
今、ホスト２０からネットワーク３０を介してストレージシステム１０に、ファイルの書き込みを指定するデータ書き込み要求（つまり、ファイル書き込み要求）が送られたものとする。そして、ストレージシステム１０のストレージコントローラ１２が、ホスト２０からのファイル書き込み要求を受信したものとする。
【００８６】
すると、ストレージコントローラ１２の分割部２００は、ファイル書き込み要求で指定されたファイル（つまりファイルデータ）を例えば４Ｋバイト毎に区切る。これにより、分割部２００は、指定されたファイルを、４Ｋバイトのサイズを有する複数のチャンクに分割する（ステップＳ１）。つまり重複管理部２０１は、指定されたファイルから当該ファイルを構成する複数のチャンクを取得する。なお、指定されたファイルのサイズが４Ｋバイトの場合には、分割部２００は、当該ファイル自体を１つのチャンクとして取得する。ここで、チャンクのサイズは固定長である必要はない。つまりチャンクのサイズは可変長であっても構わない。
【００８７】
重複管理部２０１は、取得されたチャンクの数を変数Ｎに設定する（ステップＳ２）。ここで、取得されたＮ個のチャンクをチャンクＣ＿１乃至Ｃ＿Ｎと表記する。ハッシュ生成部２０３は、チャンクＣ＿１乃至Ｃ＿Ｎのハッシュ値（つまり１段ハッシュ値）Ｈ１（Ｃ＿１）乃至Ｈ１（Ｃ＿Ｎ）を、例えば“ＳＨＡ−２５６”と呼ばれる第１のハッシュ関数を用いて計算する（ステップＳ３）。１段ハッシュ値Ｈ１（Ｃ＿１）乃至Ｈ１（Ｃ＿Ｎ）は、それぞれ３２バイトで表される。
【００８８】
次にハッシュ生成部２０３は、１段ハッシュ値Ｈ１（Ｃ＿１）乃至Ｈ１（Ｃ＿Ｎ）のハッシュ値（つまり２段ハッシュ値）Ｈ２（Ｃ＿１）乃至Ｈ２（Ｃ＿Ｎ）を、第２のハッシュ関数を用いて計算する（ステップＳ４）。前述したように、第２のハッシュ関数は、素数１６，７７７，２１３を除数として用いる除算関数である。つまりハッシュ生成部２０３は、１段ハッシュ値Ｈ１（Ｃ＿１）乃至Ｈ１（Ｃ＿Ｎ）を素数１６，７７７，２１３で除することによって取得される剰余を、２段ハッシュ値Ｈ２（Ｃ＿１）乃至Ｈ２（Ｃ＿Ｎ）として決定する。
【００８９】
すると重複管理部２０１は、ステップＳ１で取得されたＮ個のチャンクの１つを指定するのに用いられる変数ｎを初期値１に設定する（ステップＳ５）。そして重複管理部２０１は、ステップＳ１で取得されたＮ個のチャンクＣ＿１乃至Ｃ＿Ｎからｎ番目のチャンクＣ＿ｎを選択する（ステップＳ６）。
【００９０】
すると重複判定部２０２は、重複管理部２０１によって選択されたチャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ＿ｎ）に一致する１段ハッシュ値をハッシュテーブル２０５から探索するためのハッシュ値探索処理を実行する（ステップＳ７）。このハッシュ値探索処理において重複判定部２０２は、ステップＳ４で計算されたチャンクＣ＿ｎの２段ハッシュ値Ｈ２（Ｃ＿ｎ）と対応付けられているグループに属し、且つハッシュテーブル２０５に登録されている１段ハッシュ値と順次比較する。この比較により、重複判定部２０２は１段ハッシュ値Ｈ１（Ｃ＿ｎ）に一致する１段ハッシュ値を探索する。このハッシュ値探索処理の詳細は後述する。
【００９１】
重複判定部２０２は、ハッシュ値探索処理の結果に基づいて、選択されたチャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ＿ｎ）に一致する１段ハッシュ値がハッシュテーブル２０５に存在するかを判定する（ステップＳ８）。重複管理部２０１は、この重複判定部２０２による判定の結果に基づいて、ステップＳ９またはステップＳ１６に進む。
【００９２】
もし、選択されたチャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ＿ｎ）に一致する１段ハッシュ値が存在しないならば（ステップＳ８のＮｏ）、重複管理部２０１は、チャンクＣ＿ｎと同一内容を持つチャンクはＨＤＤ／ＳＳＤアレイ１１に格納されていないと判断する。この場合、重複管理部２０１はステップＳ９に進む。
【００９３】
ステップＳ９において重複管理部２０１は、チャンクＣ＿ｎにチャンク番号ＣＮＣ＿ｎを付与する。本実施形態では、シーケンシャルなチャンク番号が付与される。ステップＳ９でチャンクＣ＿ｎに付与されるチャンク番号ＣＮＣ＿ｎは、他のチャンクに既に付与されている最新のチャンク番号に１を加算することによって得られる。このため、例えばＨＤＤ１２３には、最新のチャンク番号（または次に付与されるべきチャンク番号）が格納される。この最新のチャンク番号は、ＨＤＤ１２３からメモリ１２２のワーク領域１２２ｃにロードされて用いられる。
【００９４】
なお、チャンクテーブル２０７のエントリを先頭エントリから順に参照することによっても、重複管理部２０１は、最新のチャンク番号を取得することができる。また、次に付与されるべきチャンク番号に対応付けられるチャンクテーブル２０７のエントリを指し示す次エントリポインタを、重複管理部２０１が用いても良い。重複管理部２０１は、この次エントリポインタに基づいて、チャンクＣ＿ｎに付与されるチャンク番号ＣＮＣ＿ｎを決定することができる。
【００９５】
チャンクＣ＿ｎにチャンク番号ＣＮＣ＿ｎが付与されると、アクセスコントローラ２０４は、当該チャンクＣ＿ｎをＨＤＤ／ＳＳＤアレイ１１内の空いている記憶領域に書き込む（ステップＳ１０）。すると重複管理部２０１は、チャンクＣ＿ｎの２段ハッシュ値Ｈ２（Ｃ−ｎ）と対応付けられているハッシュテーブル２０５内のリーフページＬＰ＿ｋ（ｈ）に、チャンクＣ＿ｎのハッシュ情報ＨＩＣ＿ｎを登録する（ステップＳ１１）。このハッシュ情報ＨＩＣ＿ｎは、チャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ−ｎ）及び当該チャンクＣ＿ｎのチャンク番号の対を含む。
【００９６】
ＬＰ＿ｋ（ｈ）は、後述するように、ハッシュ値探索処理（ステップＳ７）で最後にハッシュ値が探索されたリーフページを示す。ここで、ＬＰ＿ｋ（ｈ）におけるｋは、グループインデックスとして用いられる２段ハッシュ値Ｈ２（Ｃ−ｎ）を表す。また、ＬＰ＿ｋ（ｈ）におけるｈは、リーフページＬＰ＿ｋ（ｈ）が、ｈ段目のテーブルＴＢＬ＿ｈに含まれていることを示す。つまり、ＬＰ＿ｋ（ｈ）は、ｈ段目のテーブルＴＢＬ＿ｈに含まれているｋ番目のリーフページであることを示す。
【００９７】
ステップＳ１１の詳細について、以下に説明する。まず、最後にハッシュ値が探索されたリーフページＬＰ＿ｋ（ｈ）のセクタ及び当該セクタのエントリが、それぞれ、当該リーフページＬＰ＿ｋ（ｈ）のｉ番目のセクタＳＴ＿ｉ及び当該ｉ番目のセクタＳＴ＿ｉのｊ番目のエントリであるものとする。この場合、重複判定部２０２は、リーフページＬＰ＿ｋ（ｈ）のｉ番目のセクタＳＴ＿ｉ内のｊ＋１番目のエントリに、チャンクＣ＿ｎのハッシュ情報ＨＩＣ＿ｎを登録する。
【００９８】
また重複管理部２０１は、セクタＳＴ＿ｉに含まれている管理情報中の使用エントリカウントＣＮＴを１だけインクリメントする。更に重複管理部２０１は、リーフページＬＰ＿ｋ（１）の先頭のセクタＳＴ＿０に含まれている管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴｈを１だけインクリメントする。この管理情報ＭＩ１＿０は、後述するように、リーフページＬＰ＿ｋ（１）の先頭のセクタＳＴ＿０だけでなく、ワーク領域１２２ｃにも格納されている。
【００９９】
本実施形態では、ワーク領域１２２ｃに格納されている管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴｈがインクリメントされる。当該ワーク領域１２２ｃに格納されている管理情報ＭＩ１＿０は、ＨＤＤ１２３に格納されているリーフページＬＰ＿ｋ（１）の先頭のセクタＳＴ＿０の管理情報ＭＩ１＿０に、適当なタイミングで、例えば上書きされる。適当なタイミングとは、例えばストレージシステム１０がビジーでない場合、或いはストレージシステム１０の電源が遮断される前のタイミングを指す。
【０１００】
また、ｉ番目のセクタＳＴ＿ｉのｊ番目のエントリが、当該ｉ番目のセクタの最終エントリ（ここでは、ｉ＝１１）であるものとする。この場合、重複判定部２０２は、リーフページＬＰ＿ｋ（ｈ）の“ｉ＋１”番目のセクタＳＴ＿（ｉ＋１）内の先頭エントリに、チャンクＣ＿ｎのハッシュ情報ＨＩＣ＿ｎを登録する。
【０１０１】
また重複管理部２０１は、セクタＳＴ＿（ｉ＋１）に含まれている管理情報中の使用エントリカウントＣＮＴを１だけインクリメントする。更に重複管理部２０１は、管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴｈを１だけインクリメントする。
【０１０２】
次に、最後にハッシュ値が探索されたリーフページＬＰ＿ｋ（ｈ）内のエントリが、当該リーフページＬＰ＿ｋ（ｈ）の最終のエントリ（より詳細には、リーフページＬＰ＿ｋ（ｈ）の最終のセクタ内の最終のエントリ）であるものとする。つまり、リーフページＬＰ＿ｋ（ｈ）の全てのエントリが使用されており、当該リーフページＬＰ＿ｋ（ｈ）内に空きエントリはないものとする。この場合、重複管理部２０１は上述の説明と異なり、“ｈ＋１”段目のテーブルＴＢＬ＿（ｈ＋１）に含まれているｋ番目のリーフページＬＰ＿ｋ（ｈ＋１）の先頭のセクタＳＴ＿０（より詳細には、リーフページＬＰ＿ｋ（ｈ＋１）の先頭のセクタＳＴ＿０内の先頭のエントリ）にチャンクＣ＿ｎのハッシュ情報ＨＩＣ＿ｎを登録する。
【０１０３】
また重複管理部２０１は、リーフページＬＰ＿ｋ（ｈ＋１）の先頭のセクタＳＴ＿０に含まれている管理情報中の使用エントリカウントＣＮＴを１だけインクリメントする。更に重複管理部２０１は、管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴ（ｈ＋１）を１だけインクリメントする。
【０１０４】
さて、重複管理部２０１はステップＳ１１を実行すると、ステップＳ１２に進む。ステップＳ１２において重複管理部２０１は、選択されたチャンクＣ＿ｎの論理ボリューム内の位置を示す論理アドレスを取得する。この論理アドレスは、ホスト２０からのファイル書き込み要求で指定される論理アドレス（ファイルの先頭アドレス）に４Ｋ（つまり、４，０９６）×（ｎ−１）を加算することにより取得される。ステップＳ１２において重複管理部２０１は更に、取得された論理アドレスに対応付けられているメタテーブル２０６のエントリに、選択されたチャンクＣ＿ｎに付与されたチャンク番号ＣＮＣ＿ｎを登録する。
【０１０５】
重複管理部２０１はステップＳ１２を実行すると、ステップＳ１３に進む。ステップＳ１３において、まず重複管理部２０１は、選択されたチャンクＣ＿ｎに付与されたチャンク番号ＣＮＣ＿ｎに対応付けられたチャンクテーブル２０７のエントリを選択する。ステップＳ１３において、重複管理部２０１は更に、選択されたエントリに、選択されたチャンクＣ＿ｎに関するチャンク情報ＣＩＣ＿ｎを登録する。このチャンク情報ＣＩＣ＿ｎは、選択されたチャンクＣ＿ｎが書き込まれたＨＤＤ／ＳＳＤアレイ１１内の記憶領域の物理アドレス及び参照カウントＲＣＮを含む。参照カウントＲＣＮの値は“１”である。
【０１０６】
重複管理部２０１はステップＳ１３を実行すると、ステップＳ１４に進む。ステップＳ１４において重複管理部２０１は変数ｎを１インクリメントする。そして重複管理部２０１は、インクリメントされた変数ｎがステップＳ２で設定されたチャンク数Ｎを超えているかを判定する（ステップＳ１５）。もし、インクリメントされた変数ｎがチャンク数Ｎを超えていないならば（ステップＳ１５のＮｏ）、重複管理部２０１は、ホスト２０からのファイル書き込み要求によって指定されたファイルに含まれている次のチャンクの書き込みを処理するために、ステップＳ６に戻る。これに対してインクリメントされた変数ｎがチャンク数Ｎを超えているならば（ステップＳ１５のＹｅｓ）、重複管理部２０１は、ホスト２０からのファイル書き込み要求によって指定されたファイルに含まれている全てのチャンクの書き込みを終了したと判定する。この場合、図１０乃至図１２のフローチャートで示されるデータ書き込み処理は終了する。
【０１０７】
次に、選択されたチャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ＿ｎ）に一致する１段ハッシュ値が存在すると、重複判定部２０２がステップＳ８において判定した場合の動作を説明する。このように、ステップＳ８の判定が“Ｙｅｓ”の場合、重複管理部２０１は、選択されたチャンクＣ＿ｎと同一内容を持つチャンクが既にＨＤＤ／ＳＳＤアレイ１１に格納されていると判定する。ここで、ＨＤＤ／ＳＳＤアレイ１１に既に格納されていて、且つチャンクＣ＿ｎと同一内容を持つチャンクをチャンクＣ＿ｘと表記する。
【０１０８】
ステップＳ８の判定が”Ｙｅｓ”の場合、同一内容を持つ複数のチャンクが重複してＨＤＤ／ＳＳＤアレイ１１に格納されるのを排除するために、重複管理部２０１はステップＳ１６に進む。ステップＳ１６において重複管理部２０１は、選択されたチャンクＣ＿ｎを、アクセスコントローラ２０４がＨＤＤ／ＳＳＤアレイ１１に書き込む動作を抑止する。
【０１０９】
次に重複管理部２０１は、チャンクＣ＿ｘのチャンク番号を、選択されたチャンクＣ＿ｎのチャンク番号ＣＮＣ＿ｎとして、メタテーブル２０６に登録する（ステップＳ１７）。これにより、メタテーブル２０６には、同一のチャンク番号が、メタテーブル２０６内の少なくとも２つのエントリに登録されることになる。重複管理部２０１は、このチャンク番号が登録されるべきメタテーブル２０６のエントリを特定するために、選択されたチャンクＣ＿ｎの論理ボリューム内の位置を示す論理アドレスを、ステップＳ１２と同様の方法で取得する。
【０１１０】
重複管理部２０１はステップＳ１７を実行するとステップＳ１８に進む。ステップＳ１８において、まず重複管理部２０１は、選択されたチャンクＣ＿ｎのチャンク番号（つまり、チャンクＣ＿ｘのチャンク番号）に対応付けられたチャンクテーブル２０７のエントリに登録されているチャンク情報ＣＩ＿Ｃｎを参照する。ステップＳ１８において、重複管理部２０１は更に、参照されたチャンク情報中の参照カウントＲＣＮＴを１インクリメントする。これにより、インクリメントされた参照カウントＲＣＮＴは、ＨＤＤ／ＳＳＤアレイ１１には実体として１つのチャンクが書き込まれているものの、同一内容を持つＲＣＮＴ個のチャンクが論理ボリューム内のＲＣＮＴ個の４Ｋバイト領域に書き込まれていることを示す。
【０１１１】
重複管理部２０１はステップＳ１８を実行するとステップＳ１９に進む。ステップＳ１９において、まず重複管理部２０１は、チャンクＣ＿ｘ（つまり、選択されたチャンクＣ＿ｎと同一内容を持つチャンクＣ＿ｘ）が書かれているＨＤＤ／ＳＳＤアレイ１１の記憶領域を指し示す物理アドレスを取得する。この物理アドレスは、ステップＳ１８で参照されたチャンク情報に含まれている。ステップＳ１９において、重複管理部２０１は更に、取得された物理アドレスを、選択されたチャンクＣ＿ｎの論理アドレスに割り当てる。具体的には、重複管理部２０１は、図示せぬアドレス変換テーブルに、選択されたチャンクＣ＿ｎの論理アドレスと取得された物理アドレスとの対応を示すアドレス変換情報（つまり、マッピング情報）を登録する。重複管理部２０１はステップＳ１９を実行すると、ステップＳ１４に進む。以降の動作は、重複管理部２０１がステップＳ１３からステップＳ１４に進んだ場合と同様である。
【０１１２】
なお、ステップＳ１９は必ずしも必要でない。例えば、ホスト２０によって指定された論理アドレスを、重複管理部２０１は以下に述べるように、アドレス変換テーブルを用いることなく物理アドレスに変換することができる。重複管理部２０１はまず、ホスト２０によって指定された論理アドレスに基づいてメタテーブル２０６を参照することにより、当該論理アドレスに対応付けられたエントリに登録されているチャンク番号を取得する。次に重複管理部２０１は、取得されたチャンク番号に基づいてチャンクテーブル２０７を参照することにより、当該チャンクに対応付けられたエントリに登録されている物理アドレスを取得する。
【０１１３】
次に、本実施形態におけるハッシュ値探索処理（ステップＳ７）の詳細について、図１３及び図１４を参照して説明する。図１３は、ハッシュ値探索処理の典型的な手順を説明するためのフローチャートの一部を示す図である。図１３は、同ハッシュ値探索処理の典型的な手順を説明するためのフローチャートの残りを示す図である。
【０１１４】
まず重複判定部２０２は、変数ｈを初期値１に設定する（ステップＳ２１）。変数ｈは、ハッシュテーブル２０５内のｈ段目のテーブルＴＢＬ＿ｈを示す。ステップＳ２１において重複判定部２０２は更に、変数ｋを、選択されたチャンクＣ＿ｎの２段ハッシュ値Ｈ２（Ｃ＿ｎ）に設定する。変数ｋは、テーブルＴＢＬ＿ｈに含まれていて、且つ選択されたチャンクＣ＿ｎの２段ハッシュ値Ｈ２（Ｃ＿ｎ）に対応付けられているｋ番目のリーフページＬＰ＿ｋ（ｈ）を示す。ステップＳ２１において重複判定部２０２は更に、変数ｉ及びｊを、いずれも初期値０に設定する。変数ｉは、変数ｈ及びｋに基づいて特定されるリーフページＬＰ＿ｋ（ｈ）に含まれているｉ番目のセクタＳＴ＿ｉを示す。変数ｊは、セクタＳＴ＿ｉ内のｊ番目のエントリを示す。
【０１１５】
次に重複判定部２０２は、ハッシュテーブル２０５からｈ段目のテーブルＴＢＬ＿ｈを選択する（ステップＳ２２）。変数ｈが１である本実施形態では、テーブルＴＢＬ＿ｈとして１段目のテーブルＴＢＬ＿１が選択される。次に重複判定部２０２は、選択されたテーブルＴＢＬ＿ｈに含まれていて、且つ選択されたチャンクＣ＿ｎの２段ハッシュ値Ｈ２（Ｃ＿ｎ）＝ｋに対応付けられているｋ番目のリーフページＬＰ＿ｋ（ｈ）を選択する（ステップＳ２３）。ここでは、ｈが１であることから、テーブルＴＢＬ＿１のｋ番目のリーフページＬＰ＿ｋ（１）がリーフページＬＰ＿ｋ（ｈ）として選択される。ステップＳ２３において、重複判定部２０２は、選択されたリーフページＬＰ＿ｋ（ｈ）をＨＤＤ１２３から読み出して、当該読み出されたリーフページＬＰ＿ｋ（ｈ）をメモリ１２２のテーブル領域１２２ｂに格納する。つまり重複判定部２０２は、選択されたリーフページＬＰ＿ｋ（ｈ）をメモリ１２２のテーブル領域１２２ｂにロードする。
【０１１６】
次に重複判定部２０２は、選択された（ロードされた）リーフページＬＰ＿ｋ（ｈ）（ここでは、リーフページＬＰ＿ｋ（１））のｉ番目のセクタＳＴ＿ｉを選択する（ステップＳ２４）。ここでは、ｉ番目のセクタＳＴ＿ｉとして、先頭（０番目）のセクタＳＴ＿０が選択される。
【０１１７】
重複判定部２０２は、リーフページＬＰ＿ｋ（１）（つまり、メモリ１２２のテーブル領域１２２ｂに格納されたリーフページＬＰ＿ｋ（１））の先頭のセクタＳＴ＿０を選択した際に、当該セクタＳＴ＿０に含まれている管理情報ＭＩ１＿０を、例えばメモリ１２２のワーク領域１２２ｃにも格納する。これにより、重複判定部２０２は管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴ２乃至ＣＮＴ７を参照するだけで、テーブルＴＢＬ＿２乃至ＴＢＬ＿７のリーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）内でそれぞれ使用されているエントリの数を取得することができる。つまり重複判定部２０２は、リーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）をＨＤＤ１２３から読み出す前に、当該リーフページＬＰ＿ｋ（２）乃至ＬＰ＿ｋ（７）内でそれぞれ使用されているエントリの数を取得することができる。また、重複判定部２０２は、管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴ１に基づいて、リーフページＬＰ＿ｋ（１）内で使用されているエントリの数を取得することもできる。
【０１１８】
よって重複判定部２０２は、リーフページＬＰ＿ｋ（１）乃至ＬＰ＿ｋ（７）内でそれぞれ使用されているエントリの数（つまり、管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴ１乃至ＣＮＴ７）に基づいて、使用されているエントリの数が零のリーフページを特定することができる。ここで、使用エントリカウントＣＮＴ１乃至ＣＮＴ４が非零で、使用エントリカウントＣＮＴ５乃至ＣＮＴ７が零であるものとする。この場合、重複判定部２０２は、せいぜい、リーフページＬＰ＿ｋ（１）乃至ＬＰ＿ｋ（４）を対象にハッシュ値探索を行えば良いと決定できる。このリーフページに関する最大の探索範囲をｈｍａｘと表記する。この例では、ｈｍａｘは４であり、リーフページＬＰ＿ｋ（１）を先頭とする４つのリーフページが最大の探索範囲であることを示す。。
【０１１９】
同様に重複判定部２０２は、管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴｈ（ｈ＝１，２，…，７）に基づいて、リーフページＬＰ＿ｋ（ｈ）において使用されているセクタの数を特定できる。例えば、リーフページＬＰ＿ｋ（１）（ｈ＝１）の各セクタのエントリの数は１２である。したがって、使用エントリカウントＣＮＴ１（ｈ＝１）が例えば１６である場合、重複判定部２０２は、リーフページＬＰ＿ｋ（１）において使用されているセクタの数が２であると特定できる。この場合、重複判定部２０２は、せいぜい、リーフページＬＰ＿ｋ（１）内のセクタＳＴ＿０及びＳＴ＿１を対象にハッシュ値探索を行えば良いと決定できる。このセクタに関する最大の探索範囲をｉｍａｘ（ｈ，ＣＮＴ１）と表記する。ｉｍａｘ（ｈ，ＣＮＴ１）は、リーフページＬＰ＿ｋ（１）において使用されているセクタの数から１を減じることによって得られる値である。
【０１２０】
重複判定部２０２はステップＳ２４を実行すると、ステップＳ２５に進む。ステップＳ２５において重複判定部２０２は、選択されたセクタＳＴ＿ｉのｊ番目のエントリから１段ハッシュ値Ｈ１（Ｃ＿ｘ）を読み出す。次に重複判定部２０２は、読み出された１段ハッシュ値Ｈ１（Ｃ＿ｘ）とステップＳ１で計算されたチャンクＣ＿ｎの１段ハッシュ値Ｈ１（Ｃ＿ｎ）とを比較する（ステップＳ２６）。そして重複判定部２０２は、１段ハッシュ値Ｈ１（Ｃ＿ｘ）と１段ハッシュ値Ｈ１（Ｃ＿ｎ）とが等しいかを判定する（ステップＳ２７）。
【０１２１】
もし、ステップＳ２７の判定が“Ｙｅｓ”であるならば、重複判定部２０２は、セクタＳＴ＿ｉのｊ番目のエントリに含まれていて、且つ１段ハッシュ値Ｈ１（Ｃ＿ｘ）と対をなすチャンク番号を取得する（ステップＳ２８）。ステップＳ２７において重複判定部２０２は、取得されたチャンク番号を、選択されたチャンクＣ＿ｎと同一内容を持つチャンクＣ＿ｘのチャンク番号として、例えばメモリ１２２のワーク領域１２２ｃに一時的に格納する。これにより、ハッシュ値探索処理（ステップＳ７）は終了し、重複判定部２０２はステップＳ８へ進む。ワーク領域１２２ｃに一時的に格納されたチャンクＣ＿ｘのチャンク番号は、ステップＳ１７で用いられる。
【０１２２】
一方、ステップＳ２７の判定が“Ｎｏ”であるならば、重複判定部２０２は、１段ハッシュ値Ｈ１（Ｃ＿ｎ）と比較されるべき次の１段ハッシュ値を取得するために、ステップＳ２９に進む。ステップＳ２９において重複判定部２０２は、変数ｊを１だけインクリメントする。次に重複判定部２０２は、インクリメントされた変数ｊが変数ｊの最大値ｊｍａｘを超えているかを判定する（ステップＳ３０）。本実施形態において変数ｊの最大値ｊｍａｘは、１１である。
【０１２３】
もし、ステップＳ３０の判定が“Ｎｏ”であるならば、重複判定部２０２はステップＳ３１に進む。ステップＳ３１において、重複判定部２０２は、変数ｊがｊｍａｘ（ＣＮＴ）を超えているかを判定する。ｊｍａｘ（ＣＮＴ）は、リーフページＬＰ＿ｋ（ｈ）のセクタＳＴ＿ｉに含まれている管理情報ＭＩｈ＿ｉ中の使用エントリカウントＣＮＴを１だけ減じることによって得られる値（つまり、“ＣＮＴ−１”）である。つまり、ｊｍａｘ（ＣＮＴ）は、リーフページＬＰ＿ｋ（ｈ）のセクタＳＴ＿ｉにおけるエントリに関する最大の探索範囲を示す。
【０１２４】
もし、変数ｊがｊｍａｘ（ＣＮＴ）（つまり“ＣＮＴ−１”）を超えているならば（ステップＳ３１のＹｅｓ）、重複判定部２０２は、１段ハッシュ値Ｈ１（Ｃ＿ｎ）と比較されるべき新たな１段ハッシュ値はハッシュテーブル２０５に存在せず、したがって１段ハッシュ値Ｈ１（Ｃ＿ｎ）はハッシュテーブル２０５に登録されている全ての１段ハッシュ値と一致しないと判定する。この場合、重複判定部２０２は、ハッシュ値探索処理を終了する。これに対して変数ｊがｊｍａｘ（ＣＮＴ）を超えていないならば（ステップＳ３１のＮｏ）、重複判定部２０２は、リーフページＬＰ＿ｋ（ｈ）のセクタＳＴ＿ｉ内の次のエントリから１段ハッシュ値を読み出すたためにステップＳ２５に戻る。
【０１２５】
一方、ステップＳ３０の判定が“Ｙｅｓ”であるならば、重複判定部２０２は、変数ｉを１インクリメントする（ステップＳ３２）。そして重複判定部２０２は、インクリメントされた変数ｉが変数ｉの最大値ｉｍａｘ（ｈ）を超えているかを判定する（ステップＳ３３）。変数ｉの最大値ｉｍａｘ（ｈ）は、変数ｈが例えば１であれば７（８−１＝７）であり、変数ｈが例えば２であれば１５（１６−１）である。
【０１２６】
もし、ステップＳ３３の判定が“Ｎｏ”であるならば、重複判定部２０２はステップＳ３４に進む。ステップＳ３４において、重複判定部２０２は、変数ｉがｉｍａｘ（ｈ，ＣＮＴｈ）を超えているかを判定する。ｉｍａｘ（ｈ，ＣＮＴｈ）は、前述したように、リーフページＬＰ＿ｋ（ｈ）において使用されているセクタの数から１を減じることによって得られる値である。
【０１２７】
もし、変数ｉがｉｍａｘ（ｈ，ＣＮＴｈ）を超えているならば（ステップＳ３４のＹｅｓ）、重複判定部２０２は、１段ハッシュ値Ｈ１（Ｃ＿ｎ）と比較されるべき新たな１段ハッシュ値はハッシュテーブル２０５に存在せず、したがって１段ハッシュ値Ｈ１（Ｃ＿ｎ）はハッシュテーブル２０５に登録されている全ての１段ハッシュ値と一致しないと判定する。この場合、重複判定部２０２は、ハッシュ値探索処理を終了する。これに対して変数ｉがｉｍａｘ（ｈ，ＣＮＴｈ）を超えているならば（ステップＳ３４のＮｏ）、重複判定部２０２は、リーフページＬＰ＿ｋ（ｈ）（ここでは、ＬＰ＿ｋ（１））の次のセクタを選択するためにステップＳ２４に戻る。
【０１２８】
一方、ステップＳ３３の判定が“Ｙｅｓ”であるならば、重複判定部２０２は、変数ｈを１だけインクリメントする（ステップＳ３５）。そして重複判定部２０２は、インクリメントされた変数ｈが、ｈｍａｘを超えているかを判定する（ステップＳ３６）。ｈｍａｘは、前述したように、リーフページＬＰ＿ｋ（１）の先頭のセクタＳＴ＿０に含まれている管理情報ＭＩ１＿０中の使用エントリカウントＣＮＴ１乃至ＣＮＴ７に基づいて決定される。
【０１２９】
もし、ステップＳ３６の判定が“Ｎｏ”であるならば、重複判定部２０２は、ハッシュテーブル２０５から次のテーブル及び当該次のテーブル内の次のリーフページを選択するためにステップＳ２２に戻る。これに対し、ステップＳ３６の判定が“Ｙｅｓ”であるならば、重複判定部２０２は、１段ハッシュ値Ｈ１（Ｃ＿ｎ）と比較されるべき新たな１段ハッシュ値はハッシュテーブル２０５に存在せず、したがって１段ハッシュ値Ｈ１（Ｃ＿ｎ）はハッシュテーブル２０５に登録されている全ての１段ハッシュ値と一致しないと判定する。この場合、重複判定部２０２は、ハッシュ値探索処理を終了する。
【０１３０】
次に、ホスト２０によって要求されたファイル書き込みの例について、図１５乃至図１８を参照して説明する。図１５は、ホスト２０から順に送られる３つのファイル書き込み要求によって指定されるファイルＦ０乃至Ｆ２と、当該ファイルＦ０乃至Ｆ２が４Ｋバイト毎に区切るられることにより取得されるチャンクとの関係の例を示す。図１６は、ハッシュテーブル２０５に含まれている例えば１段目のテーブルＴＢＬ＿１の内容の変化の例を示す。図１７は、メタテーブル２０６の内容の変化の例を示す。図１８は、チャンクテーブル２０７の内容の変化の例を示す。
【０１３１】
まず、ストレージシステム１０の運用の開始後に、ホスト２０からストレージシステム１０のストレージコントローラ１２に、図１５（Ａ）に示される１６ＫバイトのファイルＦ０を論理ボリュームの論理アドレスＬａ０から始まる領域に書き込むことが要求されたものとする。この場合、ストレージコントローラ１２の分割部２００は、ファイルＦ０を４つのチャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３に分割する。チャンクＣａ１，Ｃａ２及びＣａ３が書き込まれるべき論理アドレスＬａ１，Ｌａ２及びＬａ３は、それぞれＬａ０＋４Ｋ，Ｌａ０＋８Ｋ，Ｌａ０＋１２Ｋである。チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３はそれぞれデータＡ，Ｂ，Ｃ及びＤを有する。ハッシュ生成部２０３は、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３のハッシュ値（１段ハッシュ値）Ｈ（Ａ），Ｈ（Ｂ），Ｈ（Ｃ）及びＨ（Ｄ）を計算する。
【０１３２】
ここで、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３と同一内容を有する他のチャンクが存在しないものとする。この場合、アクセスコントローラ２０４は、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３をＨＤＤ／ＳＳＤアレイ１１の空き領域、例えば物理アドレスＰａ０，Ｐａ１，Ｐａ２及びＰａ３で指定される物理領域に書き込む。また、重複管理部２０１は、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３に、例えばチャンク番号０，１，２及び３を付与する。
【０１３３】
重複管理部２０１は、１段ハッシュ値Ｈ（Ａ），Ｈ（Ｂ），Ｈ（Ｃ）及びＨ（Ｄ）とチャンク番号０，１，２及び３とのそれぞれの対を、例えば、図１６（Ａ）に示されるようにテーブルＴＢＬ＿１に登録する。なお、図１６（Ａ）では省略されているが、これらの対は、ハッシュ値Ｈ（Ａ），Ｈ（Ｂ），Ｈ（Ｃ），Ｈ（Ｄ）それぞれの２段ハッシュ値に対応付けられたテーブルＴＢＬ＿１のリーフページに登録される。
【０１３４】
また重複管理部２０１は、論理アドレスＬａ０，Ｌａ１，Ｌａ２及びＬａ３にそれぞれ対応付けられたメタテーブル２０６のエントリに、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３のチャンク番号０，１，２及び３を、図１７（Ａ）に示すように登録する。また重複管理部２０１は、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３のチャンク番号０，１，２及び３にそれぞれ対応付けられたチャンクテーブル２０７のエントリに、チャンクＣａ０，Ｃａ１，Ｃａ２及びＣａ３が書き込まれた物理領域の物理アドレスＰａ０，Ｐａ１，Ｐａ２及びＰａ３を、図１８（Ａ）に示すように登録する。また重複管理部２０１は、チャンクテーブル２０７において、物理アドレスＰａ０，Ｐａ１，Ｐａ２及びＰａ３とそれぞれ対をなす参照カウントＲＣＮＴにいずれも１を設定する。
【０１３５】
次に、ホスト２０からストレージコントローラ１２に、図１５（Ｂ）に示される１２ＫバイトのファイルＦ１を論理ボリュームの論理アドレスＬｂ０から始まる領域に書き込むことが要求されたものとする。この場合、ストレージコントローラ１２の分割部２００は、ファイルＦ１を３つのチャンクＣｂ０，Ｃｂ１及びＣｂ２に分割する。チャンクＣｂ１及びＣｂ２が書き込まれるべき論理アドレスＬｂ１及びＬｂ２は、それぞれＬｂ０＋４Ｋ及びＬｂ０＋８Ｋである。チャンクＣｂ０，Ｃｂ１及びＣｂ２はそれぞれデータＸ，Ｙ及びＡを有する。ハッシュ生成部２０３は、チャンクＣｂ０，Ｃｂ１及びＣｂ２のハッシュ値（１段ハッシュ値）Ｈ（Ｘ），Ｈ（Ｙ）及びＨ（Ａ）を計算する。
【０１３６】
ここでは、チャンクＣｂ０及びＣｂ１と同一内容を有する他のチャンクは存在しないが、チャンクＣｂ２と同一内容（Ａ）を有するチャンクＣａ０が存在する。この場合、アクセスコントローラ２０４は、チャンクＣｂ０及びＣｂ１をＨＤＤ／ＳＳＤアレイ１１の空き領域、例えば物理アドレスＰｂ０及びＰｂ１で指定される物理領域に書き込む。一方、チャンクＣｂ２に関してはチャンクＣａ０との重複を排除するために、重複管理部２０１は、アクセスコントローラ２０４がＨＤＤ／ＳＳＤアレイ１１に当該チャンクＣｂ２を書き込むことを抑止する。また、重複管理部２０１は、チャンクＣｂ０及びＣｂ１に、最新のチャンク番号３に後続するチャンク番号４及び５を付与する。また、チャンクＣａ０と同一内容（Ａ）を有するチャンクＣｂ２のチャンク番号には、当該チャンクＣａ０のチャンク番号０が用いられる。
【０１３７】
重複管理部２０１は、１段ハッシュ値Ｈ（Ｘ）及びＨ（Ｙ）とチャンク番号４及び５とのそれぞれの対を、例えば、図１６（Ｂ）に示されるようにテーブルＴＢＬ＿１に登録する。また重複管理部２０１は、論理アドレスＬｂ０，Ｌｂ１及びＬｂ２にそれぞれ対応付けられたメタテーブル２０６のエントリに、チャンクＣｂ０，Ｃｂ１及びＣｂ２のチャンク番号４，５及び０を、図１７（Ｂ）に示すように登録する。
【０１３８】
また重複管理部２０１は、チャンクＣｂ０及びＣｂ１のチャンク番号４及び５にそれぞれ対応付けられたチャンクテーブル２０７のエントリに、チャンクＣｂ０及びＣｂ１が書き込まれた物理領域の物理アドレスＰｂ０及びＰｂ１を、図１８（Ｂ）に示すように登録する。また重複管理部２０１は、チャンクテーブル２０７において、物理アドレスＰｂ０及びＰｂ１とそれぞれ対をなす参照カウントＲＣＮＴにいずれも１を設定する。また重複管理部２０１は、チャンクＣｂ２と同一内容（Ａ）を有するチャンクＣａ０のチャンク番号０に対応付けられたチャンクテーブル２０７のエントリの参照カウントＲＣＮＴを、図１８（Ａ）に示される１から図１８（Ｂ）に示される２に更新する。
【０１３９】
次に、ホスト２０からストレージコントローラ１２に、図１５（Ｃ）に示される１２ＫバイトのファイルＦ２を論理ボリュームの論理アドレスＬｃ０から始まる領域に書き込むことが要求されたものとする。この場合、ストレージコントローラ１２の分割部２００は、ファイルＦ２を３つのチャンクＣｃ０，Ｃｃ１及びＣｃ２に分割する。チャンクＣｃ１及びＣｃ２が書き込まれるべき論理アドレスＬｃ１及びＬｃ２は、それぞれＬｃ０＋４Ｋ及びＬｃ０＋８Ｋである。チャンクＣｃ０，Ｃｃ１及びＣｃ２はそれぞれデータＥ，Ｆ及びＡを有する。ハッシュ生成部２０３は、チャンクＣｃ０，Ｃｃ１及びＣｃ２のハッシュ値（１段ハッシュ値）Ｈ（Ｅ），Ｈ（Ｆ）及びＨ（Ａ）を計算する。
【０１４０】
ここでは、チャンクＣｃ０及びＣｃ１と同一内容を有する他のチャンクは存在しないが、チャンクＣｃ２と同一内容（Ａ）を有するチャンクＣａ０が存在する。この場合、アクセスコントローラ２０４は、チャンクＣｃ０及びＣｃ１をＨＤＤ／ＳＳＤアレイ１１の空き領域、例えば物理アドレスＰｃ０及びＰｃ１で指定される物理領域に書き込む。一方、チャンクＣｃ２に関してはチャンクＣａ０との重複を排除するために、重複管理部２０１は、アクセスコントローラ２０４がＨＤＤ／ＳＳＤアレイ１１に当該チャンクＣｃ２を書き込むことを抑止する。また、重複管理部２０１は、チャンクＣｃ０及びＣｃ１に、最新のチャンク番号６に後続するチャンク番号７及び８を付与する。また、チャンクＣａ０と同一内容（Ａ）を有するチャンクＣｃ２のチャンク番号には、当該チャンクＣａ０のチャンク番号０が用いられる。
【０１４１】
重複管理部２０１は、１段ハッシュ値Ｈ（Ｅ）及びＨ（Ｙ）とチャンク番号６及び７とのそれぞれの対を、例えば、図１６（Ｃ）に示されるようにテーブルＴＢＬ＿１に登録する。また重複管理部２０１は、論理アドレスＬｃ０，Ｌｃ１及びＬｃ２にそれぞれ対応付けられたメタテーブル２０６のエントリに、チャンクＣｃ０，Ｃｃ１及びＣｃ２のチャンク番号６，７及び０を、図１７（Ｃ）に示すように登録する。
【０１４２】
また重複管理部２０１は、チャンクＣｃ０及びＣｃ１のチャンク番号６及び７にそれぞれ対応付けられたチャンクテーブル２０７のエントリに、チャンクＣｃ０及びＣｃ１が書き込まれた物理領域の物理アドレスＰｃ０及びＰｃ１を、図１８（Ｃ）に示すように登録する。また重複管理部２０１は、チャンクテーブル２０７において、物理アドレスＰｃ０及びＰｃ１とそれぞれ対をなす参照カウントＲＣＮＴにいずれも１を設定する。また重複管理部２０１は、チャンクＣｃ２と同一内容（Ａ）を有するチャンクＣａ０のチャンク番号０に対応付けられたチャンクテーブル２０７のエントリ内の参照カウントＲＣＮＴを、図１８（Ｂ）に示される２から図１８（Ｃ）に示される３に更新する。
【０１４３】
ここで、ホスト２０からストレージコントローラ１２に、ファイルＦ１の削除が要求されたものとする。この場合、重複管理部２０１は、論理アドレスｂ０，ｂ１及びｂ２にそれぞれ対応付けられているメタテーブル２０６の３つのエントリの内容を、図１７（Ｄ）に示されるように無効化する。図１７（Ｄ）では、無効エントリを示すために、該当するエントリに斜線が付されている。このような無効化のために、メタテーブル２０６の各エントリの特定のビットが、当該エントリの内容が有効であるか否かを示すバリッドビットとして用いられる。
【０１４４】
重複管理部２０１は、論理アドレスｂ０，ｂ１及びｂ２にそれぞれ対応付けられているメタテーブル２０６の３つのエントリ内のそれぞれのバリッドビットを、いずれも当該エントリの内容が無効であることを示す状態（例えば“０”）に設定する。また重複管理部２０１は、削除されるファイルＦ１を構成するチャンクＣｂ０，Ｃｂ１及びＣｂ２のチャンク番号４，５及び０にそれぞれ対応付けられたチャンクテーブル２０７のエントリ内の参照カウントＲＣＮＴを、図１８（Ｃ）に示される１，１及び３から図１８（Ｄ）に示される０，０及び２に更新する。
【０１４５】
本実施形態では、このような状態で新たなチャンクがＨＤＤ／ＳＳＤアレイ１１に書き込まれる場合、当該新たなチャンクにはチャネル番号８が付与される。このとき、チャネル番号４及び５が付与されている有効なチャンクは存在しない。そこで本実施形態では、ストレージコントローラ１２の待ち時間、或いはホスト２０からの指示に応じて、断片化解消処理（デフラグメンテーション処理）が行われる。つまり、ＨＤＤ／ＳＳＤアレイ１１に格納されている有効なチャンクが、例えばファイル毎に当該ＨＤＤ／ＳＳＤアレイ１１の物理アドレスが連続する領域に再配置値される。この際、有効な全てのチャンクに連続するチャネル番号が改めて付与される。これに応じて、ハッシュテーブル２０５、メタテーブル２０６及びチャンクテーブル２０７も更新される。
【０１４６】
以上説明した少なくとも１つの実施形態によれば、データの重複を排除するためのハッシュテーブル探索を高速化できるストレージシステムを提供できる。
【０１４７】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【要約】
実施形態によれば、ストレージコントローラは、分割部と、重複管理部と、重複判定部とを具備する。前記分割部は、ホストコンピュータからの書き込み要求によって指定されたデータを複数のチャンクに分割する。前記重複管理部は、第１のチャンクがストレージ装置に書き込まれる場合、前記第１のチャンクの第１のハッシュ値を、前記第１のチャンクと対応付けてハッシュテーブルの第１のテーブルに優先的に登録する。前記ハッシュテーブルは、前記第１のテーブルよりも多くのエントリを有する第２のテーブルを含む。前記重複判定部は、第２のチャンクの第２のハッシュ値が計算された場合、前記第２のハッシュ値に一致する第３のハッシュ値を、まず前記第１のテーブルから探索する。【図１】
0005444506.tif 000002
【図２】
0005444506.tif 000003
【図３】
0005444506.tif 000004
【図４】
0005444506.tif 000005
【図５】
0005444506.tif 000006
【図６】
0005444506.tif 000007
【図７】
0005444506.tif 000008
【図８】
0005444506.tif 000009
【図９】
0005444506.tif 000010
【図１０】
0005444506.tif 000011
【図１１】
0005444506.tif 000012
【図１２】
0005444506.tif 000013
【図１３】
0005444506.tif 000014
【図１４】
0005444506.tif 000015
【図１５】
0005444506.tif 000016
【図１６】
0005444506.tif 000017
【図１７】
0005444506.tif 000018
【図１８】
0005444506.tif 000019