(57)【特許請求の範囲】
【請求項１】
キーとバリューとを対応づけて格納するオブジェクトストレージであって、
前記バリューが記録される第１記憶部と、
前記キーと前記第１記憶部内における前記バリューの記憶位置との対応づけを管理するための第１情報と、前記第１記憶部内の不良記憶領域の位置を管理するための第２情報とが記録される第２記憶部と、
前記第１記憶部と前記第２記憶部とを制御するコントローラと、
を具備し、
前記コントローラは、
前記第２情報に基づき、書き込み対象のバリューの書き込み先として確保した前記第１記憶部内の記憶領域に不良記憶領域が存在するか否かを判定し、
不良記憶領域が存在する場合、前記不良記憶領域を避けるように、前記確保した前記第１記憶部内の記憶領域中の前記不良記憶領域を除く領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行し、
不良記憶領域が存在しない場合、前記確保した前記第１記憶部内の記憶領域中の全領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行する、
書き込み処理手段を有する、
オブジェクトストレージ。
【請求項２】
前記書き込み処理手段は、前記第１記憶部への書き込み処理をシーケンシャルライトで実行する請求項１に記載のオブジェクトストレージ。
【請求項３】
前記書き込み処理手段は、前記書き込み対象のバリューの書き込み先として確保する前記第１記憶部内の記憶領域のサイズおよび配置、または、前記確保した前記第１記憶部内の記憶領域中から除外する、前記不良記憶領域を含む領域のサイズおよび配置の少なくとも一方を、所定サイズの整数倍のアラインに揃える請求項１に記載のオブジェクトストレージ。
【請求項４】
前記書き込み処理手段は、前記第１記憶部への書き込み処理において書き込みエラーが発生した場合、前記書き込みエラーが発生した記憶領域の位置の情報を追加すべく前記第２情報を更新する請求項１に記載のオブジェクトストレージ。
【請求項５】
前記書き込み処理手段は、前記更新した第２情報に基づき、前記不良記憶領域を避けるように、前記確保した前記第１記憶部内の記憶領域に対して前記書き込み対象のバリューを配置し直して前記第１記憶部への書き込み処理を実行する請求項４に記載のオブジェクトストレージ。
【請求項６】
前記書き込み処理手段は、前記書き込みエラーが発生した記憶領域を含む前記確保した前記第１記憶部内の記憶領域とは異なる前記第１記憶部内の記憶領域を前記書き込み対象のバリューの書き込み先として新たに確保し、前記新たに確保した前記第１記憶部内の記憶領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行する請求項４に記載のオブジェクトストレージ。
【請求項７】
前記コントローラは、
前記第１情報に基づき、読み込み対象のバリューの読み込み先とする前記第１記憶部内の記憶領域を特定し、前記第２情報に基づき、前記特定した記憶領域に不良記憶領域が存在するか否かを判定し、
不良記憶領域が存在する場合、前記不良記憶領域分だけ前記読み込み対象のバリューの読み込み先とする前記第１記憶部内の記憶領域を拡張し、前記不良記憶領域を避けるように、前記第１記憶部からの読み込み処理を実行して、読み込んだバリューを要求元へ返却する、
読み込み処理手段を有する請求項１に記載のオブジェクトストレージ。
【請求項８】
前記読み込み処理手段は、前記第１記憶部からの読み込み処理をシーケンシャルリードで実行する請求項７に記載のオブジェクトストレージ。
【請求項９】
前記読み込み処理手段は、前記第１記憶部からの読み込み処理において読み込みエラーが発生した場合、前記読み込みエラーが発生した記憶領域の位置の情報を追加すべく前記第２情報を更新し、読み込みエラーを要求元へ返却する請求項７に記載のオブジェクトストレージ。
【請求項１０】
前記読み込み処理手段は、前記読み込みエラーが発生したバリューの記憶位置を示す値を前記第１記憶部において取り得ない所定値とすべく前記第１情報を更新する請求項９に記載のオブジェクトストレージ。
【請求項１１】
前記読み込み処理手段は、前記第１情報に基づき、前記読み込み対象のバリューの読み込み先とする前記第１記憶部内の記憶領域を特定する際、前記読み込み対象のバリューの記憶位置を示す値として前記所定値が取得された場合、読み込みエラーを要求元へ返却する請求項１０に記載のオブジェクトストレージ。
【請求項１２】
前記読み込み処理手段は、前記読み込みエラーが発生したバリューのキーの情報を削除すべく前記第１情報を更新する請求項９に記載のオブジェクトストレージ。
【請求項１３】
前記読み込み処理手段は、前記第１情報に基づき、前記読み込み対象のバリューの読み込み先とする前記第１記憶部内の記憶領域を特定する際、前記読み込み対象のバリューのキーの情報が前記第１情報中に存在しない場合、読み込みエラーを要求元へ返却する請求項１２に記載のオブジェクトストレージ。
【請求項１４】
キーとバリューとを対応づけて格納するオブジェクトストレージであって、前記バリューが記録される第１記憶部と、前記キーと前記第１記憶部内における前記バリューの記憶位置との対応づけを管理するための第１情報と、前記第１記憶部内の不良記憶領域の位置を管理するための第２情報とが記録される第２記憶部とを具備するオブジェクトストレージのコントローラであって、
前記第２情報に基づき、書き込み対象のバリューの書き込み先として確保した前記第１記憶部内の記憶領域に不良記憶領域が存在するか否かを判定し、
不良記憶領域が存在する場合、前記不良記憶領域を避けるように、前記確保した前記第１記憶部内の記憶領域中の前記不良記憶領域を除く領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行し、
不良記憶領域が存在しない場合、前記確保した前記第１記憶部内の記憶領域中の全領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行する、
書き込み処理手段を有するコントローラ。
【請求項１５】
キーとバリューとを対応づけて格納するオブジェクトストレージであって、前記バリューが記録される第１記憶部と、前記キーと前記第１記憶部内における前記バリューの記憶位置との対応づけを管理するための第１情報と、前記第１記憶部内の不良記憶領域の位置を管理するための第２情報とが記録される第２記憶部とを具備するオブジェクトストレージを制御するコンピュータに、
前記第２情報に基づき、書き込み対象のバリューの書き込み先として確保した前記第１記憶部内の記憶領域に不良記憶領域が存在するか否かを判定することと、
不良記憶領域が存在する場合、前記不良記憶領域を避けるように、前記確保した前記第１記憶部内の記憶領域中の前記不良記憶領域を除く領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行することと、
不良記憶領域が存在しない場合、前記確保した前記第１記憶部内の記憶領域中の全領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行することと、
を実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、オブジェクトストレージ、コントローラおよびプログラムに関する。
【背景技術】
【０００２】
近年、オブジェクトストレージなどと称される、ホスト（クライアント）とのインタフェースがＫＶＳ（Key Value Store）型のストレージシステムが普及しつつある。ＫＶＳ型のストレージシステムでは、ホストからの書き込み要求には、書き込むデータを特定するキー（Key）の情報と、書き込むデータであるバリュー（Value）のデータ（以降、Valueデータ）とが含まれる。また、ホストからの読み込み要求には、Keyの情報が含まれる。Keyの情報としては、文字列を採用するストレージシステムが多い。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許第５３２１６８２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ストレージシステムの信頼性を上げようとすると、高信頼な高価なドライブを使用しなければならず、コストアップを招く。逆に、安価なドライブを使おうとすると、システムのダウンタイムやサービス提供能力の性能低下のペナルティだけではなく、交換用ドライブのコストと、ドライブ交換およびリビルド処理の人的オペレーションのコストとについてコストアップを招く。
【０００５】
本発明が解決しようとする課題は、信頼性や性能の低下を招くことなく、コストを低減することができるオブジェクトストレージ、コントローラおよびプログラムを提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、オブジェクトストレージは、キーとバリューとを対応づけて格納する。前記オブジェクトストレージは、前記バリューが記録される第１記憶部と、前記キーと前記第１記憶部内における前記バリューの記憶位置との対応づけを管理するための第１情報と、前記第１記憶部内の不良記憶領域の位置を管理するための第２情報とが記録される第２記憶部と、前記第１記憶部と前記第２記憶部とを制御するコントローラとを具備する。前記コントローラは、前記第２情報に基づき、書き込み対象のバリューの書き込み先として確保した前記第１記憶部内の記憶領域に不良記憶領域が存在するか否かを判定し、不良記憶領域が存在する場合、前記不良記憶領域を避けるように、前記確保した前記第１記憶部内の記憶領域中の前記不良記憶領域を除く領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行し、不良記憶領域が存在しない場合、前記確保した前記第１記憶部内の記憶領域中の全領域に対して前記書き込み対象のバリューを配置して前記第１記憶部への書き込み処理を実行する書き込み処理手段を有する。
【図面の簡単な説明】
【０００７】
【図１】実施形態のデータ記憶装置の機能構成の概要の一例を示すブロック図。
【図２】実施形態のデータ記憶装置のコントローラの機能構成の概要の一例を示すブロック図。
【図３】実施形態のデータ記憶装置の第１のドライブの区画分けの一例を示す図。
【図４】実施形態のデータ記憶装置のスロットへのValueデータの記録方法の一例を示す図。
【図５】実施形態のデータ記憶装置のスロットの余白領域を節約する方法の一例を示す図。
【図６】実施形態のデータ記憶装置のスロットへのメタデータの記録方法の一例を示す図。
【図７】実施形態のデータ記憶装置のアドレス変換情報の一例を示す図。
【図８】実施形態のデータ記憶装置のアドレス変換情報の別の一例を示す図。
【図９】実施形態のデータ記憶装置の不良セクタ情報の一例を示す図。
【図１０】実施形態のデータ記憶装置のスロット不良セクタ存在情報の一例を示す図。
【図１１】実施形態のデータ記憶装置の書き込み先スロットに不良セクタがあった場合の一例を示す図。
【図１２】実施形態のデータ記憶装置の書き込み先スロットに不良セクタがあった場合の別の一例を示す図。
【図１３】実施形態のデータ記憶装置の書き込み先スロットが不良セクタを有していない場合の一例を示す図。
【図１４】実施形態のデータ記憶装置の書き込み先スロットが不良セクタを有している場合の一例を示す図。
【図１５】実施形態のデータ記憶装置の不良セクタをスキップしてシーケンシャルライトする一例を示す図。
【図１６】実施形態のデータ記憶装置の推定領域を推定する一例を示す図。
【図１７】実施形態のデータ記憶装置の推定領域に書き込み時にスキップした領域が含まれていた場合の一例を示す図。
【図１８】実施形態のデータ記憶装置の新たな推定領域を推定する一例を示す図。
【図１９】実施形態のデータ記憶装置の推定領域に書き込み時にスキップした領域が含まれていた場合のシーケンシャルリードの一例を示す図。
【図２０】実施形態のデータ記憶装置の推定領域に書き込み時にスキップした領域が含まれていなかった場合のシーケンシャルリードの一例を示す図。
【図２１】実施形態のデータ記憶装置のマジックナンバーを記録するようにアドレス変換情報を更新する一例を示す図。
【図２２】実施形態のデータ記憶装置のValueデータを転記することで空きスロットを回収する一例を示す図。
【図２３】実施形態のデータ記憶装置で行われる書き込み処理の手順の流れの一例を示すフローチャート。
【図２４】実施形態のデータ記憶装置で行われる読み込み処理の手順の流れの一例を示すフローチャート。
【図２５】実施形態のデータ記憶装置で行われる削除処理の手順の流れの一例を示すフローチャート。
【図２６】実施形態のデータ記憶装置で行われる転記処理の手順の流れの一例を示すフローチャート。
【発明を実施するための形態】
【０００８】
以下、実施の形態について図面を参照して説明する。
まず、本実施形態のデータ記憶装置の構成について説明する。
図１は、本実施形態のデータ記憶装置２の機能構成の概要の一例を示すブロック図である。データ記憶装置２は、ホスト１とのインタフェースがＫＶＳ型のオブジェクトストレージである。図１に示すように、データ記憶装置２は、コントローラ２１、ＲＡＭ（Random Access Memory）２２、第１のドライブ２３および第２のドライブ２４を有する。なお、図１では、第１のドライブ２３として２個のドライブ（＃０，＃１）を搭載し、第２のドライブ２４として２個のドライブ（＃０，＃１）を搭載する例を示すが、ドライブの搭載個数は２個に限られない。３個以上でもよいし、１個でもよい。第１のドライブ２３と第２のドライブ２４とでドライブの搭載個数が異なっていてもよい。以降、複数のドライブを特に区別する必要がない場合は、第１のドライブ２３、第２のドライブ２４と記載する。
【０００９】
図２は、コントローラ２１の機能構成の概要の一例を示すブロック図である。図２に示すように、コントローラ２１は、読み込み処理部２１１、書き込み処理部２１２、削除処理部２１３、転記処理部２１４、不良セクタ情報管理部２１５、アドレス変換情報管理部２１６、ホストインタフェース部２１７、メモリインタフェース部２１８およびドライブインタフェース部２１９を有する。コントローラ２１内の各機能部は、コントローラ２１内のプロセッサにより実行されるファームウェア（プログラム）により実現されるものであってもよい。
【００１０】
ここで、コントローラ２１内の各機能部の説明に先立って、第１のドライブ２３と第２のドライブ２４とについて説明する。
まず、第１のドライブ２３について説明する。
第１のドライブ２３は、例えばＨＤＤ（Hard Disk Drive）のような、大容量で、シーケンシャルアクセスは比較的高速なドライブであるが、これに限られない。
【００１１】
本実施形態のデータ記憶装置２では、第１のドライブ２３には、Valueデータを記録する。シーケンシャルアクセスに適合させるために、図３に示すように、第１のドライブ２３は、スロットという単位で区画分けされる。スロットのサイズは、例えば１６ＭByteであるが、これに限られない。また、近年のＨＤＤの大容量化に伴い、Advanced Formatを採用したＨＤＤが登場してきており、例えば４ＫByte単位にアラインされていないアクセスは性能が落ち込むといったようなことがある。このため、スロットのサイズおよび配置は、Advanced Formatを採用したＨＤＤのアクセス性能が落ちないサイズ（４ＫByte等）の整数倍のアラインに揃えておくことが好ましい。
【００１２】
スロットへのValueデータの記録方法の一例を図４に示す。各々のValueデータをｖ１〜ｖ５に示した。スロットに埋める順番は、図４に示すように、スロットの先頭から順番に埋めてもよいし、別の所定の順番でもよい。Valueデータは、各々サイズが異なっているため、多くの場合、スロットに余白領域が生じる。
【００１３】
スロットの余白領域を節約する方法の一例を図５に示す。１つ目のスロットの末尾にｖ６のデータの一部を記録し（図５（Ａ））、ｖ６のデータの残りは２つ目のスロットの先頭に記録する（図５（Ｂ））。つまり、Valueデータを分割して記録することで、スロットの余白領域を節約することができる。なお、スロットに余白領域があるからと言って、必ずしも分割して記録する必要はない。例えば、６３個目までのスロットは分割して記録することで余白領域を生じさせないようにして、６４個目のスロットは分割して記録しないで余白領域としてもよい。つまり、例えば、スロット６４個おきに分割記録を中断するようにしてもよい。このように、所定の単位で分割記録を中断するようにすることで、各種処理が簡便になる効果を奏する。
【００１４】
また、第１のドライブ２３、より詳細には、スロットには、Valueデータだけでなく、そのValueデータに関連するメタデータを合わせて記録してもよい。メタデータには、後述するアドレス変換情報のうち、当該Valueデータに関連するエントリの情報や、そのValueデータの誤り訂正符号など、そのValueデータに関連する種々の情報を含めることができる。これにより、データ記憶装置２全体の信頼性を高めることができる。一例を図６に示す。図６では、ｖ１〜ｖ３に対応するメタデータであるｍ１〜ｍ３を、それぞれｖ１〜ｖ３に隣り合わせて記録しているが、メタデータだけを集めて記録するようにしてもよいし、別の所定の順番で記録してもよい。また、前述のValueデータの分割記録とメタデータの記録とを組み合わせてもよい。
【００１５】
続いて、第２のドライブ２４について説明する。
第２のドライブ２４は、例えばＳＳＤ（Solid State Drive）のような、応答時間が高速で、ランダムアクセスが比較的高速なドライブであるが、これに限られない。これは、第２のドライブ２４が記録するアドレス変換情報、不良セクタ情報、スロット不良セクタ存在情報等は、ホスト１からの書き込み、読み込み命令の度にアクセスされるため、応答時間が高速で、ランダムアクセスが比較的高速であるのが好ましいからである。
【００１６】
本実施形態のデータ記憶装置２では、第２のドライブ２４には、アドレス変換情報を記録する。アドレス変換情報は、Keyの情報からそのValueデータの記録位置情報を抽出することができる情報である。アドレス変換情報の一例を図７に示す。アドレス変換情報は、複数のエントリを有する。エントリには、Key情報と、記録位置オフセット情報と、サイズ情報とが含まれる。記録位置オフセット情報は、そのValueデータの記録位置を示す情報である。記録位置オフセット情報には、第１のドライブ２３として搭載する複数のドライブの中のどのドライブかを識別する情報（第１ドライブ識別情報）と、そのドライブ内での位置を特定する情報（第１ドライブ内位置特定情報）とが含まれる。第１ドライブ内位置特定情報として、例えば以下の２通りの情報が採用できるが、各ドライブ内での位置を特定できる情報であれば種類は問わない。
【００１７】
（１）ＬＢＡ（Logical Block Addressing）
（２）各ドライブ内のスロットの通し番号，スロット内のオフセット情報
サイズ情報は、Valueデータのサイズの情報である。例えば以下の２通りの情報が採用できるが、Valueデータのサイズを特定できる情報であれば種類は問わない。
（１）セクタ数
（２）バイト数
【００１８】
また、前述のようにValueデータが分割されて記録されているときは、分割されているそれぞれのデータについての記録位置オフセット情報と、サイズ情報とが必要になる。一例を図８に示す。図８では、Valueデータの分割数は最大２であると仮定し、第１の記録位置オフセット情報・サイズ情報と、第２の記録位置オフセット情報・サイズ情報とを有しているが、Valueデータの分割数はこれに限られない。また、全てのエントリについて第２の記録位置オフセット情報・サイズ情報を割り当てるのではなく、アドレス変換情報の容量削減のために、図８に示すように、実際に分割されているValueについてのみ、第２の記録位置オフセット情報・サイズ情報を割り当てるようにしてもよい。
【００１９】
アドレス変換情報のエントリ数は、データ記憶装置２で記憶しているKeyの総数に対応する。その実現方法は問わない。例えば、配列を適宜伸び縮みさせることで実現してもよいし、リストや二分探索木等で適宜エントリを確保・解放することで実現してもよい。
【００２０】
また、本実施形態のデータ記憶装置２では、第２のドライブ２４には、不良セクタ情報を記録する。一例を図９に示す。不良セクタ情報は、第１のドライブ２３の不良セクタの位置を管理するための情報である。不良セクタ情報には、不良セクタの位置を特定する情報である不良セクタ位置情報が含まれる。不良セクタ位置情報には、前述の記録位置オフセット情報と同様の情報を採用することができる。不良セクタ情報は、例えば、図９のように、不良セクタ位置情報のリストとして実現される。なお、その実現方法は問わない。例えば、配列を適宜伸び縮みさせることで実現してもよいし、双方向リストや二分探索木等で適宜エントリを確保・解放することで実現してもよい。また、探索コストを削減するために、全体で１つのリストとするのではなく、例えば不良セクタが属するスロットごとにリストを分割してもよい。
【００２１】
また、さらに不良セクタ情報の探索コストを削減するために、スロット不良セクタ存在情報を記録してもよい。一例を図１０に示す。図１０では、第１のドライブ２３として搭載する２個のドライブ＃０、ドライブ＃１について、それぞれのスロット中に不良セクタが存在すれば１、存在しなければ０を記録している。これにより、１となっているスロットのみを不良セクタ情報を探索すればよいことになり、不良セクタ情報の探索コストを削減することができる。また、スロット中に不良セクタが存在する場合に必ず１にするのではなく、存在する不良セクタ数を記録するようにしてもよい。これにより、どの程度探索コストがかかるかを事前に見積もることができる。
なお、スロット不良セクタ存在情報と、上述した不良セクタ情報を不良セクタが属するスロットごとに分割することは、必ずしもあわせて実施する必要はない。どちらか片方を実施するだけでも、不良セクタ情報の探索コストを削減することができる。
【００２２】
なお、第２のドライブ２４におけるアドレス変換情報、不良セクタ情報およびスロット不良セクタ存在情報の記録フォーマットは問わない。ファイルシステム上にファイルとして記録してもよいし、独自に記録ＬＢＡを管理してもよい。また、第２のドライブ２４として搭載する複数のドライブでＲＡＩＤ（Redundant Array of Inexpensive Disks）−１やＲＡＩＤ−５などの冗長構成を取ってデータ記憶装置２の信頼性を向上させてもよいし、ＲＡＩＤ−０のような構成を取ってアドレス変換情報や不良セクタ情報を記録可能な容量を増やしてもよい。
【００２３】
また、第２のドライブ２４の応答時間の高速性やランダムアクセスの高速性を活かして、第２のドライブ２４に第１のドライブ２３に記録されているValueデータをキャッシュして、ホスト１からの要求に対する応答性を高めてもよい。
次に、以上の第１のドライブ２３と第２のドライブ２４との説明を踏まえて、図２に示したコントローラ２１内の各機能部について説明する。
【００２４】
ホストインタフェース部２１７は、ホスト１とコントローラ２１内の各機能部とのインタフェース処理を行う。より詳細には、ホストインタフェース部２１７は、ホスト１から、書き込み命令、読み込み命令および削除命令を含む命令を受け付ける。書き込み命令には、書き込むデータを特定するKeyの情報、書き込むデータであるValueのデータが含まれる。読み込み命令には、Keyの情報が含まれる。削除命令には、削除するデータのKeyの情報が含まれる。
【００２５】
ホストインタフェース部２１７は、受け付けた命令が書き込み命令であったときは、書き込み処理部２１２に当該受け付けた書き込み命令を転送し、受け付けた命令が読み込み命令であったときは、読み込み処理部２１１に当該受け付けた読み込み命令を転送する。受け付けた命令が削除命令であったときは、削除処理部２１３に当該受け付けた削除命令を転送する。
【００２６】
ホストインタフェース部２１７は、読み込まれたデータを読み込み処理部２１１から受信すると、当該受信したデータをホスト１に転送する。
メモリインタフェース部２１８は、ＲＡＭ２２と、コントローラ２１内の各機能部とのインタフェース処理を行う。より詳細には、要求元から指示されるＲＡＭ２２からの読み込み指示を受け付け、読み込み指示されたデータをＲＡＭ２２から読み込み、要求元に返却する。また、要求元から指示されるＲＡＭ２２への書き込み指示を受け付け、ＲＡＭ２２へ書き込み指示されたデータを入力し、書き込み処理を実行する。
【００２７】
ドライブインタフェース部２１９は、第１のドライブ２３および第２のドライブ２４と、コントローラ２１内の各機能部とのインタフェース処理を行う。より詳細には、要求元から指示される第１のドライブ２３および第２のドライブ２４からの読み込み指示を受け付け、第１のドライブ２３および第２のドライブ２４から読み込み指示されたデータを読み込み、要求元に返却する。また、要求元から指示される第１のドライブ２３および第２のドライブ２４への書き込み指示を受け付け、第１のドライブ２３および第２のドライブ２４に書き込み指示されたデータを入力し、書き込み処理を実行する。
【００２８】
アドレス変換情報管理部２１６は、要求元からの要求に応じて、第２のドライブ２４に記録されているアドレス変換情報の参照および更新処理をドライブインタフェース部２１９を介して行う。アドレス変換情報管理部２１６が一括して処理を行う理由は、複数の要求元からの参照および更新要求に対して、一貫性を担保した応答を行うためである。従って、アドレス変換情報管理部２１６が一括して処理を行うのではなく、各機能部が連携して一貫性を担保する機能を有するようにしてもよい。以降の記載は適宜読み替え可能である。
【００２９】
不良セクタ情報管理部２１５は、要求元からの要求に応じて、第２のドライブ２４に記録されている不良セクタ情報およびスロット不良セクタ存在情報の参照および更新処理をドライブインタフェース部２１９を介して行う。不良セクタ情報管理部２１５が一括して処理を行う理由は、複数の要求元からの参照及び更新要求に対して、一貫性を担保した応答を行うためである。従って、不良セクタ情報管理部２１５が一括して処理を行うのではなく、各機能部が連携して一貫性を担保する機能を有するようにしてもよい。以降の記載は適宜読み替え可能である。
【００３０】
なお、ＲＡＭ２２は、ライトキャッシュとしてホスト１から書き込み要求されたデータを一時記憶する。
また、ＲＡＭ２２は、アドレス変換情報、不良セクタ情報およびスロット不良セクタ存在情報等の各種動作に必要な情報をキャッシュしてもよい。また、ＲＡＭ２２は、ホスト１から読み込み要求されたデータをキャッシュしてもよい。なお、各種動作に必要な情報のキャッシュや、読み込み要求されたデータのキャッシュについては、以降、ＲＡＭ２２上に記録することを特段区別する必要がない場合については、記載を省略するが、適宜読み替え可能である。
【００３１】
書き込み処理部２１２は、ホスト１からの書き込み命令を処理する。以降に詳述する。
書き込み処理部２１２は、ホストインタフェース部２１７から書き込み命令を受け取ると、当該受け取った書き込み命令から、Keyの情報およびValueデータを抽出する。
【００３２】
書き込み処理部２１２は、書き込み先スロットが確保済みであるかを調べる。
書き込み先スロットが確保済みでなかった場合、書き込み処理部２１２は、書き込み先スロットを確保する。書き込み処理部２１２は、有効なデータが記録されていないスロット(空きスロット)から書き込み先スロットを確保する。書き込み先スロットの選択方法には、任意の公知の方法を用いることができる。また、書き込み処理部２１２は、ＲＡＭ２２にスロットのサイズ分のライトバッファを確保する。
【００３３】
また、書き込み処理部２１２は、当該書き込み先スロットの不良セクタの位置をリストアップする。より詳細には、書き込み処理部２１２は、不良セクタ情報管理部２１５を介してスロット不良セクタ存在情報を参照し、当該書き込み先スロットが不良セクタを有しているかを調べ、不良セクタを有している場合は不良セクタ情報から当該書き込み先スロットが有する不良セクタの位置をリストアップする。
【００３４】
書き込み処理部２１２は、ライトバッファが埋まるまで、書き込み要求されたValueデータをライトバッファに書き込む。より詳細には、書き込み処理部２１２は、当該書き込み先スロットに不良セクタがない場合は、例えば図４に示したようにValueデータをメモリインタフェース部２１８を介してライトバッファに書き込む。当該書き込み先スロットに不良セクタがあった場合の一例を図１１に示す。書き込み処理部２１２は、Valueデータをライトバッファに書き込む際、当該Valueデータの書き込み先領域が不良セクタの位置と重複する場合は、その不良セクタの位置をスキップしてValueデータをメモリインタフェース部２１８を介してライトバッファに書き込む。図１１の例では、ｖ２の書き込み先領域が不良セクタの位置と重複していたため、その不良セクタの位置をスキップしてｖ２のデータをライトバッファに書き込んでいる。
【００３５】
なお、スキップする領域のサイズと配置についても、Advanced Formatを採用したＨＤＤのアクセス性能が落ちないサイズ（４ＫByte等）の整数倍のアラインに揃えておくことが好ましい。このようにした場合、スキップする領域が、実際の不良セクタの領域よりも大きくなる場合がある。一例を図１２に示す。スロットは、Advanced Formatのアライン（４ＫByte等）の整数倍のサイズで、かつ整数倍のアラインに揃えられている。図１２の例では、Advanced Formatのアラインの８倍である。一般に、不良セクタのサイズ（５１２Byte等）はAdvanced Formatのアラインのサイズよりも小さいことが多いため、スキップする領域が、実際の不良セクタの領域よりも大きくなることになる。
【００３６】
なお、実際にスキップする領域に、複数の不良セクタが含まれる場合もある。このため、不良セクタ情報では、個々の不良セクタごとに管理するのではなく、実際にスキップする領域で纏め上げて管理してもよい。
書き込み処理部２１２は、ライトバッファが埋まると、ライトバッファの内容を当該書き込み先スロットに書き込む。書き込み先スロットが不良セクタを有していない場合の一例を図１３に示す。図１３に示すように、書き込み処理部２１２は、余白領域を含めて、ライトバッファの内容をメモリインタフェース部２１８を介して読み出し、書き込み先スロットにドライブインタフェース部２１９を介してシーケンシャルライトする。書き込み先スロットが不良セクタを有している場合の一例を図１４に示す。図１４に示すように、書き込み処理部２１２は、ライトバッファの内容をメモリインタフェース部２１８を介して読み出し、スキップする領域（図１４の場合は不良セクタの位置）をスキップして書き込み先スロットにドライブインタフェース部２１９を介してシーケンシャルライトする。図１４の場合は合計２つのシーケンシャルライトになる。このように、スキップしているものの、個々のシーケンシャルライトのアドレスが不良セクタを挟んで並んでいるので、第１のドライブ２３がＨＤＤの場合でも速度が落ちにくい効果を奏する。
【００３７】
この効果について、図１５を参照して、より詳細に説明する。
例えば、ホスト（クライアント）とのインタフェースがＬＢＡ（Logical Block Addressing）型のストレージシステムのように、不良セクタに対する対処を、予備のセクタで置き換えることで行った場合、図１５（Ａ）に示すように、１回目のシーケンシャルライト（ａ１）の後、ヘッドを移動させて、不良セクタと置き換えられたセクタへの２回目のシーケンシャルライト（ａ２）を行うことになる。かつ、２回目のシーケンシャルライト（ａ２）の後、１回目のシーケンシャルライト（ａ１）の位置までヘッドを戻して、３回目のシーケンシャルライト（ａ３）を行わなければならない。
【００３８】
これに対して、不良セクタに対する対処を、不良セクタをスキップすることで行った場合、図１５（Ｂ）に示すように、１回目のシーケンシャルライト（ｂ１）の後、ヘッドを移動させることなく、２回目のシーケンシャルライト（ｂ２）を行うことができる。
【００３９】
この効果は、書き込み時のみならず、読み込み時にも顕れる。読み込み時における不良セクタに対する対処については、読み込み処理部２１１の説明で詳述する。
また、書き込み処理部２１２は、シーケンシャルライト中に書き込みエラーが起こった場合、当該書き込みエラーが起こったセクタについて、不良セクタ位置情報およびスロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して更新する。また、更新された不良セクタ位置情報およびスロット不良セクタ存在情報に従って、ライトバッファを埋め直す。より詳細には、更新された不良セクタ位置情報およびスロット不良セクタ存在情報に従って、スキップする領域を設定し直す。なお、書き込み先スロットは、必ずしも書き込みエラーが起こったスロットである必要はなく、別の空きスロットから書き込み先スロットを確保してもよい。
【００４０】
そして、埋め直したライトバッファの内容に基づき、必要に応じてスキップする領域をスキップして、書き込み先スロットにシーケンシャルライトする。
書き込みが正常に完了したら、当該書き込んだValueデータについて、アドレス変換情報を更新する。より詳細には、当該書き込んだValueデータについて、Key情報と、記録位置オフセット情報と、サイズ情報とが含まれるエントリをアドレス変換情報にアドレス変換情報管理部２１６を介して追加する。
【００４１】
ここで、Key情報には、書き込み命令から抽出したKeyの情報を格納すればよい。記録位置オフセット情報には、当該Valueデータが書き込まれた先頭の位置を格納すればよい。また、サイズ情報には、当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合であっても、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合であっても、書き込み命令から抽出したValueデータのサイズを格納すればよい。当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合であっても、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合であっても、同じにする理由は、アドレス変換情報の情報量を削減するためである。一般に、アドレス変換情報のエントリ数は非常に多くなる。従って、当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合と、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合とを別々のフォーマットで記録しようとすると、アドレス変換情報のエントリ数が多いことが要因となり、結果的にアドレス変換情報の情報量が膨大になってしまうからである。このため、読み込み処理時に、当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合と、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合とを区別して、正しく読み込めるようにする。詳細は、読み込み処理部２１１の説明で詳述する。
【００４２】
読み込み処理部２１１は、ホスト１からの読み込み命令を処理する。以降に詳述する。
読み込み処理部２１１は、ホストインタフェース部２１７から読み込み命令を受け取ると、当該受け取った読み込み命令から、Keyの情報を抽出する。
読み込み処理部２１１は、当該KeyのValueデータが書き込まれている領域を推定（仮決定）する。より詳細には、読み込み処理部２１１は、抽出したKeyの情報で、アドレス変換情報をアドレス変換情報管理部２１６を介して参照し、記録位置オフセット情報と、サイズ情報とを取得する。そして、読み込み処理部２１１は、記録位置オフセット情報が示す記録位置から、サイズ情報が示すサイズの領域を推定領域とする。一例を図１６に示す。
【００４３】
なお、読み込み処理部２１１は、当該取得した記録位置オフセット情報またはサイズ情報にマジックナンバーが記録されていることが判明すると、ホストインタフェース部２１７を介してホスト１に読み込みエラーを返却する。マジックナンバーは、例えば、記録位置オフセット情報またはサイズ情報として取り得ない値とすればよい。より詳細には、例えば、データ記憶装置の受け付け可能なサイズの最大値が９，９９９ＭByteだった場合、マジックナンバーとして１０，０００ＭByteの値を採用することができるが、マジックナンバーとして採用できる値はこれに限られない。
【００４４】
読み込み処理部２１１は、前記推定した領域に、書き込み時にスキップした領域(不良セクタ)が含まれているか判断する。より詳細には、読み込み処理部２１１は、記録位置オフセット情報が示す記録位置が属するスロットについて、スロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して参照し、当該スロットに不良セクタが存在するか否かを判断する。読み込み処理部２１１は、当該スロットに不良セクタが存在する場合は、不良セクタ位置情報を不良セクタ情報管理部２１５を介して参照し、前記推定した領域に、書き込み時にスキップした領域(不良セクタ)が含まれているか判断する。スキップした領域が含まれていた場合の一例を図１７に示す。図１７は、図１６の推定領域にスキップした領域が２か所含まれている例である。
【００４５】
読み込み処理部２１１は、前記推定した領域に、書き込み時にスキップした領域(不良セクタ)が含まれていた場合、新たな開始位置を前記推定した領域の末尾の位置、新たなサイズを前記推定した領域に含まれていたスキップした領域の個数分のサイズとし、それを新たな推定領域とする。図１７の場合の新たな推定領域の一例を図１８に示す。図１８の場合は、スキップした領域が２つであったので、新たなサイズは、スキップ領域２つ分のサイズとなる。
【００４６】
読み込み処理部２１１は、推定領域で書き込み時にスキップした領域(不良セクタ)が含まれなくなるまで、前記手順に従って新たな推定領域を追加する。ここでは、図１８の新たな推定領域には、書き込み時にスキップした領域はなかったとする。
読み込み処理部２１１は、これまでの推定した領域から、書き込み時にスキップした領域(不良セクタ)をスキップしてドライブインタフェース部２１９を介してシーケンシャルリードする。これまでの推定した領域が図１８の場合のシーケンシャルリードの一例を図１９に示す。図１９では、書き込み時にスキップした領域（不良セクタ）をスキップした結果、３個のシーケンシャルリードになった。このように、スキップしているものの、個々のシーケンシャルリードのアドレスが不良セクタを挟んで並んでいるので、前述の書き込み時と同様（図１５参照）、第１のドライブ２３がＨＤＤの場合でも速度が落ちにくい効果を奏する。
【００４７】
一方、図１６の推定領域に、書き込み時にスキップした領域(不良セクタ)が含まれていなかった場合のシーケンシャルリードの一例を図２０に示す。図２０では、書き込み時にスキップした領域(不良セクタ)がなかったため、１個のシーケンシャルリードになった。
【００４８】
読み込み処理部２１１は、スキップして読み込んだ場合は、読み込んだデータを連結して、ホストインタフェース部２１７を介してホスト１に返却する。読み込んだデータを連結する作業領域として、ＲＡＭ２２を用いてもよい。スキップしなかった場合は、読み込んだデータをそのままホストインタフェース部２１７介してホスト１に返却すればよい。
【００４９】
読み込み処理部２１１は、前記シーケンシャルリードの際、読み込みエラーが発生した場合、エラー時の対処をする。
より詳細には、読み込み処理部２１１は、当該読み込みエラーが起こったセクタについて、不良セクタ位置情報およびスロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して更新する。これは、後述する転記処理において当該スロットが空きスロットとして回収された後に書き込み先スロットとして確保された際に、書き込み処理での適切な処理に必要になるからである。
【００５０】
また、読み込み処理部２１１は、当該読み込みエラーが発生したデータについて、記録位置オフセット情報またはサイズ情報にマジックナンバーを記録するように、アドレス変換情報管理部２１６を介してアドレス変換情報を更新する。これは、再度同じKeyの読み込み要求がされた時の対処である。具体例を図２１に示す。当該KeyのValueデータが記録されている領域に、今回読み込みエラーが起きたセクタが含まれる。これに伴い、前述の不良セクタ位置情報の更新処理を行うと、今回読み込みエラーが起きたセクタが、不良セクタ位置情報に登録される。この状態で再度同じKeyの読み込み要求がされると、前述の読み込み処理に従って処理がなされ、今回読み込みエラーが起きたセクタがスキップされて、当該KeyのValueデータが記録されている領域に連続する（別のデータが記録されている）領域をリードしてしまうことになり、結果としてリードエラーが起こらず、かつ、正しくないデータをホスト１に返却してしまうことになる。このため、記録位置オフセット情報またはサイズ情報にマジックナンバーを記録することで、再度同じKeyの読み込み要求がされた際に、ホスト１にリードエラーを返却することができる。あるいは、マジックナンバーを記録するのではなく、当該Keyの情報を、アドレス変換情報から削除しもよい。そうすると、再度同じKeyの読み込み要求がされると、アドレス変換情報にないKeyの読み込み要求がされることになる。アドレス変換情報にないKeyの読み込み要求がされる場合、ホスト１にリードエラーを返却するようにしてもよい。
【００５１】
また、読み込み処理部２１１は、当該読み込みエラーが発生したデータについて、ホストインタフェース部２１７を介してホスト１に読み込みエラーを返却する。
削除処理部２１３は、ホスト１からの削除命令を処理する。以降に詳述する。
削除処理部２１３は、ホストインタフェース部２１７から削除命令を受け取ると、当該受け取った削除命令から、Keyの情報を抽出する。
【００５２】
削除処理部２１３は、前記抽出したKeyの情報を、アドレス変換情報から削除する。より詳細には、削除処理部２１３は、前記抽出したKeyの情報が含まれるエントリをアドレス変換情報管理部２１６を介してアドレス変換情報から削除する。
次に、転記処理部２１４について説明する。
【００５３】
ホスト１からの書き込み命令の処理と削除命令の処理とを続けると、削除されたKeyのValueデータが記録されていた領域が空き領域になるものの、書き込み先スロットはやがて枯渇してしまう。このため、転記処理部２１４が、削除されていない有効なKeyのValueデータを別の書き込み先スロットに転記することで、転記元のスロットを空きスロットとして回収する。一例を図２２に示す。図２２では、３つの転記元スロットには合計で５つの有効なKeyのValueデータがあり、そのうち４つのValueのデータを転記先スロットに転記している。その結果、有効なKeyのValueデータがなくなった転記元スロットその１と転記元スロットその２とを空きスロットとして回収することができる。転記元スロットその３には、有効なKeyのValueデータが１つ残っているので、空きスロットとして回収することはできない。結果的に、１つのスロットを転記先スロットとして消費し、２つのスロットを空きスロットとして回収できたので、差し引きで１つの空きスロットが増えたことになる。
【００５４】
転記処理部２１４は、所定の条件を満たすと転記処理を行う。所定の条件には、任意の公知の方法を用いることができる。例えば、空きスロットの残りが所定数を下回った時でもよい。また、転記処理中にホスト１から読み込み命令や書き込み命令が発行されると、ホスト１からの読み込み命令や書き込み命令の応答時間や転送速度が遅くなる可能性がある。このため、例えば、ホスト１からの命令の負荷が所定の閾値を下回った時でもよい。
【００５５】
転記処理部２１４は、転記先スロットを確保し、当該書き込み先スロットの不良セクタの位置をリストアップし、ライトバッファを準備する。詳細な処理内容は、書き込み処理部２１２における処理と同様なので省略する。
転記処理部２１４は、転記元スロットを選択する。転記元スロットの選択方法には、任意の公知の方法を用いることができる。例えば、当該スロットに記録されている有効なKeyのValueデータの総サイズが少ないスロットから選択するようにすると、一度の転記処理で多くの転記元スロットを空きスロットとして回収できる。このため、一例として、当該スロットに記録されている有効なKeyのValueデータの総サイズが少ないスロットから選択する方法が挙げられるが、これに限られない。また、スロットに記録されている有効なKeyのValueデータの総サイズは、アドレス変換情報から算出することができるが、アドレス変換情報とは別に、スロットに記録されている有効なKeyのValueデータの総サイズを管理してもよい。
【００５６】
転記処理部２１４は、転記元スロットから、有効なKeyのValueデータを読み込む。有効なKeyのValueデータの読み込み処理についての詳細な処理内容は、読み込み処理部２１１における処理と同様なので省略する。
転記処理部２１４は、前記読み込んだValueデータを、ライトバッファに書き込む。ライトバッファにValueデータを書き込む処理についての詳細な処理内容は、書き込み処理部２１２における処理と同様なので省略する。
【００５７】
転記処理部２１４は、ライトバッファが埋まるまで、前記処理を適宜繰り返す。
転記処理部２１４は、ライトバッファの内容を当該書き込み先スロットに書き込む。ライトバッファの内容を当該書き込み先スロットに書き込む処理についての詳細な処理内容は、書き込み処理部２１２における処理と同様なので省略する。
【００５８】
転記処理部２１４は、書き込み先スロットへの書き込みが正常に完了したら、当該書き込んだValueデータについて、アドレス変換情報を更新する。より詳細には、転記処理部２１４は、当該書き込んだValueデータについて、記録位置オフセット情報が、転記元スロットの当該位置から、転記先スロットの当該位置を示すように、アドレス変換情報をアドレス変換情報管理部２１６を介して更新する。
【００５９】
転記処理部２１４は、転記した結果、記録されているデータがすべて無効になった転記元スロットを空きスロットとして回収する。
次に、フローチャートを参照しながら、本実施形態のデータ記憶装置２が行う各種処理（コントローラ２１内の各機能部の処理）の手順について説明する。
【００６０】
まず、ホスト１からの書き込み命令に応じて、データ記憶装置２が行う書き込み処理の手順について、図２３を参照して説明する。図２３は、データ記憶装置２で行われる書き込み処理の手順の流れの一例を示すフローチャートである。
ホストインタフェース部２１７は、ホスト１から書き込み命令を受け付ける（ステップＳ１）。書き込み命令には、書き込むデータを特定するKeyの情報と、書き込むデータであるValueのデータとが含まれる。ホストインタフェース部２１７は、書き込み処理部２１２に前記受け付けた書き込み命令を転送する。書き込み処理部２１２は、ホストインタフェース部２１７から書き込み命令を受け取ると、前記受け取った書き込み命令から、Keyの情報およびValueデータを抽出する。
【００６１】
次に、書き込み処理部２１２は、書き込み先スロットが確保済みであるかを調べる（ステップＳ２）。
書き込み先スロットが確保済みでなかった場合（ステップＳ２のＮＯ）、書き込み処理部２１２は、書き込み先スロットとライトバッファとを確保する（ステップＳ３）。より詳細には、書き込み処理部２１２は、有効なデータが記録されていないスロット（空きスロット）から書き込み先スロットを確保する。書き込み先スロットの選択方法には、任意の公知の方法を用いることができる。また、ＲＡＭ２２にスロットのサイズ分のライトバッファを確保する。また、書き込み処理部２１２は、不良セクタ情報管理部２１５を介してスロット不良セクタ存在情報を参照し、当該書き込み先スロットが不良セクタを有しているかを調べ、不良セクタを有している場合は不良セクタ情報から当該書き込み先スロットが有する不良セクタの位置をリストアップする。
【００６２】
書き込み先スロットが確保済みであった場合（ステップＳ２のＹＥＳ）、または、書き込み先スロットを確保すると、書き込み処理部２１２は、ライトバッファに書き込む（ステップＳ４）。より詳細には、当該書き込み先スロットに不良セクタがない場合は、書き込み処理部２１２は、例えば図４に示したようにValueデータをメモリインタフェース部２１８を介してライトバッファに書き込む。当該書き込み先スロットに不良セクタがあった場合は、書き込み処理部２１２は、例えば図１１に示したようにValueデータをメモリインタフェース部２１８を介してライトバッファに書き込む。即ち、Valueデータをライトバッファに書き込む際、当該Valueデータの書き込み先領域が不良セクタの位置と重複する場合は、書き込み処理部２１２は、その不良セクタの位置をスキップしてValueデータをメモリインタフェース部２１８を介してライトバッファに書き込む。図１１に示した例では、ｖ２の書き込み先領域が不良セクタの位置と重複していたため、その不良セクタの位置をスキップしてｖ２のデータをライトバッファに書き込んでいる。
【００６３】
なお、スキップする領域のサイズと配置についても、Advanced Formatを採用したＨＤＤのアクセス性能が落ちないサイズ（４ＫByte等）の整数倍のアラインに揃えておくことが好ましい。このようにした場合、スキップする領域が、図１２に示したように、実際の不良セクタの領域よりも大きくなる場合がある。スロットはAdvanced Formatのアライン(４ＫByte等)の整数倍のサイズで、かつ、整数倍のアラインに揃えられている。図１２の例では、Advanced Formatのアラインの８倍である。一般に、不良セクタのサイズ（５１２Byte等）はAdvanced Formatのアラインのサイズよりも小さいことが多いため、スキップする領域が、実際の不良セクタの領域よりも大きくなることになる。
【００６４】
なお、実際にスキップする領域に、複数の不良セクタが含まれる場合もある。このため、不良セクタ情報では、個々の不良セクタごとに管理するのではなく、実際にスキップする領域でまとめ上げて管理してもよい。
書き込み処理部２１２は、ライトバッファが埋まったか判断する（ステップＳ５）。埋まっていなかった場合（ステップＳ５のＮＯ）は処理を終了する。
【００６５】
ライトバッファが埋まった場合（ステップＳ５のＹＥＳ）、書き込み処理部２１２は、書き込み先スロットに書き込む（ステップＳ６）。より詳細には、書き込み先スロットが不良セクタを有していない場合は、書き込み処理部２１２は、図１３に示したように、余白領域を含めて、ライトバッファの内容をメモリインタフェース部２１８を介して読み出し、書き込み先スロットにドライブインタフェース部２１９を介してシーケンシャルライトする。書き込み先スロットが不良セクタを有している場合は、書き込み処理部２１２は、図１４に示したように、ライトバッファの内容をメモリインタフェース部２１８を介して読み出し、スキップする領域（図１４の場合は不良セクタの位置）をスキップして書き込み先スロットにドライブインタフェース部２１９を介してシーケンシャルライトする。図１４の場合は合計２つのシーケンシャルライトになる。このように、スキップしているものの、個々のシーケンシャルライトのアドレスが不良セクタを挟んで並んでいるので、第１のドライブ２３がＨＤＤの場合でも速度が落ちにくい効果を奏する。
【００６６】
書き込み処理部２１２は、書き込みエラーが起こったか判断する（ステップＳ７）。起こった場合（ステップＳ７のＹＥＳ）、書き込み処理部２１２は、不良セクタの情報を更新する（ステップＳ８）。より詳細には、書き込み処理部２１２は、当該書き込みエラーが起こったセクタについて、不良セクタ位置情報およびスロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して更新する。
【００６７】
書き込み処理部２１２は、ライトバッファを埋め直す（ステップＳ９）。より詳細には、書き込み処理部２１２は、更新された不良セクタ位置情報およびスロット不良セクタ存在情報に従って、ライトバッファを埋め直す。より詳細には、書き込み処理部２１２は、更新された不良セクタ位置情報およびスロット不良セクタ存在情報に従って、スキップする領域を設定し直す。なお、書き込み先スロットは、必ずしも書き込みエラーが起こったスロットである必要はなく、別の空きスロットから書き込み先スロットを確保してもよい。
【００６８】
そして、書き込み処理部２１２は、埋め直したライトバッファの内容に基づき、必要に応じてスキップする領域をスキップして、書き込み先スロットにシーケンシャルライトするために、ステップＳ６に戻る。
書き込みエラーが起こらなかった場合（ステップＳ７のＮＯ）、書き込み処理部２１２は、アドレス変換情報を更新する。より詳細には、書き込み処理部２１２は、当該書き込んだValueデータについて、Key情報と、記録位置オフセット情報と、サイズ情報とが含まれるエントリを、アドレス変換情報にアドレス変換情報管理部２１６を介して追加する。
【００６９】
ここで、Key情報には、書き込み命令から抽出したKeyの情報を格納すればよい。記録位置オフセット情報には、当該Valueデータが書き込まれた先頭の位置を格納すればよい。また、サイズ情報には、当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合であっても、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合であっても、書き込み命令から抽出したValueデータのサイズを格納すればよい。当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合であっても、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合であっても、同じにする理由は、アドレス変換情報の情報量を削減するためである。一般に、アドレス変換情報のエントリ数は非常に多くなる。従って、当該書き込んだValueデータがスキップされずにスロットに書き込まれた場合と、当該書き込んだValueデータがスキップされてスロットに書き込まれた場合とを別々のフォーマットで記録しようとするとアドレス変換情報のエントリ数が多いことが要因となり、結果的にアドレス変換情報の情報量が膨大になってしまうからである。
【００７０】
次に、ホスト１からの読み込み命令に応じて、データ記憶装置２が行う読み込み処理の手順について、図２４を参照して説明する。図２４は、データ記憶装置２で行われる読み込み処理の手順の流れの一例を示すフローチャートである。
ホストインタフェース部２１７は、ホスト１から読み込み命令を受け付ける（ステップＳ１）。読み込み命令には、Keyの情報が含まれる。ホストインタフェース部２１７は、読み込み処理部２１１に前記受け付けた読み込み命令を転送する。読み込み処理部２１１は、ホストインタフェース部２１７から読み込み命令を受け取ると、前記受け取った読み込み命令から、Keyの情報を抽出する。
【００７１】
次に、読み込み処理部２１１は、推定領域を設定する。より詳細には、読み込み処理部２１１は、抽出したKeyの情報で、アドレス変換情報をアドレス変換情報管理部２１６を介して参照し、記録位置オフセット情報と、サイズ情報とを取得する。そして、読み込み処理部２１１は、図１６に示したように、記録位置オフセット情報が示す記録位置から、サイズ情報が示すサイズの領域を推定領域とする。
【００７２】
なお、前記取得した記録位置オフセット情報またはサイズ情報にマジックナンバーが記録されていることが判明すると、読み込み処理部２１１は、ホストインタフェース部２１７を介してホスト１に読み込みエラーを返却する。マジックナンバーは、例えば、記録位置オフセット情報またはサイズ情報として取り得ない値とすればよい。より詳細には、例えば、データ記憶装置の受け付け可能なサイズの最大値が９，９９９ＭByteだった場合、マジックナンバーとして１０，０００ＭByteの値を採用することができるが、マジックナンバーとして採用できる値はこれに限られない。
【００７３】
読み込み処理部２１１は、推定領域に書き込み時にスキップした領域（不良セクタ）が含まれているか判断する（ステップＳ３）。より詳細には、読み込み処理部２１１は、記録位置オフセット情報が示す記録位置が属するスロットについて、スロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して参照し、当該スロットに不良セクタが存在するか否かを判断する。当該スロットに不良セクタが存在する場合は、読み込み処理部２１１は、不良セクタ位置情報を不良セクタ情報管理部２１５を介して参照し、前記推定した領域に、書き込み時にスキップした領域(不良セクタ)が含まれているか判断する。図１７には、スキップした領域が含まれていた場合の一例が示されている。図１７は、図１６の推定領域にスキップした領域が２か所含まれている例である。
【００７４】
推定領域に書き込み時にスキップした領域（不良セクタ）が含まれていた場合（ステップＳ３のＹＥＳ）、読み込み処理部２１１は、新たな推定領域を設定する（ステップＳ４）。より詳細には、前記推定した領域に、書き込み時にスキップした領域(不良セクタ)が含まれていた場合、読み込み処理部２１１は、新たな開始位置を前記推定した領域の末尾の位置、新たなサイズを前期推定した領域に含まれていたスキップした領域の個数分のサイズとし、それを新たな推定領域とする。図１８には、図１７の場合の新たな推定領域の一例が示されている。図１７の場合は、スキップした領域が２つであったので、新たなサイズは、スキップ領域２つ分のサイズとなる。
【００７５】
そして、ステップＳ３に戻り、読み込み処理部２１１は、新たな推定領域にスキップした領域が含まれているかを判断する。
推定領域に書き込み時にスキップした領域（不良セクタ）が含まれていなかった場合（ステップＳ３のＮＯ）、または、新たな推定領域を設定すると（ステップＳ４）、読み込み処理部２１１は、全ての推定領域から読み込む（ステップＳ５）。より詳細には、読み込み処理部２１１は、これまでの推定した領域から、書き込み時にスキップした領域(不良セクタ)をスキップしてドライブインタフェース部２１９を介してシーケンシャルリードする。図１９には、これまでの推定した領域が図１８の場合のシーケンシャルリードの一例が示されている。図１９では、書き込み時にスキップした領域(不良セクタ)をスキップした結果、３個のシーケンシャルリードになった。このように、スキップしているものの、個々のシーケンシャルリードのアドレスが不良セクタを挟んで並んでいるので、第１のドライブ２３がＨＤＤの場合でも速度が落ちにくい効果を奏する。一方、図２０には、図１６の推定領域に、書き込み時にスキップした領域(不良セクタ)が含まれていなかった場合のシーケンシャルリードの一例が示されている。図２０では、書き込み時にスキップした領域（不良セクタ）がなかったため、１個のシーケンシャルリードになった。
【００７６】
読み込み処理部２１１は、読み込みエラーが起こったか判断する（ステップＳ６）。読み込みエラーが起こった場合（ステップＳ６のＹＥＳ）、読み込み処理部２１１は、エラー時の対処をする（ステップＳ７）。より詳細には、読み込み処理部２１１は、当該読み込みエラーが起こったセクタについて、不良セクタ位置情報およびスロット不良セクタ存在情報を不良セクタ情報管理部２１５を介して更新する。これは、後述する転記処理において当該スロットが空きスロットとして回収された後に書き込み先スロットとして確保された際に、書き込み処理での適切な処理に必要になるからである。
【００７７】
また、読み込み処理部２１１は、当該読み込みエラーが発生したデータについて、記録位置オフセット情報またはサイズ情報にマジックナンバーを記録するように、アドレス変換情報管理部２１６を介してアドレス変換情報を更新する。これは、再度同じKeyの読み込み要求がされた時の対処である。具体例が図２１に示されている。当該KeyのValueデータが記録されている領域に、今回読み込みエラーが起きたセクタが含まれる。これに伴い、前述の不良セクタ位置情報の更新処理を行うと、今回読み込みエラーが起きたセクタが、不良セクタ位置情報に登録される。この状態で再度同じKeyの読み込み要求がされると、前述の読み込み処理に従って処理がなされ、今回読み込みエラーが起きたセクタがスキップされて、当該KeyのValueデータが記録されている領域に連続する（別のデータが記録されている）領域をリードしてしまうことになり、結果としてリードエラーが起こらず、かつ、正しくないデータをホスト１に返却してしまうことになる。このため、記録位置オフセット情報またはサイズ情報にマジックナンバーを記録することで、再度同じKeyの読み込み要求がされた際に、ホスト１にリードエラーを返却することができる。あるいは、マジックナンバーを記録するのではなく、当該Keyの情報を、アドレス変換情報から削除しもよい。そうすると、再度同じKeyの読み込み要求がされると、アドレス変換情報にないKeyの読み込み要求がされることになる。アドレス変換情報にないKeyの読み込み要求がされる場合、ホスト１にリードエラーを返却するようにしてもよい。
【００７８】
読み込み処理部２１１は、リードエラーをホスト１に返却する（ステップＳ８）。より詳細には、読み込み処理部２１１は、当該読み込みエラーが発生したデータについて、ホストインタフェース部２１７を介してホスト１に読み込みエラーを返却する。そして処理を終了する。
【００７９】
読み込みエラーが起こらなかった場合（ステップＳ６のＮＯ）、読み込み処理部２１１は、読み込んだデータをホスト１に返却する（ステップＳ９）。より詳細には、読み込み処理部２１１は、スキップして読み込んだ場合は、読み込んだデータを連結して、ホストインタフェース部２１７を介してホスト１に返却する。読み込んだデータを連結する作業領域として、ＲＡＭ２２を用いてもよい。スキップしなかった場合は、読み込み処理部２１１は、読み込んだデータをそのままホストインタフェース部２１７を介してホスト１に返却すればよい。ホストインタフェース部２１７は、読み込み処理部２１１から読み込まれたデータを受信すると、前記受信したデータをホスト１に転送する。
【００８０】
次に、ホスト１からの削除命令に応じて、データ記憶装置２が行う削除処理の手順について、図２５を参照して説明する。図２５は、データ記憶装置２で行われる削除処理の手順の流れの一例を示すフローチャートである。
ホストインタフェース部２１７は、ホスト１から削除命令を受け付ける（ステップＳ１）。削除命令には、Keyの情報が含まれる。ホストインタフェース部２１７は、削除処理部２１３に前記受け付けた削除命令を転送する。削除処理部２１３は、ホストインタフェース部２１７から削除命令を受け取ると、前記受け取った削除命令から、Keyの情報を抽出する。
【００８１】
削除処理部２１３は、前記抽出したKeyの情報を、アドレス変換情報から削除する。より詳細には、削除処理部２１３は、前記抽出したKeyの情報が含まれるエントリをアドレス変換情報管理部２１６を介してアドレス変換情報から削除する。
次に、データ記憶装置２が行う転記処理の手順について、図２６を参照して説明する。図２６は、データ記憶装置２で行われる転記処理の手順の流れの一例を示すフローチャートである。
【００８２】
転記処理部２１４は、所定の条件を満たすと転記処理を行う。所定の条件には、任意の公知の方法を用いることができる。例えば、空きスロットの残りが所定数を下回った時でもよい。また、転記処理中にホスト１から読み込み命令や書き込み命令が発行されると、ホスト１からの読み込み命令や書き込み命令の応答時間や転送速度が遅くなる可能性がある。このため、例えば、ホスト１からの命令の負荷が所定の閾値を下回った時でもよい。
【００８３】
転記処理部２１４は、転記先スロットを確保し、当該書き込み先スロットの不良セクタの位置をリストアップし、ライトバッファを準備する（ステップＳ１）。詳細な処理内容は、書き込み処理のステップＳ３（図２３）と同様なので省略する。
転記処理部２１４は、転記元スロットを選択する（ステップＳ２）。転記元スロットの選択方法には、任意の公知の方法を用いることができる。例えば、当該スロットに記録されている有効なKeyのValueデータの総サイズが少ないスロットから選択するようにすると、一度の転記処理で多くの転記元スロットを空きスロットとして回収できる。このため、一例として、当該スロットに記録されている有効なKeyのValueデータの総サイズが少ないスロットから選択する方法が挙げられるが、これに限られない。また、スロットに記録されている有効なKeyのValueデータの総サイズは、アドレス変換情報から算出することができるが、アドレス変換情報とは別に、スロットに記録されている有効なKeyのValueデータの総サイズを管理してもよい。
【００８４】
転記処理部２１４は、転記元スロットから、有効なKeyのValueデータを読み込む（ステップＳ３）。有効なKeyのValueデータの読み込み処理についての詳細な処理内容は、読み込み処理のステップＳ２〜Ｓ５（図２４）と同様なので省略する。
【００８５】
転記処理部２１４は、前記読み込んだValueデータを、ライトバッファに書き込む（ステップＳ４）。ライトバッファにValueデータを書き込む処理についての詳細な処理内容は、書き込み処理のステップＳ４（図２３）と同様なので省略する。
【００８６】
転記処理部２１４は、ライトバッファが埋まるまで、上記処理を適宜繰り返す。より詳細には、転記処理部２１４は、ライトバッファが埋まったかを判断する（ステップＳ５）。ライトバッファがまだ埋まっていなかった場合（ステップＳ５のＮＯ）、転記処理部２１４は、続いて、転記元スロットから有効なKeyのValueデータをすべて読み込んだかを判断する（ステップＳ６）。すべて読み込んでいない場合は（ステップＳ６のＮＯ）、ステップＳ３に戻る。すべて読み込んだ場合は（ステップＳ６のＹＥＳ）、ステップＳ２に戻る。
【００８７】
ライトバッファが埋まった場合（ステップＳ５のＹＥＳ）、転記処理部２１４は、ライトバッファの内容を当該書き込み先スロットに書き込む（ステップＳ７）。ライトバッファの内容を当該書き込み先スロットに書き込む処理についての詳細な処理内容は、書き込み処理のステップＳ６（図２３）と同様なので省略する。
【００８８】
転記処理部２１４は、当該書き込んだValueデータについて、アドレス変換情報を更新する（ステップＳ８）。より詳細には、転記処理部２１４は、当該書き込んだValueデータについて、記録位置オフセット情報が、転記元スロットの当該位置から、転記先スロットの当該位置を示すように、アドレス変換情報をアドレス変換情報管理部２１６を介して更新する。
【００８９】
そして、転記処理部２１４は、転記元スロットを空きスロットとして回収する（ステップＳ９）。より詳細には、転記処理部２１４は、転記した結果、記録されているデータがすべて無効になった転記元スロットを空きスロットとして回収する。
例えば、従来のＬＢＡ型のストレージシステムでは、読み込みエラーや書き込みエラーが発生したドライブ（ＨＤＤ等）の取り扱いとして、それらのドライブは交換することが前提となっている。これは、ストレージシステム上に構成するファイルシステムのメタデータが壊れると、ファイルシステム全体が復旧不能になる可能性が高く、ファイルシステムが読み込みエラーや書き込みエラーに対して耐性が弱いことが、要因の一つとして挙げられる。
【００９０】
従来、ストレージシステムでは、ＲＡＩＤ構成を取るなどして、冗長化もなされているが、データエラーが発生してから、交換・リビルド処理が完了するまでの間に、データが失われることを避けることを目的としており、あくまでもデータエラーが発生したドライブを交換するという前提に変わりはない。近年のドライブ容量増加に伴い、リビルド処理も数日のオーダーになってきており、システムのダウンタイムやサービス提供能力の性能低下のペナルティも大きくなっている。
【００９１】
ストレージシステムの信頼性を上げようとすると、高信頼な高価なドライブを使用しなければならず、コストアップを招く。逆に、安価なドライブを使おうとすると、例えば規模の大きいデータセンタだと、データセンタの中で常にどこかでリビルド処理が行われているというような状況になりかねない。従って、ダウンタイム・性能低下のペナルティだけではなく、交換用ドライブのコストと、ドライブ交換およびリビルド処理の人的オペレーションのコストとについてコストアップを招く。
【００９２】
これに対して、本実施形態のデータ記憶装置２では、読み込みエラーが起きても、エラーの影響は特定のValueデータに閉じ込められるため、ストレージシステムに記録されているデータ全体の損失につながらない。また、読み込みエラーや書き込みエラーになったセクタを避けながら（容量を減らしながら）長期運用することができる。これにより、結果として、コストを低減することができるという効果を奏する。また、本実施形態のデータ記憶装置２では、不良セクタをスキップしているものの、シーケンシャルアクセスのアドレスが不良セクタを挟んで並んでいるので、速度が落ちにくい効果を奏する。
【００９３】
即ち、本実施形態のデータ記憶装置２は、信頼性や性能の低下を招くことなく、コストを低減することができる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれると共に、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００９４】
１…ホスト、２…データ記憶装置、２１…コントローラ、２２…ＲＡＭ、２３…第１のドライブ、２４…第２のドライブ、２１１…読み込み処理部、２１２…書き込み処理部、２１３…削除処理部、２１４…転記処理部、２１５…不良セクタ情報管理部、２１６…アドレス変換情報管理部、２１７…ホストインタフェース部、２１８…メモリインタフェース部、２１９…ドライブインタフェース部。
【図１】
0006542152.tif 000002
【図２】
0006542152.tif 000003
【図３】
0006542152.tif 000004
【図４】
0006542152.tif 000005
【図５】
0006542152.tif 000006
【図６】
0006542152.tif 000007
【図７】
0006542152.tif 000008
【図８】
0006542152.tif 000009
【図９】
0006542152.tif 000010
【図１０】
0006542152.tif 000011
【図１１】
0006542152.tif 000012
【図１２】
0006542152.tif 000013
【図１３】
0006542152.tif 000014
【図１４】
0006542152.tif 000015
【図１５】
0006542152.tif 000016
【図１６】
0006542152.tif 000017
【図１７】
0006542152.tif 000018
【図１８】
0006542152.tif 000019
【図１９】
0006542152.tif 000020
【図２０】
0006542152.tif 000021
【図２１】
0006542152.tif 000022
【図２２】
0006542152.tif 000023
【図２３】
0006542152.tif 000024
【図２４】
0006542152.tif 000025
【図２５】
0006542152.tif 000026
【図２６】
0006542152.tif 000027