図1Aは、記憶サービスを1つ以上の記憶クライアント106に提供するように構成された記憶層130を含むコンピューティングシステム100の一実施形態のブロック図である。記憶層130は、本明細書でさらに詳細に開示されるように、オープンツークローズファイルサービスを提供するように構成されてもよい。コンピューティングシステム100は、サーバ、デスクトップ、ラップトップ、埋め込みシステム、および/またはモバイルデバイスなどを含むがそれらに限定されない、任意の適切なコンピューティングデバイスを含んでもよい。一部の実施形態では、コンピューティングシステム100は、一群の(cluster of)サーバコンピューティングデバイスなどの複数のコンピューティングデバイスを含んでもよい。コンピューティングシステム100は、処理リソース101、揮発性メモリリソース102(例えば、ランダムアクセスメモリ(RAM))、不揮発性記憶リソース103、および通信インタフェース104を含んでもよい。処理リソース101は、汎用中央処理装置(CPU)、特定用途向け集積回路(ASIC)、ならびにフィールドプログラマブルゲートアレイ(FPGA)およびプログラマブル論理アレイ(PLG)などのプログラマブル論理素子を含んでもよいが、それらに限定されない。不揮発性記憶リソース103は、磁気ハードディスク、半導体記憶媒体、および/または光学式記憶媒体などの非一時的機械可読記憶媒体を含んでもよい。通信インタフェース104は、コンピューティングシステム100をネットワーク105に通信可能に結合するように構成されてもよい。ネットワーク105は、伝送制御プロトコル/インターネットプロトコル(TCP/IP)ネットワーク、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、仮想プライベートネットワーク(VPN)、ストレージエリアネットワーク(SAN)、公衆交換電話網(PSTN)、および/またはインターネットなどの任意の適切な通信ネットワークを含んでもよいが、それらに限定されない。
コンピューティングシステム100は、1つ以上の記憶クライアント106に記憶サービスを提供するように構成することができる記憶層130を含んでもよい。記憶クライアント106は、オペレーティングシステム(ベアメタル(bare metal)オペレーティングシステム、ゲストオペレーティングシステム、仮想マシン、および仮想化環境などを含む)、ファイルシステム、データベースシステム、ならびに/またはリモート記憶クライアント(例えば、ネットワーク105を通じてコンピューティングシステム100および/もしくは記憶層130に通信可能に結合された記憶クライアント)などを含んでもよいが、それらに限定されない。
記憶層130(および/または、そのモジュール)は、ソフトウェア、ハードウェア、またはそれらの組み合わせで実装されてもよい。一部の実施形態では、記憶層130の一部は、不揮発性記憶リソース103などの永続的、非一時的記憶媒体に記憶することができる、コンピュータプログラムコードなどの実行可能命令として具体化される。命令および/またはコンピュータプログラムコードは、処理リソース101によって実行されるように構成されてもよい。代わりに、または加えて、記憶層130の一部は、汎用および/もしくは特定用途コンポーネント、プログラム可能ハードウェア、FPGA、ASIC、ハードウェアコントローラ、ならびに/または記憶制御装置などのマシンコンポーネントとして具体化されてもよい。
記憶層130は、記憶媒体140上で記憶動作を実行するように構成されてもよい。記憶媒体140は、データを永続的に記憶することが可能な任意の記憶媒体を含んでもよい。本明細書で使用されるように、「永続的」なデータ記憶は、永続的、不揮発性記憶媒体に情報を記憶することを指す。記憶媒体140は、1つ以上の半導体記憶装置もしくはドライブ(SSD)、ハードディスクドライブ(例えば、Integrated Drive Electronics(IDE)ドライブ、Small Computer System Interface(SCSI)ドライブ、Serial Attached SCSI(SAS)ドライブ、Serial AT Attachment(SATA)ドライブなど)、テープドライブ、および/または書き込み可能光学ドライブ(CDドライブ、DVDドライブ、Blu−rayドライブなど)などにおける半導体記憶媒体などの不揮発性記憶媒体を含んでもよい。
一部の実施形態では、記憶媒体140は、NANDフラッシュメモリ、NORフラッシュメモリ、nano RAM(NRAM)、磁気抵抗RAM(MRAM)、相変化RAM(PRAM)、Racetrackメモリ、Memristorメモリ、ナノ結晶ワイヤベースメモリ、酸化ケイ素ベースサブ10ナノメータプロセスメモリ、グラフェンメモリ、シリコン−酸化物−窒化物−酸化物−シリコン(SONOS)、抵抗ランダムアクセスメモリ(RRAM)、プログラマブルメタライゼーションセル(PMC)、および/またはconductive−bridging RAM(CBRAM)などを含むことができるがそれらに限定されない、不揮発性半導体メモリを含む。記憶媒体140の特定の実施形態が本明細書で開示されるが、この開示の教示は、不揮発性および揮発性の両方の形式を含む、任意の適切な形式のメモリに適用されてもよい。したがって、記憶層130の特定の実施形態が不揮発性、半導体記憶装置140のコンテキストで開示されるが、他の記憶装置および/または記憶媒体と共に記憶層130が使用されてもよい。
一部の実施形態では、記憶媒体140は、RAM、ダイナミックRAM(DRAM)、スタティックRAM(SRAM)、シンクロナスダイナミックRAM(SDRAM)などを含むことができるがそれらに限定されない、揮発性メモリを含む。記憶媒体140は、CPUキャッシュ(例えば、L1、L2、L3キャッシュなど)、および/またはグラフィックスメモリなどの、処理リソース101のメモリに対応してもよい。一部の実施形態では、記憶媒体140は、インターコネクト127の使用によって記憶層130に通信可能に結合される。インターコネクト127は、ペリフェラルコンポーネントインターコネクト(PCI)、PCIエクスプレス(PCI−e)、シリアルアドバンスドテクノロジーアタッチメント(シリアルATAまたはSATA)、パラレルATA(PATA)、スモールコンピュータシステムインタフェース(SCSI)、IEEE1394(Fire Wire)、ファイバーチャネル、および/またはユニバーサルシリアルバス(USB)などを含んでもよいが、それらに限定されない。代わりに、記憶媒体140は、ネットワーク105(および/または、ストレージエリアネットワーク(SAN)、および/または仮想ストレージエリアネットワーク(VSAN)などの他の通信インタフェース)を通じて記憶層130に通信可能に結合されたリモート記憶装置であってもよい。したがって、インターコネクト127は、PCE−eバス、ネットワーク接続(例えば、インフィニバンド)、ストレージネットワーク、ファイバーチャネルプロトコル(FCP)ネットワーク、および/またはHyperSCSIなどの、リモートバスを含んでもよい。
記憶層130は、とりわけ、記憶コントローラ139の使用によって、記憶媒体140上で記憶動作を管理するように構成されてもよい。記憶コントローラ139は、ストレージドライバ、I/Oドライバ、および/もしくはフィルタドライバなどの、コンピューティングシステム100上で動作する1つ以上のドライバおよび/または他のソフトウェアモジュール、ならびにハードウェアコントローラおよび/もしくは通信インタフェースなどの、ハードウェアコンポーネントなどを含むがそれらに限定されないソフトウェアおよび/またはハードウェアコンポーネントを含んでもよい。記憶媒体140は、記憶装置141上で具体化されてもよい。記憶層130(例えば、記憶コントローラ139)の一部は、記憶装置141のハードウェアおよび/またはソフトウェアコンポーネント(例えば、ファームウェア)として実装されてもよい。
記憶コントローラ139は、記憶媒体140の特定の記憶位置において記憶動作を実装するように構成されてもよい。本明細書で使用されるように、記憶位置は、データを永続的に記憶することが可能な記憶リソース(例えば、記憶媒体および/または装置)の記憶の単位を指し、記憶位置は、ページ、ページのグループ(例えば、論理ページおよび/もしくは論理ページ内のオフセット)、記憶区画(例えば、物理消去ブロック、論理消去ブロックなど)、セクタ、磁気ディスク上の位置、ならびに/またはバッテリバックアップメモリ位置などを含んでもよいが、それらに限定されない。記憶位置は、記憶媒体140の記憶アドレス空間144内でアドレス指定可能であってもよい。記憶アドレスは、物理アドレス、媒体アドレス、バックエンドアドレス、および/またはアドレスオフセットなどに対応してもよい。記憶アドレスは、任意の適切な記憶アドレス空間144、記憶アドレス指定スキーム、および/または記憶位置の配置に対応してもよい。
記憶層130は、インタフェース131を含んでもよく、インタフェース131を通じて、記憶クライアント106は、記憶層130によって提供される記憶サービスにアクセスすることができる。記憶インタフェース131は、ブロックデバイスインタフェース、仮想化記憶インタフェース、1つ以上の仮想記憶ユニット(VSU)、オブジェクト記憶インタフェース、データベース記憶インタフェース、ならびに/または他の適切なインタフェースおよび/もしくはアプリケーションプログラミングインタフェース(API)のうちの1つ以上を含んでもよい。
記憶層130は、フロントエンド記憶インタフェースを通じて記憶リソースを参照することを設けてもよい。本明細書で使用されるように、「フロントエンド記憶インタフェース」は、それらと通じて記憶クライアント106が記憶層130の記憶リソースを参照することができる、インタフェースおよび/または名前空間を指す。記憶インタフェースは、論理アドレス空間132に対応してもよい。論理アドレス空間132は、識別子のグループ、組、集合、範囲(range)、および/または範囲(extent)を含んでもよい。本明細書で使用されるように、「識別子」または「論理識別子」(LID)は、ソースリソースを参照するための識別子を指し、LIDは、名前(例えば、ファイル名、および/または識別名など)、データ識別子、参照番号(references)、リンク、LID、フロントエンド識別子、論理アドレス、論理ブロックアドレス(LBA)、論理ユニット番号(LUN)アドレス、仮想ユニット番号(VUN)アドレス、仮想記憶アドレス、記憶アドレス、物理アドレス、媒体アドレス、および/またはバックエンドアドレスを含んでもよいが、それらに限定されない。
論理アドレス空間132の論理容量は、論理アドレス空間132におけるLIDの数、ならびに/またはLIDによって参照される記憶リソースのサイズおよび/もしくは粒度に対応してもよい。一部の実施形態では、論理アドレス空間132は、「シンプロビジョニング(thinly provisioned)」されてもよい。本明細書で使用されるように、シンプロビジョニングされた論理アドレス空間132は、内在する記憶リソースの物理記憶容量を上回る(例えば、記憶媒体140の記憶容量を上回る)論理容量を有する論理アドレス空間132を指す。一実施形態では、記憶層130は、記憶媒体140の物理記憶容量を上回ることができる、64ビット論理アドレス空間132(例えば、226の一意なLIDを含む論理アドレス空間)を提供するように構成される。大規模、シンプロビジョニングされた論理アドレス空間132によって、記憶クライアント106が効率的に連続した領域のLIDを割り当て、および/または参照することが可能になると共に、名前競合(name conflicts)の可能性を減少させる。記憶割り当てのためのシステムおよび方法のさらなる実施形態は、参照によってその全体が本明細書に組み込まれる、David Flynnらによる2013年4月17日に出願された「Systems and Methods for Storage Allocation」と題する米国特許出願第13/865,153号明細書で開示される。
記憶層130の変換モジュール134は、論理アドレス空間132のLIDを記憶リソース(例えば、記憶媒体140の記憶アドレス空間144内に記憶されたデータ)にマッピングするように構成されてもよい。論理アドレス空間132は、バックエンド記憶リソース(例えば、記憶媒体140)から独立してもよく、したがって、論理アドレス空間132のLIDと記憶アドレス空間144の記憶アドレスとの間の組または予め定められたマッピングが存在しなくてもよい。一部の実施形態では、論理アドレス空間132は、わずかに、シンプロビジョニングされ、および/またはオーバープロビジョニング(over−provisioned)され、それによって、論理アドレス空間132のサイズが記憶媒体140の記憶アドレス空間144と異なるようになる。
記憶層130は、記憶媒体140上で実行される記憶動作に関連する記憶メタデータ135を維持するように構成されてもよい。記憶メタデータ135は、論理アドレス空間132のLIDと記憶アドレス空間144内の記憶アドレスとの間のany−to−anyマッピングを含むフォワードマッピング、記憶媒体140の記憶位置の内容に関連するリバースマッピング、有効性ビットマップ(validity bitmaps)、信頼性試験(reliability testing)および/もしくは状態メタデータ、状態情報(例えば、エラー率および消去状態(retirement status)など)、ならびに/またはキャッシュメタデータ、などを含んでもよいが、それらに限定されない。記憶メタデータ135の一部は、コンピューティングシステム100の揮発性メモリリソース102内で維持されてもよい。代わりに、または加えて、記憶メタデータ135の一部は、不揮発性記憶リソース103および/または記憶媒体140に記憶されてもよい。
図1Bは、論理アドレス空間132のLIDと記憶アドレス空間144内のバックエンド識別子(例えば、記憶アドレス)との間のany−to−anyマッピング150の一実施形態を示す。any−to−anyマッピング150は、記憶メタデータ135の1つ以上のデータ構造において維持されてもよい。図1Bに示されるように、変換モジュール134は、任意の記憶リソース識別子(任意のLID)を任意のバックエンド記憶位置にマッピングするように構成されてもよい。さらに示されるように、論理アドレス空間132は、内在する記憶アドレス空間144とは異なってサイジングされてもよい。図1Bの実施形態では、論理アドレス空間132は、シンプロビジョニングされてもよく、および、それ自体が記憶アドレス空間144における記憶アドレスの範囲よりも大きい範囲のLIDを含んでもよい。
上記開示されるように、記憶クライアント106は、論理アドレス空間132のLIDを通じて記憶リソースを参照してもよい。したがって、論理アドレス空間132は、記憶リソースの論理インタフェース152に対応してもよく、および記憶アドレス空間144内の特定の記憶アドレスへのマッピングは、記憶リソースのバックエンドインタフェース154に対応してもよい。
記憶層130は、フォワードマッピング160における論理インタフェース152とバックエンドインタフェース154との間のany−to−anyマッピング150を維持するように構成されてもよい。フォワードマッピング160は、インデックス、マッピング、ハッシュマッピング、ハッシュテーブル、ツリー、レンジエンコードツリー、および/またはbツリーなどを含むがそれらに限定されない、任意の適切なデータ構造を含んでもよい。フォワードマッピング160は、記憶媒体140に記憶されたデータを参照するための使用に対して割り当てられているLIDに対応するエントリ162を含んでもよい。フォワードマッピング160のエントリ162は、LID164A〜Dを記憶アドレス空間144内のそれぞれの記憶アドレス166A〜Dと関連付けてもよい。フォワードマッピング160はわずかにポピュレート(populate)されてもよく、ならびに、それ自体が、記憶クライアント106によって現在割り当てられておらず、および/または記憶媒体140に記憶された有効なデータを参照するために現在使用されていないLIDに対応するエントリを除外してもよい。一部の実施形態では、フォワードマッピング160は、レンジエンコードデータ構造を含み、それによって、エントリ162のうちの1つ以上が、複数のLID(例えば、LIDの範囲(range)、範囲(extent)、および/または組)に対応することができる。図1Bの実施形態では、フォワードマッピング160は、記憶アドレス166Aの対応する範囲にマッピングされたLID164Aの範囲に対応するエントリ162を含む。エントリ162は、LIDによってインデックス付けされてもよい。図1Bの実施形態では、エントリ162は、それぞれのリンクによってツリーデータ構造に配置される。開示はこの点に限定されないが、しかしながら、任意の適切なデータ構造および/またはインデックス付け機構を使用するように適合されてもよい。
図1Cを参照して、一部の実施形態では、記憶媒体140は、複数の半導体記憶要素116A〜Yを含む半導体記憶配列115を含んでもよい。本明細書で使用されるように、半導体記憶配列(または記憶配列)115は、2つ以上の独立した列118の組を指す。列118は、とりわけインターコネクト127を使用して並列に記憶層130に通信可能に結合された1つ以上の半導体記憶要素116A〜Yを含んでもよい。配列115の行117は、それぞれの列118の物理記憶単位(半導体記憶要素116A〜Y)を含んでもよい。本明細書で使用されるように、半導体記憶要素116A〜Yは、パッケージ、チップ、ダイ、平面、および/またはプリント回路基板などとして具体化された半導体記憶リソースを含むが、それらに限定されない。配列115を含む半導体記憶要素116A〜Yは、独立した動作が可能であってもよい。したがって、半導体記憶要素116Aの最初の1つ目は、第1の記憶動作を実行することが可能であってもよく、2つ目の半導体記憶要素116Bは、異なる記憶動作を実行する。例えば、半導体記憶要素116Aは、第1の物理アドレスにおいてデータを読み出すように構成されてもよく、もう一つの半導体記憶要素116Bは、異なる物理アドレスにおいてデータを読み出す。
半導体記憶配列115はまた、論理記憶要素(LSE)と称されてもよい。本明細書でさらに詳細に開示されるように、半導体記憶配列115は、論理記憶ユニット(行117)を含んでもよい。本明細書で使用されるように、「論理記憶ユニット」、すなわち行117は、配列115のそれぞれの列118上の各々の物理記憶ユニットの2つ以上の物理記憶ユニットの組み合わせを指す。論理消去ブロックは、2つ以上の物理消去ブロックの組を指し、論理ページは、2つ以上のページなどの組を指す。一部の実施形態では、論理消去ブロックは、それぞれの論理記憶要素115および/またはバンク内で消去ブロックを含んでもよい。代わりに、論理消去ブロックは、複数の異なる配列115内で消去ブロックを含んでもよく、および/または半導体記憶要素の複数のバンクに及んで(span)もよい。
図1Aを再度参照して、記憶層130はさらに、ログ構造化記憶構成で(例えば、記憶ログで)記憶媒体140にデータを記憶するように構成されたログ記憶モジュール136を含んでもよい。本明細書で使用されるように、「記憶ログ」、すなわち「ログ構造」は、記憶媒体140の記憶アドレス空間144内のデータの順序付けられた配置を指す。記憶ログにおけるデータは、永続的メタデータを含んでもよく、および/または永続的メタデータと関連付けられてもよい。したがって、記憶層130は、コンテキスト、自己記述的フォーマット(self−describing format)でデータを記憶するように構成されてもよい。本明細書で使用されるように、コンテキストまたは自己記述的フォーマットは、永続的メタデータと関連してデータが記憶されるデータフォーマットを指す。一部の実施形態では、永続的メタデータは、データを識別するように構成されてもよく、ならびに、それ自体がデータの論理インタフェース(例えば、データと関連付けられたLIDを含んでもよい)を含んでもよく、および/またはそれを参照してもよい。永続的メタデータは、データの所有者、アクセス制御、データタイプ、相対的位置もしくはデータのオフセットに関連する情報、データと関連付けられた記憶動作(例えば、原子的記憶動作、および/もしくはトランザクションなど)に関連する情報、ログシーケンス情報、ならびに/またはデータ記憶パラメータ(例えば、圧縮アルゴリズム、暗号化など)などを含むが、それらに限定されない他の情報を含んでもよい。
図1Dは、コンテキストデータフォーマットを示す。図1Dのパケットフォーマット110は、データセグメント112および永続的メタデータ114を含む。データセグメント112は、いずれかの任意の長さおよび/またはサイズのセグメントであってもよい。永続的メタデータ114は、データパケット110の1つ以上のヘッダフィールドとして具体化されてもよい。上記開示されたように、永続的メタデータ114は、データセグメント112の論理インタフェースを含んでもよく、および、それ自体がデータセグメント112と関連付けられたLIDを含んでもよい。図1Dはパケットフォーマット110を示しているが、開示はこの点に限定されず、ならびに記憶媒体140上のインデックス、および/または記憶区画インデックスなどを含むがそれらに限定されない他の方法で、データ(例えば、データセグメント112)をコンテキストメタデータと関連付けてもよい。データパケット110は、シーケンス情報113と関連付けられてもよい。シーケンス情報は、記憶ログ内のデータパケットの相対的順序を判定するために使用されてもよい。一部の実施形態では、データパケットは、記憶媒体140の記憶区画内で連続して付加される。記憶区画は、消去ブロックまたは論理消去ブロックなどに対応してもよい。各々の記憶区画は、大多数のデータパケット110を記憶することが可能であってもよい。記憶区画内のデータパケット110の相対的位置は、記憶ログ内のパケットの順序を判定してもよい。記憶区画の順序は、とりわけ、記憶区画シーケンス情報113によって判定されてもよい。記憶区画は、記憶区画が使用(例えば、消去)のために初期化され、プログラミングされ、またはクローズされるなどのときにそれぞれのシーケンス情報113に割り当てられてもよい。記憶区画シーケンス情報113は、記憶アドレス空間144内で記憶区画の順序付けシーケンスを判定してもよい。したがって、記憶ログ内のデータパケット110の相対的順序は、a)特定の記憶区画内のデータパケット110の相対的位置、およびb)記憶アドレス空間144における他の記憶区画に対する記憶区画の順序、によって判定されてもよい。
一部の実施形態では、記憶層130は、半導体記憶媒体またはフラッシュ記憶媒体などの非対称、追記型記憶媒体140を管理するように構成されてもよい。本明細書で使用されるように、「追記型」記憶媒体は、新たなデータが書き込まれ、またはそこでプログラミングされる度に再初期化される(例えば、消去される)記憶媒体を指す。本明細書で使用されるように、「非対称」記憶媒体は、異なるタイプの記憶動作に対して異なる待ち時間を有する記憶媒体を指す。一部の実施形態では、例えば、読み出し動作は、書き込み/プログラム動作よりも高速であることがあり、および書き込み/プログラム動作は、消去動作よりもはるかに高速であることがある(例えば、媒体を読み出すことは、消去することよりも数百倍高速であり、および記憶媒体をプログラミングすることよりも数十倍高速である)。記憶媒体140は、グループ(例えば、消去ブロック)として消去することができる記憶区画に区分化されてもよい。このようにして、「適当な(in−place)」単一のデータセグメントを修正することは、データを含む消去ブロック全体を消去すること、および元の、変更されていないデータに従って、修正されたデータを消去ブロックに再書き込みすることを必要とすることがある。このことは、過度に媒体を摩耗させることがある、不効率な「ライトアンプリフィケーション(write amplification)」をもたらすことがある。一部の実施形態では、したがって、記憶層130は、「不適当な(不適切な)」データを書き込むように構成されてもよい。本明細書で使用されるように、「不適当な」データを書き込むことは、「適当な」データを上書きすること(例えば、データの元の物理記憶位置を上書きすること)ではなく異なる記憶位置においてデータを更新および/または上書きすることを指す。不適当なデータを更新および/または上書きすることは、修正されることになるデータを有する消去ブロック上の既存の、有効なデータが消去および再複製される必要がないので、ライトアンプリフィケーションを回避することができる。さらに、不適当なデータを書き込むことは、多くの記憶動作の待ち時間経路からの消去を削除することができ、それによって消去待ち時間が、書き込み動作の「クリティカルパス」の一部ではなくなる。
記憶層130は、とりわけ、ログ記憶モジュール136の使用によって不適当な記憶動作を実行するように構成されてもよい。ログ記憶モジュール136は、記憶層130によって実行される記憶動作の相対的順序を維持する方式で、記憶アドレス空間144内で最新付加ポイント(current append point)においてデータを付加する(記憶媒体140上で「記憶ログ」を生成する)ように構成されてもよい。図1Eは、記憶媒体140の記憶アドレス空間144内で実行される付加専用(append−only)記憶動作の一実施形態を示す。上記開示されるように、記憶アドレス空間144は、複数の記憶区画170A〜N(例えば、消去ブロックまたは論理消去ブロックなど)を含み、その各々を、データを記憶するのに使用するために初期化(例えば、消去)することができる。記憶区画170A〜Nは、本明細書で開示されるように、ページおよび/または論理ページなどに対応することができる、それぞれの記憶位置を含んでもよい。記憶位置は、それぞれの記憶アドレス(例えば、記憶アドレス0〜記憶アドレスN)が割り当てられてもよい。
ログ記憶モジュール136は、物理アドレス空間144内の追加ポイント180から連続してデータを記憶するように構成されてもよい。図1Eの実施形態では、データは、記憶区画170Aの記憶位置182内の付加ポイント180において付加されてもよく、および記憶位置182が満たされるとき、付加ポイント180を次の利用可能な記憶位置に進めてもよい(181)。本明細書で使用されるように、「利用可能な」記憶位置は、初期化されており、およびまだプログラミングされていない(例えば、消去されている)記憶位置を指す。上記開示されるように、一部のタイプの記憶媒体は、消去されるときに初めて確実にプログラミングすることができる。したがって、利用可能な記憶位置は、初期化(または消去状態)にある記憶区画170A〜N内の記憶位置を指してもよい。
図1Eの実施形態では、論理消去ブロック170Bは、とりわけ、消去状態にない(例えば、有効なデータを含む)ことに起因して、記憶に利用可能でないことがあり、高エラー率に起因してサービス外であることがある。したがって、記憶位置182を満たした後、ログ記憶モジュール136は、利用可能でない記憶区画170Bをスキップしてもよく、および付加ポイント180を次の利用可能な記憶区画170Cに進めてもよい。上記開示されたように、ログ記憶モジュール136は、次の利用可能な記憶区画170A〜Nにおいて付加ポイント180が存続することを示す記憶位置183〜185にデータを付加することを継続するように構成されてもよい。
記憶アドレス空間144内の「最後の」記憶位置(例えば、記憶区画170N個の記憶位置N 189)にデータを記憶した後、ログ記憶モジュール136は、第1の記憶区画170A(または、記憶区画170Aが利用可能でない場合は次の利用可能な記憶区画)に再度向ける(wrapping back to)ことによって、付加ポイント180を進めてもよい。したがって、ログ記憶モジュール136は、記憶アドレス空間144をループまたはサイクルとして使用してもよい。
上記開示されるように、記憶アドレス空間144内でデータを連続して付加することによって、記憶媒体140に記憶ログを生成することができる。図1Eの実施形態では、記憶ログは、記憶アドレス空間144内で付加ポイント180から連続してデータパケット(および/または他のデータ構造)を記憶することによって実行される記憶動作の順序付けられたシーケンスを含んでもよい。上記開示されたように、付加専用記憶フォーマットは、不適切なデータを修正および/または上書きするために使用されてもよい。不適切な記憶動作を実行することは、修正および/または上書きされているデータを含む記憶区画170A〜N上の既存の有効なデータが消去および/または再複製される必要がないので、ライトアンプリフィケーションを回避することができる。さらに、不適切なデータを書き込むことは、多くの記憶動作の待ち時間経路からの消去を削除することができる(消去待ち時間は、もはや書き込み動作の「クリティカルパス」の一部ではない)。
図1Eの実施形態では、LID Aに対応するデータセグメントX0は、記憶位置191に記憶されてもよい。データセグメントX0は、上記開示された自己記述的パケットフォーマット110で記憶されてもよい。パケット110のデータセグメント112は、データセグメントX0を含んでもよく、および永続的メタデータ114は、データセグメントと関連付けられたLID(例えば、LID A)を含んでもよい。記憶クライアント106は、LID Aと関連付けられたデータを修正および/または上書きする動作を要求してもよく、それは、データセグメントX0をデータセグメントX1と置き換えることを含むことができる。記憶層130は、記憶位置191において適切な、既存のデータパケット110を修正するのではなく、記憶媒体144上で異なる記憶位置193においてデータセグメントX1を含む新たなパケット110を付加することによって、この不適切な動作を実行してもよい。記憶動作はさらに、記憶メタデータ135を更新して、LID Aを記憶位置193の記憶アドレスと関連付け、および/または記憶位置191における使用されていない(obsolete)データX0を無効化することを含んでもよい。図1Eに示されるように、記憶メタデータ135を更新することは、フォワードマッピング160のエントリを更新して、LID A 164Eを、修正されたデータセグメントX1の記憶アドレスと関連付けることを含んでもよい。
不適切な記憶動作(例えば、記憶ログにデータを付加すること)を実行することは、記憶媒体140上に残存する使用されていない、または無効なデータ(例えば、消去、修正および/または上書きされた不適切なデータ)をもたらすことがある。図1Eに示されるように、記憶位置191において適切なデータセグメントX0を上書き、および/または置き換えることとは反対に、記憶ログにデータセグメントX1を付加することによってLID Aのデータを修正することは、記憶媒体140上で使用されていないバージョンのデータセグメントX0を維持することになることがある。使用されていないバージョンのデータセグメントX0は、上記開示されるように、データセグメントX0を消去することが、時間を要する動作であり、かつライトアンプリフィケーションをもたらすことがある、記憶区画170A全体を消去すること、および/または記憶区画170A上で有効なデータを移動させることを含むことがあるので、記憶媒体140から即時に削除(例えば、消去)されないことがある。同様に、もはや使用されていない(例えば、削除され、またはトリム(TRIM)動作の影響を受ける)データは、即時に削除されないことがある。このようにして、経時的に、記憶媒体140は、甚大な量の「無効な」データを蓄積することがある。
記憶層130は、記憶メタデータ135の使用によって(例えば、フォワードマッピング160)、記憶位置191におけるデータセグメントX0などの無効なデータを識別してもよい。記憶層130は、フォワードマッピング160において有効な識別子(LID)と関連付けられていない記憶位置が、記憶媒体140上で保持される必要がないデータを含むと判定してもよい。代わりに、または加えて、記憶層130は、削除されており、トリムされており(TRIMed)、使用されておらず、および/または無効なデータを効率的に識別するために、有効性ビットマップおよび/またはリバースマッピングなどの他の記憶メタデータ135を維持してもよい。
記憶層130は、無効なデータによって占有される記憶リソースを再要求(reclaim)するように構成されてもよい。記憶層130はさらに、記憶媒体140に記憶されたデータをリフレッシュすること(データ劣化、書き込み障害、および/もしくは読み出し障害に起因したエラー状態を防止するため)、ならびに/または媒体信頼性状況を監視することなどを含むがそれらに限定されない、他の媒体管理動作を実行するように構成されてもよい。本明細書で使用されるように、記憶区画170A〜Nなどの記憶リソースを再要求することは、新たなデータをそこに記憶/プログラミングすることができるように、記憶区画170A〜Nを消去することを指す。記憶区画170A〜Nを再要求することは、記憶区画170A〜N上の有効なデータを新たな記憶位置に移動することを含んでもよい。記憶層130は、記憶区画170A〜Nにおける無効なデータの量、記憶区画170A〜Nにおける有効なデータの量、摩耗レベル(例えば、プログラム/消去サイクルの数)、および記憶区画170A〜Nがプログラミンングまたはレフレッシュされてからの時間などを含むことができるがそれらに限定されない、1つ以上の因子に基づいて、再要求に対する記憶区画170A〜Nを識別してもよい。
記憶層130は、記憶媒体140上の記憶ログの内容の使用によって、フォワードマッピング160を含む記憶メタデータ135を再構築するように構成されてもよい。図1Eの実施形態では、LID Aと関連付けられた最新のバージョンのデータは、記憶位置191および193のそれぞれにおけるデータパケット110の相対的ログ順序に基づいて判定されてもよい。記憶位置193におけるデータパケットは、記憶ログにおける記憶位置191のデータパケットの後に順序付けされるので、記憶層130は、記憶位置193がLID Aに対応する最新バージョンのデータを含むと判定してもよい。記憶層130は、フォワードマッピング160を再構築して、LID Aを記憶位置193におけるデータパケット(記憶位置191における使用されていないデータではなく)と関連付けてもよい。
図2は、記憶層130を含むシステム200の別の実施形態を示す。記憶媒体140は、その各々が1つ以上の記憶配列115A〜Nを含むことができる、複数の独立したバンク119A〜Nを含んでもよい。各々の独立したバンク119A〜Nは、インターコネクト127を介して記憶コントローラ139に結合されてもよい。
記憶コントローラ139は、バス127を介して記憶層130から記憶要求を受信するように構成された記憶要求受信機モジュール231を含んでもよい。記憶要求受信機231はさらに、記憶層130および/または記憶クライアント106に/からデータを転送するように構成されてもよい。したがって、記憶要求受信機モジュール231は、1つ以上のダイレクトメモリアクセス(DMA)モジュール、リモートDMAモジュール、バスコントローラ、ブリッジ、およびバッファなどを含んでもよい。
記憶コントローラ139は、要求モジュール231を介して受信された要求に応答して、記憶媒体140にデータを記憶するように構成された書き込みモジュール240を含んでもよい。記憶要求は、要求に関連するデータの論理インタフェースを含んでもよく、および/またはそれを参照してもよい。書き込みモジュール240は、自己記述的記憶ログにデータを記憶するように構成されてもよく、それは、上記開示されるように、記憶媒体140の記憶アドレス空間144内で連続してデータパケット110を追加することを含むことができる。データパケット110は、データの論理インタフェースを含んでもよく、および/またはそれを参照してもよい(例えば、データと関連付けられたLIDを含んでもよい)。書き込みモジュール240は、記憶のためにデータを処理するように構成された書き込み処理モジュール242を含んでもよい。記憶のためにデータを処理することは、a)圧縮処理、b)暗号化処理、c)それぞれのデータパケット110(および/または他のコンテナ)へのカプセル化処理、およびd)誤り訂正コード(ECC)処理の実行などのうちの1つ以上を含んでもよい。書き込みバッファ244は、記憶媒体140上での記憶のためにデータをバッファリングするように構成されてもよい。一部の実施形態では、書き込みバッファ244は、記憶コントローラ139のクロック領域を記憶媒体140(および/またはインターコネクト127)のクロック領域と同期するように構成された1つ以上の同期バッファを含んでもよい。
ログ記憶モジュール136は、データ記憶動作に対する記憶位置を選択するように構成されてもよく、ならびにアドレス指定情報および/または制御情報を、独立バンク119A〜Nの記憶配列115A〜Nに提供してもよい。本明細書で開示されるように、ログ記憶モジュール136は、記憶媒体140の記憶アドレス空間144内で、ログフォーマットで連続してデータを付加するように構成されてもよい。
データを書き込む記憶動作は、a)記憶媒体140上で1つ以上のデータパケットを記憶ログに付加すること、およびb)データのLIDを1つ以上のデータパケットの記憶アドレスと関連付けるように記憶メタデータ135を更新することを含んでもよい。一部の実施形態では、記憶メタデータ135は、記憶コントローラ139のメモリリソース上で(例えば、記憶媒体140を含む記憶装置141の専用揮発性メモリリソース上で)維持されてもよい。代わりに、または加えて、記憶メタデータ135の一部は、記憶層130内で(例えば、図1Aのコンピューティングデバイス110の揮発性メモリ112上で)維持されてもよい。一部の実施形態では、記憶メタデータ135は、記憶層130によって揮発性メモリにおいて維持されてもよく、および記憶媒体140に周期的に記憶されてもよい。
記憶コントローラ139はさらに、記憶要求受信機モジュール231を介して受信された要求に応答して、記憶媒体140上で記憶ログからデータを読み出すように構成されたデータ読み出しモジュール241を含んでもよい。要求は、要求されたデータのLIDおよび/または要求されたデータの記憶アドレスなどを含んでもよい。読み出しモジュール241は、a)とりわけ、フォワードマッピング160の使用によって、要求されたデータを含むデータパケット110の記憶アドレスを判定し、b)記憶媒体140上で判定された記憶アドレスからデータパケット110を読み出し、および要求エンティティによって使用するためのデータを処理する、ように構成されてもよい。記憶媒体140から読み出されたデータは、読み出しバッファ245を介して読み出しモジュール241にストリーミングされてもよい。読み出しバッファ245は、上記説明されたように、クロック領域同期のための1つ以上の読み出し同期バッファを含んでもよい。読み出し処理モジュール243は、a)復元処理、b)復号化処理、c)1つ以上のデータパケット110(および/または他のコンテナ)からのデータの抽出、ならびにd)ECC処理の実行、のうちの1つ以上を含むことができるがそれらに限定されない、記憶媒体144から読み出されたデータを処理するように構成されてもよい。
記憶コントローラ139はさらに、特定の独立バンク119A〜Nに/から、データ、ならびに/または書き込みモジュール240および/もしくは読み出しモジュール241のコマンドを選択的にルーティングするように構成されたバンクコントローラ252を含んでもよい。一部の実施形態では、記憶コントローラ139は、独立バンク119A〜Nの間で記憶動作をインタリーブするように構成される。記憶コントローラ139は、例えば、書き込みモジュール240からのデータがバンク119Bの記憶配列115Bにプログラミンングされている間に、バンク119Aの記憶配列115Aから読み出しモジュール241に読み出してもよい。マルチバンク記憶動作のさらなる実施形態は、参照によって権明細書に組み込まれる、David Flynnらによる2006年12月12日に出願された「Apparatus,System,and Method for Managing Commands for Solid−State Storage Using Bank Interleave」と題する米国特許出願第11/952,095号明細書で開示されている。
書き込み処理モジュール242は、データパケット110をECCコードワードにエンコードするように構成されてもよい。本明細書で使用されるように、ECCコードワードは、データ、ならびに対応する誤り検出および/または訂正情報を指す。書き込み処理モジュール242は、任意の適切なECCアルゴリズムを実装し、かつ/あるいはデータセグメント、対応するECCシンドローム、ECCシンボル、ECCチャンク、ならびに/または他の構造化され、もしくは構造化されていないECC情報を含むことができるがそれらに限定されない、任意の適切なタイプのECCコードワードを生成するように構成されてもよい。ECCコードワードは、ブロックECCエンコーディング、畳み込みECCエンコーディング、低密度パリティチェック(LDPC)エンコーディング、Gallagerエンコーディング、リードソロモンエンコーディング、ハミングコード、多次元パリティエンコーディング、サイクリック誤り訂正コード、および/またはBCHコードなどを含むがそれらに限定されない、任意の適切な誤り訂正エンコーディングを含んでもよい。書き込み処理モジュール242は、予め定められたサイズのECCコードワードを生成するように構成されてもよい。したがって、単一のパケットは、複数の異なるECCコードワードにエンコードされてもよく、および/または単一のECCコードワードは、2つ以上のパケットの一部を含んでもよい。代わりに、書き込み処理モジュール242は、任意のサイズのECCコードワードを生成するように構成されてもよい。誤り訂正コード処理のさらなる実施形態は、参照によって本明細書に組み込まれる、Jeremy Fillingimらによる2013年3月14日に出願された「Systems and Methods for Adaptive Error−Correction Coding」と題する米国特許出願第13/830,652号明細書で開示されている。
一部の実施形態では、記憶層130は、高レベルの記憶動作を効率的に実装するために論理アドレス空間132を利用する。記憶層130は、「複製」または「論理複製」動作を実装するように構成されてもよい。本明細書で使用されるように、「複製」または「論理複製」は、記憶層130によって管理されたデータを効率的に複製または再現する動作を指す。複製動作は、「元の」LIDの組と同一のデータに対応する「複製された」LIDの組を生成することを含んでもよい。したがって、複製動作は、2つ(またはそれ以上の)異なる論理インタフェース(例えば、異なるLIDの組)を使用して同一の組の記憶位置を参照することを含んでもよい。したがって、複製動作は、記憶媒体140に記憶された1つ以上のデータパケット110の論理インタフェースを修正してもよい。「論理移動」は、記憶層130によって管理されるデータの論理インタフェースを修正する動作を指してもよい。論理移動動作は、記憶媒体140に記憶されたデータを参照するのに使用されるLIDを変更することを含んでもよい。「結合(merge)」動作は、論理アドレス空間132の異なる部分を結合することを含んでもよい。本明細書でさらに詳細に開示されるように、複製および/または移動動作は、重複排除、スナップショット、論理複製、原子的動作、および/またはトランザクションなどのより高レベルの記憶動作を効率的に実装するために使用されてもよい。複製および他の論理操作の動作のためのシステムおよび方法の実施形態は、参照によってその各々が組み込まれる、David Flynnらによる2012年3月19日に出願された「Logical Interfaces for Contextual Storage」、2011年3月18日に出願された「Virtual Storage Layer Supporting Operations Ordering,a Virtual Address Space,Atomic Operations,and Metadata Discovery」と題する米国仮特許出願第61/637,165号明細書、David Flynnらによる2012年4月17日に出願された「Systems,Methods,and Interfaces for Managing a Logical Address Space」と題する米国仮特許出願第61/625,647号明細書、および2012年4月23日に出願されたDavid Flynnらによる「Systems,Methods,and Interfaces for Managing a Logical Address Space」と題する米国仮特許出願第61/637,165号明細書で開示されている。
図3Aを参照して、記憶層130は、複製動作、移動動作、および結合動作などの、記憶層130によって管理されるデータに関連する論理インタフェース動作を管理するように構成された論理インタフェース管理モジュール334を含んでもよい。LIDを複製することは、とりわけ、LIDの2つ以上の異なる組の使用によってデータが参照されることを可能にするために、記憶媒体140に記憶されたデータの論理インタフェースを修正することを含んでもよい。したがって、複製を生成することは、a)論理アドレス空間132(またはその専用部分)においてLIDの組を割り当てること、およびb)とりわけ、記憶メタデータ135の使用によって、割り当てられたLIDを、LIDの「元の」組と同一の記憶位置と関連付けることを含んでもよい。したがって、複製を生成することは、複製されたLIDの新たな組を記憶位置の特定の組と関連付けるように構成されたフォワードマッピング160に1つ以上のエントリを追加することを含んでもよい。
論理インタフェース管理モジュール334は、複製同期ポリシに従って、複製動作を実装するように構成されてもよい。複製同期ポリシは、複数の複製またはコピーのうちの最初の1つを参照して実行される動作がどのように他の複製またはコピーに反映(propagated to)されるかを判定するために使用されてもよい。例えば、複製は、割り当て動作に関して同期されてもよく、それによって、複製のうちの1つを拡張する要求が、他の複製を拡張することを含むようになる。本明細書で使用されるように、ファイル(または他のデータセグメント)を拡張することは、1つ以上の論理識別子を複製に追加すること、複製および/またはコピーに割り当てられた論理識別子のうちの1つ以上を修正することなど、を含むことができる、ファイルのサイズ、範囲(range)、および/または範囲(extent)を増大させることを指す。複製同期ポリシは、とりわけ、複製が結合および/または組み合わせ(fold)動作(以下でさらに詳細に開示される)で組み合わされるときに、複製の間の差異がどのように管理されるかを判定することができる、結合ポリシを含んでもよい。
図3Aは、記憶層130によって実装される領域複製動作の一実施形態を示す。図3Aの領域複製動作は、記憶クライアント106からの要求に応答して実装されてもよい。一部の実施形態では、記憶層130のインタフェース131は、複製動作を実行するためのインタフェースおよび/またはAPIを提供するように構成されてもよい。代わりに、または加えて、領域複製動作は、原子的動作、トランザクション、スナップショット、論理複製、および/またはファイル管理動作などの、より高レベルの動作の一部として実行されてもよい。
図3Aに示されるように、記憶層130のフォワードマッピング160は、LID1024〜2048を媒体記憶位置3453〜4477に結び付ける(bind)ように構成されたエントリ362を含む。示される実施形態の詳細を曖昧にすることを回避するために、他のエントリが図3Aから省略される。本明細書で開示されるように、エントリ362、およびその結び付けは、論理インタフェース311Aを定義することができ、それを通じて、記憶クライアント106は、対応するデータ(例えば、データセグメント312)を参照し、記憶クライアント106は、LID1024〜2048の使用を通じてデータセグメント312(および/またはその一部)にアクセスおよび/または参照することができる。したがって、LID1024〜2048は、とりわけ、データセグメント312の論理インタフェース311Aを定義する。
本明細書で開示されるように、記憶層130は、記憶媒体140にコンテキストフォーマットでデータを記憶するように構成されてもよい(例えば、パケットフォーマット110)。図3Aの実施形態では、記憶位置3453〜4427におけるデータパケット310は、データセグメント312を含む。データパケット310はさらに、データセグメント312の論理インタフェースを示す永続的メタデータ314(例えば、データセグメント312をLID1024〜2048と関連付ける)を含む。上記開示されるように、記述的(descriptive)な、永続的メタデータと関連してデータを記憶することによって、記憶層130が記憶ログの内容からフォワードマッピング160(および/または他の記憶メタデータ135)を再構築することが可能になる。図3Aの実施形態では、エントリ362は、記憶アドレス3453〜4477に記憶されたデータを、パケット310の永続的メタデータ314によって参照されるLID1024〜2048と関連付けることによって、再構築されてもよい。図3Aは単一のパケット310を示しているが、開示はこの点に限定されない。一部の実施形態では、エントリ362のデータは、各々がそれぞれの永続的メタデータ314を含む複数の、異なるパケット310(例えば、各々の記憶位置に対する別個のパケットなど)に記憶されてもよい。
論理インタフェース管理モジュール334は、とりわけ、複製されることになる元のLIDに対応するLIDの新たな組を割り当て、および新たなLIDを、元の、ソースLIDの記憶位置に結び付けることによって、エントリ362を複製するように構成されてもよい。図3Bに示されるように、LID1024〜2048の複製を生成することは、LID6144〜7168の同様の組を割り当て、および識別子の複製された組を記憶アドレス3453〜4477に結び付ける、論理インタフェース管理モジュール334を含んでもよい。したがって、複製を生成することは、記憶媒体140上で複製および/または再現されることになる内在するデータセグメント312を必要とせずに、LID6144〜7168を含めるためにデータセグメント312のインタフェース311Bを拡張するように記憶メタデータ135を修正することを含んでもよい。
データセグメント312の修正された論理インタフェース311Bは、記憶位置3453〜4477に記憶された対応するデータパケット310のコンテキストフォーマットと一致しないことがある。上記開示されるように、データパケット310の永続的メタデータ314は、LID1024〜2048を参照するが、複製されたLID6144〜7168を含まず、および/またはそれらを参照しない。データセグメント312のコンテキストフォーマットは、修正された論理インタフェース311Bと一致するように更新されてもよく(例えば、データを、LID1024〜2048のみとは反対に、LID1024〜2048および6144〜7168と関連付けるように更新される)、それは、データセグメントをLIDの両方の組に関連付けるパケットフォーマットでデータセグメントを再書き込みすることを含むことができる。記憶装置141が、ランダムアクセス、ライトインプレース(write−in−place)記憶装置である場合、永続的メタデータ314は、適切に更新されてもよい。追記型、非対称記憶媒体140を含む他の実施形態では、そのような適切な更新が非効率であることがある。したがって、記憶層130は、記憶復元および/または移動などの(媒体管理モジュール370による)、媒体管理動作でデータが移動されるまで、一致しないコンテキストフォーマットでデータを維持するように構成されてもよい。データセグメント312のコンテキストフォーマットを更新することは、時間を要する処理であり、および特にデータセグメント312が大きく、および/または複製が大多数のLIDを含む場合に非効率となることがある、記憶媒体140上でデータセグメント312を移動および/または再書き込みすることを含んでもよい。したがって、一部の実施形態では、記憶層130は、複製されたデータセグメント312のコンテキストフォーマットを更新することを延期(defer)してもよく、および/または1つ以上のバックグランド動作でコンテキストフォーマットを更新してもよい。その間に、記憶層130は、一致しないコンテキストフォーマット(データパケット310)で記憶されている間にデータセグメント312へのアクセスを提供するように構成されてもよい。
記憶層130は、対応するデータセグメント312のコンテキストフォーマットが更新される前に、複製動作の完了を確認応答するように構成されてもよい。その後、データは、記憶媒体140上で更新されたコンテキストフォーマットで再書き込み(例えば、移動)されてもよい。更新は、複製動作および/または他のフォアグラウンドの記憶動作の「クリティカルパス」の外で行われてもよい。一部の実施形態では、データセグメント312は、記憶復元処理および/またはデータレフレッシュ動作などのうちの1つ以上の一部として媒体管理モジュール370によって移動される。したがって、記憶クライアント106は、修正された論理インタフェース311Bに従ってデータセグメント312のコンテキストフォーマットが更新されることを待つことなく、修正された論理インタフェース311B(例えば、LID1024〜2048および/または6144〜7168を参照して)を通じてデータセグメント312にアクセスすることが可能であってもよい。
データセグメント312のコンテキストフォーマットが記憶媒体140上で更新されるまで、データセグメント312の修正された論理インタフェース311Bは、記憶メタデータ135(例えば、マッピング160)にのみ存在することがある。したがって、とりわけ、電力故障またはデータ破損に起因してフォワードマッピング160が消失する場合、複製動作は再構築された記憶メタデータ135において反映されないことがある(複製動作は、永続的でなく、および/またはクラッシュセーフでないことがある)。上記示されたように、データパケット310の永続的メタデータ314は、データセグメント312がLID6144〜7168ではなく、1024〜2048のみと関連付けられることを示す。したがって、エントリ362のみが再構築され(図3Aにあるように)、およびエントリ364が省略され、結果として、修正された論理インタフェース311Bを通じて(例えば、6144〜7168を通じて)データセグメント312にアクセスする後続の試みは失敗することがある。
一部の実施形態では、複製動作はさらに、複製動作を永続的および/またはクラッシュセーフにするために、記憶媒体140に永続的記号を記憶することを含んでもよい。本明細書で使用されるように、「永続的記号」は、記憶媒体140に記憶されたメタデータを指す。永続的記号366は、本明細書で開示されるように、ログ順序に対応してもよく、および/またはパケットフォーマットで記憶されてもよい。永続的記号366は、データセグメント312の修正された論理インタフェース311Bのインジケーションを含んでもよい。図3Bの実施形態では、示された複製動作に対応する永続的記号366は、記憶アドレス3453〜4477に記憶されたデータを、LID1024〜2048および6144〜7168の両方の範囲と関連付けるように構成されてもよい。記憶媒体140の内容からのフォワードマッピング160の再構築の間、永続的記号366は、エントリ362および364の両方を再構築してデータセグメント312を、更新された論理インタフェース311Bの両方のLID範囲と関連付けるために使用されてもよい。一部の実施形態では、記憶層130は、記憶メタデータ135を更新し(例えば、エントリ364を生成する)、および記憶媒体140に永続的記号366を記憶したことに応答して、複製動作の完了を確認応答してもよい。永続的記号366は、更新された論理インタフェース311Bと一致することになるデータセグメント312のコンテキストフォーマットを更新したことに応答して(例えば、上記開示されたように、データセグメント312を移動および/または再書き込みする)、記憶媒体140からの削除に対して無効化および/またはマーク付けされてもよい。
一部の実施形態では、データセグメント312の更新されたコンテキストフォーマットは、データセグメント312を、両方のLID範囲1024〜2048および6144〜7168と関連付けることを含んでもよい。図3Cは、データセグメント312に対する更新されたコンテキストフォーマット(データパケット320)の一実施形態を示す。図3Cに示されるように、データパケット320の永続的メタデータ324は、データセグメント312を、更新された論理インタフェース311Bの両方のLID範囲1024〜2048および6144〜7168と関連付ける。データパケット320は、フォワードマッピング160の更新されたエントリ362および364において反映することができる、元のデータパケット310とは異なる記憶アドレス(64432〜65456)において、不適切に書き込まれてもよい。データパケット320を記憶ログに付加したことに応答して、対応する永続的記号366(存在する場合)が無効化されてもよい(記憶媒体140からの後続の削除に対して削除および/またはマーク付けされる)。一部の実施形態では、永続的記号366を削除することは、永続的記号366が記憶媒体140上でもはや保持される必要がないことを示す1つ以上のトリムメッセージを発行することを含んでもよい。代わりに、または加えて、フォワードマッピング160の一部は、永続的、クラッシュセーフな記憶位置(例えば、非一時的記憶リソース103および/または記憶媒体140)に記憶されてもよい。フォワードマッピング160(例えば、エントリ362および364)を持続(persist)させたことに応答して、上記開示されるように、データセグメント312が更新されたコンテキストフォーマットでいまだに再書き込みされていない場合でさえ、永続的記号366が無効化されてもよい。
論理インタフェース管理モジュール334は、「コピーオンライトモード」を含む1つ以上の異なるモードに従って複製動作を実装するように構成されてもよい。図3Dは、コピーオンライトモードにおける複製される範囲内で実行される記憶動作の一実施形態を示す。コピーオンライトモードでは、複製を生成した後に行われる記憶動作によって、複製が相互に分岐することがある(例えば、エントリ362および364が異なる記憶アドレス、範囲(range)および/または範囲(extent)を参照することができる)。図3Dの実施形態では、記憶層130は、データセグメント312を両方のLID範囲1024〜2048および6144〜7168(図3Cに示されるように)と関連付けるように構成された、更新されたコンテキストデータフォーマット(パケット320)でデータセグメント312を書き込んでいる。次いで、記憶クライアント106は、LID6657〜7168に対応するデータを修正および/または上書きする1つ以上の記憶要求を発行してもよい。図3Dの実施形態では、記憶要求は、LID6657〜7168のデータを修正および上書きすることを含む。それに応答して、記憶層130は、記憶媒体130に、新たなデータおよび/または修正されたデータを記憶してもよく、それは、上記開示されたように、記憶ログに新たなデータパケット340を付加することを含むことができる。データパケット340は、データセグメント342をLID6657〜7424に関連付けてもよい(例えば、パケット340の永続的メタデータ344の使用によって)。フォワードマッピング160は、データセグメント342にLID6657〜7424を関連付けるように更新されてもよく、それは、データセグメント312、および記憶アドレス78512〜79024に記憶された新たなデータセグメント342を参照するエントリ367におけるデータの修正されていない部分を参照することを継続するように構成されたエントリ365にエントリ364を分割することを含むことができる。図3Dに示されるコピーオンライトモードでは、LID1024〜2048に対応するエントリ362は、変更されなくてもよく、および記憶アドレス64432〜65456においてデータセグメント312を参照することを継続してもよい。図3Dには示されていないが、範囲1024〜2048内での修正は、エントリ362に影響を与える、同様に分岐する変更(diverging changes)をもたらすことがある。さらに、記憶要求は、データを修正および/または上書きすることに限定されない。他の動作は、LIDの組を拡張すること(データを付加する)、ならびに/またはLIDを削除すること(データを削除、切り捨て、および/もしくは切り取る)などを含んでもよい。
一部の実施形態では、記憶層130は、「同期化複製」モードなどの他の複製モードをサポートすることができる。同期化複製モードでは、LIDの複製された範囲内でなされる変更は、1つ以上の他の、対応する範囲において反映されてもよい。図3Dの実施形態では、「同期化複製」モードにおける説明された記憶動作を実装することは、新たなデータセグメント342を参照するようにエントリ362を更新することを含んでもよく、それは、本明細書で開示されるように、とりわけ、LID1024〜1536を元のデータセグメント312の部分と関連付けるように構成されたエントリにエントリ362を分割すること、およびLID1537〜2048を新たなデータセグメント342と関連付けるように構成されたエントリを追加することを含むことができる。
図3Dのコピーオンライトの実施形態を再度参照して、論理インタフェース管理モジュール334はさらに、複製結合動作を管理するように構成されてもよい。本明細書で使用されるように、「結合」または「複製結合」は、LIDの2つ以上の異なる組および/または範囲を組み合わせる動作を指す。図3Dの実施形態では、領域結合動作は、エントリ362を、対応する複製エントリ365および367と結合することを含んでもよい。論理インタフェース管理モジュール334は、より最新の変更が前の変更に優先する書き込み順序ポリシ、記憶動作の相対的優先度に基づく(例えば、記憶動作と関連付けられた記憶クライアント106、アプリケーション、および/もしくはユーザの特性に基づく)優先度に基づくポリシ、完了インジケータ(例えば、原子的記憶動作の完了、または原子的記憶動作の失敗など)、fadviseパラメータ、ならびに/またはioctrlパラメータなどの、結合ポリシに従って領域結合動作を実装するように構成されてもよい。
図3Eは、領域結合動作の一実施形態を示す。図3Eの領域結合動作は、範囲6144〜6656を範囲1024〜2048に結合することを含んでもよい。したがって、領域結合動作は、結合ポリシに従って、LID範囲6144〜6656内でなされる変更を、LID範囲1024〜2048に選択的に適用することを含んでもよい。したがって、領域結合動作は、LID1537〜2048を、新たな/修正されたデータセグメント342を含む記憶アドレス78512〜79024と関連付けるようにLID範囲1024〜2048を更新することを含んでもよい。更新は、フォワードマッピング160におけるエントリ362を分割することを含んでもよく、エントリ372は、LID1024〜1536を元のデータセグメント312の部分と関連付けるように構成されてもよく、およびエントリ373は、LID1537〜2048を新たなデータセグメント342と関連付けるように構成されてもよい。LID1537〜2048によってもはや参照されないデータセグメント312の部分は、本明細書で開示されるように無効化されてもよい。元の、ソース範囲に結合されたLID範囲6144〜7168は、フォワードマッピング160から割り当て解除および/または削除されてもよい。
図3Eに示される領域結合動作は、データの一部への論理インタフェース311Cを修正することをもたらすことがある。データセグメント342(データパケット340)のコンテキストフォーマットは、データセグメント342を、結合されたLID1537〜2048ではなく、LID6657〜7168と関連付けてもよい。上記開示されるように、記憶層130は、一致しないコンテキストフォーマットで記憶されたデータセグメント342へのアクセスを提供することができる。記憶層130は、データセグメント342が1つ以上のバックグラウンド動作(例えば、記憶復元動作)でLID1537〜2048と関連付けられる、更新されたコンテキストフォーマットでデータセグメント342を記憶するように構成されてもよい。一部の実施形態では、領域結合動作はさらに、データセグメント342を更新された論理インタフェース311Cと関連付けるために(例えば、記憶アドレス78512〜79024におけるデータセグメント342を、LID1537〜2048と関連付ける)、記憶媒体140に永続的記号366を記憶することを含んでもよい。上記開示されるように、永続的記号366は、領域結合動作が永続的であり、およびクラッシュセーフであることを保証するために使用されてもよい。永続的記号366は、論理インタフェース311Cと一致したコンテキストフォーマットでデータセグメント342を移動し(例えば、データセグメント342をLID1537〜2048と関連付ける)、および/またはフォワードマッピング160を持続させるなどに応答して、削除されてもよい。
図3A〜Eと共に開示された複製動作は、領域移動動作などの他の論理動作を実装するために使用されてもよい。図3A〜Cを再度参照すると、フォワードマッピング160のエントリ362を再現する複製動作は、データセグメント312をLID1024〜2048の元の組および複製されたLID6144〜7168(エントリ364の)の新たな組の両方を関連付けるように、データセグメント312と関連付けられた論理インタフェースを修正することを含んでもよい。複製動作はさらに、データセグメント312の更新された論理インタフェース311Bを示す永続的記号366を記憶すること、および/または1つ以上のバックグラウンド記憶動作で、更新された論理インタフェース311Bと関連してデータセグメント312を再書き込みすることを含んでもよい。
論理インタフェース管理モジュール334はさらに、「領域移動」動作を実装するように構成されてもよい。本明細書で使用されるように、「領域移動」動作は、データセグメントをLIDの異なる組と関連付けるように1つ以上のデータセグメントの論理インタフェースを修正することを指す。したがって、領域移動動作は、本明細書で開示されるように、1つ以上のデータセグメントを更新された論理インタフェースと関連付けるように記憶メタデータ135(例えば、フォワードマッピング160)を更新すること、データセグメントの更新された論理インタフェースを示す永続的記号366を記憶媒体140に記憶すること、および更新された論理インタフェースと一致したコンテキストフォーマット(パケットフォーマット310)でデータセグメントを再書き込みすることを含んでもよい。したがって、記憶層130は、同一の機構を使用した領域移動動作、および/または図3A〜Eと共に上記開示された処理ステップを実装してもよい。
図3A〜Eで開示された複製および/または領域移動動作は、記憶層130上で或る制限を課してもよい。上記開示されるように、コンテキストフォーマットにデータを記憶することは、データを参照する各々のLIDとデータを関連付けることを含んでもよい。図3Cの実施形態では、永続的メタデータ324は、両方のLID範囲1024〜2048および6144〜7168への参照を含む。したがって、データセグメントへの参照の数を増加させることは、それに対応してコンテキストデータフォーマットのオーバーヘッドが増加することになり得る(例えば、永続的メタデータ324のサイズが増加する)。一部の実施形態では、永続的メタデータ314のサイズが制限されることがあり、それは、参照、および/または特定のデータセグメント312を参照することができる複製の数を制限することがある。さらに、異なるLIDへの複数の参照を含めることは、記憶復元動作を複雑にすることがある。データセグメント312が移動されるときに更新される必要があるフォワードマッピングエントリの数は、データセグメント312を参照するLIDの数に従って変わることがある。図3Cを再度参照すると、調整(grooming)動作および/または記憶復元動作においてデータセグメント312を移動することは、2つの別個のエントリ362および364を更新することを含んでもよい。N個の異なるLID(例えば、N個の異なる複製)によって参照されるデータセグメントを移動することは、フォワードマッピング160においてN個の異なるエントリを更新することを含んでもよい。同様に、データセグメントを記憶することは、N個のエントリを永続的メタデータ314に書き込むことを含んでもよい。この可変オーバーヘッドは、バックグラウンド記憶復元動作の性能を低下させることがあり、ならびにサポートすることができる同時複製および/または参照の数を制限することがある。
一部の実施形態では、論理インタフェース管理モジュール334は、複製動作によって課されるオーバーヘッドを低減させるための中間マッピング層を含んでもよく、および/またはそれを利用してもよい。中間マッピング層は、効率的な複製動作(本明細書でさらに詳細に開示される他の動作をも)を促進するように構成された「参照エントリ」を含んでもよい。本明細書で使用されるように、「参照エントリ」は、フォワードマッピング160(および/または他の記憶メタデータ135)内で他のエントリを参照するために使用されるマッピングデータ構造のエントリを指す。参照エントリは、それが論理アドレス空間132内で1つ以上の他のエントリによって参照される間にのみ存在してもよい。一部の実施形態では、参照エントリは、記憶クライアント106にアクセス可能でなくてもよく、および/または不変(immutable)であってもよい。記憶層130は、記憶クライアントが、単一の参照エントリインタフェースを介して複数の、異なる論理インタフェースを通じてデータの同一の組を参照することを可能にする参照エントリを利用してもよい。記憶媒体140上のデータ(複数のLIDによって参照されるデータ)のコンテキストフォーマットは、データを参照エントリと関連付け、次いで、参照エントリは、他の永続的メタデータ(例えば、永続的記号366)を通じてN個の他の論理インタフェースと関連付けられるように簡易化されてもよい。したがって、複製データを移動することは、参照エントリとデータセグメントの新たな記憶アドレスとの間の単一のマッピングを更新することを含んでもよい。
図4Aは、効率的なオープンツークローズ一貫性のためのシステム400の別の実施形態のブロック図である。システム400は、中間マッピング層の使用によって領域複製動作を実装するように構成された記憶層130を含む。記憶メタデータ135は、論理アドレス空間132に関連するフォワードマッピング160を含んでもよい。上記開示されたように、フォワードマッピング160(および/または、他の記憶メタデータ135)は、記憶クライアント106による論理アドレス空間の割り当てに関連する情報、およびLIDと記憶アドレス空間144内の記憶アドレスとの間の結び付けに関連する情報などを含んでもよい。
図4Aの実施形態では、論理インタフェース管理モジュール334は、参照マッピング460の使用によって複製動作を管理するように構成された参照モジュール434を含んでもよい。参照マッピング460は、論理アドレス空間132の1つ以上の論理インタフェース(例えば、LIDのうちの1つ以上の組)によって参照されているデータに対応する参照エントリを含んでもよい。参照モジュール434は、有効なデータを参照するのにもはや使用されておらず、および/またはフォワードマッピング160内でエントリによってもはや参照されていない参照エントリを削除するように構成されてもよい。図4Aに示されるように、参照エントリは、フォワードマッピング160とは別個に(例えば、別個の参照マッピング460において)維持されてもよい。参照エントリは、論理アドレス空間132とは別個の名前空間で維持することができる、参照識別子の使用によって識別されてもよい。したがって、参照エントリは、記憶層インタフェース131を通じて記憶クライアント106に直接アクセス可能な論理アドレス空間132とは別個に、かつそれとは異なる中間、「仮想」または「参照」アドレス空間432の一部であってもよい。代わりに、一部の実施形態では、参照エントリは、予め定められた範囲から選択されたLID、および/または記憶クライアント106によって直接アクセス可能でない論理アドレス空間132の部分が割り当てられてもよい。
論理インタフェース管理モジュール334は、フォワードマッピング160における1つ以上のLIDエントリを参照マッピング460における参照エントリとリンクさせることによって、複製動作を実装するように構成されてもよい。参照エントリは、複製されたデータの記憶アドレスに結びつけられてもよい(bound to)。したがって、複製されたデータと関連付けられたLIDは、参照マッピング460(例えば、参照エントリ、次いで記憶アドレスにマッピングすることができるLID)を間接的に通じて内在するデータを参照してもよい。したがって、複製されたデータに対応するフォワードマッピング160におけるエントリは、「間接エントリ」と称されてもよい。本明細書で使用されるように、「間接エントリ」は、参照マッピング460における参照エントリを参照し、および/または参照エントリにリンクされる、フォワードマッピング160におけるエントリを指す。間接エントリは、論理アドレス空間132内でLIDが割り当てられてもよく、および記憶クライアント106にアクセス可能であってもよい。
上記開示されるように、LIDの特定の組を複製した後、記憶クライアント106は、複製を相互に分岐させることがある(複製モードに従って)、複製された範囲のうちの1つ以上の中で記憶動作を実行してもよい。「コピーオンライト」モードでは、特定の複製に対してなされる変更は、他の複製される範囲において反映されないことがある。図4Aの実施形態では、複製に対してなされる変更は、間接エントリと関連付けられた「ローカル」エントリにおいて反映されることがある。本明細書で使用されるように、「ローカルエントリ」は、記憶媒体140の1つ以上の記憶アドレスに直接マッピングされる間接エントリの一部を指す。したがって、ローカルエントリは、特定の複製において変更されたデータ、および/または他の複製の内容とは異なるデータを参照するように構成されてもよい。したがって、ローカルエントリは、特定の複製に一意なデータに対応してもよい。
変換モジュール134は、とりわけ、参照マッピング460および/または参照モジュール434の使用によって、複製されたデータと関連付けられたデータにアクセスするように構成されてもよい。変換モジュール134は、最初にローカルエントリを辿り(traverse)、ターゲットフロント識別子がローカルエントリ内で発見されない場合に、間接エントリがリンクされる参照エントリ内で辿ることを継続することを含むことができる、カスケードルックアップを実装してもよい。
ログ記憶モジュール136および媒体管理モジュール370は、複製されたデータのコンテキストフォーマットを管理するように構成されてもよい。図4Aの実施形態では、複製されたデータ(フォワードマッピング160内で2つ以上のLID範囲によって参照されるデータ)は、データを参照マッピング460の1つ以上の参照エントリと関連付けるコンテキストフォーマットで記憶されてもよい。そのような複製されたデータセグメントで記憶された永続的メタデータは、データセグメントと関連付けられた各々のLIDを識別することとは反対に、単一の参照エントリに対応してもよい。したがって、複製を生成することは、上記開示されたように、とりわけ、媒体管理モジュール370の使用によって、1つ以上のバックグラウンド動作で複製されたデータのコンテキストフォーマットを更新することを含んでもよい。
図4Bは、参照マッピング460を使用した複製動作の一実施形態を示す。状態413Aでは、論理アドレス空間132におけるLID10の範囲2(図4Bで10、2と表される)に対応するエントリは、記憶媒体140上の記憶アドレス20000におけるデータを直接参照してもよい。開示される実施形態の詳細を曖昧にすることを回避するために、他のエントリは図4Bから省略される。状態413Bでは、記憶層130は、範囲10、2を複製する動作を実装する。範囲10、2を複製することは、a)論理アドレス空間においてLIDの新たな範囲(図4Bにおいて400、2と表される)を割り当てること、およびb)それを通じてエントリ10、2および400、2が記憶アドレス20000における複製されたデータを参照することができる参照マッピング460(図4Bにおいて100000、2と表される)において参照エントリを割り当てること、を含んでもよい。複製動作はさらに、状態413Cで示されるように、エントリ10、2および400、2を参照エントリ100000、2と関連付けることを含んでもよい。上記開示されるように、エントリ10、2および400、2を参照エントリ100000、2と関連付けることは、エントリ10、2および400、2が間接エントリであることを示すことを含んでもよい。状態413Cはさらに、参照マッピング460において、記憶アドレス20000におけるデータを参照エントリ100000、2と関連付け、ならびに/またはエントリ10、2および400、2を参照エントリ100000、2と関連付けるために、記憶媒体140に永続的記号366を記憶することを含んでもよい。
記憶層130は、LID10または400のいずれかを通じて(参照エントリ100000、2を通じて)記憶アドレス20000におけるデータセグメントへのアクセスを提供してもよい。LID10または400に関連する要求に応答して、変換モジュール134は、フォワードマッピング160における対応するエントリが、参照マッピング460におけるエントリと関連付けられた間接エントリであると判定してもよい。これに応答して、参照モジュール434は、フォワードマッピング160内のローカルエントリ(存在する場合)、および参照マッピング460における対応する参照エントリ(例えば、参照エントリ100000、2)の使用によって、記憶アドレスを判定するためにカスケードを実行する。
ステップ413Cにおいて複製を生成することは、データを両方のLID範囲10、2および400、2を関連付けるように、ステップ20000において記憶されたデータセグメントの論理インタフェースを修正することを含んでもよい。しかしながら、データのコンテキストフォーマットは、単に、データをLID10、2と関連付けてもよい。上記開示されるように、複製を生成することはさらに、参照エントリ100000、2を通じてデータセグメントをLID10、2および400、2と関連付けるために、記憶媒体140に永続的記号366を記憶することを含んでもよい。データセグメントは、媒体管理モジュール370によって実行される1つ以上のバックグラウンド動作において、更新されたコンテキストフォーマットで再書き込みされてもよい。データは、別個のLID範囲10、2および400、2とは反対に、データセグメントを参照エントリ100000、2と関連付ける永続的メタデータ314と共に記憶されてもよい。したがって、データセグメントを移動することは(状態413Dに示されるように)、データを参照する各々のLID範囲に対応する複数のエントリ(例えば、複数のエントリ10、2および400、2)とは反対に、参照マッピング460において単一のエントリを更新することのみを必要とすることがある。さらに、フォワードマッピング160における任意の数のLID範囲は、記憶媒体140上でデータと関連付けられた永続的メタデータ314のサイズを増大させることなく、および/または媒体管理モジュール370の動作を複雑にすることなく、データセグメントを参照してもよい。
図4Cは、参照エントリを使用して実装される複製動作の別の実施形態を示す。LID1024〜2048および/またはデータセグメント312の複製を生成する要求に応答して、論理インタフェース管理モジュール334は、データセグメント312を表すように参照マッピング460において参照エントリ482を割り当てるように構成されてもよい。フォワードマッピング160における任意の数のLIDは、データセグメント312と関連付けられた永続的メタデータのオーバーヘッドを増大させることなく、および/または媒体管理モジュール370の動作を複雑にすることなく、参照エントリ482を通じてデータを参照してもよい。図4Cに示されるように、参照エントリ482は、データセグメント312の記憶アドレス(記憶アドレス64432〜65456)に結び付けられてもよい。フォワードマッピング160におけるエントリ462および472は、参照エントリ482を間接的に通じて記憶アドレスを参照してもよい(例えば、図4Cに示されるように、参照エントリ482にリンクされてもよい)。
図4Cの実施形態では、参照エントリ482は、識別子0Z〜1024Zが割り当てられる。参照エントリ482の識別子は、論理アドレス空間132の特定の部分に対応してもよく、または異なる、別個の名前空間に対応してもよい。記憶層130は、とりわけ、エントリ462および/または472と関連付けられたメタデータの使用によって、エントリ462および472を参照エントリ482にリンクしてもよい。代わりに、または加えて、間接エントリ462および/または472は、記憶アドレスメタデータを参照エントリ482への参照および/またはリンクに置き換えてもよい。参照エントリ482は、記憶層130を介して記憶クライアント106によって直接アクセス可能でなくてもよい。
複製動作はさらに、データセグメント312の論理インタフェース311Dを修正することを含んでもよく、修正された論理インタフェース311Dによって、間接エントリ462のLID1024〜2048および/または間接エントリ472のLID6144〜7168を通じてデータセグメント312が参照されることが可能になる。参照エントリ482は記憶クライアント106にアクセス可能でなくてもよいが、参照エントリ482は、変換モジュール134によって(間接エントリ462および472を通じて)データにアクセスするために使用されてもよく、ならびに、それ自体がデータセグメント312の修正された論理インタフェース311Bの一部と見なされてもよい。
複製動作はさらに、記憶媒体140に永続的記号366Aを記憶することを含んでもよい。上記開示されるように、永続的記号366Aおよび/または366Bの記憶は、複製動作が永続的であり、かつクラッシュセーフであることを保証することができる。永続的記号366Aは、データセグメント312と関連付けられた参照エントリ482を識別するように構成されてもよい。したがって、永続的記号366Aは、記憶アドレス64432〜65456を、参照エントリ識別子0Z〜1024Zと関連付けることができる。複製動作はさらに、エントリ462および/または472のLIDを参照エントリ482と関連付けるように構成された別の永続的記号366Bを記憶することを含んでもよい。代わりに、エントリ462、472、および482の間の関連付けに関連するメタデータは、単一の永続的記号に含まれてもよい。永続的記号366Aおよび/または366Bは、データセグメント312が更新されたコンテキストフォーマットで移動され、ならびに/またはフォワードマッピング160(および/もしくは参照マッピング460)が持続するまで、記憶媒体140上で保持されてもよい。
データセグメント312の修正された論理インタフェース311Dは、元のデータパケット410Aのコンテキストフォーマットと一致しないことがあり、永続的メタデータ314Aは、参照エントリ482および/または複製されたエントリ472ではなく、LID1024〜2048を参照することがある。記憶層130は、修正された論理インタフェース311Dと一致した、更新されたコンテキストフォーマット(パケット410B)でデータセグメント312を記憶するように構成されてもよく、永続的メタデータ314Bは、各々の複製された範囲内でLIDを別個に識別することとは反対に(例えば、エントリ462および472)、データセグメント312を参照エントリ482と関連付けてもよい。したがって、間接エントリ482の使用によって、データセグメント312の論理インタフェース311Dが、永続的メタデータ314A〜Bのサイズ制限とは独立した、任意の数のLIDを含むことが可能になる。さらに、参照エントリ482の追加的な複製は、データセグメント312のコンテキストフォーマットを更新することなくなされてもよく、そのような更新は、新たなLID範囲をフォワードマッピング160における参照エントリ482と関連付けることによって、および/またはとりわけ、永続的記号366の使用によってなされてもよい。
上記開示されるように、間接エントリ462および/または472は、参照エントリ482を通じてデータセグメント312を最初に参照してもよい。複製動作に続いて実行される記憶動作は、フォワードマッピング160内でローカルエントリの使用によって反映されてもよい。複製動作の完了の後、記憶層130は、複製されたLIDの1つ以上と関連付けられたデータを修正してもよい。図4Dの実施形態では、記憶クライアント106は、間接エントリ462のLID1024〜1052に対応するデータを修正および/または上書きしてもよく、それは、記憶ログ(記憶アドレス7823〜7851におけるデータパケット420の)に新たなデータセグメント412を付加することを含むことができる。
データセグメント412は、データセグメント412をLID1024〜1052と関連付けるように構成された永続的メタデータ414Aを含むコンテキストフォーマット(データパケット420)で記憶されてもよい。記憶層130は、データセグメント412をローカルエントリ465におけるLID1024〜1052と関連付けるように構成されてもよい。ローカルエントリ465は、間接エントリ462および/または参照エントリ482を通じてデータを参照することとは反対に、更新されたデータを直接参照してもよい。
データ1024〜1052(またはそのサブセット)に関連する要求に応答して、論理インタフェース管理モジュール334は、参照エントリがその後に続くローカルエントリ(存在する場合)への参照を検索することを含むことができる、カスケードルックアップ動作において要求されるLIDへの参照を検索してもよい。図4Dの実施形態では、ローカルエントリ465は、参照エントリ462ごとのLID範囲64432〜64460ではなく、LID範囲1024〜1052(記憶アドレス7823〜7851)に関連する要求を満たすために使用されてもよい。ローカルエントリにおいて発見されないLID(例えば、LID1053〜2048)に対する要求は、参照エントリ482を通じてサービスされることを継続してもよい。したがって、範囲1024〜2048に関連するデータの論理インタフェース311Eは、1つ以上のローカルエントリ465、1つ以上の間接エントリ462、および/または1つ以上の参照エントリ482を含んでもよい。
図4Eに示されるさらなる実施形態では、記憶層130は、論理インタフェース311EのLID(例えば、LID6144〜6162)のうちの別の1つを通じて複製のデータを修正してもよく、示される実施形態の詳細を曖昧にすることを回避するために、論理インタフェースの区切り文字は図4Eには示されない。修正されたデータは、上記開示されたように、ローカルエントリ475を使用して参照されてもよい。図4Eの実施形態では、範囲462および472の各々は、参照エントリ482の識別子0Z〜52Zを通じて前に参照された、その自身の、それぞれのローカルなバージョンのデータを有する。このようにして、エントリ462および472のいずれかもが、範囲0Z〜52Zへの参照を含まない。参照モジュール434は、対応するデータ(および参照識別子)がもはや参照されないと判定してもよく、および、それ自体が記憶媒体140から削除されるために(例えば、無効化される)マーク付けされてもよい。図4Eに示されるように、データを無効化することは、とりわけ、範囲0Z〜52Zを削除するように参照エントリ482を修正することによって、参照マッピング460からデータへの参照を削除することを含んでもよい。データを無効化することはさらに、リバースマッピング、および/または有効性ビットマップなどの、他の記憶メタデータ135を更新すること(例えば、記憶アドレス64432〜64484に記憶されたデータが保持される必要がないことを示すために)を含んでもよい。上記開示されたように、参照エントリ482を削除することができ、それによって参照されるデータを無効化することができる、参照エントリ482の任意の部分を参照しないポイントまで、エントリ462および472の範囲が分岐し続けてもよい。
図4Dおよび4Eは、対応する間接エントリ462および472との重複するLID範囲を含むローカルエントリ465および475を示しているが、開示はこの点に限定されない。一部の実施形態では、図4Dの記憶動作は、ローカルエントリ465を生成し、およびLID1053〜2048のみを参照するように間接エントリ462を修正することによって反映されてもよい。同様に、図4Eの動作は、ローカルエントリ475を生成すること、および切り捨てられた(truncated)LID範囲6163〜7168を参照するように間接エントリ472を修正することを含んでもよい。
図4Aを再度参照すると、参照モジュール434は、参照マッピング460を管理または「調整する(groom)」ように構成されてもよい。一部の実施形態では、参照マッピング460における各々のエントリは、参照カウントを含むメタデータを含む。参照カウントは、参照エントリへの新たな参照またはリンクが追加されるときにインクリメントされてもよく、およびエントリへの参照を削除したことに応答してデクリメントされてもよい。一部の実施形態では、参照カウントは、参照マッピング460において参照識別子ごとに維持されてもよい。代わりに、参照カウントは、参照エントリ全体に対して維持されてもよい。参照エントリの参照カウントが0に到達するとき、参照エントリ(および/または、その一部)は、参照マッピング460から削除されてもよい。参照エントリ((および/または、参照エントリの一部)を削除することは、本明細書で開示されるように、記憶媒体140上で対応するデータを無効化することを含んでもよい(データがもはや保持される必要がないことを示す)。
別の実施形態では、参照モジュール434は、「マークアンドスイープ(mark−and−sweep)」アプローチを使用して参照エントリを削除してもよい。参照モジュール434(または、変換モジュール134などの他のプロセス)は、とりわけフォワードマッピング160における間接エントリ(または、他のタイプのエントリ)から参照エントリへのリンクに従う(follow)ことによって、参照マッピング460におけるエントリへの参照を周期的に検査してもよい。マークアンドスイープの間にアクセスされない参照エントリは、上記開示されたように削除されてもよい。マークアンドスイープは、バックグラウンドプロセスとして動作してもよく、ならびにもはや使用されていない参照エントリを識別および削除するためにマークアンドスイープ動作を周期的に実行してもよい。
一部の実施形態では、本明細書で開示される参照マッピング460は、オンデマンドで(例えば、複製の生成、または他の間接的データ参照に応答して)生成されてもよい。他の実施形態では、全てのデータ記憶動作は、中間マッピングを通じて実行されてもよい。そのような実施形態では、記憶クライアント106は、論理アドレス空間132などの、中間マッピング層を通じて記憶アドレスにリンクされ、および/または参照することができる、仮想アドレス空間(VAS)の間接的、仮想識別子(VID)を割り当ててもよい。VASは、記憶クライアント106と記憶媒体140との間で中間マッピング層を追加してもよい。記憶クライアント106は、論理アドレス空間132の論理識別子とマッピングし、次いでそれぞれの記憶装置141および/または記憶媒体140上の記憶アドレスと関連付けられる、仮想化アドレス空間のVIDを使用してデータを参照してもよい。本明細書で使用されるように、VASは、論理ユニット番号(LUN)アドレス空間、および/または仮想LUN(vLUN)アドレス空間などを含んでもよいが、それらに限定されない。
図5Aは、とりわけ、仮想化アドレス空間532を使用して効率的な領域複製動作を実装するように構成された間接参照層530の一実施形態を示す。間接参照層530は、インタフェース531を通じてVAS532を記憶クライアント106に提示するように構成されてもよい。本明細書で開示されたインタフェース131と同様に、インタフェース531は、ブロックデバイスインタフェース、仮想記憶インタフェース、および/またはキャッシュインタフェースなどのうちの1つ以上を含んでもよい。記憶クライアント106は、インタフェース531を通じたVAS532のVIDへの参照によって、間接参照層530によって管理される記憶リソースに関連する記憶動作を実行してもよい。
間接参照層530はさらに、1つ以上の中間記憶層(例えば、記憶層130)を通じてVIDを記憶リソースにマッピングするように構成されたVAS変換モジュール534を含んでもよい。したがって、間接参照層530のVASメタデータ535は、VAS532のVIDとVAS532のLIDとの間のany−to−anyマッピングを含むVASフォワードマッピング560を含んでもよい。図5Aには示されていないが、VAS変換モジュール534および/またはVASフォワードマッピング560は、複数の異なる記憶層130の複数の論理アドレス空間132を集約するように構成されてもよい。したがって、一部の実施形態では、VAS532は、各々がLIDの別個の組を含み、ならびに各々がそれぞれの記憶層130、記憶装置141、および/または記憶媒体140に対応する、複数の異なる論理アドレス空間に対応してもよい。
図5Aは間接参照層530を記憶層130とは別個に示しているが、開示はこの点に限定されない。一部の実施形態では、VAS532、VASフォワードマッピング560、VAS変換モジュール534、および/または間接参照層530の他のモジュールは、記憶層130の一部として実装されてもよい。
間接参照層530は、とりわけ、効率的な領域複製、移動、結合、および/または他の高レベル動作を実装するために、VAS532によって提供される中間仮想アドレス空間を利用するように構成されてもよい。代わりに、または加えて、中間マッピング層は、ハードディスクおよび/またはその他などの、ランダムアクセス、ライトインプレース記憶装置上での効率的な複製動作を可能にするために利用されてもよい。
記憶クライアント106は、VAS532のVIDを参照して記憶動作を実行してもよい。したがって、記憶動作は、2つの(またはそれ以上の)変換層(translation layers)を含んでもよい。VASフォワードマッピング560は、VAS532のVIDと記憶層130の論理アドレス空間132の識別子との間の第1の変換層を含んでもよい。記憶層130のフォワードマッピング160は、LIDと記憶媒体140上での記憶アドレスとの間の第2の変換層を実装してもよい。
間接参照層530は、とりわけ、VASメタデータ535、VASフォワードマッピング560、および/またはVAS変換モジュール534の使用によって、VAS532内での割り当てを管理するように構成されてもよい。一部の実施形態では、VAS532においてVIDを割り当てることは、論理アドレス空間132において1つ以上の対応するLID(および/または、1つ以上の他の記憶層の識別子)を割り当てることを含んでもよい。したがって、VAS532において割り当てられた各々のVIDは、論理アドレス空間132の1つ以上のLIDに対応してもよい。間接参照層530および論理アドレス空間132のVIDの間のany−to−anyマッピングは、本明細書で開示されるように、まばら(sparse)であってもよく、および/またはany−to−anyであってもよい。さらに、一部の実施形態では、間接参照層530は、VIDと複数の異なる論理アドレス空間132との間のany−to−anyおよび/または範囲管理マッピング(range managed mapping)を維持するように構成されてもよい。したがって、間接参照層530は、異なるそれぞれの記憶層130によって管理される複数の異なる記憶装置141の論理アドレス空間を、単一の、集約VAS532に集約および/または結合してもよい。
図5Aの実施形態では、論理アドレス空間132は、直接アクセス可能でなくてもよく、このようにして、記憶クライアント106は、インタフェース531を通じてVIDを使用して記憶リソースを参照することができる。したがって、1つ以上のVIDを参照して、間接参照層530を通じて記憶動作を実行することは、a)VIDに対応する記憶層130を識別すること、b)VAS変換モジュール534および/またはVASフォワードマッピング560の使用によってVIDにマッピングされる記憶層130のLIDを判定すること、ならびにc)判定されたLIDを参照して記憶層130の使用によって記憶動作を実装すること、を含んでもよい。
図5Bは、間接参照層530の使用によって実装される複製動作の一実施形態を示す。上記開示されるように、VASフォワードマッピング560は、記憶層130の論理アドレス空間132を通じて記憶アドレスに間接的にマッピングされるVAS532に対応してもよい。図5Bは、間接参照層530を通じて記憶動作を実装するために使用されるアドレス指定層を示す。VAS532のVIDは、とりわけ、間接参照層530のインタフェース531を通じて記憶クライアント106にアクセス可能なトップレベルのアドレス指定層を含んでもよい。記憶層130の論理アドレス空間132は、中間アドレス指定層を含んでもよい。VASフォワードマッピング560は、VIDとLIDとの間のany−to−anyマッピングを含んでもよい。LIDは、フォワードマッピング160の使用によって、記憶アドレス空間144内で記憶アドレスにマッピングされてもよい。したがって、VIDは、記憶層130の中間論理アドレス空間を通じて記憶アドレス空間144にマッピングされてもよい。
図5Bに示されるように、状態563Aでは、VASフォワードマッピング560は、VAS532において2つのVID(10および11)を表すエントリ10、2を含んでもよい。VASフォワードマッピング560は、VIDエントリ10、2を論理アドレス空間132のLIDと関連付ける。図5Bの実施形態では、VASフォワードマッピング560は、VIDエントリ10、2をLID100000および100001(エントリ100000、2)に結び付ける。エントリ10、2は、VIDを参照して記憶動作を実行することができる特定の記憶クライアント106に割り当てられてもよい。状態563Aでは、記憶層130は、エントリ100000、2を記憶媒体140(記憶アドレス20000)上の1つ以上の記憶アドレスとマッピングするように構成されてもよい。
状態536Bでは、間接参照層530は、VIDエントリ10、2を複製する複製動作を実装してもよい。複製動作は、a)新たなVIDエントリ400、2を割り当てること、およびb)新たなVIDエントリ400、2をVASフォワードマッピング560における対応するエントリ100000、2と関連付けることを含んでもよい。フォワードマッピング160における対応するエントリ100000、2は、変更されないままであってもよい。代わりに、フォワードマッピング160におけるエントリ100000、2の参照カウント(または他のインジケータ)は、エントリが複数のVID範囲によって参照されていることを示すように更新されてもよい。記憶アドレス20000に記憶されたデータのコンテキストフォーマットは、変更されないままであってもよい(例えば、データを論理インタフェース100000、2と関連付けることを継続する)。複製動作はさらに、フォワードマッピング160におけるVIDエントリ400、2とエントリ100000、2との間の関連付けを示すために、記憶媒体140に永続的記号366を記憶することを含んでもよい。代わりに、または加えて、VASフォワードマッピング560(および/または、その一部)を持続させることによって、複製動作を永続的および/またはクラッシュセーフとすることができる。
状態536Cでは、記憶アドレス20000におけるデータは、記憶アドレス40000に移動されてもよい。移動は、標準的な記憶媒体維持動作で、かつ複製されたデータのコンテキストフォーマットを更新しないように行われてもよい。データを移動することは、フォワードマッピング160において単一のエントリを更新することを含んでもよい。VASフォワードマッピング560は変更されないままであってもよい。異なるバージョンのVID範囲10、2および400、2への修正は、中間、論理アドレス空間を通じて管理されてもよい。VID10への修正は、a)論理アドレス空間132において新たなLIDを割り当てること、b)新たなLIDと関連して修正されたデータを記憶すること、およびc)新たなLIDをVASフォワードマッピング560におけるVID10にマッピングすること、を含んでもよい。
本明細書で開示される領域複製、移動、および/または結合動作を実装する実施形態は、スナップショット、重複排除、原子的動作、トランザクション、および/またはファイル−システム管理機能などの、他の、より高レベルの記憶動作を効率的に実装するために使用されてもよい。図4Aを再度参照すると、記憶層130は、記憶媒体140上で重複データを識別するように構成された重複排除モジュール374を含んでもよい。重複データは、任意の適切な機構を使用して識別されてもよい。一部の実施形態では、重複データは、a)記憶媒体140の中身をスキャニングし、b)種々のデータセグメントに対するシグニチャ値を生成し、およびc)データシグニチャ値を比較して重複データを識別する、ことによって識別される。シグニチャ値は、暗号化シグニチャ、ハッシュコード、および/またはサイクリックコードなどを含んでもよいが、それらに限定されない。シグニチャ情報は、フォワードマッピング160などの記憶メタデータ135(例えば、エントリと関連付けられたメタデータ)内に記憶されてもよく、ならびに/または記憶メタデータ135の1つ以上の別個のデータ構造において維持および/もしくはインデックス付けされてもよい。重複排除モジュール374は、データシグニチャを比較してもよく、およびシグニチャマッチを検出すると、1つ以上の重複排除動作を実行してもよい。重複排除動作は、シグニチャマッチを検証すること(バイトごとのデータ比較を実行すること)、および2つ以上のLID範囲を通じて重複データを参照する1つ以上の領域複製動作を実行することを含んでもよい。
図6は、重複排除動作の一実施形態を示す。フォワードマッピング160は、異なるそれぞれの記憶アドレス3453〜4477および7024〜8048に記憶された重複データを参照することができる、エントリ662および672を含んでもよい。エントリ662および672は、LID1024〜2048および6144〜6656にそれぞれ対応する、異なる、それぞれの論理インタフェース663および673に対応してもよい。重複データセグメント(データセグメント612)は、上記開示されたように、重複排除モジュール374によって識別および/または検証されてもよい。代わりに、重複データは、データが記憶層130における記憶のために受信されるときに識別されてもよい。したがって、データは、データの追加的な複製が記憶媒体140に記憶される前に、重複排除されてもよい。
エントリ662および672が重複データを参照することを識別および/または検証したことに応答して、記憶層130は、データを重複排除するように構成されてもよく、それは、LIDの2つの異なる組を通じて重複データの単一の複製を参照するために1つ以上の領域複製を生成することを含むことができる。上記開示されたように、領域複製を生成することは、データセグメントの論理インタフェース663および673を修正することを含んでもよい。図6の実施形態では、重複データは、記憶位置3453〜4477および7024〜8048それぞれにおけるパケット610内のデータセグメント612として記憶される。複製動作は、データセグメント(または、新たなバージョンのデータセグメントのおよび/もしくはデータセグメントの新たな複製)のうちの1つの論理インタフェースを修正し、それによって、エントリ663および673の両方によってデータセグメントを参照することができることを含んでもよい。
領域複製動作は、図3A〜Eの領域複製の実施形態、図4A〜Eの参照エントリの実施形態、および/または図5A〜Bの中間マッピングの実施形態を含む、本明細書で開示される複製の実施形態のいずれかを使用して実装されてもよい。図6の重複排除の実施形態では、両方のLID範囲1024〜2048および6144〜7168は、参照エントリ682を通じてデータセグメント612の単一のバージョンを参照するように修正されてもよい(他のデータセグメントは無効化されてもよい)。このようにして、重複排除動作は、重複排除データセグメント612を表す(パケット610を参照する)参照エントリ682を生成することを含んでもよい。重複排除動作はさらに、上記開示されたように、参照エントリ682を通じてデータセグメント612にマッピングすることができる、それぞれの間接エントリ665および675にエントリ662および672を修正および/または変換することを含んでもよい。重複排除動作はさらに、データセグメント612を、LID1024〜2048および6144〜7168(参照エントリ682と共に)の両方の組と関連付けるようにデータセグメント612の論理インタフェース669を修正することを含んでもよい。重複排除動作はさらに、上記開示されたように、記憶媒体140に永続的記号366を記憶することを含んでもよい。
重複排除動作はさらに、上記開示されたように、修正された論理インタフェース669と一致することになるデータセグメント612のコンテキストフォーマットを更新することを含んでもよい。コンテキストフォーマットを更新することは、1つ以上のバックグラウンド動作において、記憶ログに(例えば、記憶位置84432〜85456における)更新されたコンテキストフォーマット(データパケット610)でデータセグメント612を付加することを含んでもよい。更新されたデータパケット610は、データセグメント612を更新された論理インタフェース669(例えば、参照識別子0Z〜1023Zを通じたLID1024〜2048および6144〜6656)と関連付ける永続的メタデータ614を含んでもよい。
図6はLIDの単一のエントリまたは範囲を複製および/または重複排除することを示しているが、開示はこの点に限定されない。一部の実施形態では、複数の前部の識別子範囲は、単一の複製動作で複製されてもよい。このタイプの複製動作は、アドレス範囲の「スナップショット」(または論理アドレス空間132全体)を生成するために使用されてもよい。本明細書で使用されるように、スナップショットは、特定の時点における記憶装置(またはLIDの組)の状態を指す。スナップショットは、スナップショット動作を完了した後の範囲内で行われる変更に関わらず、LID範囲の「元の」状態を維持することができる。
図7は、スナップショット動作を効率的に実装するように構成された記憶層130を含むシステム700の一実施形態を示すブロック図である。図7の実施形態は、論理アドレス空間132内のアドレス範囲に関連する。開示はこの点に限定されないが、しかしながら、上記開示されたように、VAS532内の範囲(range)および/または範囲(extent)などの、他のタイプのアドレス範囲で使用するように適合されてもよい。記憶層130は、本明細書で開示されるスナップショット動作を実装するように構成されたスナップショットモジュール736およびタイミングモジュール738を含んでもよい。
状態773Aでは、記憶層130は、LID範囲FR1のスナップショットを生成するように構成されてもよい。スナップショットを生成することは、特定の時にLID範囲FR1の状態を保存することを含んでもよい。スナップショット動作はさらに、後続の記憶動作がLID範囲内で実行されることを可能にすると共に、LID範囲FR1を保存することを含んでもよい。
上記開示されるように、記憶層130は、とりわけ、ログ記憶モジュール136の使用によって、記憶媒体140上で記憶ログにデータを記憶するように構成されてもよい。記憶動作のログ順序は、記憶区画170A〜N上のシーケンスインジケータ113および/または記憶媒体144の記憶アドレス空間144内の連続した記憶位置(図1Dおよび1Eと共に開示されるような)などの、データパケットと関連付けられたシーケンス情報を使用して判定されてもよい。
記憶層130はさらに、ログにおけるデータの相対的時間順序付けなどの、他のタイプの順序付けおよび/またはタイミング情報を維持するように構成されてもよい。しかしながら、一部の実施形態では、データのログ順序は、とりわけ、データが媒体管理動作において記憶装置内で移動されることに起因して、タイミング情報を正確に反映しないことがある。データを移動することは、記憶媒体140上のその元の記憶位置からデータを読み出すこと、および記憶ログ内の最新の付加ポイントにおいてデータを付加することを含んでもよい。このようにして、古い、移動されたデータは、より新しい最新のデータと共に記憶ログに記憶されてもよい。したがって、記憶ログは特定のLIDに関連するデータ動作の相対的ログ順序を保存することができるが、記憶ログは絶対的タイミング情報を正確に反映しないことがある。
一部の実施形態では、ログ記憶モジュール136は、記憶媒体130上で実行される記憶動作の相対的タイミング情報を確立するために使用することができる、タイミング情報にデータを関連付けるように構成される。一部の実施形態では、タイミング情報は、記憶媒体140に記憶された各々のデータパケットに適用することができる、それぞれのタイムスタンプ(タイミングモジュール738によって維持される)を含んでもよい。タイムスタンプは、データパケット310の永続的メタデータ314内に記憶されてもよい。代わりに、または加えて、タイミングモジュール738は、より荒いレベルの粒度でタイミング情報を追跡するように構成されてもよい。一部の実施形態では、タイミングモジュール738は、1つ以上のグローバルタイミングインジケータ(時点識別子(epoch identifier))を維持する。本明細書で使用されるように、「時点識別子」は、記憶層130を通じて実行される記憶動作の相対的タイミングを判定するために使用される識別子を指す。ログ記憶モジュール136は、データパケット710に時点インジケータ739を含めるように構成されてもよい。時点インジケータ739は、タイミングモジュール738によって維持される最新の時点(例えば、グローバルタイミングインジケータ)に対応してもよい。時点インジケータ739は、対応するデータセグメント712が記憶ログに書き込まれた時点(epoch)に対応してもよい。時点インジケータ739はパケット710の永続的メタデータ714内に記憶されてもよく、および、それ自体が移動動作の間にデータパケット710と関連付けられたままであってもよい。タイミングモジュール738は、新たなスナップショットの生成、および/またはユーザ要求などの、或るイベントに応答してグローバル時点識別子をインクリメントするように構成されてもよい。データセグメント712の時点インジケータ739は、移動および/または他の媒体維持動作を通じて変更されないままであってもよい。したがって、時点インジケータ739は、記憶ログにおけるデータパケット710の相対的位置とは独立して、データセグメント712の元の記憶時間に対応してもよい。
スナップショット動作は、特定の時間における特定のLID範囲(FR1)の状態を保存することを含んでもよい。したがって、スナップショット動作は、記憶媒体140にFR1に関連するデータを保存することを含んでもよい。データを保存することは、a)特定の時間枠(時点)に関するデータを識別すること、およびb)記憶媒体140に識別されたデータを保存すること(例えば、識別されたデータが、とりわけ、記憶復元動作において記憶媒体140から削除されることを防止すること)を含んでもよい。スナップショットに関連するデータは、後続の記憶動作(例えば、データ上書き、修正、トリム、および/または取り除く(obviate)動作)によって無効化されるかに関わらず保持されてもよい。特定のスナップショットに対して保存される必要があるデータは、上記開示された時点インジケータ739の使用によって識別されてもよい。
状態773A(時点インジケータe0によって表される時間t1)では、記憶層130は、スナップショット動作を実装する要求を受信してもよい。要求に応答して、スナップショットモジュール736は、タイミングモジュール738によって維持される時点識別子の最新値を判定してもよい。時点識別子の最新値は、最新「スナップショット時点」と称されてもよい。図7の実施形態では、スナップショット時点は0である。スナップショットモジュール736はさらに、タイミングモジュール738が最新の、グローバル時点インジケータをインクリメントさせるように構成されてもよい(例えば、時点識別子を1にインクリメントする)。スナップショットを生成することはさらに、最新の、更新された時点インジケータを示すように構成された永続的記号366を記憶媒体に記憶することを含んでもよい。永続的記号366はさらに、スナップショット時点に関連するデータが保存されることになることを示すように構成されてもよい(例えば、スナップショット動作において保存されることになるLID FR1の特定の範囲を識別する)。永続的記号366は、メタデータ再構築動作の間に、a)最新時点識別子を判定し、ならびに/またはb)特定のスナップショット時点(例えば、時点e0)と関連付けられたデータを保存するようにスナップショットモジュール736および/もしくは媒体管理モジュール370を構成するために使用されてもよい。
スナップショットモジュール736はさらに、スナップショット時点と関連付けられたデータを保存するよう媒体管理モジュール370を指示するように構成されてもよい。これに応答して、媒体管理モジュール370は、a)スナップショット(スナップショットデータ)を保存するためにデータを識別し、およびb)とりわけ、記憶復元動作において、識別されたデータが記憶媒体140から削除されることを防止するように構成されてもよい。媒体管理モジュール370は、データパケット710の時点インジケータ739の使用によって、スナップショットデータを識別してもよい。図1Eと共に開示されるように、データは、記憶媒体140に不適切に書き込まれてもよい。特定のLIDと関連付けられた最新バージョンのデータは、ログ内の対応するデータパケット710の順序に基づいて判定されてもよい。媒体管理モジュール370は、スナップショット時点内の最新バージョンのデータを、保存される必要があるデータとして識別するように構成されてもよい。スナップショット時点において他のデータによって使用されていない、レンダリングされたデータが削除されてもよい。図1Eの実施形態を参照して、データX0およびX1(同一のLID Aと関連付けられた)の両方がスナップショット時点0でマーク付けされていた場合、媒体管理モジュール370は、時点0における最新バージョンのデータをX1として識別し、およびデータX0を削除するためにマーク付けしてもよい。しかしながら、データX0が、後の時点(例えば、スナップショット動作の後の時点1)でマーク付けされた、スナップショット時点0およびX1でマーク付けされていた場合、媒体管理モジュール370は、スナップショットのデータを保存するために、記憶媒体140にデータX0を保存してもよい。
状態773Bでは、スナップショットモジュール738は、スナップショットFRl(時点e0と関連付けられたデータ)に関連するデータを保存するとともに、後続の時点(例えば、時点e1)の間に記憶動作が実行され続けることを可能にするように構成されてもよい。FRlを保存することは、FRlを複製して、時点e0(FRl(e0))におけるLID範囲の元の状態を保存するとともに、記憶動作がFRlを参照し続けることを可能にすることを含んでもよい。複製動作は、重複エントリ、参照エントリ、および/または中間マッピング層のうちの1つ以上を使用して上記開示されたように実装されてもよい。記憶動作は、LID FRlを参照して記憶媒体140上で記憶ログにデータを追加することを含んでもよい。スナップショットFRl(e0)に対応する複製されたLIDは、不変であってもよい。したがって、FRl(e0)のスナップショットは、LID範囲への変更に関わらずに保存されてもよい。状態773Bにおいて記憶されたデータは、最新の時点(e1)の時点インジケータ739と共に記憶されてもよい。スナップショットモジュール736は、時点e1(および、後続の時点)の間に実行される記憶動作によって使用されておらず、および/または無効化された、レンダリングされたデータを保存するように構成されてもよい。図1Eの実施形態を再度参照して、媒体管理モジュール370は、データX0を、スナップショットFRlを保存するためのデータ(スナップショット動作が実行された後に、データX1が記憶されていてもよい)として識別してもよい。スナップショットモジュール738および/または媒体管理モジュール370は、その後にデータが、時点e1においてデータX1によって使用されていなかったとしても、データX0を保存するように構成されてもよい。データX0は、LID Aが削除またはトリムなどされている場合でさえ、保持されてもよい。
LID範囲FRl(e0)および時点インジケータe0でマーク付けされたデータを含む、FRl(e0)のスナップショットは、対応するスナップショットが削除されるまで保存されてもよい。スナップショットは、インタフェース131を通じて受信される要求に応答して削除されてもよい。状態773Cにおいて示されるように、時点0は、他の、介入(intervening)時点(時点e1〜eN)が生成および/または削除された後でさえ、記憶媒体140上で保持されてもよい。時点e0を削除することは、時点e0と関連付けられた、無効な/使用されていないデータを削除するようスナップショットモジュール738および/または媒体管理モジュール370を構成することを含んでもよい。
状態773Aにおいてスナップショットを生成した後に実行される記憶動作は、論理アドレス空間132、および特に、フォワードマッピング160を修正してもよい。修正は、データを記憶媒体140に付加したこと、ならびにLIDをFR1に追加および/または削除すること、などに応答して記憶アドレス結び付けを更新することを含んでもよい。一部の実施形態では、スナップショットモジュール736は、別個の名前空間、別個のマッピングなどにおいて、論理アドレス空間132の別個の領域など、別個の記憶メタデータ135内でスナップショット範囲FR1(e0)を保存するように構成される。代わりに、スナップショットモジュール736は、時間e0において元のバージョンのFR1を保存することなく、変更がフォワードマッピング160において行われることを可能にしてもよい。スナップショットモジュール736は、記憶媒体140に記憶されたスナップショットデータを使用して、e0(時間t1)に対してフォワードマッピング160を再構築するように構成されてもよい。時間t1におけるフォワードマッピング160は、上記開示されるように再構築されてもよく、それは、記憶媒体140に記憶された(ログ順序で)データに連続してアクセスすること、およびデータパケット710と関連付けられた永続的メタデータ714に基づいてフォワードマッピングエントリを生成することを含むことができる。図7の実施形態では、時点e0に対応するフォワードマッピング160は、時点インジケータ739 e0(または、それよりも低い)でマーク付けされたデータパケット710を参照することによって再構築されてもよい。e0よりも大きい時点インジケータ739と関連付けられたデータは無視されてもよい(スナップショットFR1(e0)の生成の後の動作に対応するそのようなデータが生成されているので)。
本明細書で開示される記憶層130は、効率的な領域移動動作を実装するようにさらに構成されてもよい。図8Aは、本明細書で開示される記憶層130によって実装される移動動作の一実施形態を示す。フォワードマッピング160は、記憶媒体140上でLID1023〜1025をそれぞれのデータセグメントに結び付けるように構成されたエントリ862を含む。エントリ862は、実施形態の詳細をより良好に示すために別個に示されるが、しかしながら、エントリ862は、LID1023〜1025の全範囲を含む単一のエントリに含まれてもよい。エントリ862は、記憶アドレス32、3096、および872に記憶されたデータの論理インタフェース863を定義してもよい。上記開示されたように、記憶アドレス32、3096、および872に記憶されたデータは、データを対応するLID1023、1024、および1025と関連付けるコンテキストフォーマットで記憶されてもよい。
記憶層130は、とりわけ、LID1023、1024、および1025と、それぞれの媒体記憶位置32、3096、および872におけるデータとの間の関連付けを、LID(例えば、9215、9216、および9217)の新たな組に対応する新たな論理インタフェース863Bと置き換えることによって、エントリ862をLID9215〜9217に移動するように構成されてもよい。移動動作は、インタフェース131を介して受信される要求に応答して、ならびに/またはより高レベルの記憶動作の一部として(例えば、ファイルをリネームする要求、またはフォワードマッピング160をバランスよく配置し(balance)および/もしくはデフラグする動作、など)実行されてもよい。
移動動作は、上記開示された複製の実施形態のうちの1つ以上に従って実装されてもよい。一部の実施形態では、移動動作は、LID1023、1024、および1025にマッピングされた記憶アドレスを、目的(destination)LID9215、9216、および9217と関連付けることを含んでもよく、それは、移動動作に従ってデータの論理インタフェース863Aを修正することをもたらすことがある。移動動作はさらに、移動動作が永続的であり、およびクラッシュセーフであることを保証するために永続的記号366を記憶媒体140に記憶することを含んでもよい。記憶アドレス32、872、および3096に記憶されたデータは、上記開示されたように、1つ以上のバックグラウンド動作で、更新された論理インタフェース863Bに従って再書き込みされてもよい。
図8Bは、移動動作の別の実施形態を示す。上述したように、移動動作は、LID1023〜1025と関連付けられたデータをLID9215〜9217に移動することを含んでもよい。図8Bの移動動作は、図4A〜Eと共に開示された参照エントリを利用してもよい。したがって、移動動作は、移動動作を表すために、参照マッピング460において参照エントリ882を生成することを含んでもよい。移動動作はさらに、参照エントリ882を通じて新たな間接エントリ866を割り当ててデータを参照することを含んでもよい。参照エントリ882は、アドレス32、3096、および872と関連付けることができる、LID1023、1024、および1025を事前移動することを含んでもよい。したがって、データの新たな論理インタフェース863Cは、間接エントリ866および対応する参照エントリ882を含んでもよい。移動動作はさらに、上記開示されたように、移動動作が永続的であり、およびクラッシュセーフであることを保証するために記憶媒体に永続的記号366を記憶することを含んでもよい。
記憶アドレス32、3096、および872に記憶されたデータのコンテキストフォーマットは、更新された論理インタフェース863Cと一致しないことがあり、データのコンテキストフォーマットは、それぞれのデータセグメントを、LID9215、9216、および9217(ならびに/または、参照エントリ)とは反対に、LID1023、1024、および1025と関連付けてもよい。永続的記号366は、データの更新された論理インタフェース863Cを含んでもよく、それによって、記憶メタデータ135(例えば、フォワードマッピング160および/または参照マッピング460)を必要な場合に正確に再構築することができる。
記憶層130は、修正された論理インタフェース863C(LID9215、9216、および9217)を通じて、一致しないコンテキストフォーマットでのデータへのアクセスを提供してもよい。データは、移動動作に続く(移動動作および/または他の記憶動作の経路の外で)修正された論理インタフェース863Cと一致するコンテキストフォーマットで再書き込みおよび/または移動されてもよい。一部の実施形態では、記憶アドレス32、3096、および/または872におけるデータは、上記説明されたように、1つ以上のバックグラウンド動作で媒体管理モジュール370によって再書き込みされてもよい。したがって、移動動作は、フォワードマッピング160を更新し、および/または永続的記号366を記憶したことに応答して完了してもよい(および/または確認応答を返してもよい)。
図8Cに示されるように、フォワードマッピング160および/または他の記憶メタデータ135は、移動動作のデータを再書き込みしたことに応答して更新されてもよい。図8Cの実施形態では、媒体記憶位置32に記憶されたデータセグメント812Aは、記憶復元動作に移動されてもよく、それは、修正された論理インタフェース863Cと一致するコンテキストフォーマット(データパケット810A)でデータを記憶することを含むことができる。データパケット810Aは、データセグメント812AをLID9215と関連付ける永続的メタデータ814Aを含んでもよい。フォワードマッピング160は、更新されたコンテキストフォーマットでデータを参照するように更新されてもよく、それは、参照エントリではなくデータパケット810Aを直接参照するようにLID9215の間接エントリを修正することを含むことができる。LID9215に対応するエントリは、間接エントリから標準、ローカルエントリに戻ってもよく、およびLID1023に対する参照エントリは、参照マッピング460から削除されてもよい。
図8Dを参照して、記憶クライアント106は、LID9217と関連付けられたデータを修正してもよく、それは、データセグメントを不適切に記憶する(例えば、記憶アドレス772において)ことを含むことができる。データセグメントは、修正された論理インタフェース863Cと一致するコンテキストフォーマット(例えば、データをLID9217と関連付ける)で上書きされてもよい。これに応答して、フォワードマッピング160は、上記開示されたように、LID9217に対するエントリをデータセグメントの記憶アドレス(例えば、記憶アドレス772)と関連付け、およびLID1025に対する参照エントリを参照マッピング460から削除するように更新されてもよい。
一部の実施形態では、参照マッピング460は、フォワードマッピング160とは別個に維持されてもよく、それによって、記憶クライアント106によって直接、そのエントリ(例えば、エントリ882)を参照することができなくなる。この分離(segregation)によって、記憶クライアント106が効率的に動作することが可能になる。例えば、データが更新されたコンテキストフォーマットで上書きおよび/または移動されるまで動作を停止させる(stall)のではなく、データ動作は、データが1つ以上のバックグラウンド処理で再書き込みされている間に続行してもよい。図8Eを参照して、上記開示された移動動作に続いて、記憶クライアント106は、LID1024と関連してデータを記憶してもよい。LID1024に対応する参照エントリ882は、とりわけ、更新されたコンテキストフォーマットでいまだに再書き込みされていない記憶アドレス3096におけるデータに起因して、参照マッピング460に含まれてもよい。しかしながら、参照マッピング460がフォワードマッピング160とは別個に維持されるので、名前衝突が発生しないことがあり、および記憶動作を完了することができる。フォワードマッピング160は、論理インタフェース863C(および参照マッピング460)を通じてLID1024に以前に結び付けられたデータへのアクセスを提供することを継続している間、媒体記憶位置4322に記憶されたデータに対する論理インタフェースを含む別個のエントリ864を含んでもよい。
開示される移動動作では、とりわけ、対応するデータを再書き込み、移動、修正、削除、および/または上書きしたことに起因して、間接エントリが参照マッピング460の参照エントリにもはやリンクされないとき、参照エントリは削除されてもよく、および間接エントリは、直接、ローカルエントリに戻ってもよい。加えて、移動動作と関連付けられた永続的記号366は、上記開示されたように、記憶媒体140から無効化および/または削除されてもよい。
図1Aを再度参照して、記憶層130のインタフェース131は、本明細書で開示される記憶動作を実行するためのAPIおよび/またはインタフェースを提供するように構成されてもよい。APIおよび/またはインタフェースは、ブロックインタフェース、および/または拡張記憶インタフェースなどのうちの1つ以上を通じて見えるようにされてもよい。ブロックインタフェースは、fadviseパラメータおよびI/O制御パラメータなどの、インタフェース拡張の使用によって、追加APIおよび/または機能を含むように拡張されてもよい。インタフェース131は、領域複製動作、領域移動動作、領域結合動作、重複排除、スナップショット、および本明細書で開示される他の、より高レベルの動作を実行するAPIを提供してもよい。インタフェース131によって、記憶クライアント106が、属性および/またはメタデータをLID範囲に適用し(例えば、範囲を凍結する(freeze))、ならびに領域スナップショットを管理することが可能になる。本明細書で開示されるように、領域複製動作は、1つ以上のソースLIDの組の論理複製を生成することを含む。領域複製、移動、および/または結合動作は、図3A〜Eに示される領域複製の実施形態、図4A〜Eの参照エントリの実施形態、および/または図5A〜Bの中間マッピング層の実施形態を含むがそれらに限定されない、本明細書で開示される実施形態のいずれかを使用して実装されてもよい。
本明細書で開示される領域複製、移動、および/または結合動作は、重複排除、スナップショット、効率的なファイル複製動作(論理ファイル複製)、ファイル一貫性管理、アドレス空間管理、mmapチェックポイント、および原子的書き込みなどの、より高レベルの動作を実装するために使用されてもよい。それらのより高レベルの動作はまた、記憶層130のインタフェース131を通じて見えるようにされてもよい。開示される動作は、オペレーションシステム、ファイルシステ、および/またはデータベースサービスなどの、種々の異なる記憶クライアント106によって利用されてもよい。
図9Aは、ファイル管理動作を実装するように構成された記憶層130を含むシステム900Aの一実施形態を示す。システム900Aは、複雑度およびオーバーヘッドなどを低減させる記憶層130の機能を利用するように構成することができる、ファイルシステム906を含んでもよい。ファイルシステム906は、領域複製、移動、移動、スナップショット、重複排除、ならびに/または効率的なファイルレベルスナップショットおよび/もしくは複製動作を実装する、本明細書で開示される他の機能を利用するように構成されてもよい。ファイルシステム906は、クライアント要求(例えば、複製コマンド、またはファイルスナップショットioctrlなど)に応答してそのような動作を実装するように構成されてもよい。ファイルシステム906は、とりわけ、a)ソースファイルのダーティページ(存在する場合)をフラッシュし(flushing)、b)複製されたファイルおよび/またはファイルレベルスナップショットを表すために新たな目的ファイルを生成し、およびc)ソースファイルを目的ファイルに複製するように構成された領域複製動作を実行するよう記憶モジュール130を指示する、ことによって、ソースファイル上で効率的なファイル複製および/またはファイルレベルスナップショット動作を実装するように構成されてもよい。
図9Aは、ファイルシステム906に対する領域複製動作を実装するための種々の実施形態を示す。一部の実施形態では、および状態911Aで示されるように、記憶層130は、ソースファイル(複製されることになるファイル)のLIDがフォワードマッピング160の使用によって記憶媒体上でファイルデータにマッピングされる、論理アドレス空間132を維持するように構成されてもよい。状態911Bに示される対応する領域複製動作は、a)目的ファイルに対してLIDの組を割り当てること、ならびにb)記憶媒体140上でソースファイルおよび目的ファイルのLIDをファイルデータにマッピングすることを含んでもよい。領域複製動作はさらに、ファイルデータがソースファイルおよび目的ファイルLIDの両方に関連付けられることを示すために記憶媒体140に永続的記号366を記憶することを含んでもよい。領域複製動作はさらに、本明細書で開示されるように、更新されたコンテキストフォーマットに従って、ファイルデータを再書き込みすることを含んでもよい。
他の実施形態では、記憶層130は、領域複製動作(例えば、図4A〜Eに示されるように)を実装するために参照マッピング460を利用してもよい。領域複製動作の前に、状態911Cでは、ソースファイルのLIDがフォワードマッピング160における対応するファイルデータに直接マッピングされてもよい。状態911Dにおいて領域複製を生成することは、参照マッピング460における1つ以上の参照エントリを、ファイルデータと関連付けること、ならびにソースファイルLIDおよび目的ファイルLIDに対応する間接エントリを、参照エントリにリンクすることを含んでもよい。領域複製動作はさらに、本明細書で開示されるように、記憶媒体140に永続的記号366を記憶すること、および/またはファイルデータのコンテキストフォーマットを更新することを含んでもよい。
一部の実施形態では、記憶層130は、中間層マッピング層(例えば、図5A〜Bで開示されるように)を使用して領域複製動作を実装するように構成されてもよい。状態911Eで示されるように、ソースファイルは、中間アドレス空間(例えば、記憶層130の論理アドレス空間132)を通じて記憶媒体140上でファイルデータにマッピングすることができる、VAS532のVIDの組に対応してもよい。領域複製動作を実行することは、a)目的ファイルに対してVAS532におけるVIDを割り当てること、およびb)目的ファイルのVISを中間マッピング層のLID(例えば、ソースファイルVIDにマッピングされるLIDの同一の組)と関連付けることを含んでもよい。領域複製動作はさらに、目的VIDがファイルデータLIDと関連付けられることを示す永続的記号366を記憶媒体140に記憶することを含んでもよい。ファイルデータが中間識別子に既に結び付けられているので、ファイルデータのコンテキストフォーマットは更新される必要がないことがある。
ファイルシステム906はさらに、mmap動作をチェックポイントするために記憶層130を利用するように構成されてもよい。本明細書で使用されるように、「mmap」動作は、ファイルの内容が、ファイルシステム906の標準読み出し/書き込みインタフェースではなく、標準ロードおよび記憶動作を通じてメモリのページとしてアクセスされる動作を指す。「msync」動作は、ファイルのダーティページ(存在する場合)を記憶媒体140にフラッシュする動作を指す。mmap動作の使用は、ファイルのチェックポイントを困難にし得る。ファイル動作は、メモリにおいて実行され、およびmsyncは、状態が保存される必要があるときに発行される。しかしながら、msyncの後のファイルの状態は、最新のインメモリ(in−memory)状態を表し、および最後に保存された状態は消失することがある。したがって、ファイルシステム906がmsyncの間に破壊された場合、ファイルは矛盾した状態のままでいることがある。
一部の実施形態では、ファイルシステム906は、msyncでの呼び出しの間にmmapされたファイルの状態をチェックポイントするように構成される。ファイルをチェックポイントすることは、上記開示されたように、ファイルレベルスナップショット(および/または、領域複製)を生成することを含んでもよい。ファイルレベルスナップショットは、変更が適用される前のファイルの状態を保存するように構成されてもよい。msyncが発行されるとき、msync動作に適用される変更を反映するように別の複製が生成されてもよい。図9Bに示されるように、状態913Aでは(mmap動作の前に)、ファイル1は、記憶媒体140上でLID10〜13、および対応する記憶アドレスP1〜P4と関連付けられてもよい。mmap動作に応答して、ファイルシステム906は、記憶層130のインタフェース131を通じて領域複製動作を実行してもよく、それは、ファイル1の複製(ファイル1.1と表される)を生成することを含むことができる。ファイル1.1は、同一のファイルデータ(例えば、同一の記憶アドレスP1〜P4)を参照するLID40〜43の異なる組と関連付けられてもよい。他の実施形態では、ファイル1は、上記開示されたように、参照マッピング460および/または中間変換層を使用して複製されてもよい。
msync呼び出しに応答して、ファイルシステム906は、別の領域複製動作を実行してもよい(記憶層130の使用によって)。状態913Cに示されるように、msync動作と関連付けられた領域複製動作は、1つ以上のダーティページ(記憶アドレスP5およびP6)の内容でファイル1を更新すること、および更新されたファイル1をファイル1.2として複製することを含んでもよい。ファイル1.1は、msync動作の前のファイルの状態を反映してもよい。したがって、障害の事象では、ファイルシステム906は、ファイル1の前の状態を再構築することが可能である。
上記開示されるように、記憶層130は、ファイル一貫性(例えば、本明細書でさらに詳細に開示されるように、クローズツーオープンファイル一貫性)および原子的動作などの、より高レベルの動作を実装するために利用することができる、領域複製および領域結合動作を実装するように構成されてもよい。それらの動作は、a)論理アドレス空間132の特定の領域を複製すること、b)複製された領域内で記憶動作を実行すること、ならびにc)複製された領域を論理アドレス空間132の別の部分に選択的に結合および/または組み合わせること、を含んでもよい。本明細書で使用されるように、論理アドレス空間132の領域を結合および/または組み合わせることは、とりわけ、範囲のうちの1つにおいて実装される変更を1つ以上の他の範囲に組み込むことによって、2つ以上のLID範囲を組み合わせることを指す。結合動作が、異なるLID範囲の間の矛盾(conflicts)を解決するように構成することができる結合ポリシに従って実装されてもよい。結合ポリシは、1つのLID範囲のうちの1つの内容が別のLID範囲の内容を「上書き」する、「上書き」モード、LID範囲の内容が共に組み合わされる(例えば、論理的OR演算で)「OR」モード、および/または1つ以上のLID範囲とは別個の独立した複製を生成することによって矛盾が解決されるコピーオンコンフリクト(copy−on−conflict)モードなどを含んでもよいが、それらに限定されない。上書きモードでは、1つ以上の他のLID範囲の内容を上書きするLID範囲は、コミット時間(例えば、前の動作を上書きするより最新の動作)、および/または優先度などを含むがそれらに限定されない任意の適切な基準に基づいて判定されてもよい。
図9Cは、記憶層130の使用によって実装される領域結合動作の実施形態を示す。図9Cの実施形態では、記憶層130は、フォワードマッピング160内で1つ以上のエントリによって表すことができる、識別子範囲914を複製するように構成されてもよい。範囲914内のLID072〜083は、記憶アドレス95〜106に結び付けられてもよい。本明細書で開示される領域複製および/または結合動作は、図3A〜Eの領域複製および/もしくは移動の実施形態、図4A〜Eの参照エントリの実施形態ならびに/または図5A〜Bの中間マッピング層の実施形態のうちのいずれかを使用して実装されてもよい。したがって、一部の実施形態では、LID072〜083は、1つ以上の参照エントリおよび/または中間マッピング層を通じて記憶アドレス95〜106に結び付けられてもよい。
記憶層130は、範囲914を複製するように構成されてもよく、それは、状態941Aにおいて示されるように、LID924の新たな範囲を記憶アドレス95〜106に結びつけることを含むことができる。範囲914および/または924は、範囲914および924が関連付けられる(例えば、記憶アドレスの同一の組に結び付けられる)ことを示すように構成されたそれぞれのメタデータ984および/または994を含んでもよい。メタデータ984および/または994は、LID072〜083を972〜983にリンクするように構成されてもよく、それによって、LID範囲のうちの1つに関連する修正を、他の範囲におけるLIDと相関付けることができる(例えば、LID972と関連して書き込まれたデータを対応するLID072などと関連付けることができる)。メタデータ984および/または994は、複製されたLID範囲に対する同期ポリシを示してもよく、それは、上記開示されるように、複製の間の割り当て動作が同期されるかを示すことができる。メタデータ984および/または994はさらに、結合矛盾がどのように管理されるかを指定することができる、結合ポリシを含んでもよく、および/またはそれを参照してもよい。結合ポリシは、記憶層130のインタフェース131を通じて指定されてもよく、グローバルおよび/もしくはデフォルト結合ポリシに基づいて判定されてもよく、ならびに/または要求パラメータ(例えば、fadvise、ioctrlなど)を通じて指定されてもよい、などである。複製動作はさらに、上記開示されたように、記憶アドレス95〜106におけるデータをLID範囲972〜983と関連付けるように構成された永続的記号366を記憶媒体140に追加すること(および/または、更新されたコンテキストフォーマットでデータを再書き込みすること)を含んでもよい。
記憶層130は、1つ以上の記憶クライアント106からの記憶要求に応答して、範囲914および/また924のうちの1つ以上の中で記憶動作を実行してもよい。状態941Bに示されるように、記憶動作は、LID972〜973と関連付けられたデータを修正してもよく、それは、識別子972〜973を記憶アドレス721〜722の新たな組と関連付けることを含むことができる。状態941Bの記憶動作に続いて、記憶層130は、LID範囲972〜983を範囲072〜083と結合する領域結合動作を実行してもよい。領域結合動作は、結合ポリシに従って、LID範囲924に関してなされる修正をLID範囲914に組み込むことを含んでもよい。結合ポリシは、複製された範囲924においてなされる修正がソース範囲914内でデータを上書きすることを指定してもよい。したがって、状態941Cで示される結合動作の結果は、ソース範囲914のLID072〜073を記憶アドレス721〜722における修正されたデータに結びつけることを含んでもよい。領域結合動作はさらに、本明細書で開示されるように、複製されたLID範囲972〜983の割り当てを解除すること、記憶アドレス756〜757におけるデータをLID072〜073と関連付けるように構成された永続的記号366を記憶すること、および/または更新されたコンテキストフォーマットで記憶アドレス721〜722におけるデータを再書き込みすることを含んでもよい。721〜722における新たなデータによって取り除かれた記憶アドレス95〜96に記憶されたデータは、上記開示されたように、無効化されてもよい。
範囲914および/または924内で実行される記憶動作は、矛盾をもたらすことがある。一部の実施形態では、LID範囲と関連付けられた結合ポリシは、矛盾を回避(preempt)してもよい。本明細書でさらに詳細に開示されるように、原子的記憶動作では、記憶層130は、原子的記憶動作が1つ以上の対応する範囲において完了される間に1つ以上のLID範囲をロックしてもよい。しかしながら、他の実装形態では、記憶層130によって、記憶動作が複製された範囲内で同時に実行されることが可能になる。状態941Dでは、記憶層130は、範囲924においてLID972〜973および982〜983と関連付けられたデータを上書きおよび/または修正するように構成された記憶動作を実装してもよい。記憶層130は、範囲914のLID072〜073と関連付けられたデータを上書きおよび/または修正するように構成された他の記憶動作を実装してもよい。LID072〜073および972〜973に関連する記憶動作は、範囲914と924との間の結合矛盾を生じさせることがある。結合矛盾は、上記開示されたように、結合ポリシに従って解決されてもよい。一部の実施形態では、結合ポリシは、とりわけ、記憶ログにおける記憶動作の相対的順序に基づいて最新の修正を適用することを含んでもよい。他の実装形態では、結合ポリシは、それぞれの記憶動作を要求した記憶クライアント106(プロセスおよび/またはアプリケーションなど)の相対的優先度に基づいて矛盾を解決してもよい。別の実装形態では、結合ポリシは、範囲914および/または924の2つ(またはそれ以上の)バージョンを生成して、異なる、矛盾のバージョンを表すことによって、矛盾を解決してもよい。
状態941Eは、LID972〜973と関連付けられた矛盾する修正の代わりに、LID072〜073と関連付けられた動作を組み込むように構成された結合動作の結果の一実施形態を示す。したがって、状態941Eでは、LID072〜073は、LID972〜973を参照して実行される記憶動作に対応する記憶アドレス721〜722ではなく、LID072〜073を参照して実行される記憶動作に対応する記憶アドレス756〜757に結び付けられる。
状態941Fは、LID072〜073を参照してなされる矛盾する修正の代わりに、範囲972〜973の修正を組み込むように構成された結合動作の結果の一実施形態を示す。したがって、状態941Fでは、識別子072〜073は、LID072〜073と関連付けられた記憶アドレス721〜722ではなく、LID972〜973を参照して実行される記憶動作に対応する記憶アドレス721〜722に結び付けられる。
状態941Gは、別個の範囲複製またはバージョンを生成することによって結合矛盾を管理するように構成された結合動作の結果の一実施形態を示す。範囲914は、識別子982〜983を参照してなされる矛盾しない修正を組み込んでもよく、および識別子072〜073に関連する矛盾する記憶動作の結果を保持してもよい(記憶アドレス721〜722を組み込むのではなく)。他のLID範囲924は、識別子072〜073を参照してなされる矛盾する記憶動作の結果を組み込まずに状態941Dの修正を保持してもよい。状態941Gは、元の複製されたLID範囲072〜083 914および974〜981 924を使用した複製を示すが、開示はこの点に限定されず、論理アドレス空間132の任意の領域内の範囲複製およびバージョンを生成するように構成されてもよい。状態941E〜Gを参照して開示される領域結合動作はさらに、本明細書で開示されるように、記憶アドレス721〜722、756〜757、および/もしくは767〜768に記憶されたデータを、対応するLIDと関連付けるために1つ以上の永続的記号366を記憶媒体140に追加すること、ならびに/または1つ以上のバックグラウンド記憶動作でデータを再書き込みすることを含んでもよい。
一部の実施形態では、複製されたLID範囲914および/または924のうちの1つ以上の中での動作は、とりわけ範囲914および/もしくは924を拡張し、または範囲914および/もしくは924を縮小させる(contract)などによって、LID範囲914および/または924を修正することを含んでもよい。範囲914および/または924のうちの1つを拡張することは、他の範囲への対応する拡張を含んでもよく、そのようにして、割り当て動作は、範囲914および924の両方に追加LIDを割り当てることに基づいてもよい。
本明細書で開示される領域結合動作は、図3A〜Eの領域複製および移動の実施形態、図4A〜Eの参照エントリの実施形態、ならびに/または図5A〜Bの中間マッピングの実施形態のいずれかを使用して実装されてもよい。図9Dは、参照マッピング460を使用した領域結合動作の実施形態を示す。状態943Aに示されるように、範囲914を複製することは、論理アドレス空間132にLID範囲924を割り当てること、範囲914および924をリンクすること(とりわけ、メタデータ984および/もしくは994を使用して)、ならびに参照マッピング460において範囲914および924を参照識別子934と関連付けることを含んでもよい。領域複製動作はさらに上記開示されたように、参照マッピング460における範囲934を間接範囲914および/または924と関連付けるように構成された永続的記号366を記憶媒体140に記憶することを含んでもよい。参照マッピング460内の範囲934は、記憶アドレス95〜106に結び付けられてもよい。したがって、範囲914および924の両方は、同一の記憶アドレスにおける同一のデータを間接的に参照してもよい。
LID982〜983に対応するデータを修正するように構成された範囲924内での記憶動作は、状態943Bに示されるように、範囲924内で新たなLIDを割り当てること、および新たなローカルエントリ982〜983を対応する記憶アドレス767〜768に結びつけることを含んでもよい。範囲914および924を結合することは、上記開示されたように、結合ポリシに従って、記憶アドレス767〜768における修正されたデータを範囲914に組み込むことを含んでもよい。図9Dの実施形態では、状態943Cの領域結合動作は、参照エントリ934を削除すること、および記憶アドレス767〜768における更新されたデータを参照するように範囲914のLID081〜083を更新することを含んでもよい。結合動作はさらに、上記開示されたように、永続的記号366を記憶すること、および/または更新されたコンテキストフォーマットで記憶アドレス767〜768におけるデータを再書き込みすることを含んでもよい。
図9Eは、記憶層130によって実装される領域複製および領域結合動作のさらなる実施形態を示す。図9Eは、図5A〜Bと共に開示されるように、中間アドレス空間を含む実施形態における領域複製および領域結合動作を示す。状態947Aでは、VID072〜083を含むVID範囲914は、VASフォワードマッピング560において中間識別子272Z〜283Zを通じて記憶アドレス95〜106に間接的に結び付けられる。中間識別子は、別個の、中間アドレス空間2136(例えば、記憶層130の論理アドレス空間132)の一部であってもよい。
状態947Bに示されるように、VID範囲914を複製することは、VID972〜983を含む新たなVID範囲924を割り当てること、およびVASフォワードマッピング560において範囲924を中間識別子272Z〜283Zと関連付けることを含んでもよい。複製動作はさらに、VID範囲924を中間アドレス272Z〜283Zと関連付けるように構成された永続的記号366を記憶媒体140に記憶することを含んでもよい。記憶動作は、本明細書で開示されるように、VID範囲914および/または924を参照して実行されてもよい。VID範囲914および/または924への修正は、それぞれのVID範囲914および/または924と中間アドレス空間2136との間の更新されたマッピングにおいて反映されてもよい。状態947Cでは、VID982〜983のデータを修正する記憶動作は、VID982〜983および中間識別子984Z〜985Zと記憶アドレス456〜457との間の更新されたマッピングにおいて反映される。VID範囲914および924を結合することは、状態947Dに示されるように、更新されたデータを参照するように(中間アドレス984Z〜985Zを通じて)範囲914のVIDマッピングを更新することを含んでもよい。結合動作はさらに、上記開示されたように、結合矛盾(存在する場合)を解決することを含んでもよい。結合動作はさらに、VID082〜083を中間アドレス984Z〜985Zと関連付けるために1つ以上の永続的記号366を記憶媒体140に付加することを含んでもよい。
一部の実施形態では、記憶層130は、本明細書で開示される領域複製、移動、および/または結合動作を利用して、ファイルシステムおよび/またはデータベースなどの記憶クライアント106に対するファイル一貫性機能を提供してもよい。図9Fを参照して、ファイルシステム906は、ネットワークファイルシステム(NFS)バージョン3プロトコルならびに/または他のファイルシステムの実装形態および/もしくはプロトコルごとにクローズツーオープンファイル一貫性モデルを実装するために記憶層130を利用してもよい。クローズツーオープンファイル一貫性モデルは、複数のプロセスおよび/またはアプリケーション(ファイルシステムクライアント)が同一のファイル上で同時に動作することを可能にするように構成されてもよい。ファイル修正はファイルがクローズされる時にコミットされ、並行してファイル上で動作する他のクライアントは、ファイルがオープンされる次の時まで変更を知らない。したがって、ファイルの状態は、ファイルがオープンされる時に設定され、および他のクライアントによって並行して実装される変更は、ファイルが再オープンされるまでは適用されない。
一部の実施形態では、ファイルシステム906は、有効な(working)、複製された範囲内で修正がなされる間に、記憶層130を利用して、ファイル(例えば、一致したバージョンのファイル)の「元の」データを保存してもよい。本明細書で使用されるように、ファイルの「元の」データおよび/または一致したバージョンのファイルを保存することは、ファイルがオープンされた時に対応する状態でファイルデータを維持すること、および/またはファイル修正のログを保持し、ファイル修正からその元の、修正されていない状態を再構築することができること、を指す。
図9Fは、クローズツーオープンファイル一貫性モデルを実装するように構成された記憶層130を含むシステム900Fの一実施形態を示す。ファイルシステム906(および/または、他の記憶クライアント106)は、記憶層130を利用して、クローズツーオープンファイル一貫性を効率的に実装してもよい。記憶層130は、a)「主要な」または「一致した」バージョンのファイル、および「有効な」バージョンのファイルをもたらす、ファイルシステムクライアント926A〜Nのファイルオープン要求に応答してファイルを複製し、b)有効なバージョンのファイルを参照して記憶動作を実行し、ならびにc)ファイルのクローズに応答して、有効なバージョンのファイルを主要なバージョンのファイルに結合するように構成されてもよい。記憶層130は、本明細書で開示されるように、1つ以上の領域複製動作においてファイルデータを複製するように構成されてもよい(例えば、図3A〜E、4A〜E、および/または5A〜Bなどの領域複製の実施形態を使用して)。記憶層130はさらに、本明細書で開示されるように、1つ以上の領域結合および/または組み合わせ動作を使用して、有効なバージョンのファイル、および主要なまたは一致したバージョンのファイルを結合するように構成されてもよい。有効なバージョンのファイルは、ファイルが特定の記憶クライアント926A〜Nによってオープンされた時のファイルの状態を表してもよい。記憶クライアント926A〜Nは、有効なバージョンのファイルへの排他的なアクセスを有してもよく、そのようにして、有効なバージョンのファイルは、他のクライアント926A〜Nによってなされるファイル修正から分離されてもよい。記憶層130は、ファイルの「主要な」または「一致した」論理インタフェースを参照して、元の、修正されていないファイルデータを維持するように構成されてもよく、それは、記憶動作がファイルの有効な論理インタフェースを参照して実装されている間に、ファイルデータと、一致した論理インタフェースとの間の関連付けを維持することを含むことができる。異なる記憶クライアント926A〜Nによってなされるファイル修正の間の矛盾は、最終書き込み(例えば、前の書き込みを上書きする時の最終書き込み)、矛盾に関する複製(例えば、別個のバージョンのファイルを生成する)、クライアント926A〜Nに基づく優先度、アプリケーション、および/またはプロセスなどの、矛盾解決ポリシまたは結合ポリシに従って解決されてもよい。
図9Fの実施形態では、状態953Aでは、変換モジュール134は、記憶アドレスP0〜P3における記憶媒体140上でファイルのLID(ファイルLID950A)とファイル952Aのデータとの間のマッピング951Aを含む。マッピング951Aは、本明細書で開示されるフォワードマッピング160、および/または図5A〜Bと共に開示される1つ以上の中間マッピング層を使用して実装されてもよい。
状態953Bでは、記憶層130は、記憶クライアント(記憶クライアント926B)のファイルオープン要求に応答してファイルを複製するように構成されてもよい。要求は、インタフェース131を通じて、明示的な要求および/または要求パラメータ(例えば、fadvise、ioctrlなど)などとして受信されてもよい。複製動作は、本明細書で開示されるように、有効なバージョンのファイルに対応する「複製された」ファイルLID950Bの新たな組を割り当てること、および複製された識別子950Bを、主要なバージョンのファイル(論理識別子950Aの元の、または一致する組)のLID950Aと同一のファイルデータ952Aと関連付けることを含むことができる、1つ以上の領域複製動作を含んでもよい。領域複製動作はさらに、上記開示されたように、ファイルデータ952Aを主要なファイルLID950Aおよび有効なバージョンのファイルLID950Bの両方に関連付ける永続的記号366を記憶媒体140に記憶することを含んでもよい。
一部の実施形態では、記憶層130および/またはファイルシステム906は、記憶クライアント926Bによって実行されるファイル動作を有効なバージョンのファイル(LID950Bの有効な組)に向ける(direct)ように構成されてもよい。したがって、記憶クライアント926Bによってなされる修正は、複製されたファイルLID950Bを参照してなされてもよい。そのような修正は、元の、主要なバージョンのファイルLID950Aの状態に影響を与えないことがある。したがって、記憶クライアント926Bは、元の、主要なバージョンのファイルのLID950Aを変更することなく、LID950Bを参照して有効なバージョンのファイルを修正してもよい。
状態953Cでは、記憶クライアント926Bは、記憶アドレスP3に記憶されたファイルのデータを修正する記憶動作を実行しており(記憶層130を通じて)、修正されたデータは、記憶アドレスP64における記憶ログに付加されてもよい。それに応答して、変換モジュール134は、複製された、有効なバージョンのファイル950BのLIDを記憶アドレスP64における修正されたファイルデータ952Bに結びつけるようにマッピング951Bを更新してもよい。記憶クライアント926Bによって修正されていない他のLIDは、元の、修正されていないファイルデータ952Aに結び付けられたままであってもよい。記憶層130は、主要なバージョンのファイルの識別子950Aと、記憶アドレスP0〜3における修正されていないファイルデータ952Aとの間の元のマッピング951Aを保存するように構成される。
別の記憶クライアント926Nは、記憶クライアント926Bがファイルをオープンする前にファイルをオープンする要求を発行してもよい。それに応答して、および状態953Dに示されるように、記憶層130は、主要なファイルの別の複製を生成してもよい(主要なファイル識別子950Aを複製する)。複製されたLID(FID950C)は、複製された識別子範囲950Bを参照して記憶クライアント926Bにとって修正がなされることなく、ファイルの元の状態に対応してもよい。したがって、複製されたLID950Cは、記憶アドレスP0〜3における元の、修正されていないファイルデータ952Aにマッピングされた951Cであってもよい。記憶クライアント926Nは、記憶クライアント926Bと並行して、新たな複製されたファイル識別子範囲950Cを参照して記憶動作を実行してもよい。クライアント926Bおよび926Nによってなされる変更は、そのそれぞれのLID範囲950Bおよび950C内で分離されてもよく、そのようにして、主要なバージョンのファイル(LID950Aおよび/または別の1つ)に適用されてもよい。
状態953Eは、記憶クライアント926Bがファイルをクローズした結果を示す。記憶クライアント926Bのファイルをクローズする要求に応答して、記憶層130は、1つ以上の領域結合動作において、対応する範囲(FID950B)の内容を主要なバージョンのファイル(LID950A)に結合するように構成されてもよい。しかしながら、変更は、記憶クライアント926N(FID950C)によって使用されるバージョンのファイルに結合されなくてもよく、記憶クライアント926Nは、クライアント926Nがファイルを再オープンするまで修正へのアクセスを有しなくてもよい。修正を組み込むことは、本明細書で開示されるように、1つ以上の領域結合動作を含んでもよい。領域結合動作は、複製されたLID範囲950Bを参照してなされる修正を主要なバージョンのファイルのLID範囲950Aに結合するように構成されてもよい。図9Fの実施形態では、領域結合動作は、記憶アドレスP64における修正されたファイルデータ952Bを参照するように主要なファイルLID950Aのマッピング951Aを更新することを含む。クライアント924Bによって修正されていなかったデータは、P0〜3における元の、修正されていないファイルデータ952Aに結び付けられたままであってもよい。
本明細書で開示されるように、一部の実施形態では、修正されたファイルデータ952Bは、記憶アドレスP64における修正されたファイルデータ952Bを、LID950B(主要なバージョンのファイルと関連付けられたLID950Aとは反対に)の1つ以上と関連付けるように構成された永続的メタデータを含んでもよい。したがって、領域結合動作はさらに、LID950Aの範囲の1つ以上を、記憶アドレスP64における修正されたファイルデータ952Bと関連付けるように構成された永続的記号366を記憶媒体140に追加することを含んでもよい。記憶アドレスP64におけるデータは、1つ以上のバックグラウンド動作で、更新された永続的メタデータと共に再書き込みされてもよい。ファイルクローズ動作に続いて(および対応する領域結合動作)、変換モジュール134は、範囲950BのLIDを割り当て解除するように構成されてもよい。
クライアント926Nは、複製されたファイル識別子950Cを参照してファイルを修正してもよい。図9Gの状態953Fに示されるように、記憶クライアント926Nは、クライアント926Bによって実装される修正と矛盾する1つ以上の動作を実行してもよい。修正は、クライアント950Bがファイルをクローズする前(クライアント926Bの修正が、状態953Eにあるように主要なバージョンのファイルのLID950Aに適用される前)に行われてもよい。このようにして、LID950Aは、元の、修正されていないファイルデータ952Aへのマッピングされた951Aであり、記憶クライアント926Bに割り当てられた範囲950Bの識別子のうちの1つ以上は、修正されたファイルデータ952Bにマッピングされ、および記憶クライアント926Nに割り当てられた範囲950Cの識別子のうちの1つ以上は、矛盾するファイルデータ952Cにマッピングされる。修正されていないデータに対応するLID950Bおよび950Cは、元の、修正されていないファイルデータ952Aを参照することを継続してもよい。
クライアント926Bおよび926Cは、そのそれぞれのファイルを最終的にクローズしてもよく、それは、それぞれのLID範囲950Bおよび950Cを参照してなされた修正を、主要なバージョンのファイルの範囲950Aに結合することを含むことができる。記憶層130は、結合ポリシ944に従って、範囲950Bと950Cとの間の矛盾を解決するように構成されてもよい。一部の実施形態では、結合ポリシ944は、記憶クライアント926Bおよび926Cがファイルをクローズした順序に基づいてもよく、最後にクローズされたファイルの修正は、前に適用された修正を上書きしてもよい(例えば、修正が連続してもよい(serialized))。状態953Gに示されるように、記憶クライアント950Bは、記憶クライアント950Cの前にファイルクローズ要求を発行してもよい。クライアント950Bがファイルをクローズした後、記憶層130は、範囲950Bを参照してなされた修正を、主要なバージョンのファイルの範囲950Aに結合してもよい(図9Fの状態953Eに示されるように)。クライアント926Cによるファイルのクローズは、図9Gの状態953Gに示されるように、記憶クライアント950Bによってなされた修正(修正されたデータ952B)の一部を、データ952Cで上書くことをもたらすことがある。P3およびP64におけるデータは、それがもはや主要なファイル、または最新の、有効なバージョンのファイルによって参照されないので、記憶媒体140から削除するためにマーク付けされてもよい。上記開示されるように、記憶層130は、結合ポリシ944に基づく優先度などの、他の結合ポリシを実装するように構成されてもよい。結合ポリシに基づく優先度は、記憶クライアント926Bおよび/または926Cの相対的優先度に基づいて、矛盾を解決することができる。状態953Hでは、記憶クライアント926Cは、記憶クライアント926Bの後にファイルをクローズしてもよいが、しかしながら、記憶クライアント926Bの修正が、記憶クライアント926Cの矛盾する修正よりも高い優先度を有していることを示す結合ポリシ944に起因して、記憶クライアント926Bの修正が保持されてもよい。したがって、主要なバージョンのファイルのLID950Aは、記憶クライアント926Bの修正されたファイルデータ952Bを参照することを継続してもよく、および記憶クライアント926Cの矛盾するファイルデータ(P96におけるデータ952C)は、P3における使用されていないファイルデータ952Aに従ってガーベジコレクションのためにマーク付けされてもよい。他の実施形態では、結合ポリシ944は、2つの主要なバージョンのファイルを生成することをもたらす、コピーオンコンフリクト(copy−on−conflict)ポリシを含んでもよい。そのような実施形態では、および状態953Iに示されるように、記憶層130は、記憶クライアント926Bの修正を主要なファイルに組み込むように構成されてもよく(主要なファイルLID950Aを使用して)、および記憶クライアント926Cの矛盾する修正を新たなバージョンのファイル(ファイル識別子950D)に組み込んでもよい。
結合ポリシ944の特定の実施形態が本明細書で説明されたが、開示はこの点に限定されず、ならびに任意の適切な結合ポリシ944を実装および/または組み込んでもよい。結合ポリシ944は、記憶層130および/またはファイルシステム906内で実装されてもよい。一部の実施形態では、記憶層130および/またはファイルシステム906の結合ポリシ944は、記憶層130のインタフェース131と通じるように構成されてもよい。結合ポリシ944は、記憶層130を通じて実行される全てのファイル動作に適用されてもよい。代わりに、または加えて、結合ポリシ944は、とりわけ、上記開示されたように、ファイルシステムAPIコール、fadvise、および/またはioctrlなどを通じて、ファイルごと、および/または矛盾ごとをベースに設定されてもよい。
記憶層130はさらに、効率的な原子的記憶動作を実装するように構成されてもよい。図10は、原子的記憶動作を実装するように構成された記憶層130を含むシステム1000の一実施形態のブロック図である。本明細書で使用されるように、原子的記憶動作は、全体として完全に完了するか、またはロールバックされるかのいずれかの記憶動作を指す。したがって、原子的記憶動作は、部分的に完了することがなく、記憶層130は、不完全な原子的記憶動作のデータを無効化および/または削除するように構成されてもよい。原子的記憶動作、特に複数のステップを含み、および/または複数の異なるLID範囲もしくはベクトルに関連する原子的記憶動作を実装することは、高いオーバーヘッドコストを課すことがある。例えば、一部のデータベースシステムは、冗長書き込み動作の複数の組を使用して原子的記憶動作を実装する。
記憶層130は、領域複製、領域移動、および本明細書で開示される他の動作を利用して、原子的記憶動作の効率性を増大させることができる原子的記憶モジュール1036を含んでもよい。一部の実施形態では、インタフェース131は、ベクトル原子的記憶動作を実行するためのAPIおよび/またはインタフェースを提供する。ベクトルは、
などの、データ構造として定義されてもよい。
iov_baseパラメータは、ベクトルのデータを含むメモリまたはバッファ位置を指してもよく、iov_lenは、データバッファの長さまたはサイズを指してもよく、およびdest_lidは、ベクトルに対する目的論理識別子(destination logical identifier)を指してもよい(例えば、入力バッファiov_lenから暗示および/または導出される範囲の長さを有する基底論理識別子)。
したがって、1つ以上のベクトルにデータを書き込むベクトル記憶要求は、以下のように定義されてもよい。
上記ベクトル書き込み動作は、*iovポインタによって参照され、および/またはベクトルカウントパラメータ(iov_cnt)によって指定されるベクトルデータ構造の各々からデータを収集し、ならびにそれぞれのiovect構造(例えば、dest_lid)で指定された目的論理識別子にデータを書き込むように構成されてもよい。フラグパラメータは、ベクトル書き込み動作が原子的ベクトル動作として実装されるべきかを指定してもよい。
上記示されたように、ベクトル記憶要求は、複数のベクトルのうちの各々上で同一の動作を実行することを含んでもよい(例えば、1つ以上の異なるベクトルに関する書き込み動作を暗黙的に実行する)。一部の実施形態では、ベクトル記憶要求は、各々の構成ベクトルに対する異なるI/O動作を指定してもよい。したがって、各々のiovectデータ構造は、それぞれの動作インジケータを含んでもよい。一部の実施形態では、iovect構造は以下のように拡張されてもよい。
iov_flagパラメータは、ベクトル上で実行する記憶動作を指定してもよい。iov_flagは、書き込み、読み出し、原子的書き込み、トリムもしくは破棄要求、削除要求、フォーマット要求、パターン化書き込み要求(例えば、指定されたパターンを書き込む要求)、書き込みゼロ要求もしくは検証要求を伴う原子的書き込み動作、または割り当て要求を含むがそれらに限定されない、任意の適切な記憶動作を指定してもよい。上記説明されたベクトル記憶要求インタフェースは、ベクトル構造を受け付けるように拡張されてもよい。
フラグパラメータは、vector_requestのベクトル動作が原始的に実行されるかを指定してもよい。原子的記憶動作のさらなる実施形態は、参照によって本明細書に組み込まれる、Ashish Batwaraらによる2012年12月21日に出願された「Systems,Methods,and Interfaces for Vector Input/Output Operations」と題する米国特許出願第13/725,728号明細書に開示されている。
原子的記憶モジュール1036は、原子的記憶動作に関連する記憶動作を、予め定められた範囲(「進行中(in−process)」範囲1032)にリダイレクトするように構成されてもよい。進行中範囲1032は、記憶クライアント106にアクセス可能でない論理アドレス空間132の指定された部分であってもよい。代わりに、進行中範囲1032は、別個の名前空間(例えば、参照マッピング460および/または他の、中間アドレス空間)で実装されてもよい。原子的記憶動作が進行中範囲1032内で完了した後(例えば、構成I/Oベクトルの全てが処理された後)、原子的記憶モジュール1036は、原子的記憶要求のデータを進行中範囲1032から論理アドレス空間132における目的範囲(destination range)に移動する原子的領域移動動作を実行してもよい。上記開示されるように、領域移動動作は、単一の永続的記号366を記憶媒体140に書き込むことを含んでもよい。
記憶クライアント106は、ベクトル1040Aおよび1040Bに関連する原子的書き込み要求を発行してもよい。図10に示されるように、原子的記憶動作が実行される前(状態1015Aにおいて)、ベクトル1040AのLID10〜13は、記憶アドレスP1〜P4に結び付けられてもよく、およびベクトル1040Bの識別子36〜38は、記憶アドレスP6〜8に結び付けられてもよい。状態1015Bに示されるように、原子的記憶モジュール1036は、原子的記憶動作を進行中範囲1032にリダイレクトするように構成されてもよい。上記開示されるように、進行中範囲1032は、論理アドレス空間132の指定された領域を含んでもよく、および/または別個の名前空間内で実装されてもよい。進行中範囲1032内のベクトル1042Aは、ベクトル1040AのLID10〜13に対応してもよく、および進行中ベクトル1042Bは、ベクトル1040BのLID36〜38に対応してもよい。ベクトル1042Aおよび1042Bは、論理アドレス空間132において対応するベクトル1040Aおよび1040B(および/または、フォワードマッピング160において対応するエントリ)を参照するように構成されたメタデータを含んでもよい。状態1015Bにおいて原子的記憶動作を実装することは、進行中ベクトル1042Aおよび1042Bの識別子Z0〜Z3および/またはZ6〜Z6に関連して記憶媒体140にデータを付加することを含んでもよい。他の記憶動作は、原子的ベクトル動作と同時に実行されてもよく、および/または進行中範囲1032内の原子的ベクトル動作内でインタリーブされてもよい。
原子的記憶動作が完了の前に失敗した場合、ベクトル1040Aおよび1040Bの元のデータが影響を受けないことがある。再構築の間、進行中エントリと関連付けられたデータ(P9〜P13および/またはP100〜P102におけるデータ)は、不完全な原子的記憶動作の一部として識別されてもよく(進行中範囲1032の識別子との関連付けに起因して)、およびデータが削除されてもよい。
図10に示されるように、状態1015Bでは、原子的記憶動作が完了してもよく、それは、上記開示されたように、進行中範囲1032の識別子と関連して記憶媒体140にデータを付加することを含むことができる。原子的記憶要求の完了は、進行中ベクトル1042Aおよび1042Bに書き込まれたデータの論理インタフェースを、論理アドレス空間132に対応するように修正する領域移動動作を実行することを含んでもよい。領域移動動作は、記憶アドレスP9〜P13をLID10〜13およびP100〜102からLID36〜38に結び付けるために、永続的記号366を記憶媒体140に記憶する原子的記憶動作を実行することを含んでもよい。領域移動動作は、図4A〜Eの参照エントリの実施形態および/または図5A〜Bの中間マッピングの実施形態を含むがそれらに限定されない他の方法で実装されてもよい。
図11は、不揮発性記憶媒体にコンテキストフォーマットで記憶されたデータの論理インタフェースを管理する方法1100の一実施形態のフローチャートである。
ステップ1120は、不揮発性記憶媒体にコンテキストフォーマットで記憶されたデータの論理インタフェースを修正するステップを含んでもよい。論理インタフェースは、複製動作、重複排除動作、または移動動作などを含んでもよいが、それらに限定されない、データ上での動作を実行したことに応答して、ステップ1120において修正されてもよい。要求は、記憶クライアント106または記憶層130(例えば、重複排除モジュール374)などから発してもよい。
論理インタフェースを修正することは、データと関連付けられたLIDを修正することを含んでもよく、それは、1つ以上の追加LID(例えば、複製、重複排除など)を使用してデータを参照すること、またはデータ(例えば、移動)と関連付けられたLIDを変更すること、などを含んでもよいが、それらに限定されない。修正された論理インタフェースは、上記説明されたように、記憶媒体140上のデータのコンテキストフォーマットと一致しないことがある。
ステップ1120はさらに、論理インタフェースへの修正を識別する永続的記号を記憶媒体140に記憶するステップを含んでもよい。永続的記号は、論理動作を永続的およびクラッシュセーフにするために使用されてもよく、それによって、データの修正された論理インタフェース(例えば、記憶メタデータ135)を記憶媒体140の内容から再構築することができるようになる(必要な場合)。ステップ1120はさらに、論理インタフェースが修正されたことを確認応答してもよい(例えば、APIコールから返し、または明確な確認応答を返す、など)。確認応答(およびステップ1130における修正された論理インタフェースを通じたアクセス)は、データのコンテキストフォーマットが記憶媒体140上で更新される前に行われる。したがって、論理動作は、本明細書で開示されるように、データが再書き込みおよび/または移動されるまで待たなくてもよく、データのコンテキストフォーマットを更新することは延期されてもよく、かつ/あるいは方法1100の「クリティカルパス」ならびに/または他の記憶動作および/もしくは要求をサービスする経路の外での処理で実装されてもよい。
ステップ1130は、ステップ1120の修正された論理インタフェースを通じて一致しないコンテキストフォーマットでデータへのアクセスを提供するステップを含んでもよい。上記説明されたように、修正されたコンテキストインタフェースと一致することになるデータのコンテキストフォーマットを更新することは、不揮発性記憶媒体上でデータを再書き込みおよび/または移動することを含んでもよく、それは、ステップ1120の動作および/または修正された論理インタフェースに関連する他の記憶動作上で追加の待ち時間をかけることがある。したがって、記憶層130は、データのコンテキストフォーマットが更新されている間に(または、その前に)、一致しないコンテキストフォーマットでデータへのアクセスを提供するように構成されてもよい。ステップ1130においてデータへのアクセスを提供することは、上記説明されたように、データに対応する1つ以上の参照エントリを参照および/またはそれにリンクする(1つ以上の間接エントリを介して)を含んでもよい。
ステップ1140は、ステップ1120の修正された論理インタフェースと一致することになる記憶媒体140上のデータのコンテキストフォーマットを更新するステップを含んでもよい。ステップ1140は、記憶媒体140上でデータを別の媒体記憶位置に再書き込みおよび/または移動するステップを含んでもよい。上記説明されたように、ステップ1140は、ステップ1120のクリティカルパスの外にあるプロセス、および/または記憶層130によって実行される他の記憶要求を使用して実装されてもよく、ステップ1140は、媒体管理モジュール370または重複排除モジュール374などの、別の、自立的モジュールによって実装されてもよい。したがって、データのコンテキストフォーマットは、サービスする他の記憶動作および/または要求とは独立して更新されてもよい。このようにして、ステップ1140は、データのコンテキストフォーマットの即時的な更新を遅延させること、および媒体管理処理などの1つ以上の「バックグラウンド」処理で、データのコンテキストフォーマットを更新することを含んでもよい。代わりに、または加えて、データのコンテキストフォーマットを更新することは、他の記憶動作に応答して(例えば、それに従って)行われてもよい。例えば、データを修正する後続要求によって、不適切に、かつ更新されたコンテキストフォーマットでデータが再書き込みされてもよい。
ステップ1140はさらに、記憶メタデータ135を、更新されるデータのコンテキストフォーマットとして更新するステップを含んでもよい。データが更新されたコンテキストフォーマットで再書き込みおよび/または移動されるので、記憶層130は、記憶メタデータ135(例えば、フォワードマッピング160)を更新することができる。更新は、上記説明されたように、参照マッピング460において参照エントリへの1つ以上のリンクを削除すること、および/または間接エントリをローカルエントリと置き換えることを含んでもよい。ステップ1140はさらに、上記開示されたように、データのコンテキストフォーマットを更新したことに応答して記憶媒体140から永続的記号を無効化および/もしくは削除すること、ならびに/または記憶メタデータ135を持続させることを含んでもよい。
図12は、不揮発性記憶媒体にコンテキストフォーマットで記憶されたデータの論理インタフェースを管理する方法1200の別の実施形態のフローチャートである。方法1200は、本明細書で開示されるように、記憶層130の1つ以上のモジュールおよび/またはコンポーネントによって実装されてもよい。
ステップ1220は、消去ブロックまたは論理消去ブロックなどの、復元のための記憶区画を選択するステップを含む。上記説明されたように、ステップ1220の選択は、利用可能な記憶容量がないこと、特定の論理消去ブロック内で無効としてマーク付けされたデータの割合が閾値に到達することを検出すること、有効なデータの連結(consolidation)、閾値に到達する誤り検出率、データ分散を改善すること、またはデータリフレッシュなどの、幾つかの異なる因子に基づいてもよい。代わりに、または加えて、ステップ1220の選択基準は、上記説明されたように、記憶区画がその対応する論理インタフェースと一致しないコンテキストフォーマットにあるデータを含むかを含んでもよい。
上記開示されるように、記憶区画を復元(または再要求)することは、不揮発性記憶媒体上で記憶区画を消去すること、およびその有効なデータ(存在する場合)を他の記憶位置に移動することを含んでもよい。ステップ1230は、調整動作で移動されることになるデータのコンテキストフォーマットが更新されるべきか(例えば、データの論理インタフェースと一致しない)を判定するステップを含んでもよい。ステップ1230は、上記説明されたように、フォワードマッピング160、参照マッピング460、および/または中間アドレス空間などの、記憶メタデータ135にアクセスして、データの永続的メタデータ(例えば、論理インタフェースメタデータ)がデータの記憶メタデータ135と一致するかを判定するステップを含んでもよい。永続的メタデータが記憶メタデータ135(例えば、上記説明されたように、データを異なるLIDと関連付ける)と一致しない場合、フローはステップ1240において継続し、それ以外の場合、フローはステップ1250において継続する。
ステップ1240は、データの論理インタフェースと一致することになるデータのコンテキストフォーマットを更新するステップを含んでもよい。ステップ1240は、上記説明されたように、LID(および/または、参照エントリ)の異なる組を参照するように論理インタフェースメタデータを更新するステップを含んでもよい。
ステップ1250は、上記説明されたように、不揮発性記憶媒体上で実行される記憶動作の順序付けられたシーケンスを保存する、ログフォーマットで異なる記憶位置にデータを移動するステップを含む。したがって、移動されたデータ(更新されたコンテキストフォーマットで)は、記憶メタデータ135を再構築するとき(必要な場合)の有効かつ最新バージョンのデータとして識別されてもよい。ステップ1250はさらに、本明細書で開示されるように、データの論理インタフェースをデータの新たな媒体記憶位置に結び付け、および一致しないコンテキストフォーマットでのデータへの間接的かつ参照エントリを削除するように記憶メタデータ135を更新するステップを含んでもよい。
図13は、コンテキストフォーマットで記憶されたデータの論理インタフェースを管理する方法1300の別の実施形態のフローチャートである。ステップ1315は、1つ以上の記憶装置120上で重複データを識別するステップを含んでもよい。ステップ1315は、記憶層130内で動作する重複排除モジュール374によって実行されてもよい。代わりに、ステップ1320は、実行される記憶動作として記憶層130によって実行されてもよい。
ステップ1315は、記憶媒体140が重複データを含むこと(または、書き込みおよび/もしくは修正要求のデータを既に含むこと)を判定および/または検証するステップを含んでもよい。したがって、ステップ1320は、記憶動作の経路内で(例えば、重複データが記憶媒体140に書き込まれる時、またはその前)に行われてもよく、および/またはサービスする記憶動作(例えば、重複データが記憶媒体140に既に記憶されているかを識別する)の経路の外で行われてもよい。ステップ1320は、記憶メタデータ135において、データシグニチャを生成および/または維持するステップ、ならびに重複データを識別するためにシグニチャを使用するステップを含んでもよい。
ステップ1315において重複データを識別したことに応答して、記憶層130(または、重複排除モジュール374などの他のモジュール)は、データの複製の論理インタフェースを修正してもよく、それによって、単一の複製が、LIDの2つの組(またはそれ以上)によって参照されてもよい。ステップ1320における論理インタフェースへの修正は、上記説明されたように、記憶メタデータ135を更新すること、および/または不揮発性記憶媒体135に永続的記号を記憶することを含んでもよい。ステップ1320はさらに、上記説明されたように、不揮発性記憶媒体上でデータの他の複製を無効化および/または削除するステップを含んでもよい。
記憶媒体140上のデータのコンテキストフォーマットは、修正された論理インタフェースと一致しないことがある。したがって、ステップ1330および1340は、上記説明されたように、修正された論理インタフェースを通じて一致しないコンテキストフォーマットでデータへのアクセスを提供するステップ、および記憶媒体140上でデータのコンテキストフォーマットを更新するステップを含んでもよい。
図14は、本明細書で開示される記憶層130によって実装される領域結合動作の一実施形態のフローチャートである。ステップ1410は、論理アドレス空間132内でLIDの組を複製するステップを含んでもよい。LIDを複製することは、LIDの2つ以上の異なる組を通じて記憶媒体140上のデータの同一の組(例えば、同一の記憶位置および/または記憶アドレス)を参照することを含んでもよい。2つ以上の組は、LIDの有効な組およびLIDの元の、一貫性の組を含んでもよい。LIDの有効な組は、ファイル修正動作を実行するために使用されてもよく、およびLIDの元の、一貫性の組は、データの元の、修正されていない状態を維持するように構成されてもよい。
上記開示されるように、ステップ1410において複製されたデータは、記憶媒体140上でデータの記憶位置に結び付けることができる、LIDの組によって参照されてもよい。ステップ1410は、論理アドレス空間132内で、および/または別個のアドレス空間内でLIDの1つ以上の他の組を割り当てるステップを含んでもよい。LIDの1つ以上の他の組は、LIDの元の組の論理容量に等しい(例えば、同一の数のLIDを含み、および/または同一の量の記憶容量に対応する)論理容量を含んでもよい。ステップ1410はさらに、LIDの1つ以上の他の組の論理識別子を、LIDの元の組によって参照される同一のデータと関連付けおよび/または結びつけるステップを含んでもよい。したがって、ステップ1410は、データをLIDの2つ以上の異なる組に関連付けるように、データへの論理インタフェースを修正するステップを含んでもよい。一部の実施形態では、ステップ1410は、論理アドレス空間132内でLIDの1つ以上の組を割り当てるステップ、およびLIDを記憶アドレスの同一の組に結び付けるステップを含む。代わりに、または加えて、ステップ1410は、図4A〜Eと共に開示されるように、参照マッピング460内で1つ以上の参照エントリを生成して、1つ以上の参照エントリを通じてLIDの2つ以上の異なる組のLIDを記憶アドレスにリンクするステップを含んでもよい。代わりに、ステップ1410は、1つ以上の中間マッピング層の使用によって実装されてもよい(例えば、図5A〜Bと共に開示されるように)。ステップ1410はさらに、とりわけ、LIDと関連付けられたメタデータ984および/または994を通じてLIDの2つ以上の組をリンクするステップを含んでもよい。メタデータ984および/または994は、LIDの組が同一の記憶エンティティ(例えば、同一のファイルのバージョン)の複製を表すことを示すように構成されてもよい。メタデータ984および/または994はさらに、上記開示されたように、LIDの2つ以上の組に対する結合ポリシを指定および/または参照するように構成されてもよい。
ステップ1410はさらに、ステップ1410の複製動作を永続的およびクラッシュセーフにするように構成された永続的記号366を記憶媒体140に記憶するステップを含んでもよい。永続的記号366は、データの修正された論理インタフェース(例えば、データをLIDの2つ以上の組と関連付ける)を示し、および複製動作の結合ポリシを示す、などのように構成されてもよい。
ステップ1420は、ステップ1410の異なるLID範囲のうちの1つ以上の中で記憶動作を実行するステップを含んでもよい。記憶動作は、1つ以上の記憶クライアント106からインタフェース131を通じて受信される要求に応答して実行されてもよい。記憶動作は、データを記憶媒体140に付加することを含んでもよい。したがって、記憶動作は、1つ以上のLIDの組におけるLIDと記憶媒体140上の記憶位置との間の関連付けおよび/または結びつけを修正することを含んでもよい。関連付けおよび/または結びつけを修正することはさらに、1つ以上のLIDの組におけるLIDを、付加されたデータに、直接、ならびに/または1つ以上の間接参照および/もしくはマッピング層を通じてマッピングすることを含んでもよい。
ステップ1430は、上記開示されたように、LIDの組を結合するステップを含んでもよい。LIDの組を結合することは、上記開示されたように、LID範囲の1つにおいてなされた修正を、LIDの組のうちの1つ以上に組み込むことを含んでもよい。ステップ1430はさらに、結合ポリシに従って、1つ以上の結合矛盾を解決することを含んでもよい。一部の実施形態では、結合することは、LIDの組の1つ以上を削除(例えば、無効化)することを含んでもよく、それは、フォワードマッピング160からエントリを削除すること、参照カウントデータ構造から記憶位置への共有された参照を削除すること、参照マッピング460から参照エントリを削除すること、および/または中間マッピング層において参照を削除すること、などを含むことができる。ステップ1430はさらに、上記開示されたように、結合されたデータの論理インタフェースを修正するステップを含んでもよい。修正された論理インタフェースは、LIDの組の1つ以上を参照して元から記憶されていたデータを参照するために使用されるLIDを更新してもよい。修正された論理インタフェースは、記憶媒体140上のデータのコンテキストフォーマットと一致しないことがある。したがって、ステップ1430は、結合されたデータを、データの更新された論理インタフェースと関連付ける(例えば、第2の組のLIDと関連して元から記憶されているデータを第1の組のLIDと関連付ける)1つ以上の永続的記号366を記憶媒体140に追加するステップを含んでもよい。ステップ1430はさらに、上記開示されたように、一致しないコンテキストフォーマットでデータへのアクセスを提供するステップ、および/または1つ以上のバックグラウンド動作でデータのコンテキストフォーマットを更新するステップを含んでもよい。
図15は、領域結合動作のための方法1500の別の実施形態のフローチャートである。ステップ1520は、LID範囲の論理複製を生成する要求を受信するステップを含んでもよい。要求は、インタフェース131を通じて記憶クライアント106から受信されてもよく、および/または記憶層130によって提供されるより高レベルのAPIの一部であってもよい。要求は、全くない場合に複製がどのように同期されるか、複製がどのように行われるか(結合ポリシ)、および論理複製が一時的なものとして指定されるか、などを含むことができるがそれらに限定されない、複製の「動作モード」を含んでもよい。
ステップ1530は、論理アドレス空間132においてLIDを割り当てて、要求をサービスするステップを含んでもよい。ステップ1530の割り当てはさらに、複製されたLID範囲への変更に適合する物理記憶空間を予約するステップを含んでもよい。物理記憶空間の予約は、複製の動作モードに基づいてもよい。例えば、全ての変更が複製と元のアドレス範囲との間で同期されることになる場合、物理記憶空間のごく一部(存在する場合)が予約されてもよい。代わりに、記憶層130は、コピーオンコンフリクト結合ポリシを有する論理複製動作に対する追加の物理記憶容量を予約してもよい。ステップ1530はさらに、論理アドレス空間132の指定された部分またはセグメント(例えば、論理複製および/または複製動作での使用に専用の範囲)内で複製を割り当てるステップを含んでもよい。したがって、ステップ1530は、LIDの第2の、異なる組を割り当てて、LIDの第1の組を複製するステップを含んでもよい。
ステップ1540は、ステップ1530において割り当てられた複製されたLIDと共に、データに結び付けられる元のLIDの両方を参照するように、複製に対応するデータの論理インタフェースを更新するステップを含んでもよい。ステップ1540は、上記開示されたように、永続的記号366を記憶媒体140に記憶するステップを含んでもよい。
ステップ1550は、記憶要求を受信するステップ、ならびに記憶要求が第1の組および/または第2の組のLID(複製されたLID範囲)に関連するかを判定するステップを含む。そうである場合、フローはステップ1560において継続し、その他の場合、フローはステップ1550に残る。
ステップ1560は、他の関連付けられたLID範囲上で何の動作が行われるか(存在する場合)を判定する(例えば、割り当て動作を同期するなど)ステップを含んでもよい。ステップ1560の判定は、複製の同期ポリシを含むことができ、および/または参照することができる、メタデータ984および/または994にアクセスすることを含んでもよい。
ステップ1570は、要求された記憶動作に従って、ステップ1560において判定された動作(存在する場合)を実行するステップを含んでもよい。同期動作のうちの1つ以上を実行することができない場合(例えば、複製のうちの1つ以上に対する追加の論理アドレス空間132を割り当てることができない場合)、内在する記憶動作が失敗することがある。
図16は、領域複製および/または領域結合動作を実装するための方法1600の別の実施形態のフローチャートである。ステップ1610は、上記開示されたように、LID範囲を複製するステップを含んでもよい。ステップ1610は、それぞれの記憶アドレスにおいて記憶媒体140に記憶されたデータと関連付けられたLIDの組を複製するステップを含んでもよい。したがって、ステップ1610は、LIDの2つ以上の異なる組を記憶位置の同一の組(例えば、同一のデータ)と関連付けるステップを含んでもよい。ステップ1610はさらに、上記開示されたように、1つ以上の永続的記号366を記憶媒体140に記憶するステップ、および/または更新されたコンテキストフォーマットでデータを再書き込みするステップを含んでもよい。ステップ1610は、とりわけ、メタデータ984および/または994を通じてLIDのうちの2つ以上の組をリンクするステップを含んでもよい。メタデータ984および/または994は、上記開示されたように、複製同期ポリシおよび/または結合ポリシなどを含んでもよく、および/またはそれらを参照してもよい。
ステップ1620は、2つ以上の複製されたLID範囲のうちの1つ以上を参照して記憶動作を実行するステップを含んでもよい。ステップ1620は、複製された範囲の間の割り当て動作を同期するステップを含んでもよい。ステップ1620の記憶動作は、データを記憶媒体140に付加すること、および/または付加されたデータを異なるLID範囲のうちの1つ以上のLIDと関連付けることを含んでもよい。
ステップ1630は、ステップ1610の2つ以上のLID範囲を結合する要求を受信するステップを含む。結合要求は、インタフェース131を通じて受信されてもよく、および/または原子的記憶動作などの、別の、より高レベルの動作の一部であってもよい。
ステップ1640は、LIDの2つ以上の組(存在する場合)の間の結合矛盾を識別するステップを含んでもよい。結合矛盾を識別することは、2つ以上の複製されたLID範囲のうちの2つ以上の中で修正されているLIDを識別することを含んでもよい。図9Cを再度参照して、ステップ1640は、範囲924における対応するLID972〜973にあったように、範囲914におけるLID072〜073が修正されたことに応答と判定したことに応答して、状態941Dにおける結合矛盾を識別するステップを含んでもよい。このようにして、ステップ1640は、LIDの複製内での修正を比較して、矛盾する修正が結合動作における同一のLIDにマッピングするケースを識別するステップを含んでもよい。
ステップ1650は、ステップ1640において識別された結合矛盾を解決するステップを含んでもよい。ステップ1650は、上記開示されるように、どのように結合矛盾が解決されるかを判定することができる、適用可能な結合ポリシを判定するステップを含んでもよい。結合ポリシは、どのバージョンのLIDが、結合されたLID範囲に含まれるか、および/またはLID範囲の別個の複製を維持することによって矛盾が解決されるかを指定することができる。ステップ1650はさらに、上記開示されたように、解決された結合矛盾に従ってLID範囲を結合するステップを含んでもよい。
図17は、本明細書で開示される記憶層130を使用してオープンツークローズファイル一貫性を実装するための方法1700の一実施形態のフローチャートである。ステップ1710は、ファイルのデータに対応するLID範囲を複製するステップを含んでもよい。上記開示されるように、ファイルシステム906(および/または、他の記憶クライアント106)は、記憶層130を利用して、クローズツーオープンファイル一貫性モデルを実装するように構成されてもよい。したがって、ステップ1710は、ファイルをオープンする、ファイルシステム906からの要求に応答して、および/またはクライアントからの要求に応答して実行されてもよい。ステップ1710は、LIDの2つ以上の異なる組を通じてファイルデータの記憶位置を参照するようにファイルデータの論理インタフェースを修正するステップを含んでもよい。LIDの2つ以上の異なる組は、LIDの有効な組、および元の、一貫性の組を含んでもよい。したがって、LIDの元の、一貫性の組は、主要なバージョンのファイルに対応してもよく、およびLIDの有効な組は、クライアントによって使用されるファイルの有効な複製に対応してもよい。有効な複製は、他の記憶クライアントによってなされる同時ファイル修正(ステップ1710においてクライアントがファイルをオープンした後になされた修正)から分離してもよい。同様に、論理識別子の有効な組における論理識別子を参照してなされた修正は、LIDのファイル有効な組が他のLID組と結合されるまで(例えば、ファイルをクローズしたことに応答して)、LIDの元の、一貫性の組(主要なバージョンのファイル)に反映されなくてもよい。ステップ1710の領域複製動作は、図3A〜Eの複数の参照の実施形態、図4A〜Eの参照インデックスの実施形態、および/または図5A〜Bの中間マッピング層の実施形態を含む、本明細書で開示される領域複製の実施形態のいずれかを使用して実行されてもよい。ステップ1710はさらに、ファイルオープン動作を要求した記憶クライアント106など、記憶クライアント106にLIDの組のうちの1つ以上を提供するステップを含んでもよい。記憶クライアントは、LIDの有効な組が設けられてもよい。代わりに、または加えて、記憶層130は、記憶クライアント106に、LIDの元の、一貫性の組(または、他の組)を提供してもよく、および記憶層130は、記憶クライアント106の記憶要求をLIDの有効な組にリダイレクトしてもよい。
ステップ1720は、LIDの有効な組内で記憶動作を実行するステップを含んでもよい。記憶動作は、ファイルを修正するように構成された1つ以上のデータセグメント(例えば、ファイルの1つ以上の元の、修正されていないデータセグメントを修正および/または上書きするように構成されたデータセグメント)を記憶媒体140に記憶することを含んでもよい。記憶動作はさらに、本明細書で開示されるように、LIDの有効な組におけるLIDのうちの1つ以上を、更新された記憶位置および/またはアドレスに結び付けることを含んでもよい。ファイルの修正されていないデータに関連する有効な組内のLIDは、元の記憶アドレスに結び付けられたままであってもよい(LIDの元の、一貫性の組と同一の記憶位置に結び付けられたまま)。
ステップ1722は、上記説明されたように、元の、修正されていないバージョンのファイル、および元の、一貫性の組のLIDへの参照による対応するファイルデータへのアクセスを提供するステップを含んでもよい。ステップ1722はさらに、とりわけ、ステップ1710にあるようなファイルLIDの別の複製を生成することによって、他のクライアントがファイルをオープンすることを可能にするステップを含んでもよい。
ステップ1730は、上記開示されたように、LIDの有効な組を、LIDの元の、一貫性の組など、別のLID範囲に結合するステップを含んでもよい。ステップ1730は、クライアントがファイルをクローズしたことに応答して実行されてもよい。ステップ1730はさらに、上記開示されたように、結合矛盾を識別および解決するステップを含んでもよい。結合矛盾を解決することは、複製されたLID範囲のうちの1つ以上でなされた修正に優先することを含んでもよい。一部の実施形態では、例えば、ステップ1710において生成されたLIDの有効な組に対応する修正は、異なる記憶クライアント106のLIDの異なる有効な組を参照してなされた修正に優先してもよく、またはそれによって優先されてもよい。結合矛盾を解決することは、LID範囲を分岐させて(fork)、LIDの有効な組を参照してなされた修正に対応する第1のLID範囲と、LIDの異なる有効な組において別の記憶クライアントによってなされた矛盾する修正に対応する別のLID範囲とを生成することを含んでもよい。LID範囲を結合することはさらに、上記開示されたように、永続的記号366を記憶媒体140に記憶すること、データのコンテキストフォーマットと一致しない論理インタフェースを通じて記憶媒体140に記憶されたデータへのアクセスを提供すること、および/または更新されたコンテキストフォーマットでデータを再書き込みすることを含んでもよい。
種々の例示的な実施形態を参照してこの開示がなされてきた。しかしながら、当業者は、本開示の範囲から逸脱することなく、例示的な実施形態に変更および修正をなしてもよいことを理解するであろう。例えば、種々の動作ステップと共に、動作ステップを実行するコンポーネントは、特定の用途の依存した代替的な方法で、またはシステムの動作と関連付けられた任意の数の費用関数を考慮した代替的な方法で実装されてもよい(例えば、ステップのうちの1つ以上が削除、修正、または他のステップと組み合わされてもよい)。したがって、この開示は、限定的な意味ではなく、例示的なものとして見なされることになり、および全てのそのような修正はその範囲内に含まれると意図される。同様に、利点、他の有利点、および課題を解決する手段が種々の実施形態に関して上記説明されてきた。しかしながら、利点、有利点、課題を解決する手段、および任意の利点、有利点、または解決手段を行わせ、かつより明確にさせることができる任意の要素は、重要な、要求され、または必須の特徴または要素と解釈されるべきでない。本明細書で使用されるように、用語「含む(comprises)」、「含む(comprising)」、および任意のそれらの他の変形は、非排他的な包含をカバーすることを意図され、それによって、処理、方法、項目、または要素のリストを含む装置は、それらの要素を含むだけでなく、明確に記載されていない他の要素、またはそのような処理、システム、項目、または装置に継承される他の要素を含んでもよい。また、本明細書で使用されるように、用語「結合される(coupled)」、「結合する(coupling)」、および任意のそれらの他の変形は、物理接続、電子的接続、磁気的接続、光学的接続、通信接続、機能的接続、および/または任意の他の接続をカバーすることを意図される。
加えて、当業者は、本開示の原理が記憶媒体に具体化された機械可読プログラムコード手段を有する機械可読記憶媒体上のコンピュータプログラム製品において反映されてもよいことが理解されよう。磁気記憶装置(ハードディスクおよびフロッピーディスクなど)、光学式記憶装置(CD−ROM、DVD、およびブルーレイディスクなど)、ならびに/またはフラッシュメモリなどを含む、任意の有形、非一時的機械可読記憶媒体が利用されてもよい。それらのコンピュータプログラム命令は、汎用コンピュータ、特殊用途コンピュータ、または機械を生成する他のプログラム可能データ処理装置にロードされてもよく、それによって、コンピュータまたは他のプログラム可能データ処理装置上で実行する命令が指定された機能を実装する手段を生成する。それらのコンピュータプログラム命令はまた、コンピュータ、または特定の方式で機能する他のプログラム可能データ処理装置を指示することができる機械可読メモリに記憶されてもよく、それによって、機械可読メモリに記憶命令が指定された機能を実装する実装手段を含む、製造の項目を生成する。コンピュータプログラム命令はまた、コンピュータまたは他のプログラム可能データ処理装置にロードされてコンピュータまたは他のプログラム可能データ処理装置上で一連の動作ステップを実行させてコンピュータ実行処理を生成し、それによって、コンピュータまたは他のプログラム可能装置上で実行する命令が、指定された機能を実行するステップを提供する。
この開示の原理が種々の実施形態で示されてきたが、特定の環境、および動作要件に特に適合される構造、配置、比率、要素、材質、および構成要素の多くの修正が、この開示の原理および範囲から逸脱せずに使用されてもよい。それらのおよび他の変更または修正は、本開示の範囲内に含まれることが意図される。
以下の項目は、国際出願時の特許請求の範囲に記載の要素である。
(項目1)
記憶装置の1つ以上の記憶位置に記憶されたデータを、アドレス空間の論理識別子と関連付けるステップと、
前記データにアクセスする記憶クライアントの要求に応答して、論理識別子の有効な組を提供し、それによって、論理識別子の前記有効な組および論理識別子の一貫性の組が前記同一の1つ以上の記憶位置と関連付けられるステップと、
前記データの少なくとも一部を修正するように構成された記憶動作を実装するステップであって、前記記憶動作を実装することは、前記有効な組における前記論理識別子のうちの1つ以上の記憶位置の関連付けを更新すること、および論理識別子の前記一貫性の組と前記1つ以上の記憶位置との間の前記関連付けを保存することを含む、ステップと
を含む、方法。
(項目2)
前記記憶動作は、データを前記記憶装置上のログに付加することを含み、前記方法はさらに、前記付加されたデータを論理識別子の前記有効な組と関連付けるステップを含む、項目1に記載の方法。
(項目3)
前記記憶動作は、前記記憶装置に記憶された前記データの元のデータセグメントを修正するように構成されたデータセグメントを前記記憶装置に書き込むことを含み、前記方法はさらに、
前記論理識別子の前記一貫性の組における論理識別子を参照することによって前記元のデータセグメントへのアクセスを提供するステップと、
論理識別子の前記有効な組における論理識別子の使用によって、前記元のデータセグメントを修正するように構成された前記データセグメントを関連付けるステップと
を含む、項目1に記載の方法。
(項目4)
前記記憶動作は、データをファイルに付加することを含み、前記方法はさらに、
1つ以上の追加論理識別子を論理識別子の前記有効な組に割り当てるステップと、
前記1つ以上の追加論理識別子を参照することによって、前記付加されたデータへのアクセスを提供するステップと
を含む、項目1に記載の方法。
(項目5)
前記記憶動作は、ファイルの複数の元のデータセグメントのうちの1つを修正するように構成され、前記方法はさらに、
論理識別子の前記一貫性の組の論理識別子の使用によって、前記複数の元のデータセグメントを参照するステップと、
論理識別子の前記有効な組の論理識別子の使用によって、前記記憶動作によって修正されていない前記元のデータセグメントを参照するステップと、
論理識別子の前記有効な組の論理識別子を通じて、前記記憶動作に対応するデータセグメントを参照するステップと
を含む、項目1に記載の方法。
(項目6)
前記記憶クライアントによって実行される記憶動作に対し前記記憶装置上で記憶容量を予約することによって論理識別子の前記有効な組を割り当てるステップをさらに含む、項目1に記載の方法。
(項目7)
異なる記憶クライアントの要求に応答して前記記憶動作によって修正されていない前記データへのアクセスを提供するステップをさらに含む、項目1に記載の方法。
(項目8)
前記データに対応するファイルをオープンする、別の記憶クライアントの要求に応答して論理識別子空間の追加の有効な組を割り当て、それによって、論理識別子の前記一貫性の組および論理識別子の前記追加の有効な組が前記同一の記憶位置と関連付けられ、ならびに前記関連付けは、前記記憶動作によって修正されない、項目1に記載の方法。
(項目9)
前記データは、前記データをそれぞれの論理識別子と関連付けるように構成された永続的メタデータと関連して前記記憶装置に記憶され、前記方法はさらに、前記データを前記一貫性の組および前記有効な組の論理識別子と関連付けるように構成された永続的メタデータを前記記憶装置に付加するステップを含む、項目1に記載の方法。
(項目10)
前記データに対応するファイルをクローズする、前記記憶クライアントの要求に応答して、論理識別子の前記一貫性の組を、論理識別子の前記有効な組と結合するステップをさらに含み、結合することは、前記記憶クライアントによって論理識別子の前記有効な組を参照してなされた前記ファイルへの修正を、論理識別子の前記一貫性の組に組み込むことを含む、項目1に記載の方法。
(項目11)
論理識別子の前記有効な組を前記1つ以上の記憶位置の記憶アドレスに結び付けるステップをさらに含む、項目1に記載の方法。
(項目12)
ファイルのデータを論理識別子の元の組および論理識別子の複製の組の両方に結び付けることによって、記憶装置に記憶された前記データに対応する前記ファイルを複製するように構成された変換モジュールと、
複製論理識別子を参照して前記ファイルを変更するように構成された記憶動作を実行している間に、前記記憶装置に記憶された前記ファイルデータ、および前記保存されたファイルデータと論理識別子の前記元の組との間の結び付けを保存するように構成された記憶層と、
前記記憶動作を実行した後に前記元の論理識別子を通じて前記保存されたファイルデータへのアクセスを提供するように構成されたインタフェースと
を含む、装置。
(項目13)
前記変換モジュールは、前記ファイルをオープンする要求に応答して、前記ファイルを複製するように構成され、および前記インタフェースは、前記ファイルに関連する異なる要求に応答して、論理識別子の前記元の組を通じて前記保存されたファイルデータへのアクセスを提供するように構成される、項目12に記載の装置。
(項目14)
前記変換モジュールは、前記オープンされたファイルに関連する記憶動作を論理識別子の前記複製された組にリダイレクトするように構成される、項目13に記載の装置。
(項目15)
前記記憶動作は、前記ファイルからデータセグメントを削除するように構成され、ならびに前記記憶層は、前記データセグメントと論理識別子の前記複製された組における論理識別子との間の関連付けを削除し、および前記データセグメントと論理識別子の前記元の組における論理識別子との間の関連付けを保存するように構成される、項目12に記載の装置。
(項目16)
前記記憶動作は、前記ファイルの既存のデータを変更するように構成され、ならびに前記記憶層は、論理識別子の前記複製された組のうちの1つ以上の論理識別子を使用して前記ファイルの前記変更されたデータを参照し、および論理識別子の前記元の組の論理識別子を使用して対応する保存されたファイルデータを参照するように構成される、項目12に記載の装置。
(項目17)
前記変換モジュールはさらに、論理識別子の前記複製された組の前記論理識別子を参照して実行された前記記憶動作のファイル修正を、論理識別子の前記元の組に組み込むことによって、前記複製された論理識別子を前記元の論理識別子に組み合わせるように構成される、項目12に記載の装置。
(項目18)
前記ファイル修正は、前記記憶装置に前記ファイルのデータセグメントを記憶することを含み、前記ファイル修正を組み込むことは、前記データセグメントを論理識別子の前記元の組の前記論理識別子のうちの1つと関連付ける永続的メタデータを前記記憶装置に記憶することを含む、項目17に記載の装置。
(項目19)
前記ファイル修正は、前記ファイルを拡張することを含み、および前記ファイル修正を組み込むことは、論理識別子を元の論理識別子の前記組に追加して、前記拡張されたファイルのデータを参照することを含む、項目17に記載の装置。
(項目20)
ファイルをオープンする要求に応答して、前記ファイルの論理複製を生成する手段であって、前記論理複製を生成することは、論理アドレスの2つの異なる組を通じて前記ファイルのデータを参照することを含む、手段と、
論理アドレスの前記2つの異なる組のうちの最初の1つを参照して、前記ファイルを修正する手段と、
論理アドレスの前記最初の組を参照して前記ファイルを修正した後、論理アドレスの前記2つの異なる組のうちの2つ目の1つを通じて元のバージョンのファイルへのアクセスを提供する手段と
を含む、システム。
(項目21)
結合ポリシに従って、論理アドレスの前記最初の組内で実装されたファイル修正を参照するように論理アドレスの前記2つ目の組を更新することによって、論理アドレスの前記2つの異なる組を結合する手段をさらに含む、項目20に記載のシステム。
(項目22)
前記ファイルを修正する手段は、記憶装置に記憶されたログに前記ファイルの修正されたデータを付加する手段を含み、および論理アドレスの前記2つの異なる組を結合する手段は、論理アドレスの前記2つ目の組の論理アドレスを前記修正されたデータと関連付けるように構成された永続的記号を前記ログに追加する手段を含む、項目21に記載のシステム。