以下、実施の形態について図面を参照して詳細に説明する。
〔第1の実施の形態〕
図1は、第1の実施の形態に係る制御システムの構成例とその動作例を示す図である。図1に示す情報処理システム1は、プロセッサ11、第1のメモリ21、第2のメモリ22、第1の転送制御回路31および第2の転送制御回路32を備える。
この情報処理システム1は、データDTを、第1のメモリ21と第2のメモリ22とに二重化して記録して、データDTの安全性を向上させるようにしたものである。第2のメモリ22は、第1のメモリ21に格納されるデータをバックアップするために設けられている。
なお、図1では例として、二重化の対象となるデータDTは、バッファメモリ23に一時的に格納されているものとする。また、バッファメモリ23の記憶領域と第1のメモリ21の記憶領域は、例えば、同一の半導体メモリによって実現されてもよい。
第1の転送制御回路31は、プロセッサ11、第1のメモリ21および第2の転送制御回路32に接続されている。第1の転送制御回路31は、例えば、第1のメモリ21に対するデータの書き込みや、第2の転送制御回路32との間のデータの送受信を、プロセッサ11とは独立して実行可能になっている。
第2の転送制御回路32は、第2のメモリ22および第1の転送制御回路31と接続されている。第2の転送制御回路32は、例えば、第2のメモリ22に対するデータの書き込みや、第1の転送制御回路31との間のデータの送受信を、プロセッサ11とは独立して実行可能になっている。
以下、上記構成の情報処理システム1において、バッファメモリ23に一時的に記憶されたデータDTを第1のメモリ21と第2のメモリ22とに二重化する処理について、順を追って説明する。
プロセッサ11は、第1のメモリ21を転送先とするデータDTの転送を、第1の転送制御回路31に要求する(ステップS1)。転送要求を受けた第1の転送制御回路31は、バッファメモリ23からデータDTを読み出し、第1のメモリ21ではなく第2の転送制御回路32に送信する(ステップS2)。このステップS2の処理は、例えば、第1のメモリ21を書き込み先とする書き込み要求パケットが送信されることで行われる。
第2の転送制御回路32は、第1の転送制御回路31から送信されたデータDTを受信すると、受信したデータDTを第2のメモリ22に格納する(ステップS3)とともに、受信したデータDTを第1の転送制御回路31を介して第1のメモリ21に格納する(ステップS4)。例えば、第2の転送制御回路32は、受信したデータDTを図示しないバッファメモリに一時的に格納した後、このバッファメモリから読み出したデータDTを第2のメモリ22と第1のメモリ21とに転送する。なお、ステップS4の処理は、例えば、第2の転送制御回路32が第1の転送制御回路31からの書き込み要求パケットを第1の転送制御回路31に転送することで行われる。
以上の処理によれば、プロセッサ11が第1の転送制御回路31にデータ転送を1回だけ要求することで、データDTが第1のメモリ21と第2のメモリ22とに二重化されて記録される。このため、例えば、プロセッサ11が、データDTをバッファメモリ23から第1のメモリ21へ転送するように要求した後、データDTをバッファメモリ23から第2のメモリ22へ転送するように要求した場合と比較して、データの二重化に要する時間を短縮することができる。
例えば、プロセッサ11が第1の転送制御回路31にデータ転送を要求した際には、データ転送に要する実時間に対して無視できない長さのオーバヘッドが発生する。情報処理システム1では、プロセッサ11がデータ転送を1回だけ要求するようにし、この要求に応じて、プロセッサ11から独立した第2の転送制御回路32というハードウェアが、データDTを2方向に転送するようにしたことで、発生するオーバヘッドの長さが短縮される。これにより、データの二重化に要する時間を短縮することができる。
また、第1の転送制御回路31は、例えば、プロセッサとメモリとの間に配置されて、メモリとプロセッサ以外の周辺機器との間でデータを送受信する、一般的なメモリコントローラあるいはバスコントローラとして実現することができる。このような第1の転送制御回路31に、周辺機器として第2の転送制御回路32を接続した構成としたことで、情報処理システム1の基本的な内部構成を変えずに、データの二重化を高速化することができる。
〔第2の実施の形態〕
図2は、第2の実施の形態に係るストレージシステムの構成例を示す図である。
ストレージシステム100は、CM(Controller Module)200a,200b、CBU(Cache Backup Unit)300a,300bおよびDE(Drive Enclosure)400を備える。また、CM200a,200bには、ホスト装置500a,500bが接続されている。
CM200a,200bのそれぞれは、ホスト装置からのIO(In Out)要求に応じて、DE400内の記憶装置に対するデータの読み書きを行う。例えば、CM200a,200bはそれぞれ、ホスト装置500a,500bのどちらからもIO要求を受け付けることができる。なお、CM200a,200bに接続されるホスト装置の数は、図2のように2つに限らない。
また、CM200aは、自装置内のRAM(Random Access Memory)の記憶領域の一部をキャッシュ領域として使用し、ホスト装置からDE400への書き込みを要求された書き込みデータや、DE400から読み出された読み出しデータを、キャッシュ領域に一時的に記録する。CM200bも同様に、自装置内のRAMの記憶領域の一部をキャッシュ領域として使用し、ホスト装置からDE400への書き込みを要求された書き込みデータや、DE400から読み出された読み出しデータを、キャッシュ領域に一時的に記録する。
DE400は、CM200a,200bからのアクセス制御対象となる複数の記憶装置を備える。本実施の形態のDE400は、記憶装置としてHDD(Hard Disk Drive)を備えるディスクアレイ装置である。なお、DE400が備える記憶装置としては、SSD(Solid State Drive)などの他の種類の不揮発性記憶装置を使用することもできる。また、CM200a,200bには、複数のDE400が接続されていてもよい。
ホスト装置500aは、ユーザの操作に応じて、CM200a,200bのいずれかに対してDE400内のHDDへのアクセスを要求する。ホスト装置500aは、例えば、ユーザの操作に応じて、CM200a,200bのいずれかを通じて、DE400内のHDDからのデータの読み出しや、DE400内のHDDに対するデータの書き込みを行うことができる。ホスト装置500bも、ホスト装置500aと同様の処理を実行可能である。
CM200aとCBU300a、CBU300aとCBU300b、CBU300bとCM200bは、それぞれPCIeバスによって接続されている。また、CBU300a,300bはそれぞれ、不揮発性メモリとしてNANDフラッシュを備えている。
CBU300aは、CM200aのキャッシュ領域にデータが書き込まれるのに同期して、同じデータを自装置内のNANDフラッシュにバックアップする。CBU300bは、CM200bのキャッシュ領域にデータが書き込まれるのに同期して、同じデータを自装置内のNANDフラッシュにバックアップする。
このように、CMのキャッシュ領域のデータが不揮発性メモリであるNANDフラッシュにバックアップされることで、CMの動作が異常停止した場合でも、キャッシュ領域のデータが失われないようにすることができる。例えば、停電によってCMの動作が停止した際に、バックアップ領域を実現するメモリデバイスに電源を供給し続ける必要がなくなる。
また、キャッシュ領域のデータがCBUのNANDフラッシュにバックアップされることで、例えば、異常停止したCMが復旧したときに、復旧したCMは、CBUのNANDフラッシュに記憶されたデータを自装置のキャッシュ領域に書き戻すことで、アクセス制御動作を即座に再開することができる。さらに、CMのキャッシュ領域のデータのうち、DE400のHDDに書き込まれていないダーティデータが失われる事態を回避でき、ストレージシステム100の信頼性が向上する。
また、図2のように、CM200aと、CM200aのキャッシュ領域のデータをバックアップするCBU300aとが分離されることで、例えば、CM200aが異常停止した場合に、他方のCM200bがCBU300aのNANDフラッシュからデータを読み出すことができる。この場合、CM200bは、読み出したデータを自装置のキャッシュ領域に格納して、CM200aが実行していたアクセス制御を即座に引き継ぐことができる。
また、例えば、特許文献1に記載の技術のように、一方のCMのキャッシュ領域のデータを他方のCMのRAMにバックアップする場合には、各CMのRAMに他方のCM用のバックアップ領域を確保する必要がある。これに対して、キャッシュ領域のデータをCBU内のNANDフラッシュにバックアップすることにより、各CMのRAMの使用量を減らすことができる。
ところで、例えば、ホスト装置からの書き込み要求に応じて、ホスト装置から送信されたデータをCM内のキャッシュ領域に書き込む場合には、キャッシュ領域へのデータの書き込みとNANDフラッシュへのデータの書き込みという2回の書き込み動作が必要になる。このため、ホスト装置に応答するまでの時間が長くなる可能性がある。
これに対して、本実施の形態では、CMのCPU(Central Processing Unit)が自装置内のキャッシュ領域を書き込み先としたDMA転送を1回要求すると、CM内のメモリコントローラが、書き込みデータをCBUにDMA方式で転送する。CBUは、受信した書き込みデータをCMのキャッシュ領域と自装置内のNANDフラッシュとに並列に書き込む。このように、DMA転送が1回要求されるだけでデータがキャッシュ領域とNANDフラッシュとに二重に書き込まれる構成としたことで、ホスト装置500に対する応答時間が短縮される。
また、一般的にNANDフラッシュは、データを上書きする際には、書き込まれているデータを一旦消去する必要があり、なおかつ、データを消去することが可能な最小領域は、データを読み書きすることが可能な最小領域より大きい、という性質がある。このことから、ランダムなデータをNANDフラッシュに書き込む際の書き込み速度は、キャッシュ領域として使用されるDRAM(Dynamic RAM)などの揮発性メモリと比較して遅い。
これに対して、本実施の形態のCBUは、NANDフラッシュの記憶領域を、ページ単位の分割領域および複数ページ単位の分割領域といった大きさの異なる領域に分割して管理する。そして、CBUは、キャッシュ領域のデータをNANDフラッシュに書き込む際に、書き込むデータの大きさに合致した分割領域に対してデータを書き込む。このような書き込み制御を行うことで、NANDフラッシュにおいて、内部の一部領域にのみ無効データを含むページがランダムに発生しにくくなり、その結果、上書きを伴う書き込みに要する時間が短くなる。
図3は、CMおよびCBUのハードウェア構成例を示す図である。
なお、この図3では例としてCM200aおよびCBU300aについて説明するが、CM200bはCM200aと同様のハードウェア構成によって実現され、CBU300bはCBU300bと同様のハードウェア構成によって実現される。また、CM200bはCM200aと同様の処理を実行可能であり、CBU300bはCBU300aと同様の処理を実行可能である。そこで、これ以後、主としてCM200aおよびCBU300aの構成および処理について説明し、CM200bおよびCBU300bについての説明を適宜省略する。
CM200aは、CPU201によって装置全体が制御されている。CPU201には、RAM202および周辺機器が、メモリコントローラ(MC)203を介して接続されている。RAM202は、CM200aの主記憶装置として使用され、CPU201に実行させるプログラムの少なくとも一部や、このプログラムによる処理に必要な各種データを一時的に記憶する。
CPU201には、周辺機器の例として、SSD204、ホストインタフェース(I/F)205およびディスクインタフェース(I/F)206が接続されている。
SSD204は、CM200aの二次記憶装置として使用され、CPU201によって実行されるプログラムやその実行に必要な各種のデータなどを記憶する。なお、二次記憶装置としては、例えば、HDDなどの他の種類の不揮発性記憶装置が使用されてもよい。
ホストインタフェース205は、ホスト装置500との間でデータを送受信するインタフェース処理を実行する。ディスクインタフェース206は、DE400内のHDDとの間でデータを送受信するインタフェース処理を実行する。
メモリコントローラ203は、CBU300aとPCIeバスを介して接続されている。メモリコントローラ203は、CM200a内の周辺機器とCPU201との間のデータ転送や、CPU201とCBU300aとの間のデータ転送を制御する。
また、メモリコントローラ203は、DMAコントローラ(DMAC)203aを備えている。DMAコントローラ203aは、CPU201からのDMA転送要求に応じて、RAM202内のデータをRAM202内の他の領域に書き込む処理や、RAM202内のデータをCBU300aに転送する処理を、CPU201とは独立して実行する。また、DMAコントローラ203aは、他方のCM200bからCBU300b、CBU300aを介して受信した情報に応じて、データ転送処理をCPU201とは独立して実行することもできる。
CBU300aは、IO制御部310、NAND制御部321、テーブル制御部322、DMAコントローラ(DMAC)323、NANDフラッシュ331およびRAM332を備えている。
IO制御部310は、PCIeバスを通じたデータの送受信を制御する制御回路である。IO制御部310は、PCIeバスを通じて受信した情報の宛先を判別して、受信した情報をCM200aのメモリコントローラ203もしくはCBU300b、またはNAND制御部321に転送する。また、IO制御部310は、CM200aからの指示に応じてDMAコントローラ323にDMA転送を要求し、NANDフラッシュ331に記録されたデータをDMAコントローラ323の制御の下でCM200aに転送することもできる。
また、IO制御部310の内部にはバッファメモリ311が設けられている。IO制御部310は、PCIeバスを通じて送受信するデータをバッファメモリ311に一時的に格納する。なお、バッファメモリ311のメモリ領域は、RAM332と共通化されていてもよい。
NAND制御部321およびテーブル制御部322は、NANDフラッシュ331に対するアクセス制御を実現するための制御回路である。なお、NAND制御部321とテーブル制御部322とは、個別の半導体装置として実現されてもよいし、あるいは1つの半導体装置として実現されてもよい。また、NAND制御部321およびテーブル制御部322の少なくとも一方の機能が、IO制御部310と同じ半導体装置によって実現されてもよい。
テーブル制御部322は、NANDフラッシュ331の記憶領域を管理するためのテーブルをRAM332に登録する。後述するように、テーブル制御部322は、テーブルを用いて、NANDフラッシュ331の記憶領域を、少なくとも、ページ単位の領域と1つまたは複数のブロック単位の領域とに分けて管理する。ここで、ページはデータを読み書きする際の最小単位の領域であり、例えば4キロバイトの容量を有する。また、ブロックはデータを消去する際の最小単位の領域であり、例えば512キロバイトの容量を有する。
NAND制御部321は、テーブル制御部322から書き込み先または読み出し元のアドレスの指定を受けて、NANDフラッシュ331に対するデータの書き込みや、NANDフラッシュ331からのデータの読み出しを行う。
DMAコントローラ323は、CM200aが異常停止したときに、CM200aのキャッシュ領域のデータを他方のCM200bに転送して、CM200aで行われていたIO処理を復旧させるために設けられている。DMAコントローラ323は、他方のCM200bからの指示に応じて、NANDフラッシュ331にバックアップされた、キャッシュ領域のデータを、CM200bに対して転送する。このデータ転送の際、DMAコントローラ323は、RAM332に記憶されたテーブル情報を、テーブル制御部322を通じて取得することができる。
次に、ストレージシステム100で実行の処理の詳細について説明する。以下の説明では、最初に、CMのキャッシュ領域のデータを二重化する処理について説明し、その次に、CBUのNANDフラッシュに対するアクセス制御処理について説明する。そして、その後に、これらの処理を実現するためのストレージシステム100全体における処理について説明する。
(1)キャッシュ領域のデータの二重化処理
図4は、キャッシュ領域のデータの二重化処理を説明するための図である。
CM200aのRAM202には、バッファ領域202aとキャッシュ領域202bとが確保される。ホスト装置は、CM200aに対してデータの書き込みを要求するとともに、書き込みデータを送信する。送信された書き込みデータは、CM200aのバッファ領域202aに一時的に格納される。この後、CM200aは、バッファ領域202aに格納された書き込みデータをキャッシュ領域202bに書き込むが、このときCM200aは、同じ書き込みデータをCBU300aのNANDフラッシュ331にも書き込み、書き込みデータを二重化する。
バッファ領域202aからキャッシュ領域202bおよびNANDフラッシュ331に書き込みデータを転送する処理は、DMA方式で実行されることで、CPU201の動作とは独立して高速に実行することができる。バッファ領域202aからキャッシュ領域202bおよびNANDフラッシュ331にデータがDMA転送される場合は、通常、CPU201は、キャッシュ領域202bにデータを書き込むためのDMA転送要求と、NANDフラッシュ331にデータを書き込むためのDMA転送要求とを、個別に行う。このように、CPU201がDMA転送を2回要求することで、CPU201がホスト装置に対して書き込み完了を応答するまでの時間が長くなってしまうという問題がある。
これに対して、本実施の形態のストレージシステム100では、CPU201がDMA転送を1回要求することで、キャッシュ領域202bへのデータのDMA転送とNANDフラッシュ331へのデータのDMA転送とが実行される。これにより、データの二重化に要する時間が短縮され、ホスト装置からの書き込み要求に対するCM200aの応答速度が向上する。
以下、ホスト装置からCM200aに対してデータの書き込み要求が送信された場合の処理について、順を追って説明する。
ホスト装置がCM200aに対してデータの書き込みを要求すると、ホスト装置から送信された書き込みデータWD1は、CM200aのバッファ領域202aに一旦書き込まれる(ステップS11)。CM200aのCPU201は、DMAコントローラ203aに対して、読み出し元をバッファ領域202aに指定し、書き込み先をキャッシュ領域202bに指定した書き込み動作を要求する(ステップS12)。
DMAコントローラ203aは、CPU201からの要求に応じて、書き込みデータWD1をバッファ領域202aから読み出し、読み出した書き込みデータWD1をキャッシュ領域202bではなくCBU300aに転送する(ステップS13)。具体的には、DMAコントローラ203aは、書き込みコマンドと、書き込み先としてキャッシュ領域202bの所定アドレスとを設定した書き込み要求パケットに、バッファ領域202aから読み出した書き込みデータWD1を格納し、その書き込み要求パケットをCBU300aに送信する。
CBU300aのIO制御部310は、CM200aから受信した書き込み要求パケットを、バッファメモリ311に一旦格納する。IO制御部310は、書き込み要求パケットに格納された書き込みデータWD1を、CBU300a内のNANDフラッシュ331に書き込む(ステップS14)。これとともに、IO制御部310は、バッファメモリ311内の書き込み要求パケットを、CM200aのメモリコントローラ203に転送する(ステップS15)。NANDフラッシュ331へのデータの書き込みとCM200aへの書き込み要求パケットの転送は、例えば並列に実行される。CM200aのメモリコントローラ203は、CBU300aから転送された書き込み要求パケットから書き込みデータWD1を取り出し、キャッシュ領域202bに書き込む。
以上の処理によれば、CM200aのCPU201がDMA転送を1回要求すると、書き込みデータWD1は自動的にCBU300aに転送される。そして、CBU300aのIO制御部310の処理によって、書き込みデータWD1はNANDフラッシュ331とキャッシュ領域202bとに転送される。このような処理により、CPU201がDMA転送を要求する際のオーバヘッドが1回分しか生じなくなり、書き込みデータWD1の二重化が完了して、CPU201がホスト装置に対して書き込み完了の応答をできるようになるまでの時間が短縮される。
なお、バッファ領域202aの書き込みデータWD1をCM200aの外部に転送するという上記のDMAコントローラ203aの機能は、本来、書き込みデータWD1を外部のバックアップ領域に転送するための機能と言うことができる。例えば、この機能は、特許文献1の技術のように、CM200aに対応する一方のコントローラが、自装置内のキャッシュ領域のデータを、CM200bに対応する他方のコントローラのキャッシュ領域に格納する際に使用されるものである。
本実施の形態では、この機能を応用し、後述するように、二重化要求であることを示す情報をヘッダ領域に設定しておくことで、書き込み要求パケットを受信したCBU300aが上記のステップS14,S15のような二重化処理を実行できるようにしている。さらに、書き込み要求パケットにおいて、書き込み先としてバックアップ領域ではなくキャッシュ領域202bのアドレスを設定しておくことで、CBU300aから転送された書き込み要求パケットを受信したCM200aのメモリコントローラ203が、書き込みデータWD1をキャッシュ領域202bに格納できるようにしている。
ところで、CM200a,200bがともに正常に動作している環境では、ユーザに提供される複数の論理ボリュームのうち、どの論理ボリュームに対するアクセス制御をCM200aが担当し、どの論理ボリュームに対するアクセス制御をCM200bが担当するかが、あらかじめ決められている。ここで、論理ボリュームとは、DE400内のHDDの物理記憶領域によって実現される論理的な記憶領域である。
このような環境では、例えば、CM200aは、ホスト装置から自装置が担当する論理ボリュームに対する書き込み要求を受け付けると、ホスト装置から受信した書き込みデータを、自装置のキャッシュ領域202bとCBU300aのNANDフラッシュ331とに書き込む。また、CM200bは、ホスト装置から自装置が担当する論理ボリュームに対する書き込み要求を受け付けると、ホスト装置から受信した書き込みデータを、自装置のキャッシュ領域202bとCBU300bのNANDフラッシュ331とに書き込む。
このように、CBU300aのNANDフラッシュ331には、CM200aが担当する論理ボリュームに書き込まれるデータがバックアップされる。一方、CBU300bのNANDフラッシュ331には、CM200bが担当する論理ボリュームに書き込まれるデータがバックアップされる。
しかしながら、一方のCMが、ホスト装置から、他方のCMが担当する論理ボリュームに対するアクセス要求を受け付ける場合もある。例えば、ホスト装置と他方のCMとの間の伝送路の負荷が高い場合や、その伝送路上で異常が発生している場合などである。この場合、一方のCMがホスト装置から受信した書き込みデータが、他方のCM内のキャッシュ領域202bと、他方のCMに属するCBU内のNANDフラッシュ331とに書き込まれる。
本実施の形態のストレージシステム100では、このようなケースでも、キャッシュ領域202bおよびNANDフラッシュ331への書き込みデータの二重化処理が1回のDMA転送要求に応じて行われるようにして、二重化処理の速度を向上させる。
図5は、CMが、他方のCMが担当する論理ボリュームに対するアクセス要求を受けた場合のデータ二重化処理手順を説明するための図である。
ホスト装置がCM200aに対してデータの書き込みを要求すると、ホスト装置から送信された書き込みデータWD2は、CM200aのバッファ領域202aに一旦書き込まれる(ステップS21)。CM200aのCPU201は、ホスト装置からの書き込み要求が、他方のCM200bが担当する論理ボリュームに対するものである場合、CM200bに対してPCIeパケットを送信して、書き込み要求先の論理ボリュームおよびアドレスを識別する情報を通知する(ステップS22)。
CM200aからのPCIeパケットは、CBU300aのIO制御部(図示せず)およびCBU300bのIO制御部310を介して、CM200bに転送される。CM200bのCPU201は、CM200aからのPCIeパケットを受信すると、CM200bのDMAコントローラ203aに対して、読み出し元をCM200aに指定し、転送先をCM200bのキャッシュ領域202bに指定した読み出し動作を要求する(ステップS23)。
CM200bのDMAコントローラ203aは、CPU201からの要求に応じて、CM200aに対して書き込みデータWD2の読み出しを要求する(ステップS24)。具体的には、CM200bのDMAコントローラ203aは、読み出しコマンドと、転送先としてCM200bのキャッシュ領域202bの所定アドレスとを設定した読み出し要求パケットを、CM200aに送信する。
CM200bのDMAコントローラ203aから送信された読み出し要求パケットは、CBU300bのIO制御部310およびCBU300aのIO制御部(図示せず)を介して、CM200aに転送される。CM200aのメモリコントローラ203は、CM200bから読み出し要求パケットを受信すると、CM200aのバッファ領域202aから書き込みデータWD2を読み出し、読み出した書き込みデータWD2を格納した応答パケットを返信する(ステップS25)。返信された応答パケットは、CBU300aのIO制御部(図示せず)を介してCBU300bに転送される。
CBU300bのIO制御部310は、CM200aから受信した応答パケットを、バッファメモリ311に一旦格納する。CBU300bのIO制御部310は、応答パケットに格納された書き込みデータWD2を、CBU300b内のNANDフラッシュ331に書き込む(ステップS26)。これとともに、CBU300bのIO制御部310は、バッファメモリ311内の応答パケットを、CM200bのDMAコントローラ203aに転送する(ステップS27)。NANDフラッシュ331へのデータの書き込みとCM200bへの応答パケットの転送は、例えば並列に実行される。CM200bのDMAコントローラ203aは、CBU300bから転送された応答パケットから書き込みデータWD2を取り出し、キャッシュ領域202bに書き込む。
以上の処理によれば、CM200bのCPU201が、CM200aのバッファ領域202aからCM200bのキャッシュ領域202bへの書き込みデータWD2のDMA転送と、CM200aのバッファ領域202aからCBU300bのNANDフラッシュ331への書き込みデータWD2のDMA転送とを個別に要求する場合と比較して、書き込みデータWD2の二重化が完了するまでの処理時間が短縮される。従って、ホスト装置から書き込み要求を受け付けたCM200aは、ホスト装置に対して短時間で書き込み完了の応答を行うことができる。
なお、図5に示した処理は、書き込みデータWD2を他方のCM200aから取得するためにDMAコントローラ203aが送信した読み出し要求パケットに対する応答パケットを、伝送路上のCBU300bがキャプチャすることで、書き込みデータWD2をCM200bだけでなくCBU300bも取得できるようにしたものと言うことができる。本実施の形態では、二重化要求であることを示す情報を読み出し要求パケットのヘッダ領域に設定しておくことで、CBU300bが応答パケットから書き込みデータWD2を取り込んでNANDフラッシュ331に書き込むことができるようにしている。
(2)NANDフラッシュに対するアクセス制御処理
次に、CBUのNANDフラッシュに対するアクセス制御処理について説明する。まず、図6を用いてNANDフラッシュに対するアクセス制御処理の参考例を挙げ、この図6を用いてNANDフラッシュにおける問題点を説明し、その後に本実施の形態のアクセス制御処理について説明する。
図6は、NANDフラッシュに対するブロック単位での書き込み処理手順の参考例を示す図である。
NANDフラッシュには一般的に、データを上書きする際には、書き込まれているデータを一旦消去する必要があり、なおかつ、データを消去することが可能な最小領域は、データを読み書きすることが可能な最小領域より大きい、という性質がある。データを読み書きすることが可能な最小領域は「ページ」と呼ばれ、以下、例として1ページは4キロバイトとする。また、データを消去することが可能な最小領域は「ブロック」と呼ばれ、以下、例として1ブロックは512キロバイトとする。上記のような性質から、NANDフラッシュについては、初期状態からある程度時間が経過するとデータのアクセス速度が低くなるという問題がある。
図6に示すNANDフラッシュの参考例では、NANDフラッシュには、ユーザ領域A1とスペア領域A2とが設けられている。NANDフラッシュのコントローラ(図示せず)は、図6の状態1のようにNANDフラッシュにデータが書き込まれていない初期状態から、データの書き込みが要求されると、図6の状態2のように、NANDフラッシュのユーザ領域A1に対して順次データを書き込んでいく。コントローラは、データを書き込んだブロックのステータスを「有効」に変更する。
また、NANDフラッシュのコントローラは、NANDフラッシュにすでに記録されたデータの上書きが要求されると、上書きデータをNANDフラッシュの別の空きブロックに書き込む。ここで、本実施の形態のCMは、ホスト装置から、512バイトごとに付与されたLBA(Logical Block Address)を単位として読み書きの要求を受ける。このため、NANDフラッシュの1ブロックに記録されたデータの一部のみ、すなわち、1ブロック内のページのうちの一部のみが、上書きの対象になることがある。NANDフラッシュのコントローラは、NANDフラッシュの1ブロック内の一部のページに対応するデータの上書きが要求された場合、上書きデータを別の空きブロックに書き込むとともに、上書き対象の元データが記録されているブロックのステータスを、その内部の一部のページが無効であることを示す「ダーティ」に変更する。
図6の状態3では、NANDフラッシュのコントローラは、ブロックB1内の一部のページに対応するデータの一部の上書きが要求されると、上書きデータを空きブロックであるブロックB11に書き込むとともに、ブロックB1のステータスをダーティにする。同様に、コントローラは、ブロックB2内の一部のページに対応するデータの上書きが要求されると、上書きデータを空きブロックであるブロックB12に書き込むとともに、ブロックB2のステータスをダーティにする。また、コントローラは、ブロックB3内の一部のページに対応するデータの上書きが要求されると、上書きデータを空きブロックであるブロックB13に書き込むとともに、ブロックB3のステータスをダーティにする。以下、ステータスがダーティであるブロックを「ダーティブロック」と呼ぶ。
このようにして、NANDフラッシュではダーティブロックが増加していく。ダーティブロックが増加するほど、NANDフラッシュ全体の記憶容量と比較して、NANDフラッシュに実際に記録できるデータの容量が小さくなってしまう。そこで、NANDフラッシュのコントローラは、図6の状態4のようにNANDフラッシュの空きブロック数が一定数以下になると、空きブロックを増やすための処理を実行する。
例えば、NANDフラッシュのコントローラは、図6の状態5に示すように、ステータスがダーティであるブロックB1,B4における有効ページのデータを、空きブロックであるブロックB14にコピーする。また、コントローラは、ステータスがダーティであるブロックB5における有効ページのデータを、空きブロックであるブロックB15にコピーする。これらのコピーが終了すると、ブロックB1,B4,B5の中のすべてのページが無効になる。コントローラは、図6の状態6のように、ブロックB1,B4,B5のデータを消去し、これらのブロックB1,B4,B5を空きブロックにする。
以上の図6の例のように、NANDフラッシュでは、空きブロックを確保する際に、有効ページのデータのコピー、およびコピーが済んだブロックのデータ消去が行われる。このようなデータのコピーおよび消去にNANDフラッシュの内部バスの帯域を使用されることで、NANDフラッシュに対する外部からのアクセス速度が低下してしまうという問題があった。また、このような問題を解決するために、NANDフラッシュのフロントエンドにキャッシュメモリを搭載する方法があるが、この方法では回路規模や製造コストが大きくなってしまう。
そこで、本実施の形態では、CBUが次に説明するようなNANDフラッシュのアクセス制御を行うことで、キャッシュメモリを用いることなく、NANDフラッシュに対するランダムなデータの書き込み速度を向上させる。以下、例としてCBU300aでの処理について説明するが、CBU300bも同様の処理を実行可能である。
図7は、CBUにおけるNANDフラッシュの領域管理方法を説明するための図である。
CBU300aは、NANDフラッシュ331の内部を、ユーザ領域L,M,Sという3つの領域に分けて管理する。CBU300aは、ユーザ領域Sを、図6に示した参考例と同様に、ページ単位でデータが書き込まれるように管理する。また、CBU300aは、ユーザ領域Lを、ブロック単位でデータが書き込まれるように管理する。また、CBU300aは、ユーザ領域Mを、複数ページでかつブロックより小さい領域を単位としてデータが書き込まれるように管理する。
以下、ユーザ領域Lにおける書き込み単位の領域を「L−分割領域」、ユーザ領域Mにおける書き込み単位の領域を「M−分割領域」、ユーザ領域Sにおける書き込み単位の領域を「S−分割領域」と呼ぶ。なお、図7では、L−分割領域、M−分割領域およびS−分割領域のそれぞれの正確な大きさを示してはいない。
CBU300aは、CM200aからNANDフラッシュ331に対するデータの書き込み要求を受けたとき、書き込みデータの大きさに応じて、データの書き込み先をユーザ領域L,M,Sのいずれかに振り分ける。CBU300aは、書き込みデータがS−分割領域の大きさ以下である場合には、書き込みデータをユーザ領域S内のいずれかのS−分割領域に書き込む。また、CBU300aは、書き込みデータがS−分割領域の大きさより大きく、M−分割領域の大きさ以下である場合には、書き込みデータをユーザ領域M内のいずれかのM−分割領域に書き込む。また、CBU300aは、書き込みデータがM−分割領域の大きさより大きく、L−分割領域の大きさ以下である場合には、書き込みデータをユーザ領域L内のいずれかのL−分割領域に書き込む。
なお、元の書き込みデータがL−分割領域の大きさより大きい場合には、例えば、元の書き込みデータが先頭からL−分割領域の大きさごとに分割される。そして、分割された書き込みデータが、1つまたは複数のL−分割領域と1つのS−分割領域または1つのM−分割領域に振り分けて書き込まれる。
図8は、各ユーザ領域に対するデータの書き込み処理例を示す図である。
CBU300aは、ユーザ領域L,M,Sの全体が空き領域とされた初期状態から、データの書き込み要求を受けると、図8の状態11に示すように、書き込みデータの大きさに応じたユーザ領域内の分割領域に、書き込みデータを書き込んでいく。また、CBU300aは、NANDフラッシュ331内のある分割領域にすでに書き込まれたデータ全体を上書きするような書き込み要求を受けた場合、状態12に示すような制御を行う。
例えば、CBU300aは、L−分割領域Al1に書き込まれたデータ全体を上書きするような書き込み要求を受けたとき、新たな書き込みデータを新たなL−分割領域Al2に書き込む。これとともに、CBU300aは、元のL−分割領域Al1のステータスを、有効なデータが記録されていない「無効」とする。その後、CBU300aは、ユーザ領域Lに空きブロックを確保しようとする際に、図8の状態13に示すように、ステータスが無効とされたL−分割領域Al1のデータを、他の分割領域にコピーすることなく、消去することができる。
一方、CBU300aは例えば、S−分割領域As1に書き込まれたデータを上書きするような書き込み要求を受けたとき、図8の状態12に示すように、新たな書き込みデータを新たなS−分割領域As2に書き込む。これとともに、CBU300aは、元のS−分割領域As1のステータスを無効にする。その後、CBU300aは、S−分割領域As1を含むブロックを空きブロックにしようとする際には、図8の状態13に示すように、そのブロックにおける他のS−分割領域に記録されているデータを他の空きブロックにコピーする必要が生じる。
ここで、ホスト装置からCM200aに対してあるデータの書き込みが要求された後、ホスト装置から同じデータの更新が要求されるケースでは、元のデータの全体が書き替えられることが多い。このため、L−分割領域に記録されたデータの上書きが要求された場合、元のデータが記録されたL−分割領域内のすべてのページのステータスが無効になる可能性が高い。従って、ユーザ領域Lでは、ユーザ領域Sと比較して、無効なページがランダムに発生する可能性が低くなり、空き領域を確保する際にデータのコピーが実行される可能性も低くなる。その結果、ランダムなデータの書き込み速度を向上させることができる。
次に、ユーザ領域Mにおけるデータの上書き処理の例について説明する。ここでは例として、M−分割領域の大きさはL−分割領域の1/2(すなわち、ブロックの1/2)であるものとする。
CBU300aは例えば、M−分割領域Am1に書き込まれたデータの全体を上書きするような書き込み要求を受けたとき、図8の状態12に示すように、新たな書き込みデータを新たなM−分割領域Am2に書き込む。これとともに、CBU300aは、元のM−分割領域Am1のステータスを無効にする。また、CBU300aは例えば、M−分割領域Am3に書き込まれたデータの全体を上書きするような書き込み要求を受けたとき、図8の状態12に示すように、新たな書き込みデータを新たなM−分割領域Am4に書き込む。これとともに、CBU300aは、元のM−分割領域Am3のステータスを無効にする。
ここで、M−分割領域Am1,Am3が1つのブロックを構成する領域であった場合、CBU300aは、ユーザ領域Mに空きブロックを確保しようとする際に、図8の状態13に示すように、ステータスが無効とされたM−分割領域Am1,Am3の各データを、他の分割領域にコピーすることなく消去することができる。
ユーザ領域Mでは、ユーザ領域Lと比較して、ブロックより小さい無効な領域がランダムに発生する可能性は高い。しかしながら、ユーザ領域Lでは複数ページを単位として書き込みが行われることから、図8のケースのように、1つのブロックを構成するすべてのM−分割領域のステータスが無効になる可能性が、ユーザ領域Sよりも高くなる。従って、ブロックより小さい複数ページの領域を単位として書き込みが行われるユーザ領域Mを用意しておくことで、空き領域を確保する際にデータのコピーが実行される可能性が低くなり、その結果、ランダムなデータの書き込み速度を向上させることができる。
ところで、以上の説明では、データを上書きする際の処理について説明したが、CM200aがライトバックを実行した際にも、無効ページがランダムに発生しにくくなるという効果が生じる。ライトバックとは、CM200aが、自装置のキャッシュ領域のデータをバックエンドの記憶領域(本実施の形態ではDE400)に書き戻す処理である。CM200aは、例えば、自装置のキャッシュ領域の使用率が一定以上になったとき、キャッシュ領域の空き領域を増やすためにライトバックを行う。これとともに、CM200aは、ライトバックを行ったデータに対応するNANDフラッシュ331のデータを無効化するように、CBU300aに要求する。このとき、NANDフラッシュ331でも、無効化が要求されたデータができるだけ早く消去されて、新規データを書き込み可能な空き領域が増やされることが望ましい。
上記のように、CBU300aは、書き込みデータの書き込み先を、その大きさに応じてユーザ領域L,M,Sのいずれかに振り分ける。このため、ライトバックが済んだとき、NANDフラッシュ331における無効化すべき領域は、ユーザ領域L,M,Sのそれぞれにおける分割領域ごとに発生する。一方、分割領域のうちの一部のみが無効化すべき領域となって、その残りの領域に有効なデータが残る、という事態は起こらない。
例えば、CM200aのキャッシュ領域のデータのうち、図8の状態11におけるL−分割領域Al1に対応するデータがライトバックされたとき、L−分割領域Al1内の全ページのデータが不要になり、無効化される。このため、CBU300aは、L−分割領域Al1に記録されたデータを、他の分割領域にコピーすることなく、即座に消去することができる。従って、CBU300aは、空きブロックを短時間で確保することができ、その際にNANDフラッシュ331のデータバスの負荷が高くならないため、NANDフラッシュ331に対するランダムなデータの書き込み速度を向上させることができる。
また、例えば、CM200aのキャッシュ領域のデータのうち、図8の状態11におけるM−分割領域Am1,Am3に対応するデータがライトバックされたとき、M−分割領域Am1,Am3の両方に含まれる全ページのデータが不要になり、これらの全ページが無効化される。この場合、CBU300aは、M−分割領域Am1,Am3から構成されるブロック内のデータを、他の分割領域にコピーすることなく、即座に消去することができる。
このM−分割領域Am1,Am3の例のように、ライトバックが実行されたとき、ユーザ領域Mでは、ユーザ領域Sと比較して、ブロック単位で無効な領域が発生する確率が高くなる。このため、空き領域を確保する際にデータのコピーが実行される可能性が低くなり、その結果、ランダムなデータの書き込み速度を向上させることができる。
さらに、ライトバックの際に無効ページがランダムに発生しにくくなるという効果は、次の図9で説明するように、NANDフラッシュ331内の分割領域に記録されたデータの一部のみが上書きされた場合でも得られる。
図9は、分割領域内の一部のデータのみ上書きされる場合の処理例を示す図である。
図9の状態21に示すようにユーザ領域L,M,Sにデータが書き込まれた状態から、CBU300aはCM200aから、例えば、L−分割領域Al3に記録されたデータの一部のみを上書きするような書き込み要求を受けたものとする。この場合CBU300aは、図9の状態22に示すように、上書きデータのサイズに応じた分割領域を選択する。上書きデータがページのサイズより大きく、M−分割領域のサイズ以下であった場合、CBU300aは、上書きデータをユーザ領域MのM−分割領域Am5に書き込む。これとともに、CBU300aは、L−分割領域Al3内のページのうち、上書きの対象とされたデータが記録されたページのみを無効化する。これにより、L−分割領域Al3のステータスは、一部のデータのみが有効な「ダーティ」となる。
このような状態22から、CM200aが、L−分割領域Al3およびM−分割領域Am5に対応するデータのライトバックを実行したとする。この場合、L−分割領域Al3およびM−分割領域Am5に記録されたすべてのデータが不要になる。このとき、M−分割領域Am5のステータスは、無効ページを含む「ダーティ」となるものの、L−分割領域Al3は、即座にデータを消去可能な状態になる。CBU300aは、図9の状態23に示すように、L−分割領域Al3に記録されたデータを、他の分割領域にコピーすることなく、即座に消去することができる。
以上で説明したように、CM200aがライトバックを実行したことに伴って、NANDフラッシュ331内の対応するデータが無効化される際に、NANDフラッシュ331では、無効ページがランダムに発生しにくくなる。このため、空きブロックを確保する際にデータのコピーが実行される可能性が低くなり、その結果、ランダムなデータの書き込み速度を向上させることができる。
ここで、前述のように、CBU300aは、NANDフラッシュ331にデータを書き込む際、データの大きさに応じた分割領域にデータを書き込む。このため、CM200aがライトバックを行ったとき、NANDフラッシュ331における無効化すべきデータは、分割領域ごとに発生する。
例えば図8において、ホスト装置からCM200aに対してデータD1の書き込みが要求され、このデータD1がNANDフラッシュ331のL−分割領域Al1に書き込まれたものとする。この後、CM200aがキャッシュ領域内のデータD1をライトバックした場合、CBU300aは、NANDフラッシュ331のL−分割領域Al1を無効化すればよい。
また、例えば図9において、ホスト装置からCM200aに対してデータD2の書き込みが要求され、このデータD2がNANDフラッシュ331のL−分割領域Al3に書き込まれたものとする。さらに、ホスト装置からCM200aに対して、データD2の一部の上書きが要求され、その上書きデータ(データD2の一部を構成する新規データ)が図9の状態22のようにM−分割領域Am5に書き込まれたとする。この後、CM200aがキャッシュ領域内のデータD2をライトバックした場合、CBU300aは、NANDフラッシュ331のL−分割領域Al3およびM−分割領域Am5を無効化すればよい。
このように、CM200aがライトバックを行ったとき、NANDフラッシュ331における無効化すべきデータは分割領域ごとに発生する。そこで、本実施の形態では、CM200aは、キャッシュ領域に格納されたデータがNANDフラッシュ331におけるどの分割領域に格納されているかを、分割領域を識別するIDを用いて管理する。そして、CM200aは、ライトバックを行ったとき、ライトバックしたデータに対応するIDをCBU300aに通知することで、ライトバックしたデータに対応するNANDフラッシュ331のデータの無効化を要求する。
CBU300aは、CM200aから受信したIDがL−分割領域を示すものであった場合、そのL−分割領域のデータを即座に消去することができる。また、CBU300aは、CM200aから受信したIDがM−分割領域を示すものであった場合でも、受信したIDがS−分割領域を示す場合と比較して、IDが示すM−分割領域を含むブロックのデータを即座に消去できる可能性が高くなる。
従って、CM200aがライトバックを行ったときに、CBU300aがNANDフラッシュ331に空き領域を確保するのに要する平均時間が短縮される。また、NANDフラッシュ331に空き領域を確保する処理が実行されている間、NANDフラッシュ331のデータバスの負荷が軽減されるため、NANDフラッシュ331に対するランダムなデータの書き込み性能が劣化することも抑制される。従って、CM200aがライトバックを行ったときでも、CM200aは、ホスト装置から受信した書き込みデータをNANDフラッシュ331に高速に書き込むことができ、ホスト装置に対して短時間で応答できるようになる。
次に、図10は、NANDフラッシュの記憶領域の管理に関連するデータテーブルの例を示す図である。ストレージシステム100では、図7〜図9で説明したような書き込み制御を容易にするために、図10に示すキャッシュ管理テーブル221、NAND管理テーブル351およびID管理テーブル352が使用される。
CM200aのCPU201は、ホスト装置からの要求に応じたIO処理を実現するためのファームウェアの実行を開始すると、CM200aのRAM202にキャッシュ管理テーブル221を生成する。キャッシュ管理テーブル221は、RAM202内のキャッシュ領域に格納されたデータを管理するために使用される。
ここで、LBAとは、CM200aから提供される論理ボリュームに対してホスト装置がアクセスを要求する際の最小単位を示す論理アドレスであり、例として512バイトごとに付与されているものとする。以下の説明では、「LBA#(p)」は、LBAの値が「p」であることを示すものとする。
キャッシュ管理テーブル221には、キャッシュ領域に格納されたデータの全LBAのそれぞれに対応するレコードが登録される。例えば、ホスト装置からCM200aに対して複数のLBAに跨る書き込みデータの書き込みが要求された場合、キャッシュ管理テーブル221には、それら複数のLBAのそれぞれに対応するレコードが登録される。
キャッシュ管理テーブル221のレコードには、LBAに対して「キャッシュアドレス」および「ID」が対応付けて登録される。キャッシュアドレスは、対応するデータが格納されたキャッシュ領域上の(すなわちRAM202上の)アドレスを示す。IDは、対応するデータがCBU300aのNANDフラッシュ331におけるどの分割領域にバックアップされているかを識別するための識別情報であり、後述するように、CBU300aのテーブル制御部322からCM200aに対して通知される。
一方、CBU300aが電源投入などに応じて起動すると、CBU300aのテーブル制御部322は、CBU300aのRAM202にNAND管理テーブル351およびID管理テーブル352を生成する。
NAND管理テーブル351には、NANDフラッシュ331内の全ページのそれぞれに対応するレコードが登録される。NAND管理テーブル351の各レコードには、対応するページのアドレスを示す「NANDアドレス」に対して「LBA」および「ステータス」が対応付けて記録される。なお、以下の説明では、「Adr#(x)」は、NANDフラッシュ331におけるアドレスの値が「x」であることを示すものとする。
NAND管理テーブル351のレコードにおけるLBAは、対応するページに記録されているデータが、CM200aのキャッシュ領域に格納されたどのデータに対応するかを示す。ステータスは、対応するページにおけるデータの記録状態を識別するための情報である。ステータスは、データが記録されていない「未使用」、有効なデータが記録されている「有効」、無効なデータが記録されている「無効」のいずれかを示す。
なお、ステータスが「無効」であるページは、そのページに記録されているデータを上書きする新たなデータが他のページに記録されていることを示す。また、ステータスが「無効」であるページに対してデータ消去処理が行われると、そのページのステータスは「未使用」に変更される。
また、NAND管理テーブル351のレコードにおけるLBAは、ステータスが「有効」である場合のみ登録される。NAND管理テーブル351のレコードにおけるLBAは、例えば、CM200aが異常停止して、NANDフラッシュ331にバックアップされたデータが他方のCM200bのキャッシュ領域に読み込まれる際に、バックアップされたデータとともに読み込まれる。この場合、他方のCM200bは、読み込んだLBAを用いることで、読み込んだデータを用いたIO制御を引き継ぐことができる。さらに、NAND管理テーブル251のレコードにおけるLBAは、NANDフラッシュ331内の分割領域に記録されたデータの一部を上書きする際に、テーブル制御部322によって参照される。
なお、本実施の形態では、1つのLBAに対応付けられるデータのサイズは、ページサイズの1/8である。このため、隣接する複数ページにわたってデータが書き込まれた場合、NAND管理テーブル351においてこれら複数ページに対応付けて登録されるLBAは、8ずつ増加することになる。
ID管理テーブル352は、テーブル制御部322が、NANDフラッシュ331内の分割領域のうちデータが書き込まれた分割領域を管理するために使用される。ID管理テーブル352には、有効なデータまたは無効なデータが記録された分割領域ごとにレコードが登録される。ID管理テーブル352の各レコードには、「ID」および「NANDアドレス」が登録される。
ID管理テーブル352におけるIDは、対応する分割領域に対してテーブル制御部322がユニークに割り当てた識別情報である。IDは、対応する分割領域の種別がユーザ領域L,M,Sのうちのどれであるかを識別可能な情報になっている。以下の説明では、ID_L#(a)は、L−分割領域に割り当てられたIDの値が「a」であることを示し、ID_M#(b)は、M−分割領域に割り当てられたIDの値が「b」であることを示し、ID_S#(c)は、S−分割領域に割り当てられたIDの値が「c」であることを示す。
ID管理テーブル352におけるNANDアドレスは、対応する分割領域のNANDフラッシュ331における先頭アドレスを示す。例えば図10において、ID_L#(a)が割り当てられたL−分割領域は、NANDフラッシュ331におけるAdr#(x)からAdr#(x+X)までのページに対応する。
ここで、CBU300aのテーブル制御部322は、CM200aからデータの書き込み要求を受ける前に、書き込みデータのサイズに応じた分割領域を示すIDを生成して、CM200aに通知する。CBU300aのテーブル制御部322は、CM200aから転送された書き込みデータを分割領域に書き込む際に、書き込み先の分割領域の先頭アドレスと、CM200aに通知したIDとを含むレコードを、ID管理テーブル352に登録する。
一方、CM200aは、CBU300aから通知されたIDを、キャッシュ領域における書き込みデータのLBAに対応付けて、キャッシュ管理テーブル221に登録する。CM200aはその後、キャッシュ領域に登録されたデータをバックエンドの記憶領域にライトバックする際に、ライトバックするデータを無効化するようにCBU300aに要求する。この無効化の要求時に、CM200aは、データのLBAの代わりに、キャッシュ管理テーブル221に登録された、ライトバックしたデータに対応するIDを、CBU300aに通知する。
このように、CM200aは、キャッシュ領域内のデータがバックアップされている、NANDフラッシュ331における分割領域を示すIDを認識しておくことで、データをライトバックする際に、そのデータに対応するバックアップデータが記録されたNANDフラッシュ331における領域を、IDを通知することでCBU300aに簡単に指定することができる。
(3)ストレージシステム全体の処理例
次に、上記の(1)(2)に示した処理を実現するためにストレージシステム100全体で実行される処理の例について説明する。
まず、図11は、PCIeバスを通じて送受信されるパケットの構成例を示す図である。
PCI Express規格では、トランザクションレイヤにおけるPCIeパケット(TLP:Transaction Layer Packet)は、「TLPヘッダ」と、データが格納される「ペイロード」と、「オプション」とを含む。
「TLPヘッダ」は、「Fmt」、「Type」、「Length」および「Address」の各領域を含む。「Fmt」および「Type」に設定される情報によって、PCIeパケットの種別が規定される。本実施の形態では、「Fmt」および「Type」に設定される情報により、PCIeパケットは、書き込み要求パケット、読み出し要求パケット、および、その他の種別であるコントロールパケットのいずれかの種別とされる。
「Address」には、基本的に、書き込み要求パケットの場合は書き込み先アドレスが、読み出し要求パケットの場合は読み出し元アドレスが設定される。一般的に、この「Address」における上位側は使用されないことが多い。そこで、本実施の形態のCMおよびCBUは、「Address」における上位側のmビット分の領域を、キャッシュバックアップ用制御領域として利用する。なお、以下の説明では、キャッシュバックアップ用制御領域を、その最上位ビットをnとして「Addr.[n:n−m]」と表記する場合もある。
キャッシュバックアップ用制御領域の上位側3ビット(Addr.[n:n−2])には、宛先判別用番号が設定される。後述するように、CBUのIO制御部310は、PCIeパケットを受信したポートの位置(CM側か、あるいはCBU側か)と、「Fmt」および「Type」で指定されるパケットの種別と、宛先判別用番号との組み合わせから、PCIeバスを通じて受信したPCIeパケットの転送先を判定することができる。
CMおよびCBUは、キャッシュバックアップ用制御領域の下位側(m−3)ビット(Addr.[n−3:n−m])に、NANDフラッシュにおける分割領域を識別するためのIDを設定することができる。すなわち、CMおよびCBUは、キャッシュバックアップ用制御領域の下位側(m−3)ビットを用いて、他のCMまたはCBUにIDを通知することができる。
キャッシュバックアップ用制御領域の下位側(m−3)ビットにIDが設定されている場合には、宛先判別用番号における下位側2ビット(Addr.[n−1:n−2])に、IDがL−分割領域、M−分割領域、S−分割領域のどれを示すかによって異なる値が設定される。図11に示すように、「00」はL−分割領域、「01」はM−分割領域、「11」はS−分割領域を示すものとする。
なお、「Address」におけるキャッシュバックアップ用制御領域より下位側の領域(以下、単に「下位側領域」と言う)に設定される値は、場合によっては、パケット受信者が何の処理を要求されたかを識別するためにも使用される。
図12は、CMのRAMに確保される制御用領域の例を示す図である。
CM200aのCPU201は、ファームウェアを実行することにより、RAM202に制御用領域を確保し、制御用領域に図12に示すような値を格納する。なお、ID取得用アドレス251a〜251c、CM−DMA起動用アドレス252およびCBU−DMA起動用アドレス254a,254bとしては、ファームウェアを実行したCPU201によって、あらかじめ決められた値がRAM202に書き込まれる。
ID取得用アドレス251a〜251cは、CM200aのCPU201がホスト装置から新規のデータの書き込み要求を受けたときに、CBU300aからIDを取得するためにCPU201によって読み出される。ID取得用アドレス251a,251b,251cは、それぞれL−分割領域のID、M−分割領域のID、S−分割領域のIDを取得するために使用される。
CPU201は、「Address」の下位側領域にID取得用アドレス251a〜251cのいずれかを設定した読み出し要求パケットをPCIeバスに送信することで、設定したアドレスに対応する分割領域のIDの送信をCBU300aに要求する。また、CPU201は、IDを取得した後、「Address」の下位側領域に同じID取得用アドレスを設定した書き込み要求パケットをPCIeバスに送信することで、取得したIDに対応付けるLBAをCBU300aに通知する。
CM−DMA起動用アドレス252およびDMAディスクリプタ253は、CPU201がDMAコントローラ203aに対してDMA転送を要求する際に使用される。
CM−DMA起動用アドレス252は、DMAコントローラ203aを起動するためにCPU201によって読み出される。
DMAディスクリプタ253には、DMAコントローラ203aに参照される情報が、CPU201によって書き込まれる。DMAディスクリプタ253には、コマンド253a、転送サイズ253b、第1アドレス253cおよび第2アドレス253dが設定される。
コマンド253aは、DMA転送の方向を示すものであり、RAM202からCM200aの外部への転送か、あるいは、CM200aの外部からRAM202への転送かを示す。転送サイズ253bは、DMA転送されるデータのサイズを示す。
RAM202からCM200aの外部への転送が要求される場合、第1アドレス253cには、RAM202における転送元アドレスが設定され、第2アドレス253dには、外部における転送先アドレスが設定される。この場合、DMAコントローラ203aは、RAM202から読み出したデータを第2アドレス253dに設定された外部のメモリ領域のアドレスに書き込むことを要求する書き込み要求パケットを、PCIeバスに送信する。
一方、CM200aの外部からRAM202への転送が要求される場合、第1アドレス253cには、RAM202における転送先アドレスが設定され、第2アドレス253dには、外部における転送元アドレスが設定される。この場合、DMAコントローラ203aは、第2アドレス253dに設定された外部のメモリ領域のアドレスからデータを読み出すことを要求する読み出し要求パケットを、PCIeバスに送信する。
なお、これらのいずれの場合でも、書き込み要求パケットおよび読み出し要求パケットの「Length」には、転送サイズ253bに設定された値が格納される。
CBU−DMA起動用アドレス254a,254bは、CBU300bのDMAコントローラ323を起動させる際に、CM200aのCPU201によって読み出される。CM200aのCPU201がCBU300bのDMAコントローラ323を起動させる場合とは、他方のCM200bが異常停止したときに、CBU300bのNANDフラッシュ331に記録されたデータをCM200aがDE400に書き戻すことで、CM200bで行われていたIO処理を復旧させる場合である。
CBU−DMA起動用アドレス254a,254bは、CM200aのCPU201がデータの書き戻しのためにCM200aのRAM202に確保するバッファ領域の先頭アドレスを示す。CBU−DMA起動用アドレスが複数用意されているのは、バッファ領域を複数用意できるようにするためである。CM200aのCPU201は、RAM202から読み出したCBU−DMA起動用アドレスを「Address」に設定した読み出し要求パケットをCBU300bに送信することで、CBU300bのDMAコントローラ323にNANDフラッシュ331のデータを送信させる。
次に、書き込みデータを二重化するための処理手順について、主にシーケンス図を用いて説明する。まず、図13〜図18を用いて、例として、CM200aが、自装置が担当する論理ボリュームに対する書き込み要求を受けた場合の処理について説明する。
図13は、自装置が担当する論理ボリュームに対する書き込み要求をCMが受けたときの処理例を示す第1のシーケンス図である。
[ステップS101]ホスト装置は、CM200aに対して書き込みを要求するとともに、書き込みデータを送信する。CM200aが受信した書き込みデータは、ホストインタフェース205およびメモリコントローラ203を介して、RAM202のバッファ領域202aに書き込まれる。
[ステップS102]CM200aのCPU201は、書き込みが要求されたデータが属する論理ボリュームの番号(LUN:Logical Unit Number)と、書き込みデータのLBAとをチェックし、書き込みデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図13の例では、書き込みデータは、CM200aが担当する論理ボリュームに属するデータであったものとする。
[ステップS103]CPU201は、受信した書き込みデータのLBAが、キャッシュ管理テーブル221に登録されているかを判定する。この図13の例では、受信した書き込みデータのLBAがキャッシュ管理テーブル221に登録されていないものとする。この場合、CPU201は、受信した書き込みデータがキャッシュ領域202bに新規に書き込まれるデータであると判定する。CPU201は、キャッシュ管理テーブル221に、受信した書き込みデータのLBAにそれぞれ対応するレコードを生成し、各レコードにLBAを登録する。
ここでは例として、キャッシュ管理テーブル221には、図10に示すようにLBA#(p)〜LBA#(p+P)が登録されたものとする。
[ステップS104]CPU201は、CBU300a宛てのPCIeパケットを送信して、CBU300aに対してIDの通知を要求する。
具体的には、CPU201はまず、受信した書き込みデータのサイズに基づき、CBU300aのNANDフラッシュ331において書き込みデータを格納すべき分割領域が、L−分割領域、M−分割領域、S−分割領域のどれであるかを判定する。CPU201は、書き込みデータのサイズがS−分割領域のサイズ以下である場合には、書き込み先をS−分割領域と判定する。また、CPU201は、書き込みデータのサイズがS−分割領域のサイズより大きくM−分割領域のサイズ以下である場合には、書き込み先をM−分割領域と判定する。また、CPU201は、書き込みデータのサイズがM−分割領域のサイズより大きくL−分割領域以下である場合には、書き込み先をL−分割領域と判定する。
CPU201は、CBU300aに対して、判定した種別の分割領域を示すIDを通知するように要求する。ここでは例として、書き込み先がL−分割領域であると判定されたものとする。CPU201は、読み出し要求パケットを生成し、読み出し要求パケットにおけるキャッシュバックアップ用制御領域に、宛先判別用番号として、宛先がCBU300aであることを指定し、かつ、L−分割領域を指定するための値を設定する。また、CPU201は、RAM202の制御用領域からL−分割領域用のID取得用アドレス251aを読み出し、読み出し要求パケットの「Address」の下位側領域に設定する。CPU201は、このように設定した読み出し要求パケットを、メモリコントローラ203およびPCIeバスを通じてCBU300aに送信する。
[ステップS105]CBU300aのIO制御部310は、読み出し要求パケットを受信する。CBU300aのテーブル制御部322は、受信したパケットの種別が読み出し要求パケットであることと、「Address」の下位側領域に設定された値とから、IDの通知が要求されたことを認識する。
テーブル制御部322は、宛先判別用番号の下位2ビットの値から、L−分割領域のIDの通知が要求されたと判断し、L−分割領域に割り当てるユニークなIDを生成する。ここでは例として、図10に示したID_L#(a)が生成されたものとする。テーブル制御部322は、生成したIDをキャッシュバックアップ用制御領域の下位側領域(Addr.[n−3:n−m])に設定した応答パケットを、IO制御部310を通じてCM200aに送信する。
なお、本実施の形態では、ステップS104において、CM200aのCPU201が書き込みデータのサイズに対応する分割領域の種別を判定しているが、他の例として、分割領域の種別判定がCBU300a側で行われてもよい。この場合例えば、ステップS104において、CM200aのCPU201は書き込みデータのサイズをCBU300aに通知する。そして、ステップS105において、CBU300aのテーブル制御部322は、通知されたサイズに対応する分割領域の種別を判定するとともに、判定した種別に対応するIDを生成して、CM200aに通知する。
[ステップS106]CM200aのCPU201は、CBU300aから送信された応答パケットからIDを抽出し、ステップS103でキャッシュ管理テーブル221に生成したレコードに登録する。この例は、図10に示すように、キャッシュ管理テーブル221において、LBA#(p)〜LBA#(p+P)のすべてに対応付けてID_L#(a)が登録される。これにより、書き込みデータにIDが対応付けられる。
[ステップS107]CPU201は、CBU300a宛てのPCIeパケットを送信して、CBU300aから通知されたIDに対応付けたLBAを、CBU300aに通知する。
具体的には、CPU201は、読み出し要求パケットを生成する。CPU201は、読み出し要求パケットにおけるキャッシュバックアップ用制御領域に、宛先がCBU300aであることを示すように設定し、読み出し要求パケットの「Address」の下位側領域に、L−分割領域用のID取得用アドレス251aを設定する。さらに、CPU201は、書き込みデータの先頭LBAと、書き込みデータのサイズを、それぞれ書き込み要求パケットにおけるペイロード、「Length」に設定する。CPU201は、このように設定した書き込み要求パケットを、メモリコントローラ203およびPCIeバスを通じてCBU300aに送信する。
[ステップS108]CBU300aのIO制御部310は、書き込み要求パケットを受信する。CBU300aのテーブル制御部322は、受信したパケットの種別が書き込み要求パケットであることと、「Address」の下位側領域に設定された値とから、LBAが通知されたことを認識する。
テーブル制御部322は、書き込み要求パケットから、書き込みデータの先頭LBAおよびサイズを抽出し、抽出した情報を、ステップS105で割り当てたIDに対応付けて、RAM332に一時的に格納する。テーブル制御部322は、IO制御部310を通じて、CM200aに応答パケットを送信する。
[ステップS109]CM200aのCPU201は、応答パケットを受信すると、DMAコントローラ203aを起動させて、書き込みデータを二重化するためのDMA転送を要求する。
具体的には、CPU201は、RAM202からCM−DMA起動用アドレス252(図12参照)を読み出し、読み出したアドレスをメモリコントローラ203に通知することで、DMAコントローラ203aを起動させる。さらに、CPU201は、DMAディスクリプタ253(図12参照)に対して次のような設定を行うことで、DMAコントローラ203aに、RAM202のキャッシュ領域202bを書き込み先としたDMA書き込み処理を実行させる。
CPU201は、コマンド253aに、RAM202から外部への転送を示す値を設定する。これによりDMAコントローラ203aは、書き込み要求パケットを生成する。また、CPU201は、転送サイズ253bに、二重化する書き込みデータのサイズを設定する。DMAコントローラ203aは、書き込み要求パケットの「Length」に、転送サイズ253bに設定された値を格納する。
また、CPU201は、第1アドレス253cに、RAM202のバッファ領域202aにおける書き込みデータのアドレスを設定する。一方、第2アドレス253dに設定される情報は、DMAコントローラ203aから送信される書き込み要求パケットの「Address」に格納されるものである。CPU201は、書き込みデータを格納するためのRAM202におけるキャッシュ領域202bのアドレスを決定し、決定したキャッシュ領域202bにおける先頭アドレスを、「Address」の下位側領域に対応する第2アドレス253dの領域に設定する。これとともに、CPU201は、キャッシュバックアップ用制御領域に対応する第2アドレス253dの領域に、宛先がCBU300aであることを示すような宛先判別用番号と、CBU300aに通知するIDとを設定する。
さらに、CPU201は、決定したキャッシュ領域202bのアドレスを、ステップS103でキャッシュ管理テーブル221に生成したレコードに登録する。
[ステップS110]DMAコントローラ203aは、RAM202のバッファ領域202aから、ステップS101で書き込まれた書き込みデータを読み出す。
[ステップS111]DMAコントローラ203aは、DMAディスクリプタ253に設定された情報に基づき、読み出した書き込みデータを格納した書き込み要求パケットを、CBU300aに送信する。
このとき送信される書き込み要求パケットにおいては、ステップS105でCBU300aから通知されたID(この例ではID_L#(a))、キャッシュ領域202bにおける書き込み先アドレス、書き込みデータのサイズなどが設定されている。
[ステップS112]CBU300aのIO制御部310は、受信した書き込み要求パケットをバッファメモリ311に格納し、書き込み要求パケット内の書き込みデータを二重化するための処理を実行する。
IO制御部310は、NAND制御部321およびテーブル制御部322に対して、書き込みデータをNANDフラッシュ331に書き込むための処理を実行するように指示する。例えば、IO制御部310は、テーブル制御部322に、書き込み要求パケットに設定されたIDの読み取りを指示するとともに、NAND制御部321に、テーブル制御部322から通知されるNANDフラッシュ331のアドレスに書き込みデータを書き込むように指示する。
これとともに、IO制御部310は、受信した書き込み要求パケットをCM200aに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS113]テーブル制御部322は、書き込み要求パケットに設定されたIDが、ID管理テーブル352に登録されているかをチェックする。図13の処理では、IDはステップS105で新規に割り当てられたものであるので、IDはID管理テーブル352に登録されていない。
[ステップS114]ステップS113で、IDがID管理テーブル352に登録されていないと判定した場合、テーブル制御部322は、IDをID管理テーブル352に登録する。このとき、IDは、L−分割領域、M−分割領域、S−分割領域のどれに対応するかが識別可能な状態で、ID管理テーブル352に登録される。
また、テーブル制御部322は、IDに対して分割領域のアドレスを割り当てる。具体的には、テーブル制御部322は、NAND管理テーブル351を参照して、IDに対応する種別の分割領域のうち、分割領域全体のページのステータスが「未使用」である分割領域を選択する。この例では、IDはL−分割領域を示すID_L#(a)であるので、テーブル制御部322は、内部の全ページのステータスが「未使用」であるL−分割領域を選択する。
テーブル制御部322は、ID管理テーブル352にレコードを生成し、生成したレコードに、選択した分割領域のNANDフラッシュ331における先頭アドレスとIDとを登録する。この例では、ID管理テーブル352には、図10のようにID_L(a)とAdr#(x)とが対応付けられたレコードが登録される。
さらに、テーブル制御部322は、NAND管理テーブル351において、選択した分割領域に対応するアドレスのそれぞれに対して、書き込みデータのLBAを登録する。具体的には、テーブル制御部322は、ステップS108でRAM332に一時的に格納しておいた先頭LBAおよびサイズを読み出す。テーブル制御部322は、読み出した先頭LBAを、NAND管理テーブル351のレコードのうち、選択した分割領域における先頭アドレスのレコードに登録する。また、テーブル制御部322は、NAND管理テーブル351における次のアドレスに対応するレコードに、前のレコードに登録されたLBAに8を加算したLBAを登録する。
以後、テーブル制御部322は、RAM332から読み出したサイズに対応する数のレコードに、8ずつ加算したLBAを順次登録していく。このようにして、NAND管理テーブル351において、書き込みデータに対応するLBAと、各LBAに対応する部分データのNANDフラッシュ331におけるアドレスとが対応付けられる。なお、選択された分割領域がS−分割領域である場合、LBAはNAND管理テーブル351における1つのレコードにのみ登録される。
ここでは例として、テーブル制御部322は、図10に示すように、NANDフラッシュ331におけるAdr#(x)からAdr#(x+X)までのL−分割領域を、ID_L#(a)に割り当てたものとする。また、例えば、書き込みデータのサイズがL−分割領域と同じであったとすると、NAND管理テーブル351では、Adr#(x)からAdr#(x+X)までの全レコードにLBAが登録される。なお、書き込みデータのサイズがL−分割領域より小さい場合には、Adr#(x)からAdr#(x+X)までのアドレスのうち、書き込みデータが記録されるアドレスにのみ、LBAが対応付けて登録される。
[ステップS115]テーブル制御部322は、ステップS114でNAND管理テーブル351に登録したNANDフラッシュ331におけるアドレスを、NAND制御部321に通知する。NAND制御部321は、ステップS112でバッファメモリ311に書き込まれた書き込み要求パケットのペイロードから書き込みデータを順次読み出し、NANDフラッシュ331におけるテーブル制御部322から通知されたアドレスに書き込む。また、テーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
ここでは例として、NANDフラッシュ331におけるAdr#(x)からAdr#(x+X)までの全領域に書き込みデータが書き込まれる。このため、図10に示すように、NAND管理テーブル351のレコードのうち、Adr#(x)からAdr#(x+X)までのすべてのレコードのステータスが「有効」になる。
[ステップS116]CM200aのメモリコントローラ203は、ステップS112でCBU300aから送信された書き込み要求パケットを受信すると、書き込み要求パケットに設定されたキャッシュ領域202bのアドレスに、書き込み要求パケットに格納された書き込みデータを書き込む。
以上の処理により、書き込みデータは、CM200aのキャッシュ領域202bと、CBU300aのNANDフラッシュ331とに二重化される。なお、ステップS112での、CBU300aのIO制御部310からCM200aへの書き込み要求パケットの送信処理と、ステップS115でのバッファメモリ311からNANDフラッシュ331への書き込みデータの転送処理とは、並列に実行されてもよい。
[ステップS117]CBU300aのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS118]CM200aのCPU201は、CBU300aからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
次に、図14は、自装置が担当する論理ボリュームに対する書き込み要求をCMが受けたときの処理例を示す第2のシーケンス図である。この図14の処理は、図13の処理によってホスト装置から書き込みが要求された書き込みデータの全体を上書きするような書き込み要求が、ホスト装置からCM200aに送信された場合のものである。
[ステップS131]ホスト装置は、CM200aに対して、図13のステップS101で書き込みを要求した書き込みデータと同じLBAに対応する書き込みデータを送信して、書き込みを要求する。CM200aが受信した書き込みデータは、ホストインタフェース205およびメモリコントローラ203を介して、RAM202のバッファ領域202aに書き込まれる。
[ステップS132]CM200aのCPU201は、書き込みを要求されたデータが属する論理ボリュームの番号(LUN)と、書き込みデータのLBAとをチェックし、書き込みデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図14の例では、書き込みデータは、CM200aが担当する論理ボリュームに属するデータである。
[ステップS133]CPU201は、受信した書き込みデータのLBAが、キャッシュ管理テーブル221に登録されているかを判定する。この例では、受信した書き込みデータのLBAはLBA#(p)〜LBA#(p+P)であり、これらのLBAはキャッシュ管理テーブル221に登録されている。この場合、CPU201は、受信した書き込みデータがキャッシュ領域202bにすでに格納されているデータであると判定する。
[ステップS134]CPU201は、ホスト装置から要求された上書きの種別が「全面上書き」か、あるいは「一部上書き」かを判定する。
例えば、CPU201は、受信した書き込みデータが、キャッシュ領域202bに格納されている上書き対象のデータに内包されており、かつ、受信した書き込みデータのサイズが、上書き対象のデータより小さい、という条件を満たす場合に、一部上書きが要求されたと判定する。より具体的には、CPU201は、受信した書き込みデータのLBA範囲が、キャッシュ管理テーブル221に登録されているシーケンシャルなLBA範囲に内包されており、かつ互いのLBA範囲が完全一致していない場合に、一部上書きが要求されたと判定する。
一方、CPU201は、例えば、受信した書き込みデータのLBA範囲が、キャッシュ領域202bに格納されている上書き対象のデータのLBA範囲と完全一致する場合に、全面上書きが要求されたと判定する。さらに、CPU201は、例えば、キャッシュ領域202bに格納されている上書き対象のデータのLBA範囲が、受信した書き込みデータのLBA範囲を内包し、かつ、受信した書き込みデータのLBA範囲より大きい場合にも、全面上書きが要求されたと判定してもよい。
この例では、受信した書き込みデータのLBA範囲と、キャッシュ領域202bに格納されている上書き対象のデータのLBA範囲は、ともにLBA#(p)〜LBA#(p+P)であることから、CPU201は全面上書きが要求されたと判定する。この場合、次のステップS135に示すように、新たなIDをCBU300aから取得することなく、受信した書き込みデータを二重化するための処理が開始される。
[ステップS135]CPU201は、DMAコントローラ203aを起動させて、書き込みデータを二重化するためのDMA転送を要求する。
このステップS135での処理は、次の点を除けば、図13のステップS109の処理と同様である。ステップS135では、CPU201は、キャッシュ管理テーブル221から、受信した書き込みデータのLBAに対応付けられたIDを読み出し、DMAディスクリプタ253の第2アドレス253dにおけるキャッシュバックアップ用制御領域に対応する領域に設定する。これにより、CPU201は、上書きするデータを書き込むべき、NANDフラッシュ331における分割領域のIDを、自ら決定してCBU300aに指定することができる。この例では、DMAディスクリプタ253を設定されるIDは、ID_L#(a)となる。
[ステップS136]DMAコントローラ203aは、RAM202のバッファ領域202aから、ステップS131で書き込まれた書き込みデータを読み出す。
[ステップS137]DMAコントローラ203aは、読み出した書き込みデータを格納した書き込み要求パケットを、CBU300aに送信する。
このとき送信される書き込み要求パケットにおいては、ステップS135でCPU201がDMAディスクリプタ253に設定したID(この例ではID_L#(a))、キャッシュ領域202bにおける書き込み先アドレス、書き込みデータのサイズなどが設定されている。
[ステップS138]CBU300aのIO制御部310は、受信した書き込み要求パケットをバッファメモリ311に格納し、書き込み要求パケット内の書き込みデータを二重化するための処理を実行する。IO制御部310は、NAND制御部321およびテーブル制御部322に対して、書き込みデータをNANDフラッシュ331に書き込むための処理を実行するように指示する。これとともに、IO制御部310は、受信した書き込み要求パケットをCM200aに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS139]テーブル制御部322は、書き込み要求パケットに設定されたIDが、ID管理テーブル352に登録されているかをチェックする。この例では、書き込み要求パケットにはID_L#(a)が設定され、このID_L#(a)はID管理テーブル352にすでに登録されている。この場合、次のステップS140の処理が実行される。
[ステップS140]テーブル制御部322は、ID管理テーブル352から、書き込み要求パケットに設定されたIDが登録されたレコードを選択し、選択したレコードに登録されたNANDフラッシュ331のアドレスを抽出する。テーブル制御部322は、ID管理テーブル352から抽出したアドレスに基づき、NAND管理テーブル351から、書き込み要求パケットに設定されたIDが示す分割領域に対応するレコードを選択し、選択したレコードのステータスを「無効」に変更する。
[ステップS141]テーブル制御部322は、書き込み要求パケットに設定されたIDに対して、新たな分割領域のアドレスを割り当てる。具体的には、テーブル制御部322は、NAND管理テーブル351を参照して、IDに対応する種別の分割領域のうち、分割領域全体のページのステータスが「未使用」である分割領域を選択する。
テーブル制御部322は、ID管理テーブル352のレコードのうち、書き込み要求パケットに設定されたIDが登録されたレコードに、新たに選択した分割領域の先頭アドレスを上書きして登録する。さらに、テーブル制御部322は、NAND管理テーブル351において、新たに選択した分割領域に対応するアドレスのそれぞれに対して、書き込みデータのLBAを登録する。このとき、テーブル制御部322は、ステップS140でステータスを「無効」に更新したレコードに登録されていたLBAを、新たに選択した分割領域に対応するアドレスを含むレコードにコピーする。
[ステップS142]テーブル制御部322は、ステップS141でNAND管理テーブル351に登録したNANDフラッシュ331におけるアドレスをNAND制御部321に通知する。NAND制御部321は、ステップS138でバッファメモリ311に書き込まれた書き込み要求パケットのペイロードから書き込みデータを順次読み出し、NANDフラッシュ331におけるテーブル制御部322から通知されたアドレスに書き込む。また、テーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
ここで、図15は、全面上書きの実行時におけるテーブルの状態の例を示す図である。
図14のステップS138でIO制御部310が受信した書き込み要求パケットには、ID_L#(a)が設定されている。図14のステップS140において、テーブル制御部322は、ID管理テーブル352から、ID_L#(a)に対応付けられているAdr#(x)を抽出して(図10参照)、ID_L#(a)に割り当てられているNANDフラッシュ331の領域を特定する。テーブル制御部322は、図15に示すように、NAND管理テーブル351のレコードのうち、ID_L#(a)に割り当てられていたL−分割領域のアドレスであるAdr#(x)〜Adr#(x+X)に対応するレコードのステータスを、「無効」に更新する。
また、図14のステップS141において、テーブル制御部322は、内部の全ページのステータスが「未使用」であるL−分割領域を選択する。図15の例では、新たなL−分割領域のアドレスはAdr#(x’)〜Adr#(x’+X)となる。テーブル制御部322は、ID管理テーブル352のレコードのうち、ID_L#(a)を含むレコードのアドレスを、新たに選択したL−分割領域の先頭アドレスであるAdr#(x’)に更新する。
さらに、図14のステップS142において、テーブル制御部322は、NAND管理テーブル351において元のL−分割領域のAdr#(x)〜Adr#(x+X)に対応付けられていたLBA#(p)〜LBA#(p+P−7)を、新たなL−分割領域のAdr#(x’)〜Adr#(x’+X)のレコードにコピーする。テーブル制御部322は、LBAのコピーが完了した後、NAND管理テーブル351において、元のL−分割領域のAdr#(x)〜Adr#(x+X)に対応付けられていたLBA#(p)〜LBA#(p+P−7)を消去する。
このように、全面上書きの場合には、分割領域を識別するIDは変更されずに、分割領域に対応する物理領域のみが変更される。また、変更前の分割領域は、その内部の全ページのステータスが「無効」または「未使用」となる。このため、例えば、L−分割領域のデータの全面上書きが実行される場合には、CBU300aは、変更前のL−分割領域、すなわちブロックのデータを、その内部のデータを他のブロックにコピーすることなく、消去することができる。図15の例では、Adr#(x)〜Adr#(x+X)は1ブロックを構成するため、このブロックに記録されたデータを、他のブロックにコピーすることなく消去することができる。
以下、図14に戻って説明する。
[ステップS143]CM200aのメモリコントローラ203は、ステップS138でCBU300aから送信された書き込み要求パケットを受信すると、書き込み要求パケットに設定されたキャッシュ領域202bのアドレスに、書き込み要求パケットに格納された書き込みデータを書き込む。これにより、キャッシュ領域202bに格納されていた元の書き込みデータの全面が、新たな書き込みデータによって更新される。
以上の処理により、書き込みデータは、CM200aのキャッシュ領域202bと、CBU300aのNANDフラッシュ331とに二重化される。
[ステップS144]CBU300aのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS145]CM200aのCPU201は、CBU300aからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
次に、図16,図17は、自装置が担当する論理ボリュームに対する書き込み要求をCMが受けたときの処理例を示す第3のシーケンス図である。この図16の処理は、図14の処理によってホスト装置から書き込みが要求された書き込みデータの一部を上書きするような書き込み要求が、ホスト装置からCM200aに送信された場合のものである。
[ステップS161]ホスト装置は、CM200aに対して、図13のステップS101および図14のステップS131で書き込みを要求したデータの一部に上書きするためのデータを送信して、書き込みを要求する。CM200aが受信したデータは、ホストインタフェース205およびメモリコントローラ203を介して、RAM202のバッファ領域202aに書き込まれる。
ここでは例として、キャッシュ領域202bに格納された、LBA#(p)〜LBA#(p+P)に対応する一連のデータのうち、LBA#(p’)〜LBA#(p’+P’)に対応するデータがホスト装置から送信されたものとする(ただし、例としてp<p’<p+P,p’+P’<p+Pとする)。以下、LBA#(p’)〜LBA#(p’+P’)に対応するデータを「上書きデータ」と呼ぶ。
[ステップS162]CM200aのCPU201は、ホスト装置から受信した上書きデータが属する論理ボリュームの番号(LUN)と、上書きデータのLBAとをチェックし、上書きデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図16では、書き込みデータは、CM200aが担当する論理ボリュームに属するデータである。
[ステップS163]CPU201は、受信した上書きデータのLBAが、キャッシュ管理テーブル221に登録されているかを判定する。この例では、受信した上書きデータのLBAはLBA#(p’)〜LBA#(p’+P’)であり、これらのLBAはキャッシュ管理テーブル221に登録されている。この場合、CPU201は、受信した書き込みデータがキャッシュ領域202bにすでに格納されているデータであると判定する。
[ステップS164]CPU201は、ホスト装置から要求された上書きの種別が全面上書きか、一部上書きかを判定する。
この例では、受信した上書きデータのLBA範囲はLBA#(p’)〜LBA#(p’+P’)である。このLBA範囲は、キャッシュ管理テーブル221に登録された一連のデータのLBA範囲であるLBA#(p)〜LBA#(p+P)に内包され、かつ、各LBA範囲は完全一致しない。このことから、CPU201は一部上書きが要求されたと判定する。
[ステップS165]ステップS164で一部上書きが要求されたと判定した場合、CPU201は、上書き対象範囲データのLBAをCBU300aに通知して、NANDフラッシュ331に格納された上書き対象範囲のデータを無効化するように要求する。
CPU201は、指定したLBAを無効化するためのCBU300a宛ての書き込み要求パケットを生成する。CPU201は、キャッシュ管理テーブル221から、上書きデータのLBAに対応付けられたIDを読み出し、読み出したIDを、書き込み要求パケットのキャッシュバックアップ用制御領域に設定する。また、CPU201は、書き込み要求パケットのペイロードに上書きデータの先頭LBAを設定するとともに、書き込み要求パケットの「Length」に上書きデータのサイズを設定する。CPU201は、このように設定した書き込み要求パケットを、メモリコントローラ203およびPCIeバスを通じてCBU300aに送信する。
[ステップS166]CBU300aのIO制御部310は、CM200aからの書き込み要求パケットを受信する。CBU300aのテーブル制御部322は、書き込み要求パケットに設定されていた、上書きデータの先頭LBAおよびサイズに基づき、上書きデータに対応するLBAを判定する。テーブル制御部322は、NAND管理テーブル351のレコードのうち、上書きデータに対応するLBAを含むレコードのステータスを「無効」に更新する。
テーブル制御部322は、ステータスを更新した後、IO制御部310を通じて、書き込み要求パケットに対する応答パケットをCM200aに送信する。
なお、テーブル制御部322は、上書きデータに対応するLBAを認識する際に、書き込み要求パケットに設定されたIDを読み出し、ID管理テーブル352において読み出したIDに対応付けられたアドレスを基に、NAND管理テーブル351における上書きデータに対応するLBAの検索範囲を絞ってもよい。
[ステップS167]CPU201は、CBU300a宛ての読み出し要求パケットを送信して、CBU300aに対して、上書きデータを書き込む分割領域に対応する新たなIDの通知を要求する。
具体的には、CPU201は、図13のステップS104と同様の判定基準を用いて、受信した上書きデータのサイズに基づき、上書きデータを格納すべき分割領域が、L−分割領域、M−分割領域、S−分割領域のどれであるかを判定する。ここでは例として、上書きデータの書き込み先がM−分割領域であると判定されたものとする。
CPU201は、読み出し要求パケットを生成し、読み出し要求パケットにおけるキャッシュバックアップ用制御領域に、宛先判別用番号として、宛先がCBU300aであることを指定し、かつ、M−分割領域を指定するための値を設定する。また、CPU201は、RAM202の制御用領域からM−分割領域用のID取得用アドレス251bを読み出し、読み出し要求パケットの「Address」の下位側領域に設定する。CPU201は、このように設定した読み出し要求パケットを、メモリコントローラ203およびPCIeバスを通じてCBU300aに送信する。
[ステップS168]CBU300aのIO制御部310は、読み出し要求パケットを受信する。テーブル制御部322は、読み出し要求パケットにおける宛先判別用番号の下位2ビットの値から、M−分割領域のIDの通知が要求されたと判断し、M−分割領域に割り当てるユニークなIDを生成する。テーブル制御部322は、生成したIDをキャッシュバックアップ用制御領域の下位側領域(Addr.[n−3:n−m])に設定した応答パケットを、IO制御部310を通じてCM200aに送信する。
なお、他の例として、上書きデータのサイズに対応する分割領域の種別の判定は、ステップS167ではなくステップS168でCBU300aのテーブル制御部322によって実行されてもよい。
[ステップS169]CM200aのCPU201は、CBU300aから送信された応答パケットからIDを抽出し、キャッシュ管理テーブル221のレコードのうち、上書きデータのLBAを含むレコードに、抽出したIDを上書きして登録する。
[ステップS170]CPU201は、CBU300a宛てのPCIeパケットを送信して、CBU300aから通知されたIDに対応付けたLBAを、CBU300aに通知する。
具体的には、CPU201は、読み出し要求パケットを生成する。CPU201は、読み出し要求パケットにおけるキャッシュバックアップ用制御領域に、宛先がCBU300aであることを示すように設定し、読み出し要求パケットの「Address」の下位側領域に、M−分割領域用のID取得用アドレス251bを設定する。さらに、CPU201は、上書きデータの先頭LBAと、上書きデータのサイズを、それぞれ書き込み要求パケットにおけるペイロード、「Length」に設定する。CPU201は、このように設定した書き込み要求パケットを、メモリコントローラ203およびPCIeバスを通じてCBU300aに送信する。
[ステップS171]CBU300aのIO制御部310は、書き込み要求パケットを受信する。CBU300aのテーブル制御部322は、書き込み要求パケットから、上書きデータの先頭LBAおよびサイズを抽出し、抽出した情報を、ステップS168で割り当てたIDに対応付けて、RAM332に一時的に格納する。テーブル制御部322は、IO制御部310を通じて、CM200aに応答パケットを送信する。
[ステップS172]CM200aのCPU201は、応答パケットを受信すると、DMAコントローラ203aを起動させて、上書きデータを二重化するためのDMA転送を要求する。
CPU201は、RAM202からCM−DMA起動用アドレス252を読み出し、読み出したアドレスをメモリコントローラ203に通知することで、DMAコントローラ203aを起動させる。さらに、CPU201は、DMAディスクリプタ253に対して情報を設定することで、DMAコントローラ203aに、RAM202のキャッシュ領域202bを書き込み先としたDMA書き込み処理を実行させる。なお、キャッシュ領域202bにおける書き込み先アドレスは、キャッシュ管理テーブル221において上書きデータの先頭LBAに対応付けられたキャッシュアドレスとなる。
[ステップS173]DMAコントローラ203aは、RAM202のバッファ領域202aから、ステップS161で書き込まれた上書きデータを読み出す。
[ステップS174]DMAコントローラ203aは、読み出した上書きデータを格納した書き込み要求パケットを、CBU300aに送信する。
このとき送信される書き込み要求パケットにおいては、ステップS168でCBU300aから通知されたID、キャッシュ領域202bにおける書き込み先アドレス、上書きデータのサイズなどが設定されている。
[ステップS175]CBU300aのIO制御部310は、受信した書き込み要求パケットをバッファメモリ311に格納し、書き込み要求パケット内の上書きデータを二重化するための処理を実行する。IO制御部310は、NAND制御部321およびテーブル制御部322に対して、上書きデータをNANDフラッシュ331に書き込むための処理を実行するように指示する。これとともに、IO制御部310は、受信した書き込み要求パケットをCM200aに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS176]テーブル制御部322は、書き込み要求パケットに設定されたIDが、ID管理テーブル352に登録されているかをチェックする。図16,図17の処理では、IDはステップS168で新規に割り当てられたものであるので、IDはID管理テーブル352に登録されていない。
[ステップS177]ステップS176で、IDがID管理テーブル352に登録されていないと判定した場合、テーブル制御部322は、IDをID管理テーブル352に登録する。また、テーブル制御部322は、IDに対して分割領域のアドレスを割り当てる。
テーブル制御部322は、NAND管理テーブル351を参照して、IDに対応する種別の分割領域のうち、分割領域全体のページのステータスが「未使用」である分割領域を選択する。この例では、IDはM−分割領域を示すので、テーブル制御部322は、内部の全ページのステータスが「未使用」であるM−分割領域を選択する。テーブル制御部322は、ID管理テーブル352にレコードを生成し、生成したレコードに、選択した分割領域のNANDフラッシュ331における先頭アドレスとIDとを登録する。
さらに、テーブル制御部322は、NAND管理テーブル351において、選択した分割領域に対応するアドレスのそれぞれに対して、書き込みデータのLBAを登録する。このとき、テーブル制御部322は、ステップS166でステータスを「無効」に更新したレコードに登録されていたLBAを、新たに選択した分割領域に対応するアドレスを含むレコードにコピーする。
[ステップS178]テーブル制御部322は、ステップS177でNAND管理テーブル351に登録したNANDフラッシュ331におけるアドレスをNAND制御部321に通知する。NAND制御部321は、ステップS175でバッファメモリ311に書き込まれた書き込み要求パケットのペイロードから上書きデータを順次読み出し、NANDフラッシュ331におけるテーブル制御部322から通知されたアドレスに書き込む。また、テーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
ここで、図18は、一部上書きの実行時におけるテーブルの状態の例を示す図である。
図16のステップS166において、CBU300aのテーブル制御部322は、CM200aから通知されたLBAおよび上書きデータのサイズに基づき、NAND管理テーブル351のレコードのうち、上書きデータに対応するLBA#(p’)〜LBA#(p’+P’)を含むレコードのステータスを「無効」に更新する。
その後、図16のステップS168では、テーブル制御部322は、新たなID_M#(d)を生成してCM200aに通知したとする。この場合、ステップS169において、CM200aのCPU201は、図18に示すように、キャッシュ管理テーブル221のレコードのうち、LBA#(p’)〜LBA#(p’+P’)を含むレコードのIDを、ID_L#(a)からID_M#(d)に更新する。これにより、LBA#(p)〜LBA#(p+P)における一連の書き込みデータには、ID_L#(a)とID_M#(d)という2つのIDが対応付けられることになる。
その後、図17のステップS177では、CBU300aのテーブル制御部322は、図18に示すように、ID管理テーブル352にレコードを生成し、生成したレコードに、CM200aから通知されたID_M#(d)と、選択した分割領域のNANDフラッシュ331における先頭アドレスであるAdr#(y’)とを登録する。さらに、テーブル制御部322は、NAND管理テーブル351において、上書き対象データが記録されていたAdr#(x”)〜Adr#(x”+Y)に対応付けられていたLBA#(p’)〜LBA#(p’+P’−7)を、M−分割領域のAdr#(y’)〜Adr#(y’+Y)のレコードにコピーする。テーブル制御部322は、LBAのコピーが完了した後、NAND管理テーブル351において、上書き対象データが記録されていたL−分割領域のAdr#(x”)〜Adr#(x”+Y)に対応付けられていたLBA#(p’)〜LBA#(p’+P’−7)を消去する。
以下、図17に戻って説明する。
[ステップS179]CM200aのメモリコントローラ203は、ステップS175でCBU300aから送信された書き込み要求パケットを受信すると、書き込み要求パケットに設定されたキャッシュ領域202bのアドレスに、書き込み要求パケットに格納された上書きデータを書き込む。これにより、キャッシュ領域202bに格納されていた元の書き込みデータのうち、LBA#(p’)〜LBA#(p’+P’)に対応する領域のみが、上書きデータによって更新される。
以上の処理により、上書きデータは、CM200aのキャッシュ領域202bと、CBU300aのNANDフラッシュ331とに二重化される。
[ステップS180]CBU300aのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS181]CM200aのCPU201は、CBU300aからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
以上の図13,図14,図16および図17に示したように、ストレージシステム100では、ホスト装置から書き込み要求を受け付けたCM200aのCPU201が、DMAコントローラ203aに対してDMA転送を1回要求するだけで、書き込みが要求されたデータがキャッシュ領域202bとCBU300aのNANDフラッシュ331とに二重化される。このため、CPU201がDMA転送を要求する際のオーバヘッドが短縮され、その結果、書き込みデータの二重化処理全体に要する時間が短縮される。従って、CM200aは、ホスト装置に対して書き込みの完了を短時間で応答することができる。
さらに、CBU300aは、CM200aから転送された書き込みデータを、そのサイズに応じたNANDフラッシュ331上の分割領域に書き込む。これにより、NANDフラッシュ331上に無効ページがランダムに発生しにくくなり、その結果、NANDフラッシュ331上に空きブロックを確保する際に、ブロック間でデータがコピーされる確率が低くなる。これにより、NANDフラッシュ331のデータバスの負荷が軽減され、NANDフラッシュ331への書き込みデータの書き込み速度が向上する。従って、書き込みデータの二重化処理全体に要する時間が短縮される。
なお、上記の説明では、CBU300aは、1つの分割領域に対して1つのIDを割り当てたが、他の方法として、例えば、CBU300aは、1つの分割領域内の各ページに対して連続的なIDを割り当ててもよい。この場合、例えば、ステップS107,S165,S170において、CM200aのCPU201は、IDを通知することでLBAを指定することもできる。
次に、一方のCMが、他方のCMが担当する論理ボリュームに対する書き込み要求を受けた場合の処理について説明する。以下の図19〜図24では、例として、CM200aが、CM200bが担当する論理ボリュームに対する書き込み要求を受けた場合の処理を示す。
図19,図20は、一方のCMが、他方のCMが担当する論理ボリュームに対する書き込み要求を受けたときの処理例を示す第1のシーケンス図である。
[ステップS201]ホスト装置は、CM200aに対して書き込みを要求するとともに、書き込みデータを送信する。CM200aが受信した書き込みデータは、RAM202のバッファ領域202aに書き込まれる。
[ステップS202]CM200aのCPU201は、書き込みが要求されたデータが属する論理ボリュームの番号(LUN)と、書き込みデータのLBAとをチェックし、書き込みデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図19では、書き込みデータは、CM200aが担当する論理ボリュームに属するデータでなかったものとする。
[ステップS203]CM200aのCPU201は、ペイロードに書き込みデータのLUNおよび先頭LBAを、「Length」に書き込みデータのサイズをそれぞれ格納した、他方のCM200b宛ての書き込み要求パケットを送信して、LUNおよびLBAをCM200bに通知する。
[ステップS204〜S209]CM200aから送信された書き込み要求パケットは、CBU300aのIO制御部310およびCBU300bのIO制御部310を介して、CM200bに転送される。この後、ステップS204〜S209では、CM200bおよびCBU300bは、図13のステップS103〜S108でのCM200aおよびCBU300bと同様の処理を実行する。
すなわち、CM200bのCPU201は、書き込みデータがCM200bのキャッシュ領域202bにないと判定し(ステップS204)、書き込みデータに応じた種別の分割領域のIDを通知するようにCBU300bに要求する(ステップS205)。CBU300bのテーブル制御部322は、IDを生成してCM200bに返信し(ステップS206)、CM200bのCPU201は、返信されたIDをキャッシュ管理テーブル221に登録する(ステップS207)。
CM200bのCPU201は、書き込みデータのLBAをCBU300bに通知する(ステップS208)。CBU300bのテーブル制御部322は、通知されたLBAを割り当てたIDとともにRAM332に一時的に記録して、CM200bに応答パケットを送信する(ステップS209)。
[ステップS210]CM200bのCPU201は、応答パケットを受信すると、CM200bのDMAコントローラ203aを起動させて、上書きデータを二重化するためのDMA転送を要求する。
CPU201は、CM200bのRAM202からCM−DMA起動用アドレス252を読み出し、読み出したアドレスをCM200bのメモリコントローラ203に通知することで、CM200bのDMAコントローラ203aを起動させる。さらに、CPU201は、CM200bのDMAディスクリプタ253に次のような設定を行うことで、DMAコントローラ203aに、RAM202のキャッシュ領域202bを転送先としたDMA読み出し処理を実行させる。
CPU201は、DMAディスクリプタ253のコマンド253aに、外部からRAM202への転送を示す値を設定し、DMAディスクリプタ253の転送サイズ253bに、書き込みデータのサイズを設定する。また、CPU201は、DMAディスクリプタ253の第1アドレス253cに、CM200bのキャッシュ領域202bのアドレスを設定する。このとき、CPU201は、キャッシュ領域202bのアドレスを、ステップS204でキャッシュ管理テーブル221に生成したレコードに登録する。
また、DMAディスクリプタ253の第2アドレス253dに設定される情報は、DMAコントローラ203aから送信される読み出し要求パケットの「Address」に格納されるものである。CPU201は、第2アドレス253dにおけるキャッシュバックアップ用制御領域に対応する領域に、宛先がCBU300bであることを示すような宛先判別用番号と、CBU300bに通知するIDとを設定する。また、CM200aのバッファ領域202aは、CM200aのRAM202上に固定的に割り当てられている。このことから、CM200bのCPU201は、「Address」の下位側領域に対応する第2アドレス253dの領域に、読み出し元のアドレスとして、CM200aのバッファ領域202aを示すあらかじめ決められたアドレスを設定する。
[ステップS211]CM200bのDMAコントローラ203aは、DMAディスクリプタ253に設定された情報に基づき、CM200aのバッファ領域202aを読み出し元とする読み出し要求パケットを、PCIeバスを通じてCBU300bに送信する。
[ステップS212]CBU300bのIO制御部310は、CM200bからの読み出し要求パケットを受信すると、読み出し要求パケットからIDを抽出して、CBU300bのテーブル制御部322に通知する。これとともに、IO制御部310は、受信した読み出し要求パケットをCM200aに転送する。
[ステップS213]CBU300bのテーブル制御部322は、読み出し要求パケットから抽出されたIDが、CBU300bのRAM332に記録されたID管理テーブル352に登録されているかをチェックする。図19,図20の例では、IDはステップS206で新規に割り当てられたものであるので、IDはID管理テーブル352に登録されていない。
[ステップS214]ステップS213で、IDがID管理テーブル352に登録されていないと判定した場合、CBU300bのテーブル制御部322は、IDをID管理テーブル352に登録する。このとき、IDは、L−分割領域、M−分割領域、S−分割領域のどれに対応するかが識別可能な状態で、ID管理テーブル352に登録される。
また、テーブル制御部322は、IDに対して分割領域のアドレスを割り当てる。具体的には、テーブル制御部322は、NAND管理テーブル351を参照して、IDに対応する種別の分割領域のうち、分割領域全体のページのステータスが「未使用」である分割領域を選択する。この例では、IDはL−分割領域を示すID_L#(a)であるので、テーブル制御部322は、内部の全ページのステータスが「未使用」であるL−分割領域を選択する。
テーブル制御部322は、ID管理テーブル352にレコードを生成し、生成したレコードに、選択した分割領域のNANDフラッシュ331における先頭アドレスとIDとを登録する。さらに、テーブル制御部322は、ステップS209でRAM332に一時的に格納しておいた先頭LBAおよびサイズに基づき、NAND管理テーブル351において、選択した分割領域に対応するアドレスのそれぞれに対して、書き込みデータのLBAを登録する。
[ステップS215]CM200aのメモリコントローラ203は、ステップS212でCBU300bのIO制御部310から転送された読み出し要求パケットを受信すると、CM200aのバッファ領域202aから、ステップS201で書き込まれた書き込みデータを読み出す。
[ステップS216]CM200aのメモリコントローラ203は、読み出し要求パケットに対する応答パケットに、バッファ領域202aから読み出した書き込みデータを格納して、この応答パケットをCBU300bに送信する。
[ステップS217]CBU300bのIO制御部310は、CM200aからの応答パケットを自身のバッファメモリ311に格納し、応答パケット内の書き込みデータを二重化するための処理を実行する。
IO制御部310は、CBU300bのNAND制御部321に、書き込みデータをCBU300bのNANDフラッシュ331に書き込むように指示する。これとともに、IO制御部310は、受信した応答パケットをCM200bに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS218]CBU300bのNAND制御部321は、ステップS214でテーブル制御部322がNAND管理テーブル351にLBAを登録したレコードに登録されたアドレスを書き込み先として、応答パケットから抽出した書き込みデータをNANDフラッシュ331に書き込む。このとき、CBU300bのテーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
[ステップS219]CM200bのDMAコントローラ203aは、ステップS217でCBU300bから送信された応答パケットを受信すると、DMAディスクリプタ253の第1アドレス253cに設定されたキャッシュ領域202bのアドレスに、応答パケットに格納された書き込みデータを書き込む。
以上の処理により、書き込みデータは、CM200bのキャッシュ領域202bと、CBU300bのNANDフラッシュ331とに二重化される。なお、ステップS217での、CBU300bのIO制御部310からCM200bへの応答パケットの送信処理と、ステップS218でのバッファメモリ311からNANDフラッシュ331への書き込みデータの転送処理とは、並列に実行されてもよい。
[ステップS220]CBU300bのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS221]CM200aのCPU201は、CBU300bからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
図21,図22は、一方のCMが、他方のCMが担当する論理ボリュームに対する書き込み要求を受けたときの処理例を示す第2のシーケンス図である。図21,図22の処理は、図19,図20の処理によってホスト装置から書き込みが要求された書き込みデータの全体を上書きするような書き込み要求が、ホスト装置からCM200aに送信された場合のものである。
[ステップS241]ホスト装置は、CM200aに対して、図19のステップS201で書き込みを要求した書き込みデータと同じLBAに対応する書き込みデータを送信して、書き込みを要求する。CM200aが受信した書き込みデータは、CM200aのRAM202のバッファ領域202aに書き込まれる。
[ステップS242]CM200aのCPU201は、書き込みを要求されたデータが属する論理ボリュームの番号(LUN)と、書き込みデータのLBAとをチェックし、書き込みデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図21では、書き込みデータは、CM200aが担当する論理ボリュームに属するデータではない。
[ステップS243]CM200aのCPU201は、他方のCM200b宛てに書き込み要求パケットを送信して、書き込みデータのLUN、先頭LBAおよびサイズをCM200bに通知する。
[ステップS244]CM200bのCPU201は、CM200aから受信した書き込み要求パケットに設定された情報から、CM200aが受け付けた書き込みデータのLBAを認識する。CM200bのCPU201は、書き込みデータのLBAが、CM200b内のキャッシュ管理テーブル221に登録されているかを判定する。この例では、CPU201は、受信した書き込みデータのLBAはキャッシュ管理テーブル221に登録されていると判定する。
[ステップS245]CM200bのCPU201は、キャッシュ管理テーブル221を参照して、ホスト装置から要求された上書きの種別が「全面上書き」か、あるいは「一部上書き」かを判定する。この例では、CPU201は全面上書きが要求されたと判定する。この場合、次のステップS246に示すように、新たなIDをCBU300bから取得することなく、書き込みデータを二重化するための処理が開始される。
[ステップS246]CM200bのCPU201は、CM200bのDMAコントローラ203aを起動させて、書き込みデータを二重化するためのDMA転送を要求する。
このステップS246での処理は、次の点を除けば、図19のステップS210の処理と同様である。ステップS246では、CPU201は、キャッシュ管理テーブル221から、書き込みデータのLBAに対応付けられたIDを読み出し、DMAディスクリプタ253の第2アドレス253dにおけるキャッシュバックアップ用制御領域に対応する領域に設定する。これにより、CPU201は、上書きするデータを書き込むべき、CBU300bのNANDフラッシュ331における分割領域のIDを、自ら決定してCBU300bに指定することができる。
[ステップS247]CM200bのDMAコントローラ203aは、DMAディスクリプタ253に設定された情報に基づき、CM200aのバッファ領域202aを読み出し元とする読み出し要求パケットを、PCIeバスを通じてCBU300bに送信する。
[ステップS248]CBU300bのIO制御部310は、CM200bからの読み出し要求パケットを受信すると、読み出し要求パケットからIDを抽出して、CBU300bのテーブル制御部322に通知する。これとともに、IO制御部310は、受信した読み出し要求パケットをCM200aに転送する。
[ステップS249]CBU300bのテーブル制御部322は、読み出し要求パケットから抽出されたIDが、CBU300bのRAM332に記録されたID管理テーブル352に登録されているかをチェックする。図21,図22の例では、テーブル制御部322は、IDはID管理テーブル352に登録されていると判定する。この場合、次のステップS250の処理が実行される。
[ステップS250]CBU300bのテーブル制御部322は、CBU300bのID管理テーブル352から、読み出し要求パケットに設定されたIDが登録されたレコードを選択し、選択したレコードに登録されたNANDフラッシュ331のアドレスを抽出する。テーブル制御部322は、ID管理テーブル352から抽出したアドレスに基づき、NAND管理テーブル351から、読み出し要求パケットに設定されたIDが示す分割領域に対応するレコードを選択し、選択したレコードのステータスを「無効」に変更する。
[ステップS251]CBU300bのテーブル制御部322は、読み出し要求パケットに設定されたIDに対して、同じ種別の新たな分割領域のアドレスを割り当てる。テーブル制御部322は、ID管理テーブル352のレコードのうち、読み出し要求パケットに設定されたIDが登録されたレコードに、新たに選択した分割領域の先頭アドレスを上書きして登録する。さらに、テーブル制御部322は、NAND管理テーブル351において、新たに選択した分割領域に対応するアドレスのそれぞれに対して、書き込みデータのLBAを登録する。このとき、テーブル制御部322は、ステップS250でステータスを「無効」に更新したレコードに登録されていたLBAを、新たに選択した分割領域に対応するアドレスを含むレコードにコピーする。
[ステップS252]CM200aのメモリコントローラ203は、ステップS248でCBU300bのIO制御部310から転送された読み出し要求パケットを受信すると、CM200aのバッファ領域202aから、ステップS241で書き込まれた書き込みデータを読み出す。
[ステップS253]CM200aのメモリコントローラ203は、読み出し要求パケットに対する応答パケットに、バッファ領域202aから読み出した書き込みデータを格納して、この応答パケットをCBU300bに送信する。
[ステップS254]CBU300bのIO制御部310は、CM200aからの応答パケットを自身のバッファメモリ311に格納し、応答パケット内の書き込みデータを二重化するための処理を実行する。
IO制御部310は、CBU300bのNAND制御部321に、書き込みデータをCBU300bのNANDフラッシュ331に書き込むように指示する。これとともに、IO制御部310は、受信した応答パケットをCM200bに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS255]CBU300bのNAND制御部321は、ステップS251でテーブル制御部322がNAND管理テーブル351にLBAを登録したレコードに登録されたアドレスを書き込み先として、応答パケットから抽出した書き込みデータをNANDフラッシュ331に書き込む。このとき、CBU300bのテーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
[ステップS256]CM200bのDMAコントローラ203aは、ステップS254でCBU300bから送信された応答パケットを受信すると、DMAディスクリプタ253の第1アドレス253cに設定されたキャッシュ領域202bのアドレスに、応答パケットに格納された書き込みデータを書き込む。これにより、CM200bのキャッシュ領域202bに格納されていた元の書き込みデータの全面が、新たな書き込みデータによって更新される。
[ステップS257]CBU300bのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS258]CM200aのCPU201は、CBU300bからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
図23,図24は、一方のCMが、他方のCMが担当する論理ボリュームに対する書き込み要求を受けたときの処理例を示す第3のシーケンス図である。図23,図24の処理は、図20,図21の処理によってホスト装置から書き込みが要求された書き込みデータの一部を上書きするような書き込み要求が、ホスト装置からCM200aに送信された場合のものである。
[ステップS271]ホスト装置は、CM200aに対して、図21のステップS241で書き込みを要求した書き込みデータの一部に上書きするためのデータを送信して、書き込みを要求する。CM200aが受信した書き込みデータは、CM200aのRAM202のバッファ領域202aに書き込まれる。以下、このステップS271でホスト装置から送信されたデータを「上書きデータ」と呼ぶ。
[ステップS272]CM200aのCPU201は、書き込みを要求されたデータが属する論理ボリュームの番号(LUN)と、書き込みデータのLBAとをチェックし、上書きデータが、CM200aが担当する論理ボリュームに属するものかを判定する。この図23では、上書きデータは、CM200aが担当する論理ボリュームに属するデータではない。
[ステップS273]CM200aのCPU201は、他方のCM200b宛てに書き込み要求パケットを送信して、上書きデータのLUN、先頭LBAおよびサイズをCM200bに通知する。
[ステップS274〜S282]CM200bのCPU201は、CM200aから受信した書き込み要求パケットに設定された情報から、CM200aが受け付けた上書きデータのLBAを認識する。この後、ステップS274〜S282では、CM200bおよびCBU300bは、図16のステップS163〜S171でのCM200aおよびCBU300aと同様の処理を実行する。
すなわち、CM200bのCPU201は、上書きデータのLBAがCM200bのキャッシュ管理テーブル221に登録されていないと判定し(ステップS274)、上書きの種別が「一部上書き」であると判定する(ステップS275)。CM200bのCPU201は、上書き対象範囲のデータのLBAをCBU300bに通知して、CBU300bのNANDフラッシュ331に格納された上書き対象範囲のデータを無効化するように要求する(ステップS276)。CBU300bのテーブル制御部322は、CBU300bのNAND管理テーブル351のレコードのうち、上書きデータに対応するLBAを含むレコードのステータスを「無効」に更新する(ステップS277)。
CM200bのCPU201は、CBU300b宛ての読み出し要求パケットを送信して、CBU300bに対して、上書きデータを書き込む分割領域に対応する新たなIDの通知を要求する(ステップS278)。ここでは例として、M−分割領域に対応するIDの通知が要求されたものとする。CBU300bのテーブル制御部322は、M−分割領域のIDを生成してCM200bに返信し(ステップS279)、CM200bのCPU201は、返信されたIDをキャッシュ管理テーブル221に登録する(ステップS280)。
CM200bのCPU201は、上書きデータのLBAをCBU300bに通知する(ステップS281)。CBU300bのテーブル制御部322は、通知されたLBAを割り当てたIDとともにRAM332に一時的に記録して、CM200bに応答パケットを送信する(ステップS282)。
[ステップS283]CM200bのCPU201は、応答パケットを受信すると、CM200bのDMAコントローラ203aを起動させて、上書きデータを二重化するためのDMA転送を要求する。
[ステップS284]CM200bのDMAコントローラ203aは、CM200aのバッファ領域202aを読み出し元とする読み出し要求パケットを、PCIeバスを通じてCBU300bに送信する。送信される読み出し要求パケットには、ステップS279でCBU300bから割り当てられたIDが格納されている。
[ステップS285]CBU300bのIO制御部310は、CM200bからの読み出し要求パケットを受信すると、読み出し要求パケットからIDを抽出して、CBU300bのテーブル制御部322に通知する。これとともに、IO制御部310は、受信した読み出し要求パケットをCM200aに転送する。
[ステップS286]CBU300bのテーブル制御部322は、読み出し要求パケットから抽出されたIDが、CBU300bのRAM332に記録されたID管理テーブル352に登録されているかをチェックする。図23,図24の例では、テーブル制御部322は、IDはID管理テーブル352に登録されていないと判定する。この場合、次のステップS287の処理が実行される。
[ステップS287]CBU300bのテーブル制御部322は、IDをID管理テーブル352に登録する。また、テーブル制御部322は、IDに対して分割領域のアドレスを割り当てる。
テーブル制御部322は、NAND管理テーブル351を参照して、IDに対応する種別の分割領域のうち、分割領域全体のページのステータスが「未使用」である分割領域を選択する。図23,図24の例では、IDはM−分割領域を示すので、テーブル制御部322は、内部の全ページのステータスが「未使用」であるM−分割領域を選択する。テーブル制御部322は、ID管理テーブル352にレコードを生成し、生成したレコードに、選択した分割領域のNANDフラッシュ331における先頭アドレスとIDとを登録する。
さらに、テーブル制御部322は、NAND管理テーブル351において、選択した分割領域に対応するアドレスのそれぞれに対して、上書きデータのLBAを登録する。このとき、テーブル制御部322は、ステップS277でステータスを「無効」に更新したレコードに登録されていたLBAを、新たに選択した分割領域に対応するアドレスを含むレコードにコピーする。
[ステップS288]CM200aのメモリコントローラ203は、ステップS285でCBU300bのIO制御部310から転送された読み出し要求パケットを受信すると、CM200aのバッファ領域202aから、ステップS271で書き込まれた書き込みデータを読み出す。
[ステップS289]CM200aのメモリコントローラ203は、読み出し要求パケットに対する応答パケットに、バッファ領域202aから読み出した上書きデータを格納して、この応答パケットをCBU300bに送信する。
[ステップS290]CBU300bのIO制御部310は、CM200aからの応答パケットを自身のバッファメモリ311に格納し、応答パケット内の上書きデータを二重化するための処理を実行する。
IO制御部310は、CBU300bのNAND制御部321に、上書きデータをCBU300bのNANDフラッシュ331に書き込むように指示する。これとともに、IO制御部310は、受信した応答パケットをCM200bに転送して、キャッシュ領域202bに対する書き込みを要求する。
[ステップS291]CBU300bのNAND制御部321は、ステップS287でテーブル制御部322がNAND管理テーブル351にLBAを登録したレコードに登録されたアドレスを書き込み先として、応答パケットから抽出した上書きデータをNANDフラッシュ331に書き込む。これにより、上書き対象のデータのみが、元の書き込みデータとは別の分割領域に書き込まれる。このとき、CBU300bのテーブル制御部322は、NAND管理テーブル351のレコードのうち、NAND制御部321によってデータが書き込まれたアドレスに対応するレコードのステータスを「有効」に更新する。
[ステップS292]CM200bのDMAコントローラ203aは、ステップS290でCBU300bから送信された応答パケットを受信すると、応答パケットに格納された上書きデータをCM200bのキャッシュ領域202bに書き込む。これにより、CM200bのキャッシュ領域202bに格納されていた元の書き込みデータの一部が、上書きデータによって更新される。
[ステップS293]CBU300bのIO制御部310は、PCIeバスを通じて、CM200aに対して二重化処理の完了を割り込みによって通知する。
[ステップS294]CM200aのCPU201は、CBU300bからの二重化処理の完了通知を受信すると、ホスト装置に対して書き込みの完了の応答を返す。
以上のように、一方のCMがホスト装置から、他方のCMが担当する論理ボリュームに対する書き込み要求を受けた場合でも、他方のCMのCPUは、DMAコントローラに対してDMA転送を1回要求するだけで、書き込みが要求されたデータを二重化することができる。このため、書き込みデータの二重化処理全体に要する時間が短縮される。さらに、一方のCMが自装置が担当する論理ボリュームに対する書き込み要求を受けた場合と同様に、CBUにおけるNANDフラッシュへの書き込み速度の向上効果も得られることから、書き込みデータの二重化処理全体に要する時間が短縮される。
次に、図25は、ライトバック実行時の処理例を示すシーケンス図である。図25では例として、CM200aがライトバックを実行した場合の処理を示すが、CM200bがライトバックを実行した場合には、CM200bおよびCBU300bが、図25におけるCM200aおよびCBU300aの処理を実行することができる。
[ステップS331]CM200aのCPU201は、キャッシュ領域202bの使用率をチェックする。キャッシュ領域202bの使用率が所定値以下の場合、CPU201は、所定時間後にステップS331の処理を再度実行する。一方、キャッシュ領域202bの使用率が所定値より大きい場合、CPU201は、次のステップS332の処理を実行する。
[ステップS332]CPU201は、キャッシュ領域202bに格納されているデータのうち、ホスト装置から最後にアクセスされてからの時間が最も長いデータを選択する。CPU201は、選択したデータをキャッシュ領域202bから読み出して、バックエンドの記憶領域(DE400のHDD)に書き戻す。
[ステップS333]CPU201は、キャッシュ管理テーブル221から、ライトバックを行ったデータに対応付けられているIDを読み出す。CPU201は、書き込み要求パケットを生成し、書き込み要求パケットのキャッシュバックアップ用制御領域に、キャッシュ管理テーブル221から読み出したIDを設定する。CPU201は、IDを設定した書き込み要求パケットをCBU300aに対して送信して、IDに対応する分割領域の無効化を要求する。
例えば、図15に示した状態から、CPU201がLBA#(p)〜LBA#(p+P)に対応する一連の書き込みデータのライトバックを行ったとする。この場合、CPU201は、キャッシュ管理テーブル221において、LBA#(p)〜LBA#(p+P)に対応付けられたID_L#(a)を、CBU300aに通知する。
また、例えば、図18に示した状態から、CPU201がLBA#(p)〜LBA#(p+P)に対応する一連の書き込みデータのライトバックを行ったとする。この場合、CPU201は、キャッシュ管理テーブル221において、LBA#(p)〜LBA#(p+P)に対応付けられたID_L#(a)およびID_M#(d)の両方を、CPU300aに通知する。例えば、CPU201は、ID_L#(a)とID_M#(d)とを、それぞれ個別の書き込み要求パケットを用いてCBU300aに通知する。
[ステップS334]CPU201は、キャッシュ管理テーブル221のレコードのうち、ライトバックを行ったデータに対応するレコードを消去する。なお、このステップS334の処理は、CBU300aでの分割領域の無効化、またはCBU300aでの分割領域のデータ消去が完了した後に、実行されてもよい。
[ステップS335]CBU300aのIO制御部310は、CM200aからの書き込み要求パケットを受信する。CBU300aのテーブル制御部322は、書き込み要求パケットからIDを読み出し、ID管理テーブル352から、読み出したIDに対応付けられているNANDフラッシュ331のアドレスを読み出す。テーブル制御部322は、NAND管理テーブル351のレコードのうち、ID管理テーブル352から読み出したアドレスを含むレコードのステータスを「無効」に更新するとともに、これらのレコードのLBAを消去する。さらに、テーブル制御部322は、書き込み要求パケットから読み出したIDが登録されたID管理テーブル352のレコードを消去する。
[ステップS336]テーブル制御部322は、NAND管理テーブル351を参照して、内部の全ページのステータスが「無効」または「未使用」のブロック、すなわち、データを即座に消去可能なブロックが存在するかを判定する。データを即座に消去可能なブロックが存在した場合、テーブル制御部322は、そのブロックのアドレスをNAND制御部321に通知して、データ消去を要求する。
[ステップS337]NAND制御部321は、テーブル制御部322から通知されたアドレスに対応するブロックのデータを消去する。
なお、ステップS336において、データを即座に消去可能なブロックが存在しない場合には、テーブル制御部322は、例えば、NAND制御部321に次のような処理を実行させる。NAND制御部321は、内部のページの一部が有効ページである複数のブロックを選択し、選択した複数のブロック内の有効ページのデータを、データ消去済みの他のブロックにコピーする。コピーが完了すると、NAND制御部321は、選択した複数のブロックに記録されているデータを消去し、空きブロックに遷移させる。
ここで、例えば、ステップS333において、CM200aのCPU201がL−分割領域のIDをCBU300aに通知した場合、ステップS336では、テーブル制御部322は、通知されたIDに対応するブロックのデータ消去をNAND制御部321に実行させる。この場合、NAND制御部321は、データ消去が要求されたブロックに記録されたデータを、他のブロックにコピーすることなく即座に消去することができる。
また、例えば、ステップS333において、CM200aのCPU201がM−分割領域のIDをCBU300aに通知した場合、ステップS336では、S−分割領域のIDを通知した場合と比較して、内部の全ページのステータスが「無効」または「未使用」のブロックが存在している可能性が高くなる。もし、内部の全ページのステータスが「無効」または「未使用」のブロックが存在していれば、ステップS337において、NAND制御部321は、そのブロックに記録されたデータを、他のブロックにコピーすることなく即座に消去することができる。
このように、ストレージシステム100によれば、ライトバックを実行したときに、NANDフラッシュ331におけるデータ消去を短時間で実行できる確率が高まる。このため、NANDフラッシュ331に空きブロックを生成するまでの平均時間を短縮することができる。従って、例えば、CM200aがホスト装置からの書き込み要求を受けてから、キャッシュ領域202bおよびNANDフラッシュ331上のバックアップ領域が足りないために、ホスト装置に対する応答が遅れる、といった事態の発生確率が低くなり、ホスト装置に対する平均応答時間を短縮することができる。
次に、一方のCMが異常停止した場合の処理について説明する。以下、例として、CM200aが異常停止したものとして説明する。この場合、他方のCM200bは、CBU300aのNANDフラッシュ331に格納されている、CM200aのキャッシュ領域のバックアップデータを読み出し、バックエンドの記憶装置(DE400)に書き戻す。これにより、CBU300aのNANDフラッシュ331に格納されていた、CM200aが担当していた論理ボリュームの最新データを失わずに、CM200bが、その論理ボリュームに対するホスト装置からの要求に応じたアクセス制御を引き継ぐことができる。
図26は、アクセス制御を引き継ぐCMがRAM上に生成する制御領域、および、制御領域内の情報とCBUのNAND管理テーブルの情報との対応関係の例を示す図である。
CBU300aのNANDフラッシュ331に格納されたデータをDE400に書き戻す際、CM200bのCPU201、CM200bのRAM202に、書き戻し用のバッファ領域260を確保する。バッファ領域260は、付与されたLBAが連続している一連のデータごとに生成される。各バッファ領域260は、一連のデータの先頭のLBAを示す「先頭LBA」、一連のデータのサイズを示す「サイズ」、「書き戻しフラグ」、および、一連のデータが格納される「データ」を含む。「書き戻しフラグ」は、DE400への書き戻しが完了したか、あるいは書き戻しを実行中かを示すフラグ情報である。
なお、CPU201は、例えば、RAM202における各バッファ領域260の先頭アドレスを、例えば、図12に示したCBU−DMA起動用アドレス254a,254b,・・・で指定する。あるいは、CBU−DMA起動用アドレス254aが1つだけ用意されていて、CPU201は、複数のバッファ領域260のうちの1つ目の領域の先頭アドレスのみをCBU−DMA起動用アドレスで指定し、2つ目以降のバッファ領域260の先頭アドレスを動的に指定してもよい。
図27は、NANDフラッシュに格納されたデータの書き戻し処理の例を示すシーケンス図である。
[ステップS351]CBU300aのIO制御部310は、CM200aがエラー発生により停止したことを検出すると、エラー発生をCM200bに通知する。IO制御部310は、例えば、CM200aと通信できなくなったときに、CM200aが停止したと判定する。
この後、CBU300aのNANDフラッシュ331に格納されたデータがすべてCM200bによって読み出されるまで、ステップS352〜S363の処理が繰り返される。
[ステップS352]CM200bのCPU201は、CBU300aに読み出し要求パケットを送信して、NANDフラッシュ331に格納されたデータをDMA転送するように要求する。このとき、読み出し要求パケットには、データの転送先としてCM200bのバッファ領域260の先頭アドレスが設定される。
[ステップS353]CBU300aのIO制御部310は、読み出し要求パケットを受信すると、DMAコントローラ323を起動する。このとき、IO制御部310は、DMAコントローラ323に対して、データの転送先として、読み出し要求パケットに設定されていたバッファ領域260の先頭アドレスを指定する。
[ステップS354]CBU300aのDMAコントローラ323は、CBU300aのテーブル制御部322を通じて、RAM332内のNAND管理テーブル351を参照する。DMAコントローラ323は、NAND管理テーブル351に登録されたLBAを検索して、一連のデータの先頭LBAを判別する。例えば、DMAコントローラ323は、NAND管理テーブル351に登録されたLBAのうち、最小のLBAを先頭LBAと判別する。
[ステップS355]DMAコントローラ323は、CM200bに対して応答パケットを送信して、判別した先頭LBAをCM200bのバッファ領域260に転送する。
[ステップS356]DMAコントローラ323は、NAND管理テーブル351において、転送したLBAに対応付けられたアドレスを抽出する。DMAコントローラ323は、NANDフラッシュ331における抽出したアドレスからデータを読み出し、CM200bのバッファ領域260に転送する。DMAコントローラ323は、データの転送が完了すると、NAND管理テーブル351から、転送したデータに対応するLBAを消去する。
[ステップS357]DMAコントローラ323は、NAND管理テーブル351に、転送したデータのLBAから連続するLBA(前のLBAに8ビットが加算されたLBA)があるかを判定する。連続するLBAがある場合、次のステップS358の処理が行われる。
[ステップS358]DMAコントローラ323は、NAND管理テーブル351から、連続するLBAに対応付けられたアドレスを抽出する。DMAコントローラ323は、NANDフラッシュ331における抽出したアドレスからデータを読み出し、CM200bのバッファ領域260に転送する。DMAコントローラ323は、データの転送が完了すると、NAND管理テーブル351から、転送したデータに対応するLBAを消去する。
これ以後、DMAコントローラ323は、NAND管理テーブル351に連続するLBAが存在している間、ステップS357,S358の処理を繰り返す。これにより、一連のデータがCM200bのバッファ領域260に書き込まれる。
[ステップS357a]ここで、上記のステップS357の判定処理が実行されたときに、前のLBAから連続するLBAがなかったとする。
[ステップS359]DMAコントローラ323は、ステップS356の実行から現在までに転送した一連のデータのデータサイズを、CM200bのバッファ領域260に転送する。
[ステップS360]DMAコントローラ323は、CM200bのCPU201に対して、割り込みによって、データ転送が完了したことを通知する。
[ステップS361]CM200bのCPU201は、バッファ領域260の「書き戻しフラグ」をオフにする。
[ステップS362]CPU201は、バッファ領域260に格納された一連のデータを、DE400に書き戻す。
[ステップS363]一連のデータの書き戻しが完了すると、CPU201は、バッファ領域260の「書き戻しフラグ」をオンにする。
上記処理においては、CM200bのCPU201は、CBU300aのNANDフラッシュ331からデータを読み出す際に、データに対応付けられていたLBAも読み出す。これにより、CM200bのCPU201は、読み出したデータが論理ボリューム上のどのデータかを特定できるようになる。従って、CM200bのCPU201は、読み出したデータをDE400に書き戻した後、それらのデータに対するホスト装置からのアクセス要求を受け付けて、CM200aが実行していたアクセス制御を引き継ぐことができるようになる。
図28は、データの書き戻し処理中にホスト装置から読み出し要求を受けたときの処理例を示すフローチャートである。
[ステップS381]CM200bのCPU201は、ホスト装置から、CM200aが担当していた論理ボリュームのデータに対する読み出し要求を受け付ける。
[ステップS382]CPU201は、バッファ領域260の「先頭LBA」および「サイズ」に基づき、読み出しを要求されたデータがバッファ領域260にあるかを判定する。CPU201は、データがバッファ領域260にある場合、ステップS383の処理を実行し、データがバッファ領域260にない場合、ステップS384の処理を実行する。
[ステップS383]CPU201は、バッファ領域260における、読み出しが要求されたデータに対応付けられた「書き戻しフラグ」を参照する。CPU201は、「書き戻しフラグ」がオフである場合には、オンになるまでステップS384の処理の実行を待ち合わせる。そして、CPU201は、「書き戻しフラグ」がオンになった場合、ステップS384の処理を実行する。
[ステップS384]CPU201は、読み出しを要求されたデータを、DE400から読み出し、ホスト装置に送信する。ここで、ステップS384の処理がステップS383の次に実行された場合には、他方のCM200aのキャッシュ領域に格納されていた最新のデータがホスト装置に送信される。
上記の処理によれば、CM200bは、ステップS383で「書き戻しフラグ」がオフである場合に、DE400からのデータの読み出しの実行を抑止することで、DE400に格納されていない最新のデータがあるにもかかわらず、古いデータがホスト装置に送信されてしまうという事態を防止することができる。
次に、図29は、CBUのIO制御部における判定パターンの例を示す図である。
CM間で通信が行われる際や、CMとCBUとの間で通信が行われる際、PCIeパケットは少なくとも1つのCBUのIO制御部310を経由する。CBUのIO制御部310は、PCIeパケットを受信したとき、受信したポートと、パケットの種別(すなわち、TLPヘッダの「Fmt」,「Type」の値)と、TLPヘッダの宛先判別用番号(Addr.[n:n−2])との組み合わせに応じて、PCIeパケットが自装置(すなわち、IO制御部310が属するCBU)宛てか、あるいは他の装置宛てかを判定する。IO制御部310は、PCIeパケットが他の装置宛てであると判定した場合には、PCIeパケットを他方のポートから転送する。一方、IO制御部310は、受信したPCIeパケットが自装置宛てと判定した場合には、上記の情報の組み合わせから自装置がどのような処理をするべきかを判定することもできる。
上記情報の組み合わせに基づくIO制御部310による判定パターンには、例えば、図29のような13種類のパターンがある。なお、以下の説明において、自系CMとは、自装置のNANDフラッシュ331にキャッシュ領域202bのデータをバックアップしているCMを指す。例えば、CBU300aにとっての自系CMはCM200aであり、他系CMはCM200bである。また、IO制御部310が備える2つのポートのうち、一方のポートは自系CMに接続し、他方のポートは他方のCBUに接続する。
パターン1の場合、IO制御部310は、自装置に対する、自系CMからのデータの二重化要求と判定する。この処理は、例えば、上記シーケンス図におけるステップS112,S138,S175に対応する。この場合、宛先判別用番号の下位2ビットは分割領域の種別を指す。
パターン2の場合、IO制御部310は、自系CMから自装置へのLBAの通知と判定する。この処理は、例えば、ステップS108,S171,S209,S282に対応する。
パターン3の場合、IO制御部310は、自装置に対する、自系CMからのページの無効化要求と判定する。この場合、宛先判別用番号の下位2ビットは分割領域の種別を指す。IO制御部310は、ペイロードにLBAが設定されていた場合、IDが示す分割領域のページのうちLBAに対応するページの無効化が要求されたと判定する。これは、例えば、ステップS166,S277に対応する。
一方、IO制御部310は、ペイロードにLBAが設定されていなかった場合、IDが示す分割領域内の全有効ページの無効化が要求されたと判定する。これは、例えば、ステップS333でCM200aが送信した、ライトバックしたデータに対応するIDを通知するための書き込み要求パケットを、CBU300aのIO制御部310が受信した場合に対応する。
パターン4の場合、IO制御部310は、受信した書き込み要求パケットを他方のCBUに転送する。この処理は、例えば、ステップS203,S243,S273でCM200aが送信した書き込み要求パケットを、CBU300aのIO制御部310が受信した場合に対応する。
パターン5の場合、IO制御部310は、受信した読み出し要求パケットからIDを抽出するとともに、受信した読み出し要求パケットを他方のCBUに転送する。この処理は、例えば、ステップS212,S248,S285に対応する。
パターン6の場合、IO制御部310は、自系CMからのIDの割り当て要求と判定する。この処理は、例えば、S104,S167でCM200aが送信した読み出し要求パケットを、CBU300aのIO制御部310が受信した場合や、ステップS205,S278でCM200bが送信した読み出し要求パケットを、CBU300bのIO制御部310が受信した場合に対応する。この場合、宛先判別用番号の下位2ビットは分割領域の種別を指す。
パターン7の場合、IO制御部310は、受信した読み出し要求パケットを他方のCBUに転送する。この処理は、例えば、ステップS352でCM200bが送信した書き戻し要求のための読み出し要求パケットを、CBU300bのIO制御部310が受信した場合に対応する。
パターン8の場合、IO制御部310は、受信したコントロールパケットを他方のCBUに転送する。この処理は、例えば、ステップS216,S253,S289でCM200aから送信された応答パケットを、CBU300aのIO制御部310が受信した場合に対応する。
パターン9の場合、IO制御部310は、受信した書き込み要求パケットを自系CMに転送する。この処理は、例えば、ステップS203,S243,S273でCM200aが送信した書き込み要求パケットを、CBU300aのIO制御部310が受信した場合に対応する。
パターン10の場合、IO制御部310は、受信した読み出し要求パケットを自系CMに転送する。この処理は、例えば、ステップS212,S248,S285でCBU300bから転送された読み出し要求パケットを、CBU300aのIO制御部310が受信した場合に対応する。この場合、宛先判別用番号の下位2ビットは分割領域の種別を指す。
パターン11の場合、IO制御部310は、自装置のNANDフラッシュ331のデータをDMA転送するように要求されたと判定する。この処理は、例えば、ステップS353の処理に対応する。
パターン12の場合、IO制御部310は、他系CMから送信されたデータの二重化要求と判定する。この処理は、例えば、ステップS217,S254,S290の処理に対応する。この場合、宛先判別用番号の下位2ビットは分割領域の種別を指す。
パターン13の場合、IO制御部310は、受信したコントロールパケットを自系CMに転送する。この処理は、例えば、ステップS355,S356,S358,S359でCBU300aから送信された応答パケットを、CBU300bのIO制御部310が受信した場合に対応する。
以上のようにIO制御部310がパケットの宛先および要求された処理を判定することで、CM間の通信、およびCMとCBUとの間の通信を、PCI Express規格に準拠したパケットを用いて実行できるようになる。これにより、ストレージシステム100の開発コストを低減できる。また、CMによるPCIeバスを通じた通信処理に関する設計変更を少なくすることができる。
以上の各実施の形態に関し、さらに以下の付記を開示する。
(付記1) プロセッサと、
第1のメモリおよび第2のメモリと、
前記プロセッサおよび前記第1のメモリに接続された第1の転送制御回路と、
前記第1の転送制御回路および前記第2のメモリに接続された第2の転送制御回路と、
を有し、
前記第1の転送制御回路は、前記第1のメモリを転送先とするデータの転送要求を前記プロセッサから受けると、前記データを前記第2の転送制御回路に送信し、
前記第2の転送制御回路は、前記第1の転送制御回路から前記データを受信すると、受信した前記データを前記第2のメモリに格納するとともに、受信した前記データを前記第1の転送制御回路を通じて前記第1のメモリに格納する、
ことを特徴とする情報処理システム。
(付記2) 前記第1の転送制御回路は、前記第1のメモリを転送先とする前記データの転送要求を前記プロセッサから受けると、前記データが格納され、かつ前記第1のメモリを書き込み先とする書き込み要求パケットを前記第2の転送制御回路に送信し、
前記第2の転送制御回路は、前記第1の転送制御回路からの前記書き込み要求パケットを受信すると、前記書き込み要求パケットに格納された前記データを前記第2のメモリに書き込むとともに、前記書き込み要求パケットを前記第1の転送制御回路に転送し、
前記第1の転送制御回路は、前記第2の転送制御回路から転送された前記書き込み要求パケットを受信すると、前記書き込み要求パケットに格納された前記データを前記第1のメモリに書き込む、
ことを特徴とする付記1記載の情報処理システム。
(付記3) 前記情報処理システムには記憶装置が接続され、
前記プロセッサは、ホスト装置からのアクセス要求に応じて前記記憶装置に対するアクセスを制御するとともに、前記第1のメモリを、前記記憶装置と前記ホスト装置との間で送受信するデータをキャッシュするキャッシュメモリとして使用し、
前記第2の転送制御回路には、前記プロセッサに代わって、前記ホスト装置からのアクセス要求に応じて前記記憶装置に対するアクセスを制御するバックアップ装置が接続され、
前記プロセッサの動作が停止したとき、前記バックアップ装置は、前記第2のメモリに格納されたデータを前記第2の転送制御回路を通じて読み出して前記記憶装置に書き込む、
ことを特徴とする付記1または2記載の情報処理システム。
(付記4) 前記第2の転送制御回路には転送バッファが接続され、
前記第2の転送制御回路は、前記第1の転送制御回路から送信された前記データを前記転送バッファに一時的に格納し、前記データを前記転送バッファから前記第2のメモリへ転送するとともに、前記データを前記転送バッファから前記第1の転送制御回路を通じて前記第1のメモリへ転送する、
ことを特徴とする付記1〜3のいずれか1項に記載の情報処理システム。
(付記5) ネットワークに接続された第1の通信インタフェースと、
前記ネットワークを通じて前記第1のインタフェースが受信したデータを一時的に記憶するとともに、前記第1の転送制御回路に接続された第1の受信バッファと、
前記ネットワークに接続された第2の通信インタフェースと、
前記ネットワークを通じて前記第2の通信インタフェースが受信したデータを一時的に記憶する第2の受信バッファと、
前記第2の受信バッファおよび前記第2の転送制御回路に接続された第3の転送制御回路と、
をさらに有し、
前記プロセッサが、前記第1の受信バッファに記憶された第1のデータを前記第1のメモリに転送するように前記第1の転送制御回路に要求した場合、
前記第1の転送制御回路は、前記第1の受信バッファから読み出した前記第1のデータを格納した、前記第1のメモリを書き込み先とする書き込み要求パケットを前記第2の転送制御回路に送信し、
前記第2の転送制御回路は、前記第1の転送制御回路からの前記書き込み要求パケットを受信すると、前記書き込み要求パケットに格納された前記第1のデータを前記第2のメモリに書き込むとともに、前記書き込み要求パケットを前記第1の転送制御回路に転送し、
前記第1の転送制御回路は、前記第2の転送制御回路から転送された前記書き込み要求パケットに格納された前記第1のデータを前記第1のメモリに書き込み、
前記プロセッサが、前記第2の受信バッファに記憶された第2のデータを前記第1のメモリに転送するように前記第1の転送制御回路に要求した場合、
前記第1の転送制御回路は、前記第2の受信バッファを読み出し元とする読み出し要求パケットを前記第2の転送制御回路を通じて前記第3の転送制御回路に送信し、
前記第3の転送制御回路は、前記読み出し要求パケットを受信すると、前記第2の受信バッファから読み出した前記第2のデータを格納した応答パケットを前記第2の転送制御回路に送信し、
前記第2の転送制御回路は、前記応答パケットを受信すると、前記応答パケットに格納された前記第2のデータを前記第2のメモリに書き込むとともに、前記応答パケットを前記第1の転送制御回路に転送し、
前記第1の転送制御回路は、前記第2の転送制御回路から転送された前記応答パケットに格納された前記第2のデータを前記第1のメモリに書き込む、
ことを特徴とする付記1記載の情報処理システム。
(付記6) 前記第2のメモリはNANDフラッシュであり、
前記第2の転送制御回路は、前記データのサイズがページのサイズ以下である場合には、前記NANDフラッシュの記憶領域をページ単位で分割した複数の第1種別の分割領域のうちの1つに前記データを書き込み、前記データのサイズがページのサイズより大きくブロックのサイズ以下である場合には、前記NANDフラッシュの記憶領域をブロック単位で分割した複数の第2種別の分割領域のうちの1つに前記データを書き込む、
ことを特徴とする付記1記載の情報処理システム。
(付記7) 前記プロセッサは、
前記第1の転送制御回路に対してデータの転送を要求したことに伴って前記第2のメモリに格納されたデータが、どの分割領域に格納されたかを示す識別情報を前記第2の転送制御回路から取得し、
前記第2のメモリに格納されたデータの無効化を要求する際に、無効化するデータが格納された分割領域を示す識別情報を、前記第1の転送制御回路を通じて前記第2の転送制御回路に通知する、
ことを特徴とする付記6記載の情報処理システム。
(付記8) 前記情報処理システムには記憶装置が接続され、
前記プロセッサは、
ホスト装置からのアクセス要求に応じて前記記憶装置に対するアクセスを制御するとともに、前記第1のメモリを、前記記憶装置と前記ホスト装置との間で送受信するデータをキャッシュするキャッシュメモリとして使用し、
前記第1のメモリに格納されたデータを前記記憶装置にライトバックしたとき、ライトバックしたデータに対応する識別情報を前記第1の転送制御回路を通じて前記第2の転送制御回路に通知して、通知した識別情報に対応する分割領域のデータを無効化するように要求し、
前記第2の転送制御回路は、前記プロセッサから通知された識別情報が前記第2種別の分割領域を示す場合、前記通知された識別情報が示す分割領域に対するデータ消去処理を実行する、
ことを特徴とする付記7記載の情報処理システム。
(付記9) 前記プロセッサは、前記第2のメモリに格納されたデータを新たなデータで上書きするように要求する際に、上書き対象のデータに対応する識別情報を前記第1の転送制御回路を通じて前記第2の転送制御回路に通知し、
前記第2の転送制御回路は、通知された識別番号が示す第1の分割領域のデータを無効化するとともに、前記第1の分割領域と同じ種別の第2の分割領域を前記通知された識別番号に割り当て直し、前記第2の分割領域に前記新たなデータを書き込む、
ことを特徴とする付記7または8記載の情報処理システム。
(付記10) 前記プロセッサは、前記第2のメモリに格納された第1のデータの一部を第2のデータで上書きするように要求する際に、前記第1のデータのうち前記第2のデータで上書きされる領域を無効化するとともに、前記第2のデータのサイズに応じた種別の分割領域を示す新たな識別情報を通知するように、前記第2の転送制御回路に要求し、
前記第2の転送制御回路は、前記第1のデータが格納された分割領域のうち前記第2のデータで上書きされる領域を無効化するとともに、前記新たな識別情報を前記プロセッサに通知し、前記第2のデータを前記新たな識別情報が示す分割領域に書き込む、
ことを特徴とする付記8記載の情報処理システム。
(付記11) 前記プロセッサは、前記第1のメモリに格納された、前記第2のデータによってその一部が上書きされた前記第1のデータを前記記憶装置にライトバックしたとき、前記第1のデータに対応する識別情報と前記第2のデータに対応する識別情報を前記第1の転送制御回路を通じて前記第2の転送制御回路に通知して、通知した各識別情報に対応する分割領域のデータを無効化するように要求することを特徴とする付記10記載の情報処理システム。
(付記12) 前記第2の転送制御回路には、前記プロセッサに代わって、前記ホスト装置からのアクセス要求に応じて前記記憶装置に対するアクセスを制御するバックアップ装置が接続され、
前記プロセッサは、前記第1の転送制御回路に対してデータの転送を要求したことに伴って前記第2のメモリに新たなデータが格納されるたびに、格納された新たなデータの論理アドレスを前記第1の転送制御回路を通じて前記第2の転送制御回路に通知し、
前記第2の転送制御回路は、前記第2のメモリに格納したデータと前記プロセッサから通知された論理アドレスとを、前記第1種別の分割領域ごとに管理テーブルに対応付けて登録し、
前記プロセッサの動作が停止したとき、前記バックアップ装置は、前記第2のメモリに格納されたデータと、データに対応付けられた論理アドレスとを、前記第2の転送制御回路を通じて読み出し、連続する論理アドレスが付与されたデータを一連のデータと判定して、前記一連のデータを前記記憶装置に書き込む、
ことを特徴とする付記8記載の情報処理システム。
(付記13) プロセッサと、第1のメモリおよび第2のメモリとを備える情報処理システムにおけるデータ記録制御方法であって、
前記プロセッサが、前記第1のメモリを転送先とするデータの転送要求を、前記第1のメモリに接続された第1の転送制御回路に要求し、
前記第1の転送制御回路が、前記第2のメモリに接続された第2の転送制御回路に対して、前記データを送信し、
前記第2の転送制御回路が、前記第1の転送制御回路から受信した前記データを前記第2のメモリに格納するとともに、受信した前記データを前記第1の転送制御回路を通じて前記第1のメモリに格納する、
ことを特徴とするデータ記録制御方法。
(付記14) 前記第2の転送制御回路に前記データを送信する処理では、前記第1の転送制御回路は、前記データが格納され、かつ前記第1のメモリを書き込み先とする書き込み要求パケットを前記第2の転送制御回路に送信し、
前記データを前記第1のメモリおよび前記第2のメモリに格納する処理は、
前記第2の転送制御回路が、前記第1の転送制御回路からの前記書き込み要求パケットを受信すると、前記書き込み要求パケットに格納された前記データを前記第2のメモリに書き込むとともに、前記書き込み要求パケットを前記第1の転送制御回路に転送し、
前記第1の転送制御回路が、前記第2の転送制御回路から転送された前記書き込み要求パケットを受信すると、前記書き込み要求パケットに格納された前記データを前記第1のメモリに書き込む、
処理を含む、
ことを特徴とする付記13記載のデータ記録制御方法。
(付記15) 前記第2のメモリはNANDフラッシュであり、
前記第2の転送制御回路が、前記データのサイズがページのサイズ以下である場合には、前記NANDフラッシュの記憶領域をページ単位で分割した複数の第1種別の分割領域のうちの1つに前記データを書き込み、前記データのサイズがページのサイズより大きくブロックのサイズ以下である場合には、前記NANDフラッシュの記憶領域をブロック単位で分割した複数の第2種別の分割領域のうちの1つに前記データを書き込む、
処理をさらに含むことを特徴とする付記13記載のデータ記録制御方法。
(付記16) 前記プロセッサが、
前記第1の転送制御回路に対してデータの転送を要求したことに伴って前記第2のメモリに格納されたデータが、どの分割領域に格納されたかを示す識別情報を前記第2の転送制御回路から取得し、
前記第2のメモリに格納されたデータの無効化を要求する際に、無効化するデータが格納された分割領域を示す識別情報を、前記第1の転送制御回路を通じて前記第2の転送制御回路に通知する、
処理をさらに含むことを特徴とする付記15記載のデータ記録制御方法。