(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0012】
図1Aは、1つ以上の記憶クライアント106にストレージサービスを提供するよう構成される記憶層130を備える演算システム100の一実施形態のブロック図である。記憶層130は、本明細書中で更に詳細に開示するような、ファイルオープン−クローズサービスを提供するよう構成されてもよい。演算システム100は、サーバ、デスクトップ、ラップトップ、埋込みシステム、モバイル機器、及び/又は同様のものを含むが、これらに限定されない任意の適切な演算装置を備えていてもよい。幾つかの実施形態において、演算システム100は、サーバ演算装置のクラスタ等の複数の演算装置を含んでもよい。演算システム100は、処理リソース101、揮発性メモリリソース102(例えば、ランダムアクセスメモリ(RAM))、不揮発性記憶リソース103、及び通信インタフェース104を備えていてもよい。処理リソース101は、汎用中央処理装置(CPU)、特定用途向け集積回路(ASIC)、及び、フィールドプログラマブルゲートアレイ(FPGA)、プログラマブル論理アレイ(PLG)、及び同様のもの等のプログラマブル論理素子を含んでもよいが、これらに限定されない。不揮発性記憶リソース103は、磁気ハードディスク、ソリッドステート記憶媒体、光学式記憶媒体、及び/又は同様のもの等の非一時的機械読取可能記憶媒体を備えていてもよい。通信インタフェース104は、演算システム100をネットワーク105に通信可能に結合するよう構成されてもよい。ネットワーク105は、伝送制御プロトコル/インターネットプロトコル(TCP/IP)ネットワーク、ローカルエリアネットワーク(LAN)、ワイドエリアネットワーク(WAN)、仮想プライベートネットワーク(VPN)、ストレージエリアネットワーク(SAN)、公衆交換電話網(PSTN)、インターネット、及び/又は同様のものを含むが、これらに限定されない任意の適切な通信ネットワークを備えていてもよい。
【0013】
演算システム100は、1つ以上の記憶クライアント106にストレージサービスを提供するよう構成されてもよい記憶層130を備えていてもよい。記憶クライアント106は、オペレーティングシステム(ベアメタルオペレーティングシステム、ゲストオペレーティングシステム、仮想マシン、仮想化環境、及び同様のものを含む)、ファイルシステム、データベースシステム、リモート記憶クライアント(例えば、ネットワーク105を介して演算システム100及び/又は記憶層130に通信可能に結合される記憶クライアント)、及び/又は同様のものを含んでもよいが、これらに限定されない。
【0014】
記憶層130(及び/又はそのモジュール)は、ソフトウェア、ハードウェア、又はそれらの組み合わせにおいて実装されてもよい。幾つかの実施形態において、記憶層130の一部は、不揮発性記憶リソース103等の永続的な非一時的記憶媒体上に格納されてもよいコンピュータプログラムコード等の実行可能命令として具現化される。命令及び/又はコンピュータプログラムコードは、処理リソース101による実行のために構成されてもよい。代替として、又は加えて、記憶層130の一部は、汎用及び/又は特定用途向け構成部品、プログラマブルハードウェア、FPGA、ASIC、ハードウェアコントローラ、記憶コントローラ、及び/又は同様のもの等の機械部品として具現化されてもよい。
【0015】
記憶層130は、記憶媒体140上の記憶操作を実行するよう構成されてもよい。記憶媒体140は、データを永続的に格納することができる何れかの記憶媒体を備えていてもよい。本明細書中で用いるように、「永続的」データ記憶とは、情報を永続的不揮発性記憶媒体上に格納することを指す。記憶媒体140は、1つ以上のソリッドステート記憶装置又はドライブ(SSD)、ハードディスクドライブ(例えば、統合ドライブエレクトロニクス(IDE)ドライブ、小型コンピュータシステムインタフェース(SCSI)ドライブ、シリアルアタッチドSCSI(SAS)ドライブ、シリアルATアタッチメント(SATA)ドライブ等)、テープドライブ、書き込み可能な光学ドライブ(例えば、CDドライブ、DVDドライブ、ブルーレイドライブ等)及び/又は同様のもの等におけるソリッドステート記憶媒体等の不揮発性記憶媒体を含んでもよい。
【0016】
幾つかの実施形態において、記憶媒体140は、NANDフラッシュメモリ、NORフラッシュメモリ、ナノRAM(NRAM)、磁気抵抗RAM(MRAM)、相変化RAM(PRAM)、レーストラックメモリ、メモリスタメモリ、ナノクリスタルワイヤベースメモリ、酸化シリコンベースサブ10ナノメートルプロセスメモリ、グラフェンメモリ、Silicon−Oxide−Nitride−Oxide−Silicon(SONOS)、抵抗変化型ランダムアクセスメモリ(RRAM)、プログラマブルメタライゼーションセル(PMC)、導電性ブリッジ型RAM(CBRAM)、及び/又は同様のものを含んでもよいが、これらに限定されない不揮発性ソリッドステートメモリを備えている。記憶媒体140の特定の実施形態は本明細書中で開示するが、本開示の教示は、不揮発性及び揮発性形態の両方を含むメモリの任意の適切な形態に対して適用することができる。従って、記憶層130の特定の実施形態は、不揮発性のソリッドステート記憶装置140の文脈において開示するが、記憶層130は、他の記憶装置及び/又は記憶媒体と共に用いられてもよい。
【0017】
幾つかの実施形態において、記憶媒体140は、RAM、ダイナミックRAM(DRAM)、スタティックRAM(SRAM)、シンクロナスダイナミックRAM(SDRAM)等を含んでもよいが、これらに限定されない揮発性メモリを含む。記憶媒体140は、CPUキャッシュ(例えば、L1、L2、L3キャッシュ等)、グラフィックスメモリ、及び/又は同様のもの等の処理リソース101のメモリに相当してもよい。幾つかの実施形態において、記憶媒体140は、相互接続127の使用により記憶層130に通信可能に結合される。相互接続127は、周辺構成機器相互接続(PCI)、PCI express(PCI−e)、シリアルアドバンストテクノロジーアタッチメント(シリアルATA又はSATA)、パラレルATA(PATA)、小型コンピュータシステムインタフェース(SCSI)、IEEE 1394(ファイヤーワイヤー)、ファイバチャネル、ユニバーサルシリアルバス(USB)、及び/又は同様のものを含んでもよいが、これらに限定されない。代替として、記憶媒体140は、ネットワーク105(及び/又は、ストレージエリアネットワーク(SAN)、仮想ストレージエリアネットワーク(VSAN)、及び/又は同様のもの等の他の通信インタフェース)を介して記憶層130に通信可能に結合される遠隔記憶装置であってもよい。相互接続127は、従って、PCE−eバス、ネットワーク接続(例えば、インフィニバンド)、ストレージネットワーク、ファイバチャネルプロトコル(FCP)ネットワーク、HyperSCSI、及び/又は同様のもの等のリモートバスを備えていてもよい。
【0018】
記憶層130は、特に、記憶コントローラ139の使用によって記憶媒体140上の記憶操作を管理するよう構成されてもよい。記憶コントローラ139は、ストレージドライバ、I/Oドライバ、フィルタドライバ、及び/又は同様のもの等の、演算システム100上で動作する1つ以上のドライバ及び/又は他のソフトウェアモジュールを含むが、これらに限定されないソフトウェア及び/又はハードウェアコンポーネント;ハードウェアコントローラ、通信インタフェース、及び/又は同様のもの等のハードウェアコンポーネント等を備えていてもよい。記憶媒体140は、記憶装置141上で具現化されてもよい。記憶層130の一部(例えば、記憶コントローラ139)は、記憶装置141のハードウェア及び/又はソフトウェアコンポーネント(例えば、ファームウェア)として実装されてもよい。
【0019】
記憶コントローラ139は、記憶媒体140の特定の記憶位置における記憶操作を実施するよう構成されてもよい。本明細書中で用いるように、記憶位置とは、データを永続的に格納することができる記憶リソース(例えば、記憶媒体及び/又は装置)の記憶の単位を指し;記憶位置は、ページ、ページのグループ(例えば、論理ページ及び/又は論理ページ内部のオフセット)、記憶区分(例えば、物理消去ブロック、論理消去ブロック等)、セクタ、磁気ディスク上の位置、バッテリバックアップ付きメモリ位置、及び/又は同様のものを含んでもよいが、これらに限定されない。記憶位置は、記憶媒体140の記憶アドレス空間144内部でアドレス指定可能であってもよい。記憶アドレスは、物理アドレス、媒体アドレス、バックエンドアドレス、アドレスオフセット、及び/又は同様のものに相当してもよい。記憶アドレスは、任意の適切な記憶アドレス空間144、アドレス指定スキーム、及び/又は記憶位置の配置に相当してもよい。
【0020】
記憶層130は、記憶クライアント106がそれを介して記憶層130によって提供されるストレージサービスにアクセスしてもよいインタフェース131を備えていてもよい。記憶インタフェース131は、ブロックデバイスインタフェース、仮想化記憶インタフェース、1つ以上の仮想記憶ユニット(VSU)、オブジェクト記憶インタフェース、データベース記憶インタフェース、及び/又は他の適切なインタフェースのうちの1つ以上、及び/又はアプリケーションプログラミングインタフェース(API)を含んでもよい。
【0021】
記憶層130は、フロントエンド記憶インタフェースを介して記憶リソースを参照するために設けられてもよい。本明細書中で用いるように、「フロントエンド記憶インタフェース」とは、記憶クライアント106がそれを介して記憶層130の記憶リソースを参照してもよいインタフェース及び/又は名前空間を指す。記憶インタフェースは、論理アドレス空間132に対応してもよい。論理アドレス空間132は、識別子のグループ、セット、集合、範囲、及び/又は程度を備えていてもよい。本明細書中で用いるように、「識別子」又は「論理識別子」(LID)とは、ソ−スリソースを参照するための識別子を指し;LIDは、名前(例えば、ファイル名、識別名、及び/又は同様のもの)、データ識別子、リファレンス、リンク、LID、フロントエンド識別子、論理アドレス、論理ブロックアドレス(LBA)、論理ユニット番号(LUN)アドレス、仮想ユニット番号(VUN)アドレス、仮想記憶アドレス、記憶アドレス、物理アドレス、媒体アドレス、バックエンドアドレス、及び/又は同様のものを含んでもよいが、これらに限定されない。
【0022】
論理アドレス空間132の論理容量は、論理アドレス空間132内のLIDの数及び/又はサイズ及び/又はLIDによって参照される記憶リソースの粒度に対応してもよい。幾つかの実施形態において、論理アドレス空間132は「シンプロビジョニング」されてもよい。本明細書中で用いるように、シンプロビジョニングされる論理アドレス空間132とは、基本となる記憶リソースの物理的な記憶容量を超える(例えば、記憶媒体140の記憶容量を超える)論理容量を有する論理アドレス空間132を指す。一実施形態において、記憶層130は、記憶媒体140の物理的な記憶容量を超えてもよい64ビットの論理アドレス空間132(例えば、2の26乗のユニークなLIDを備える論理アドレス空間)を提供するよう構成される。大きな、シンプロビジョニングされる論理アドレス空間132は、記憶クライアント106が、LIDの隣接する範囲を割り当て/又は参照する一方で、命名競合の可能性を低減することを可能にしてもよい。
【0023】
記憶層130の変換モジュール134は、論理アドレス空間132のLIDを記憶リソース(例えば、記憶媒体140の記憶アドレス空間144内部に格納されるデータ)にマッピングするよう構成されてもよい。論理アドレス空間132は、バックエンド記憶リソース(例えば、記憶媒体140)とは無関係であってもよく;従って、論理アドレス空間132のLIDと記憶アドレス空間144の記憶アドレスとの間の何のセット又は所定のマッピングもなくてもよい。幾つかの実施形態において、論理アドレス空間132は、論理アドレス空間132のサイズが記憶媒体140の記憶アドレス空間144とは異なるように、点在し、シンプロビジョニングされ、及び/又はオーバープロビジョニングされる。
【0024】
記憶層130は、記憶媒体140上で実行される記憶操作に関する記憶メタデータ135を維持するよう構成されてもよい。記憶メタデータ135は、論理アドレス空間132のLIDと記憶アドレス空間144内部の記憶アドレスとの間の何れかから何れかへのマッピングを備える前方マップ、記憶媒体140の記憶位置の内容、妥当性ビットマップ、信頼性試験、及び/又はステータスメタデータに関する逆方向マップ、ステータス情報(例えば、エラー率、リタイアステータス等)、キャッシュメタデータ、及び/又は同様のものを含んでもよいが、これらに限定されない。記憶メタデータ135の一部は、演算システム100の揮発性メモリリソース102の内部に維持されてもよい。代替として、又は加えて、記憶メタデータ135の一部は、不揮発性記憶リソース103及び/又は記憶媒体140に格納されてもよい。
【0025】
図1Bは、論理アドレス空間132のLIDと記憶アドレス空間144内部のバックエンド識別子(例えば、記憶アドレス)との間の何れかから何れかへのマッピング150の一実施形態を示している。何れかから何れかへのマッピング150は、記憶メタデータ135の1つ以上のデータ構造内に維持されてもよい。
図1Bに示すように、変換モジュール134は、何れかの記憶リソース識別子(何れかのLID)を何れかのバックエンド記憶位置にマッピングするよう構成されてもよい。更に図示するように、論理アドレス空間132は、基本となる記憶アドレス空間144とは異なった大きさにされてもよい。
図1Bの実施形態において、論理アドレス空間132は、シンプロビジョニングされてもよく、よって、記憶アドレス空間144内の記憶アドレスの範囲よりも大きい範囲のLIDを備えていてもよい。
【0026】
上で開示したように、記憶クライアント106は、論理アドレス空間132のLIDを介して記憶リソースを参照してもよい。従って、論理アドレス空間132は、記憶リソースの論理インタフェース152に相当してもよく、記憶アドレス空間144内部の特定の記憶アドレスへのマッピングは、記憶リソースのバックエンドインタフェース154に相当してもよい。
【0027】
記憶層130は、前方マップ160において論理インタフェース152とバックエンドインタフェース154との間の何れかから何れかへのマッピング150を維持するよう構成されてもよい。前方マップ160は、インデックス、マップ、ハッシュマップ、ハッシュテーブル、ツリー、範囲符号化ツリー、bツリー、及び/又は同様のものを含むが、これらに限定されない任意の適切なデータ構造を備えていてもよい。前方マップ160は、記憶媒体140に格納されたデータを参照するよう用いるために割り当てられたLIDに対応するエントリ162を備えていてもよい。前方マップ160のエントリ162は、LID164A〜Dを記憶アドレス空間144内部のそれぞれの記憶アドレス166A〜Dに関連付けてもよい。前方マップ160は、点在して追加されてもよく、よって、記憶クライアント106によってその時点で割り当てられていないか、及び/又は、記憶媒体140に格納された有効データを参照するようその時点で使用されていないLIDに対応するエントリを除外してもよい。幾つかの実施形態において、前方マップ160は、エントリ162のうちの1つ以上が複数のLID(例えば、LIDの範囲、程度、及び/又はセット)に対応してもよいように、範囲符号化データ構造を備える。
図1Bの実施形態において、前方マップ160は、記憶アドレス166Aの対応する範囲にマッピングされたLID164Aの範囲に対応するエントリ162を含んでいる。エントリ162はLIDによってインデックス化されてもよい。
図1Bの実施形態において、エントリ162は、それぞれのリンクによってツリーデータ構造に編成されてもよい。しかし、本開示はこの点に限定されず、任意の適切なデータ構造及び/又はインデックス化機構を用いるよう成されてもよい。
【0028】
図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の記憶操作を実行することができてもよい一方で、第2のソリッドステート記憶素子116Bは異なる記憶操作を実行する。例えば、ソリッドステート記憶素子116Aは、第1の物理アドレスにおけるデータを読み取るよう構成されてもよい一方で、別のソリッドステート記憶素子116Bが異なる物理アドレスにおけるデータを読み取る。
【0029】
ソリッドステート記憶アレイ115はまた、論理記憶素子(LSE)とも呼ばれる。本明細書中で更に詳細に開示するように、ソリッドステート記憶アレイ115は、論理記憶単位(ロウ117)を備えていてもよい。本明細書中で用いるように、「論理記憶単位」又はロウ117とは、2つ以上の物理記憶単位の組み合わせを指し、各物理記憶単位はアレイ115の各カラム118上にある。論理消去ブロックとは2つ以上の物理消去ブロックのセットを指し、論理ページとは2つ以上のページのセットを指す、等である。幾つかの実施形態において、論理消去ブロックは、各論理記憶素子115及び/又はバンク内部に消去ブロックを備えていてもよい。代替として、論理消去ブロックは、複数の異なるアレイ115内部に消去ブロックを備えていてもよく、及び/又は、ソリッドステート記憶素子の複数のバンクにまたがっていてもよい。
【0030】
図1Aに戻って参照すると、記憶層130は更に、ログ構造化記憶構成で(例えば、記憶ログの形で)記憶媒体140上にデータを格納するよう構成されるログ記憶モジュール136を備えていてもよい。本明細書中で用いるように、「記憶ログ」又は「ログ構造」とは、記憶媒体140の記憶アドレス空間144内部のデータの順序付けられた配列を指す。記憶ログ内のデータは、永続的メタデータを備えるか、及び/又は、それに関連付けられてもよい。従って、記憶層130は、コンテキストの自己記述的なフォーマットでデータを格納するよう構成されてもよい。本明細書中で用いるように、コンテキスト又は自己記述的なフォーマットとは、データが永続的メタデータに関連して格納されるデータフォーマットを指す。幾つかの実施形態において、永続的メタデータは、データを特定するよう構成されてもよく、よって、データの論理インタフェースを備えるか、それを参照してもよい(例えば、データと関連するLIDを備えていてもよい)。永続的メタデータは、データの所有者、アクセス制御、データ型、データの相対位置又はオフセットに関する情報、データと関連する記憶操作に関する情報(例えば、アトミック記憶操作、トランザクション、及び/又は同様のもの)、ログシーケンス情報、データ記憶パラメータ(例えば、圧縮アルゴリズム、暗号化等)、及び/又は同様のものを含むが、これらに限定されない他の情報を含んでもよい。
【0031】
図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における他の記憶区分に対する記憶区分の順序によって決定されてもよい。
【0032】
幾つかの実施形態において、記憶層130は、ソリッドステート記憶媒体、フラッシュ記憶媒体、又は同様のもの等の非対称型の、ライトワンス記憶媒体140を管理するよう構成されてもよい。本明細書中で用いるように、「ライトワンス」記憶媒体とは、新しいデータがそれに書き込まれるか、プログラムされる度に再初期化される(例えば、消去される)記憶媒体を指す。本明細書中で用いるように、「非対称型」記憶媒体とは、異なる種類の記憶操作に対して異なる待ち時間を有する記憶媒体を指す。幾つかの実施形態において、例えば、読取り操作は、書込み/プログラム操作よりも高速であってもよく、書込み/プログラム操作は、消去操作よりも大幅に高速であってもよい(例えば、媒体を読み込むことは、消去よりも何百倍も高速であってもよく、記憶媒体をプログラミングすることよりも何十倍も高速であってもよい)。記憶媒体140は、グループとして消去することができる記憶区分に分割されてもよい(例えば、消去ブロック)。よって、単一データセグメントを「所定位置」で修正することは、データを備える消去ブロック全体を消去し、修正されるデータを、オリジナルの変化していないデータと共に消去ブロックに書き換えることを必要としてもよい。これは、結果として、媒体を過度に消耗させる非効率な「ライトアンプリフィケーション」を生じる。幾つかの実施形態において、従って、記憶層130は、データを「所定位置以外」に書き込むよう構成されてもよい。本明細書中で用いるように、データを「所定位置以外」に書き込むこととは、データを「所定位置」に上書きする(例えば、データのオリジナルの物理記憶位置を上書きする)のではなく、データを異なる記憶位置で更新及び/又は上書きすることを指す。データを所定位置以外で更新及び/又は上書きすることにより、修正されるべきデータを有する消去ブロック上の既存の有効データが、消去され、再度コピーされる必要がないため、ライトアンプリフィケーションを回避できる。更に、データを所定位置以外に書込むことにより、消去待ち時間が書込み操作の「クリティカルパス」の一部ではないように、多くの記憶操作の待ち時間パスからの消去を排除できる。
【0033】
記憶層130は、特に、ログ記憶モジュール136の使用によって所定位置以外の記憶操作を実行するよう構成されてもよい。ログ記憶モジュール136は、記憶媒体140上に「記憶ログ」を形成する記憶層130によって実行される記憶操作の相対的順序を維持する方法で、記憶アドレス空間144内部の現在の追記点において、データを追記するよう構成されてもよい。
図1Eは、記憶媒体140の記憶アドレス空間144内部で実行される追記のみの記憶操作の一実施形態を示している。上で開示したように、記憶アドレス空間144は、複数の記憶区分170A〜N(例えば、消去ブロック、論理消去ブロック、又は同様のもの)を備え、そのそれぞれは、データを格納することに用いるために初期化(例えば、消去)されてもよい。記憶区分170A〜Nは、本明細書中で開示するようなページ、論理ページ、及び/又は同様のものに対応してもよいそれぞれの記憶位置を備えていてもよい。記憶位置は、それぞれの記憶アドレス(例えば、記憶アドレス0から記憶アドレスN)を割り当てられてもよい。
【0034】
ログ記憶モジュール136は、物理アドレス空間144内の追記点180から順次データを格納するよう構成されてもよい。
図1Eの実施形態において、データは、記憶区分170Aの記憶位置182内の追記点180において追記されてもよく、記憶位置182が一杯になった場合、追記点180は、次に利用可能な記憶位置まで進んで181もよい。本明細書中で用いるように、「利用可能な」記憶位置とは、初期化され、未だプログラムされていない(例えば、消去された)記憶位置を指す。上で開示したように、幾つかの種類の記憶媒体は、一旦消去された後は、確実にプログラムすることのみ可能である。従って、利用可能な記憶位置とは、初期化(又は消去)状態にある記憶区分170A〜N内部の記憶位置を指してもよい。
【0035】
図1Eの実施形態において、論理消去ブロック170Bは、特に、消去状態にない(例えば、有効データを備えている)か、高いエラー率のために使用不能であるか、又は同様の理由のために、記憶に利用できないことがあり得る。従って、記憶位置182が一杯になった後、ログ記憶モジュール136は、利用できない記憶区分170Bをスキップし、追記点180を次に利用可能な記憶区分170Cに進めてもよい。ログ記憶モジュール136は、追記するデータを記憶位置183〜185に続けるよう構成されてもよく、この点で、追記点180は、上で開示したように、次に利用可能な記憶区分170A〜Nに続く。
【0036】
データを記憶アドレス空間144内の「最後の」記憶位置(例えば、記憶区分170Nの記憶位置N189)に格納した後、ログ記憶モジュール136は、第1の記憶区分170A(又は、記憶区分170Aが利用できない場合は、次に利用可能な記憶区分)に折り返すことによって追記点180を進めてもよい。従って、ログ記憶モジュール136は、記憶アドレス空間144をループ又はサイクルとして扱ってもよい。
【0037】
上で開示したように、記憶アドレス空間144内に順次追記するデータは、記憶媒体140に関する記憶ログを生成してもよい。
図1Eの実施形態において、記憶ログは、記憶アドレス空間144内の追記点180からデータパケット(及び/又は他のデータ構造)を順次格納することによって実行される記憶操作の順序付けられたシーケンスを備えていてもよい。追記のみの記憶フォーマットは、上で開示したように、所定位置以外でデータを修正及び/又は上書きするために用いられてもよい。修正及び/又は上書きされるデータを備える記憶区分170A〜N上の既存の有効データが消去及び/又は再度コピーされる必要がないため、所定位置以外で記憶操作を実行することにより、ライトアンプリフィケーションを回避してもよい。更に、データを所定位置以外に書込むことにより、多くの記憶操作の待ち時間パスからの消去を排除できる(消去待ち時間が、もはや書込み操作の「クリティカルパス」の一部ではない)。
【0038】
図1Eの実施形態において、LID Aに対応するデータセグメントX0は、記憶位置191に格納されてもよい。データセグメントX0は、上で開示した自己記述型パケットフォーマット110で格納されてもよい。パケット110のデータセグメント112はデータセグメントX0を備えていてもよく、永続的メタデータ114はデータセグメントと関連するLID(例えば、LID A)を備えていてもよい。記憶クライアント106は、データセグメントX0をデータセグメントX1で置換することを含んでもよいLID Aと関連するデータを修正及び/又は上書きする操作を要求してもよい。記憶層130は、記憶位置191の所定位置における既存のデータパケット110を修正するのではなく、記憶媒体144上の異なる記憶位置193にデータセグメントX1を備える新規パケット110を追記することによって、この所定位置以外の操作を実行してもよい。記憶操作は更に、LID Aを記憶位置193の記憶アドレスと関連付けるか、及び/又は、記憶位置191の廃止データX0を無効化するよう記憶メタデータ135を更新することを含んでいてもよい。
図1Eに示すように、記憶メタデータ135を更新することは、LID A 164Eを修正されたデータセグメントX1の記憶アドレスと関連付けるよう前方マップ160のエントリを更新することを含んでいてもよい。
【0039】
所定位置以外で記憶操作を実行すること(例えば、データを記憶ログに追記すること)は、結果として、記憶媒体140上に残る廃止又は無効データ(例えば、所定位置以外で消去、修正、及び/又は上書きされたデータ)を生じる場合がある。
図1Eに示すように、記憶位置191における所定位置でデータセグメントX0を上書き及び/又は置換することとは対照的に、データセグメントX1を記憶ログに追記することによってLID Aのデータを修正することは、結果として、記憶媒体140上にデータセグメントX0の廃止バージョンを維持することを招く。上で開示したように、データセグメントX0を消去することは、記憶区分170A全体を消去するか、及び/又は、時間のかかる操作であり、結果としてライトアンプリフィケーションを生じる場合がある記憶区分170A上の有効データを再配置することを伴う恐れがあるため、データセグメントX0の廃止バージョンは、記憶媒体140から即座に削除(例えば、消去)されないことがあり得る。同様に、もはや使用されていない(例えば、消去されるか、トリム操作を受ける)データは、即座に削除されないことがあり得る。よって、時が経つにつれて、記憶媒体140は、かなりの量の「無効」データを蓄積する場合がある。
【0040】
記憶層130は、記憶メタデータ135(例えば、前方マップ160)の使用によって、記憶位置191におけるデータセグメントX0等の無効データを特定してもよい。記憶層130は、前方マップ160において有効な識別子(LID)と関連付けられていない記憶位置が、記憶媒体140上で保管される必要のないデータを備えていることを判断してもよい。代替として、又は加えて、記憶層130は、削除されたか、トリムされたか、廃止であるか、及び/又は、そうでなければ無効であるデータを効率的に特定するよう、妥当性ビットマップ、逆方向マップ、及び/又は同様のもの等の他の記憶メタデータ135を維持してもよい。
【0041】
記憶層130は、無効データによって占有された記憶リソースを再利用するよう構成されてもよい。記憶層130は更に、(データ劣化、書込み妨害、読取り妨害、及び/又は同様のものによるエラー状態を防止するよう)記憶媒体140上に格納されたデータをリフレッシュすること、媒体信頼性条件を監視すること、及び/又は同様のことを含むが、これらに限定されない他の媒体管理操作を実行するよう構成されてもよい。本明細書中で用いるように、記憶区分170A〜N等の記憶リソースを再利用することとは、新しいデータがそれらに格納/プログラムされてもよいように記憶区分170A〜Nを消去することを指す。記憶区分170A〜Nを再利用することは、記憶区分170A〜N上の有効データを新しい記憶位置に再配置することを含んでいてもよい。記憶層130は、記憶区分170A〜N内の無効データの量、記憶区分170A〜N内の有効データの量、ウェアレベル(例えば、プログラム/消去サイクル数)、記憶区分170A〜Nがプログラム又はリフレッシュされてからの時間、等を含んでもよいが、これらに限定されない1つ以上の要因に基づく再利用に対して、記憶区分170A〜Nを特定してもよい。
【0042】
記憶層130は、記憶媒体140上の記憶ログの内容の使用によって、前方マップ160を含む記憶メタデータ135を再構築するよう構成されてもよい。
図1Eの実施形態において、LID Aと関連するデータの現行バージョンは、記憶位置191及び193それぞれにおけるデータパケット110の相対的なログ順序に基づいて判断されてもよい。記憶位置193におけるデータパケットは、記憶ログ内の記憶位置191におけるデータパケットの後に順序付けられているため、記憶層130は、記憶位置193がLID Aに対応するデータのつい最近の最新バージョンを備えていることを判断してもよい。記憶層130は、LID Aを(記憶位置191の廃止データではなく)記憶位置193のデータパケットと関連付けるよう前方マップ160を再構築してもよい。
【0043】
図2は、記憶層130を備えるシステム200の別の実施形態を示している。記憶媒体140は、複数の独立バンク119A〜Nを備えていてもよく、それぞれは、1つ以上の記憶アレイ115A〜Nを備えていてもよい。各独立バンク119A〜Nは、相互接続127を介して記憶コントローラ139に結合されてもよい。
【0044】
記憶コントローラ139は、バス127を介して記憶層130からの記憶リクエストを受信するよう構成される記憶リクエストレシーバモジュール231を備えていてもよい。記憶リクエストレシーバ231は更に、記憶層130及び/又は記憶クライアント106へ/からデータを転送するよう構成されてもよい。従って、記憶リクエストレシーバモジュール231は、1つ以上の直接メモリアクセス(DMA)モジュール、リモートDMAモジュール、バスコントローラ、ブリッジ、バッファ、等を備えていてもよい。
【0045】
記憶コントローラ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つ以上の同期バッファを備えていてもよい。
【0046】
ログ記憶モジュール136は、データ記憶操作のための記憶位置を選択するよう構成されてもよく、アドレス指定及び/又は制御情報を独立バンク119A〜Nの記憶アレイ115A〜Nに提供してもよい。本明細書中に開示するように、ログ記憶モジュール136は、記憶媒体140の記憶アドレス空間144内にログフォーマットで順次データを追記するよう構成されてもよい。
【0047】
データを書き込むための記憶操作は、a)1つ以上のデータパケットを記憶媒体140上の記憶ログに追記することと、b)データのLIDを1つ以上のデータパケットの記憶アドレスと関連付けるよう記憶メタデータ135を更新することとを備えていてもよい。幾つかの実施形態において、記憶メタデータ135は、記憶コントローラ139のメモリリソース上(例えば、記憶媒体140を備える記憶装置141の専用揮発性メモリリソース上)に維持されてもよい。代替として、又は加えて、記憶メタデータ135の一部は、記憶層130内部(例えば、
図1Aの演算装置110の揮発性メモリ112上)で維持されてもよい。幾つかの実施形態において、記憶メタデータ135は、記憶層130によって揮発性メモリ内に維持されてもよく、記憶媒体140上に定期的に格納されてもよい。
【0048】
記憶コントローラ139は更に、記憶リクエストレシーバモジュール231を介して受信したリクエストに応じて記憶媒体140上の記憶ログからデータを読み取るよう構成されるデータ読取りモジュール241を備えていてもよい。リクエストは、要求したデータのLID、要求したデータの記憶アドレス、及び/又は同様のものを備えていてもよい。読取りモジュール241は、a)特に、前方マップ160の使用によって要求されたデータを備えるデータパケット110の記憶アドレスを決定し、b)記憶媒体140上の決定された記憶アドレスからデータパケット110を読み取り、c)要求されたエンティティによる使用のためにデータを処理するよう構成されてもよい。記憶媒体140から読み取られたデータは、読取りバッファ245を介して読取りモジュール241に流してもよい。読取りバッファ245は、上で説明したように、クロックドメイン同期のために1つ以上の読取り同期バッファを備えていてもよい。読取り処理モジュール243は、a)解凍処理、b)復号化処理、c)1つ以上のデータパケット110(及び/又は他のコンテナ)からデータを抽出、d)ECC処理を実行、等のうちの1つ以上を含んでもよいが、これらに限定されない、記憶媒体144から読み取られたデータを処理するよう構成されてもよい。
【0049】
記憶コントローラ139は更に、書込みモジュール240及び/又は読取りモジュール241のデータ及び/又は命令を特定の独立バンク119A〜Nへ/から選択的にルーティングするよう構成されるバンクコントローラ252を備えていてもよい。幾つかの実施形態において、記憶コントローラ139は、独立バンク119A〜N間の記憶操作をインターリーブするよう構成される。記憶コントローラ139は、例えば、書込みモジュール240からのデータがバンク119Bの記憶アレイ115Bにプログラムされている間に、バンク119Aの記憶アレイ115Aから読取りモジュール241へ読み取ってもよい。マルチバンク記憶操作の更なる実施形態は、David Flynnらの2006年12月12日出願の米国特許出願第11/952,095号明細書、名称「Apparatus,System,and Method for Managing Commands for Solid−State Storage Using Bank Interleave」に開示されており、引用して本明細書に組み込む。
【0050】
書込み処理モジュール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日出願の米国特許出願第13/830,652号明細書、名称「Systems and Methods for Adaptive Error−Correction Coding」に開示されており、引用して本明細書に組み込む。
【0051】
幾つかの実施形態において、記憶層130は、ハイレベルの記憶操作を効率的に実施するよう論理アドレス空間132を活用する。記憶層130は、「クローン」又は「論理コピー」操作を実施するよう構成されてもよい。本明細書中で用いるように、「クローン」又は「論理コピー」とは、記憶層130によって管理されるデータを効率的に複写又は複製する操作を指す。クローン操作は、「オリジナルの」LIDのセットと同じデータに相当する「クローン化された」LIDのセットを作成することを含んでいてもよい。クローン操作は、従って、2つ(以上)の異なる論理インタフェース(例えば、LIDの異なるセット)を用いて記憶位置の同じセットを参照することを含んでいてもよい。クローン操作は、従って、記憶媒体140上に格納された1つ以上のデータパケット110の論理インタフェースを修正することを含んでいてもよい。「論理移動」とは、記憶層130によって管理されるデータの論理インタフェースを修正する操作を指してもよい。論理移動操作は、記憶媒体140上に格納されたデータを参照するために用いられるLIDを変更することを含んでいてもよい。「マージ」操作は、論理アドレス空間132の異なる部分をマージすることを含んでいてもよい。本明細書中で更に詳細に開示するように、クローン及び/又は移動操作は、重複排除、スナップショット、論理コピー、アトミック操作、トランザクション、及び/又は同様のもの等のよりハイレベルな記憶操作を効率的に実施するために用いられてもよい。
【0052】
図3Aを参照すると、記憶層130は、クローン操作、移動操作、マージ操作等の記憶層130によって管理されるデータに関する論理インタフェース操作を管理するよう構成される論理インタフェース管理モジュール334を備えていてもよい。LIDのクローンを作成することは、特に、LIDの2つ以上の異なるセットの使用によって、データが参照されることを可能にするために、記憶媒体140内に格納されたデータの論理インタフェースを修正することを含んでいてもよい。従って、クローンを作成することは、a)LIDのセットを論理アドレス空間132(又はその専用部分)内に割り当てることと、b)特に、記憶メタデータ135の使用によって、割り当てたLIDをLIDの「オリジナルの」セットと同じ記憶位置に関連付けることとを含んでいてもよい。クローンを作成することは、従って、1つ以上のエントリを、クローン化したLIDの新しいセットを記憶位置の特定のセットに関連付けるよう構成される前方マップ160に追加することを含んでいてもよい。
【0053】
論理インタフェース管理モジュール334は、クローン同期ポリシーに従うクローン操作を実施するよう構成されてもよい。クローン同期ポリシーは、複数のクローン即ちコピーのうちの第1のものに関して実行される操作がどのように他のクローン即ちコピーに増殖するかを決定するために用いられてもよい。例えば、クローンは、クローンのうちの1つを展開するリクエストが他のクローン及び/又はコピーを展開することを含むように、割当操作に対して同期させてもよい。本明細書中で用いるように、ファイル(又は他のデータセグメント)を展開することとは、1つ以上の論理識別子をクローンに追加すること、クローンに割り当てられた論理識別子のうちの1つ以上を修正すること、及び/又は同様のものを含んでもよいファイルのサイズ、範囲、及び/又は程度を増加させることを指す。クローン同期ポリシーは、特に、クローンがマージ及び/又は折り畳み操作(更に詳細に以下で開示する)において組み合わされる場合に、クローン間の相違がどのように管理されるかを決定してもよいマージポリシーを備えていてもよい。
【0054】
図3Aは、記憶層130によって実施される範囲クローン操作の一実施形態を示す。
図3Aの範囲クローン操作は、記憶クライアント106からのリクエストに応じて実施されてもよい。幾つかの実施形態において、記憶層130のインタフェース131は、クローン操作を実行するためのインタフェース及び/又はAPIを提供するよう構成されてもよい。代替として、又は加えて、範囲クローン操作は、アトミック操作、トランザクション、スナップショット、論理コピー、ファイル管理操作、及び/又は同様のもの等のよりハイレベルな操作の一部として実行されてもよい。
【0055】
図3Aに示すように、記憶層130の前方マップ160は、LID1024〜2048を媒体記憶位置3453〜4477に結合するよう構成されるエントリ362を備えている。他のエントリは、図示の実施形態の詳細を曖昧にしないために
図3Aから省略する。本明細書中に開示するように、エントリ362、及びその結合は、それを介して記憶クライアント106が対応するデータ(例えば、データセグメント312)を参照してもよい論理インタフェース311Aを定義してもよく、記憶クライアント106は、LID1024〜2048の使用によって、記憶層130を介してデータセグメント312(及び/又はその一部)にアクセスするか、及び/又はそれを参照してもよい。従って、LID1024〜2048は、特に、データセグメント312の論理インタフェース311Aを定義する。
【0056】
本明細書中に開示するように、記憶層130は、記憶媒体140上にコンテキストフォーマット(例えば、パケットフォーマット110)でデータを格納するよう構成されてもよい。
図3Aの実施形態において、記憶位置3453〜4477におけるデータパケット310は、データセグメント312を備えている。データパケット310は更に、データセグメント312の論理インタフェースを示す(例えば、データセグメント312をLID1024〜2048と関連付ける)永続的メタデータ314を含んでいる。上で開示したように、記述的な永続的メタデータと関連するデータを格納することにより、記憶層130が、記憶ログの内容から前方マップ160(及び/又は他の記憶メタデータ135)をリビルドすることを可能にしてもよい。
図3Aの実施形態において、エントリ362は、記憶アドレス3453〜4477に格納されたデータを、パケット310の永続的メタデータ314によって参照されたLID1024〜2048と関連付けることによって再構築されてもよい。
図3Aは単一のパケット310を示しているが、本開示はこれに関して限定されない。幾つかの実施形態において、エントリ362のデータは、複数の異なるパケット310に格納されてもよく、それぞれはそれぞれの永続的メタデータ314(例えば、各記憶位置に対する別々のパケット、等)を備えている。
【0057】
論理インタフェース管理モジュール334は、特に、クローン化されるオリジナルのLIDに対応するLIDの新しいセットを割り当て、新規LIDをオリジナルのソースLIDの記憶位置に結合することによって、エントリ362をクローン化するよう構成されてもよい。
図3Bに示すように、LID1024〜2048のクローンを作成することは、LID6144〜7168の同等のセットを割り当て、識別子のクローン化されたセットを記憶アドレス3453〜4477に結合する論理インタフェース管理モジュール334を備えていてもよい。クローンを作成することは、従って、記憶媒体140上で複写及び/又は複製される基本となるデータセグメント312を必要とすることなく、LID6144〜7168を含むようデータセグメント312の論理インタフェース311Bを展開するために、記憶メタデータ135を修正することを含んでいてもよい。
【0058】
データセグメント312の修正された論理インタフェース311Bは、記憶位置3453〜4477に格納された対応するデータパケット310のコンテキストフォーマットと矛盾している場合がある。上で開示したように、データパケット310の永続的メタデータ314は、LID1024〜2048を参照するが、クローン化されたLID6144〜7168を含まないか、及び/又は参照しない。データセグメント312のコンテキストフォーマットは、修正された論理インタフェース311Bと一致するよう更新され(例えば、データを、LID1024〜2048のみとは対照的に、LID1024〜2048及び6144〜7168と関連付けるよう更新され)てもよく、これは、データセグメントをLIDの両セットと関連付けるパケットフォーマットでデータセグメントを書き換えることを含んでいてもよい。記憶装置141がランダムアクセスの所定位置に書き込む記憶装置である場合、永続的メタデータ314は、所定位置で更新されてもよい。ライトワンスの非対称型記憶媒体140を備える他の実施形態において、かかる所定位置の更新は、非効率であり得る。従って、記憶層130は、データが、(媒体管理モジュール370によって)記憶回復、再配置、及び/又は同様のもの等の媒体管理操作において再配置されるまで、矛盾したコンテキストフォーマットでデータを維持するよう構成されてもよい。データセグメント312のコンテキストフォーマットを更新することは、データセグメント312を記憶媒体140上に再配置及び/又は書き換えることを含んでいてもよく、これは、データセグメント312が大きい場合、及び/又は、クローンが多数のLIDを備える場合に、時間のかかるプロセスである場合があり、特に非効率である場合がある。従って、幾つかの実施形態において、記憶層130は、クローン化されたデータセグメント312のコンテキストフォーマットを更新することを先延ばしするか、及び/又は、1つ以上のバックグラウンド操作においてコンテキストフォーマットを更新してもよい。その間に、記憶層130は、矛盾したコンテキストフォーマット(データパケット310)内に格納される間に、データセグメント312に対するアクセスを提供するよう構成されてもよい。
【0059】
記憶層130は、対応するデータセグメント312のコンテキストフォーマットが更新される前に、クローン操作の完了を通知するよう構成されてもよい。データは、その後、記憶媒体140上に更新されたコンテキストフォーマットで書き換えられ(例えば、再配置され)てもよい。更新は、クローン操作及び/又は他のフォアグラウンド記憶操作の「クリティカルパス」の外側で生じてもよい。幾つかの実施形態において、データセグメント312は、記憶回復プロセス、データリフレッシュ操作、及び/又は同様のもののうちの1つ以上の一部として、媒体管理モジュール370によって再配置される。従って、記憶クライアント106は、(例えば、LID1024〜2048及び/又は6144〜7168に関して)修正された論理インタフェース311Bを介して、修正された論理インタフェース311Bに従って更新されるべきデータセグメント312のコンテキストフォーマットを待つことなく、データセグメント312にアクセスできてもよい。
【0060】
データセグメント312のコンテキストフォーマットが記憶媒体140上で更新されるまで、データセグメント312の修正された論理インタフェース311Bは、記憶メタデータ135(例えば、マップ160)内のみに存在してもよい。従って、前方マップ160が、特に、電源障害又はデータの破損によって失われた場合、クローン操作は、再構築される記憶メタデータ135において反映されなくてもよい(クローン操作は、永続的及び/又はクラッシュセーフでなくてもよい)。上で示したように、データパケット310の永続的メタデータ314は、データセグメント312がLID6144〜7168ではなく1024〜2048のみと関連付けられていることを示している。従って、エントリ362のみが再構築され(
図3Aのように)、エントリ364は除外され、結果として、修正された論理インタフェース311Bを介して(例えば、6144〜7168を介して)データセグメント312にアクセスするその後の試行は失敗する場合がある。
【0061】
幾つかの実施形態において、クローン操作は更に、クローン操作を永続的及び/又はクラッシュセーフにするよう、記憶媒体140上に永続的ノートを格納することを含んでいてもよい。本明細書中で用いるように、「永続的ノート」とは、記憶媒体140上に格納されるメタデータを指す。永続的ノート366は、ログ順序に相当してもよく、及び/又は、本明細書中に開示するように、パケットフォーマットに格納されてもよい。永続的ノート366は、データセグメント312の修正された論理インタフェース311Bの指示を備えていてもよい。
図3Bの実施形態において、図示するクローン操作に対応する永続的ノート366は、記憶アドレス3453〜4477に格納されたデータを、LID1024〜2048及び6144〜7168の両範囲と関連付けるよう構成されてもよい。記憶媒体140の内容から前方マップ160を再構築する間、永続的ノート366は、データセグメント312を、更新された論理インタフェース311Bの両LID範囲と関連付けるよう、両エントリ362及び364を再構築するために用いられてもよい。幾つかの実施形態において、記憶層130は、記憶メタデータ135を更新すること(例えば、エントリ364を作成すること)、及び、記憶媒体140上に永続的ノート366を格納することに応じて、クローン操作の完了を通知してもよい。永続的ノート366は、更新された論理インタフェース311Bと一致するようデータセグメント312のコンテキストフォーマットを更新すること(例えば、上で開示したように、データセグメント312を再配置及び/又は書き換えること)に応じた記憶媒体140からの削除のために、無効にされるか、及び/又は、印を付けられてもよい。
【0062】
幾つかの実施形態において、データセグメント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)を永続させることに応じて、永続的ノート366は、データセグメント312が更新されたコンテキストフォーマットに未だ書き換えられていなくても、上で開示したように無効化されてもよい。
【0063】
論理インタフェース管理モジュール334は、「コピーオンライトモード」を含む1つ以上の異なるモードに従ってクローン操作を実施するよう構成されてもよい。
図3Dは、コピーオンライトモードにおいてクローン化された範囲内で実行される記憶操作の一実施形態を示している。コピーオンライトモードにおいて、クローンを作成した後に生じる記憶操作は、クローンに互いから分岐させてもよい(例えば、エントリ362及び364は、異なる記憶アドレス、範囲、及び/又は程度を参照してもよい)。
図3Dの実施形態において、記憶層130は、データセグメント312を、(
図3Cに示すように)データセグメント312を両LID範囲1024〜2048及び6144〜7168と関連付けるよう構成される更新されたコンテキストデータフォーマット(パケット320)に書き込んでいる。記憶クライアント106は、次いで、LID6657〜7168に対応するデータを修正及び/又は上書きするよう1つ以上の記憶リクエストを発行してもよい。
図3Dの実施形態において、記憶リクエストは、LID6657〜7168のデータを修正及び/又は上書きすることを含んでいる。これに応じて、記憶層130は、新規の、及び/又は修正されたデータを記憶媒体130上に格納してもよく、これは、上で開示したように、新規データパケット340を記憶ログに追記することを含んでいてもよい。データパケット340は、(例えば、パケット340の永続的メタデータ344の使用により)データセグメント342をLID6657〜7424と関連付けてもよい。前方マップ160は、LID6657〜7424をデータセグメント342と関連付けるよう更新されてもよく、これは、エントリ364を、データセグメント312内のデータの未修正部分を参照し続けるよう構成されるエントリ365と、記憶アドレス78512〜79024に格納される新規データセグメント342を参照するエントリ367とに分割することを含んでいてもよい。
図3Dに示すコピーオンライトモードにおいて、LID1024〜2048に対応するエントリ362は、変更されなくてもよく、記憶アドレス64432〜65456のデータセグメント312を参照し続けてもよい。
図3Dには示していないが、範囲1024〜2048内の修正は、結果として、エントリ362に影響を及ぼす同様の分岐変化を生じてもよい。その上、記憶リクエストは、データを修正及び/又は上書きすることに限定されない。他の操作は、LIDのセットを展開する(データを追記する)こと、LIDを削除する(データを抹消、切り捨て、及び/又はトリムする)こと、及び/又は同様のことを含んでいてもよい。
【0064】
幾つかの実施形態において、記憶層130は、「同期クローン」モード等の他のクローンモードに対応してもよい。同期クローンモードにおいて、LIDのクローン化された範囲内で行われる変更は、1つ以上の他の対応する範囲に反映されてもよい。
図3Dの実施形態において、「同期クローン」モードで説明した記憶操作を実施することは、本明細書中に開示するように、新規データセグメント342を参照するようエントリ362を更新することを含んでいてもよく、特に、エントリ362を、LID1024〜1536をオリジナルのデータセグメント312の一部と関連付けるよう構成されるエントリに分割することと、LID1537〜2048を新規データセグメント342と関連付けるよう構成されるエントリを追加することとを含んでいてもよい。
【0065】
図3Dのコピーオンライトの実施形態に戻って参照すると、論理インタフェース管理モジュール334は更に、クローンマージ操作を管理するよう構成されてもよい。本明細書中で用いるように、「マージ」又は「クローンマージ」とは、LIDの2つ以上の異なるセット及び/又は範囲を組み合わせるための操作を指す。
図3Dの実施形態において、範囲マージ操作は、エントリ362に対応するクローン化エントリ365及び367とをマージすることを含んでいてもよい。論理インタフェース管理モジュール334は、より最近の変化が早期の変化をオーバーライドする書込み順序ポリシー;記憶操作の相対的優先度に基づく(例えば、記憶操作と関連する記憶クライアント106、アプリケーション、及び/又はユーザのプロパティに基づく)優先度ベースポリシー;完了インジケータ(例えば、アトミック記憶操作の完了、アトミック記憶操作の失敗、又は同様のもの);fadviseパラメータ;ioctrlパラメータ;及び/又は同様のもの等の、マージポリシーに従って範囲マージ操作を実施するよう構成されてもよい。
【0066】
図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から割り当て解除されるか、及び/又は削除されてもよい。
【0067】
図3Eに示す範囲マージ操作は、結果として、論理インタフェース311Cをデータの一部に修正することを招く場合がある。データセグメント342(データパケット340)のコンテキストフォーマットは、データセグメント342を、マージされたLID1537〜2048ではなく、LID6657〜7168と関連付けてもよい。上で開示したように、記憶層130は、矛盾したコンテキストフォーマットに格納されるデータセグメント342に対するアクセスを提供してもよい。記憶層130は、更新されたコンテキストフォーマットでデータセグメント342を格納するよう構成されてもよく、データセグメント342は、1つ以上のバックグラウンド操作(例えば、記憶回復操作)において、LID1537〜2048と関連付けられる。幾つかの実施形態において、範囲マージ操作は更に、データセグメント342を更新された論理インタフェース311Cと関連付ける(例えば、記憶アドレス78512〜79024のデータセグメント342をLID1537〜2048と関連付ける)よう、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。上で開示したように、永続的ノート366は、範囲マージ操作が永続的であり、クラッシュセーフであることを確実にするために用いられてもよい。永続的ノート366は、論理インタフェース311Cと一致するコンテキストフォーマットでデータセグメント342を再配置する(例えば、データセグメント342をLID1537〜2048と関連付ける)こと、前方マップ160を永続させること、及び/又は同様のことに応じて、削除されてもよい。
【0068】
図3A〜Eと関連して開示されるクローン操作は、範囲移動操作等の他の論理操作を実施するために用いられてもよい。
図3A〜Cに戻って参照すると、前方マップ160のエントリ362を複製するクローン操作は、データセグメント312をLID1024〜2048のオリジナルのセット及び(エントリ364の)クローン化されたLID6144〜7168の新しいセットの両方と関連付けるよう、データセグメント312と関連する論理インタフェースを修正することを含んでいてもよい。クローン操作は更に、データセグメント312の更新された論理インタフェース311Bを示す永続的ノート366を格納すること、及び/又は、1つ以上のバックグラウンド記憶操作において更新された論理インタフェース311Bに従ってデータセグメント312を書き換えることを含んでもよい。
【0069】
論理インタフェース管理モジュール334は更に、「範囲移動」操作を実施するよう構成されてもよい。本明細書中で用いるように、「範囲移動」操作とは、データセグメントをLIDの異なるセットと関連付けるよう1つ以上のデータセグメントの論理インタフェースを修正することを指す。範囲移動操作は、従って、1つ以上のデータセグメントを更新された論理インタフェースと関連付けるよう記憶メタデータ135(例えば、前方マップ160)を更新することと、データセグメントの更新された論理インタフェースを示す永続的ノート366を記憶媒体140上に格納することと、本明細書中に開示するように、更新された論理インタフェースと一致するコンテキストフォーマット(パケットフォーマット310)でデータセグメントを書き換えることとを含んでいてもよい。従って、記憶層130は、
図3A〜Eと関連して上で開示したものと同じ機構及び/又は処理ステップを用いて、範囲移動操作を実施してもよい。
【0070】
図3A〜Eに開示するクローン及び/又は範囲移動操作は、記憶層130に関して特定の制限を課してもよい。上で開示したように、データをコンテキストフォーマットで格納することは、データを参照する各LIDとデータを関連付けることを含んでいてもよい。
図3Cの実施形態において、永続的メタデータ324は、両LID範囲1024〜2048及び6144〜7168に対する参照を備えている。データセグメントに対する番号参照を増加することは、従って、コンテキストデータフォーマットのオーバーヘッドの対応する増加を課す(例えば、永続的メタデータ324のサイズを増加させる)。幾つかの実施形態において、永続的メタデータ314のサイズは制限されてもよく、それは、特定のデータセグメント312を参照できる参照及び/又はクローンの数を制限してもよい。その上、異なるLIDに対する複数の参照を含むことは、記憶回復操作を複雑にする場合がある。データセグメント312が再配置される場合に更新される必要がある前方マップエントリの数は、データセグメント312を参照するLIDの数に従って変化してもよい。
図3Cに戻って参照すると、グルーミング及び/又は記憶回復操作においてデータセグメント312を再配置することは、2つの別々のエントリ362及び364を更新することを含んでいてもよい。N個の異なるLID(例えば、N個の異なるクローン)によって参照されるデータセグメントを再配置することは、前方マップ160内のN個の異なるエントリを更新することを含んでいてもよい。同様に、データセグメントを格納することは、N個のエントリを永続的メタデータ314に書き込むことを含んでいてもよい。この可変オーバーヘッドは、バックグラウンド記憶回復操作の実行を低減してもよく、対応できる同時発生するクローン及び/又は参照の数を制限してもよい。
【0071】
幾つかの実施形態において、論理インタフェース管理モジュール334は、クローン操作によって課せられるオーバーヘッドを低減するよう中間マッピング層を備えるか、及び/又は、それを活用してもよい。中間マッピング層は、効率的なクローン化操作(並びに、本明細書中で更に詳細に開示するような、他の操作)を容易にするよう構成される「参照エントリ」を備えていてもよい。本明細書中で用いるように、「参照エントリ」とは、前方マップ160(及び/又は他の記憶メタデータ135)内の他のエントリを参照するために用いられるマッピングデータ構造のエントリを指す。参照エントリは、論理アドレス空間132内の1つ以上の他のエントリによって参照されている間だけ存在してもよい。幾つかの実施形態において、参照エントリは、記憶クライアント106にアクセスできなくてもよく、及び/又は、不変であってもよい。記憶層130は、記憶クライアントが、単一参照エントリインタフェースを経由して、複数の異なる論理インタフェースを介してデータの同じセットを参照することを可能にするよう、参照エントリを活用してもよい。記憶媒体140上のデータ(複数のLIDによって参照されるデータ)のコンテキストフォーマットは、順に、他の永続的メタデータ(例えば、永続的ノート366)を介してN個の他の論理インタフェースと関連付けられるデータを参照エントリと関連付けるよう簡素化されてもよい。クローン化されたデータを再配置することは、従って、参照エントリとデータセグメントの新規記憶アドレスとの間の単一マッピングを更新することを含んでいてもよい。
【0072】
図4Aは、効果的なオープン−クローズ整合性のためのシステム400の別の実施形態のブロック図である。システム400は、中間マッピング層の使用によって範囲クローン操作を実施するよう構成される記憶層130を含んでいる。記憶メタデータ135は、論理アドレス空間132に関する前方マップ160を備えていてもよい。前方マップ160(及び/又は他の記憶メタデータ135)は、上で開示したような、記憶クライアント106による論理アドレス空間の割当、記憶アドレス空間144内のLIDと記憶アドレスとの間の結合、等に関する情報を含んでもよい。
【0073】
図4Aの実施形態において、論理インタフェース管理モジュール334は、参照マップ460の使用によってクローン操作を管理するよう構成される参照モジュール434を備えていてもよい。参照マップ460は、論理アドレス空間132の1つ以上の論理インタフェース(例えば、LIDの1つ以上のセット)によって参照されるデータに対応する参照エントリを備えていてもよい。参照モジュール434は、もはや有効データを参照するために用いられない、及び/又は、前方マップ160内のエントリによってもはや参照されない参照エントリを削除するよう構成されてもよい。
図4Aに示すように、参照エントリは、前方マップ160とは別に(例えば、別々の参照マップ460に)維持されてもよい。参照エントリは、論理アドレス空間132よりも別の名前空間に維持されてもよい参照識別子の使用によって特定されてもよい。従って、参照エントリは、記憶層インタフェース131を介して記憶クライアント106に直接アクセス可能な論理アドレス空間132とは独立した別の中間の「仮想」又は「参照」アドレス空間432の一部であってもよい。代替として、幾つかの実施形態において、参照エントリは、記憶クライアント106によって直接アクセスできない論理アドレス空間132の所定の範囲及び/又は部分から選択されるLIDを割り当てられてもよい。
【0074】
論理インタフェース管理モジュール334は、前方マップ160内の1つ以上のLIDエントリを参照マップ460内の参照エントリにリンクさせることによってクローン操作を実施するよう構成されてもよい。参照エントリは、クローン化されたデータの記憶アドレスに結合されてもよい。従って、クローン化されたデータと関連するLIDは、参照マップ460を介して間接的に基本となるデータを参照してもよい(例えば、LIDは、順に、記憶アドレスにマッピングされる参照エントリにマッピングされてもよい)。従って、クローン化されたデータに対応する前方マップ160内のエントリは、「間接エントリ」と呼ばれてもよい。本明細書中で用いるように、「間接エントリ」とは、参照マップ460内の参照エントリを参照するか、及び/又はそれにリンクされる前方マップ160内のエントリを指す。間接エントリは、論理アドレス空間132内部でLIDを割り当てられてもよく、記憶クライアント106にアクセス可能であってもよい。
【0075】
上で開示したように、LIDの特定のセットをクローン化した後、記憶クライアント106は、クローン化された範囲のうちの1つ以上の内部で記憶操作を実行してもよく、それにより、(クローンモードに従って)クローンに互いから分岐させてもよい。「コピーオンライト」モードにおいて、特定のクローンに対して行われた変更は、他のクローン化された範囲に反映されなくてもよい。
図4Aの実施形態において、クローンに対して行われた変更は、間接エントリと関連する「ローカル」エントリに反映されなくてもよい。本明細書中で用いるように、「ローカルエントリ」とは、記憶媒体140の1つ以上の記憶アドレスに直接マッピングされる間接エントリの一部を指す。従って、ローカルエントリは、特定のクローンにおいて変更された、及び/又は、他のクローンの内容とは異なるデータを参照するよう構成されてもよい。ローカルエントリは、従って、特定のクローンに対してユニークなデータに対応してもよい。
【0076】
変換モジュール134は、特に、参照マップ460及び/又は参照モジュール434の使用によりクローン化されたデータと関連するデータにアクセスするよう構成されてもよい。変換モジュール134は、最初にローカルエントリをトラバースし、目標のフロント識別子がローカルエントリ内に見つからなかった場合、間接エントリがリンクされる参照エントリ内部のトラバースを継続することを含んでもよいカスケードルックアップを実施してもよい。
【0077】
ログ記憶モジュール136及び媒体管理モジュール370は、クローン化されたデータのコンテキストフォーマットを管理するよう構成されてもよい。
図4Aの実施形態において、クローン化されたデータ(前方マップ160内で2つ以上のLID範囲によって参照されるデータ)は、データを参照マップ460の1つ以上の参照エントリと関連付けるコンテキストフォーマットで格納されてもよい。かかるクローン化されたデータセグメントと共に格納される永続的メタデータは、データセグメントと関連する各LIDを特定することとは対照的に、単一参照エントリに対応してもよい。クローンを作成することは、従って、上で開示したように、特に、媒体管理モジュール370の使用によって、1つ以上のバックグラウンド操作においてクローン化されたデータのコンテキストフォーマットを更新することを含んでいてもよい。
【0078】
図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のクローン化されたデータ(
図4Bで100000,2と表記する)を参照できる参照マップ460に参照エントリを割り当てることとを含んでいてもよい。クローン操作は更に、状態413Cで示すように、エントリ10,2及び400,2を参照エントリ100000,2と関連付けることを含んでいてもよい。上で開示したように、エントリ10,2及び400,2を参照エントリ100000,2と関連付けることは、エントリ10,2及び400,2が間接エントリであることを示すことを含んでいてもよい。状態413Cは更に、記憶アドレス20000のデータを参照エントリ100000,2と関連付けるよう、及び/又は、エントリ10,2及び400,2を参照マップ460内の参照エントリ100000,2と関連付けるよう、記憶媒体140に永続的ノート366を格納することを含んでいてもよい。
【0079】
記憶層130は、LID10又は400のどちらかを介して(参照エントリ100000,2を介して)記憶アドレス20000のデータセグメントに対するアクセスを提供してもよい。LID10又は400に関するリクエストに応じて、変換モジュール134は、前方マップ160内の対応するエントリが、参照マップ460内のエントリと関連する間接エントリであることを判断してもよい。これに応じて、参照モジュール434は、前方マップ160(もしあれば)内部のローカルエントリ及び参照マップ460内の対応する参照エントリ(例えば、参照エントリ100000,2)の使用によって記憶アドレスを決定するためのカスケードを実行する。
【0080】
ステップ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の操作を複雑化させることなく、データセグメントを参照してもよい。
【0081】
図4Cは、参照エントリを用いて実施されるクローン操作の別の実施形態を示している。LID1024〜2048及び/又はデータセグメント312のクローンを作成するためのリクエストに応じて、論理インタフェース管理モジュール334は、データセグメント312を表すために参照エントリ482を参照マップ460内に割り当てるよう構成されてもよい。前方マップ160内のLIDの幾つでも、データセグメント312と関連する永続的メタデータのオーバーヘッドを増加させることなく、及び/又は、媒体管理モジュール370の操作を複雑化させることなく、参照エントリ482を介してデータを参照してもよい。
図4Cに示すように、参照エントリ482は、データセグメント312の記憶アドレス(記憶アドレス64432〜65456)に結合されてもよい。前方マップ160内のエントリ462及び472は、参照エントリ482を介して間接的に記憶アドレスを参照してもよい(例えば、
図4Cに示すように、参照エントリ482にリンクされてもよい)。
【0082】
図4Cの実施形態において、参照エントリ482は、識別子0Z〜1024Zを割り当てられている。参照エントリ482の識別子は、論理アドレス空間132の特定部分に対応してもよく、又は、異なる別の名前空間に対応してもよい。記憶層130は、特に、エントリ462及び/又は472と関連するメタデータの使用によって、エントリ462及び472を参照エントリ482にリンクさせてもよい。代替として、又は加えて、間接エントリ462及び/又は472は、記憶アドレスメタデータを、参照エントリ482に対する参照及び/又はリンクで置き換えてもよい。参照エントリ482は、記憶層130を介して記憶クライアント106によって直接アクセスできなくてもよい。
【0083】
クローン操作は更に、データセグメント312の論理インタフェース311Dを修正することを含んでいてもよく、修正された論理インタフェース311Dは、データセグメント312が間接エントリ462のLID1024〜2048及び/又は間接エントリ472の6144〜7168を介して参照されることを可能にしてもよい。参照エントリ482は記憶クライアント106に対してアクセスできなくてもよいが、参照エントリ482は、変換モジュール134によって(間接エントリ462及び472を介して)データにアクセスするために用いられてもよく、よって、データセグメント312の修正された論理インタフェース311Bの一部として見なされてもよい。
【0084】
クローン操作は更に、記憶媒体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上に保管されてもよい。
【0085】
データセグメント312の修正された論理インタフェース311Dは、コンテキストフォーマットオリジナルデータパケット410Aと矛盾している場合があり、永続的メタデータ314Aは、参照エントリ482及び/又はクローン化されたエントリ472ではなく、LID1024〜2048を参照してもよい。記憶層130は、修正された論理インタフェース311Dと一致する更新されたコンテキストフォーマット(パケット410B)でデータセグメント312を格納するよう構成されてもよく、永続的メタデータ314Bは、それぞれのクローン化された範囲(例えば、エントリ462及び472)内のLIDを別々に特定することとは対照的に、データセグメント312を参照エントリ482と関連付けてもよい。従って、間接エントリ482の使用により、データセグメント312の論理インタフェース311Dが、永続的メタデータ314A〜Bのサイズ制限とは無関係に、幾つでもLIDを備えることが可能となる。その上、参照エントリ482の追加のクローンは、データセグメント312のコンテキストフォーマットを更新せずに作成されてもよく、かかる更新は、新規LID範囲を前方マップ160内の参照エントリ482と関連付けることによって、及び/又は、特に、永続的ノート366の使用によって行われてもよい。
【0086】
上で開示したように、間接エントリ462及び/又は472は、最初に、参照エントリ482を介してデータセグメント312を参照してもよい。クローン操作の後に実行される記憶操作は、前方マップ160内のローカルエントリの使用によって反映されてもよい。クローン操作の完了後、記憶層130は、クローン化されたLIDのうちの1つ以上と関連するデータを修正してもよい。
図4Dの実施形態において、記憶クライアント106は、間接エントリ462のLID1024〜1052に対応するデータを修正及び/又は上書きし、これは、新規データセグメント412を(記憶アドレス7823〜7851のデータパケット420内の)記憶ログに追記することを含んでいてもよい。
【0087】
データセグメント412は、データセグメント412をLID1024〜1052と関連付けるよう構成される永続的メタデータ414Aを備えるコンテキストフォーマット(データパケット420)に格納されてもよい。記憶層130は、データセグメント412をローカルエントリ465内のLID1024〜1052と関連付けるよう構成されてもよい。ローカルエントリ465は、間接エントリ462及び/又は参照エントリ482を介してデータを参照することとは対照的に、更新されたデータを直接参照してもよい。
【0088】
データ1024〜1052(又はそれらのサブセット)に関するリクエストに応じて、論理インタフェース管理モジュール334は、カスケードルックアップ操作において要求されたLIDに対する参照を検索してもよく、これは、ローカルエントリ(もしあれば)の後に参照エントリに対する参照を検索することを含んでいてもよい。
図4Dの実施形態において、ローカルエントリ465は、参照エントリ462につき64432〜64460ではなく、LID範囲1024〜1052(記憶アドレス7823〜7851)に関するリクエストを満足させるために用いられてもよい。ローカルエントリ内で見つからなかったLIDに対するリクエスト(例えば、LID1053〜2048)は、参照エントリ482を介して、引き続き処理されてもよい。範囲1024〜2048に関するデータの論理インタフェース311Eは、従って、1つ以上のローカルエントリ465、1つ以上の間接エントリ462、及び/又は1つ以上の参照エントリ482を備えていてもよい。
【0089】
図4Eに示す更なる実施形態において、記憶層130は、論理インタフェース311EのLIDのうちの別の1つ(例えば、LID6144〜6162)を介してクローンのデータを修正してもよく、論理インタフェースデリミタは、図示の実施形態の詳細を曖昧にしないために
図4Eに示していない。修正されたデータは、上で開示したように、ローカルエントリ475を用いて参照されてもよい。
図4Eの実施形態において、範囲462及び472のそれぞれは、参照エントリ482の識別子0Z〜52Zを介してその前に参照されたデータのそれ自体のそれぞれのローカルバージョンを有している。よって、エントリ462又は472のどちらも、範囲0Z〜52Zに対する参照を含んでいない。参照モジュール434は、対応するデータ(及び参照識別子)がもはや参照されていないことを判断してもよく、よって、記憶媒体140から削除(例えば、無効化される)ために印を付けられてもよい。
図4Eに示すように、データを無効化することは、特に、範囲0Z〜52Zを削除するよう参照エントリ482を修正することによって、データに対する参照を参照マップ460から削除することを含んでいてもよい。データを無効化することは更に、(例えば、記憶アドレス64432〜64484に格納されたデータを保管する必要がないことを示すよう)逆方向マップ、妥当性ビットマップ、及び/又は同様のもの等の他の記憶メタデータ135を更新することを含んでいてもよい。エントリ462及び472の範囲は、どちらかが参照エントリ482のどの部分も参照しなくなるまで、分岐し続けてもよく、上で開示したように、その点において、参照エントリ482は削除されてもよく、それによって参照されるデータは無効化されてもよい。
【0090】
図4D及び4Eは、対応する間接エントリ462及び472とのオーバーラップしたLID範囲を備えるローカルエントリ465及び475を示しているが、本開示はこれに関して限定されない。幾つかの実施形態において、
図4Dの記憶操作は、ローカルエントリ465を作成し、LID1053〜2048のみを参照するよう間接エントリ462を修正することによって反映されてもよい。同様に、
図4Eの操作は、ローカルエントリ475を作成することと、端を切り捨てられたLID範囲6163〜7168を参照するよう間接エントリ472を修正することとを含んでいてもよい。
【0091】
図4Aに戻って参照すると、参照モジュール434は、参照マップ460を管理するか、「グルーミング」するよう構成されてもよい。幾つかの実施形態において、参照マップ460内の各エントリは、参照カウントを含むメタデータを備えている。参照カウントは、参照エントリに対する新規参照又はリンクが追加されるようにインクリメントされてもよく、エントリに対する参照を削除することに応じてデクリメントされてもよい。幾つかの実施形態において、参照カウントは、参照マップ460内の各参照識別子に対して維持されてもよい。代替として、参照カウントは、全体として参照エントリに対して維持されてもよい。参照エントリの参照カウントが0に達した場合、参照エントリ(及び/又はその一部)は、参照マップ460から削除されてもよい。参照エントリ(及び/又は参照エントリの一部)を削除することは、(データをもはや保管する必要がないことを示す)本明細書中に開示するように、記憶媒体140上の対応するデータを無効化することを含んでいてもよい。
【0092】
別の実施形態において、参照モジュール434は、「マークアンドスイープ」のアプローチを用いて参照エントリを削除してもよい。参照モジュール434(又は、変換モジュール134等の他のプロセス)は、特に、前方マップ160内の間接エントリ(又はエントリの他の種類)から参照エントリへのリンクを辿ることによって、参照マップ460内のエントリに対する参照を定期的にチェックしてもよい。マークアンドスイープ中にアクセスされない参照エントリは、上で開示したように、削除されてもよい。マークアンドスイープは、バックグラウンドプロセスとして動作してもよく、もはや使用されていない参照エントリを特定し、削除するよう、定期的にマークアンドスイープ操作を実行してもよい。
【0093】
幾つかの実施形態において、本明細書中に開示する参照マップ460は、要求があり次第(例えば、クローンの作成、又は他の間接データ参照に応じて)、作成されてもよい。他の実施形態において、全てのデータ記憶操作は、中間マッピングを介して実行されてもよい。かかる実施形態において、記憶クライアント106は、論理アドレス空間132等の中間マッピング層を介して記憶アドレスにリンクされるか、及び/又は、それを参照してもよい間接的な、仮想アドレス空間(VAS)の仮想識別子(VID)を割り当ててもよい。VASは、記憶クライアント106と記憶媒体140との間に中間マッピング層を追加してもよい。記憶クライアント106は、論理アドレス空間132の論理識別子にマッピングされ、順に、それぞれの記憶装置141及び/又は記憶媒体140上の記憶アドレスと関連する、仮想化されたアドレス空間のVIDを用いてデータを参照してもよい。本明細書中で用いるように、VASは、論理ユニット番号(LUN)アドレス空間、仮想LUN(vLUN)アドレス空間、及び/又は同様のものを含んでもよいが、これらに限定されない。
【0094】
図5Aは、仮想化されたアドレス空間532を用いて、特に、効果的な範囲クローン操作を実施するよう構成されるアグリゲーション層530の一実施形態を示している。アグリゲーション層530は、インタフェース531を介して記憶クライアント106にVAS532を提示するよう構成されてもよい。本明細書中で開示したインタフェース131のように、インタフェース531は、ブロックデバイスインタフェース、仮想記憶インタフェース、キャッシュインタフェース、及び/又は同様のもののうちの1つ以上を備えていてもよい。記憶クライアント106は、インタフェース531を介してVAS532のVIDに対する参照によって、アグリゲーション層530によって管理される記憶リソースに関する記憶操作を実行してもよい。
【0095】
アグリゲーション層530は更に、1つ以上の中間記憶層(例えば、記憶層130)を介してVIDを記憶リソースにマッピングするよう構成されるVAS変換モジュール534を備えていてもよい。従って、アグリゲーション層530のVASメタデータ535は、VAS532のVIDとVAS532のLIDとの間の何れかから何れかへのマッピングを備えるVAS前方マップ560を含んでもよい。
図5Aには示していないが、VAS変換モジュール534及び/又はVAS前方マップ560は、複数の異なる記憶層130の複数の論理アドレス空間132を単一のVAS532へ集約するよう構成されてもよい。従って、幾つかの実施形態において、VAS532は複数の異なる論理アドレス空間132に対応してもよく、それぞれはLIDの別々のセットを備え、それぞれがそれぞれの記憶層130、記憶装置141、及び/又は記憶媒体140に対応している。
【0096】
図5Aは、記憶層130とは別々にアグリゲーション層530を示しているが、本開示はこれに関して限定されない。幾つかの実施形態において、アグリゲーション層530のVAS532、VAS前方マップ560、VAS変換モジュール534、及び/又は他のモジュールは、記憶層130の一部として実装されてもよい。
【0097】
アグリゲーション層530は、特に、効果的な範囲クローン、移動、マージ、及び/又は他のハイレベルな操作を実施するようVAS532によって提供される中間仮想アドレス空間を活用するよう構成されてもよい。代替として、又は加えて、中間マッピング層は、ハードディスク及び/又は同様のもの等のランダムアクセスの所定位置に書き込む記憶装置上で効果的なクローン操作を可能にするよう活用されてもよい。
【0098】
記憶クライアント106は、VAS532のVIDに関して記憶操作を実行してもよい。従って、記憶操作は、2つ(以上)の変換層を備えていてもよい。VAS前方マップ560は、VAS532のVIDと記憶層130の論理アドレス空間132の識別子との間に第1の変換層を備えていてもよい。記憶層130の前方マップ160は、記憶媒体140上のLIDと記憶アドレスとの間に第2の変換層を実装してもよい。
【0099】
アグリゲーション層530は、特に、VASメタデータ535、VAS前方マップ560、及び/又はVAS変換モジュール534の使用によりVAS532内部での割当てを管理するよう構成されてもよい。幾つかの実施形態において、VIDをVAS532内に割り当てることは、論理アドレス空間132内に1つ以上の対応するLID(及び/又は1つ以上の他の記憶層の識別子)を割り当てることを備えていてもよい。従って、VAS532内に割り当てられた各VIDは、論理アドレス空間132の1つ以上のLIDに対応してもよい。アグリゲーション層530のVIDと論理アドレス空間132との間の何れかから何れかへのマッピングは、本明細書中に開示するように、点在するか、及び/又は、何れかから何れかへであってもよい。その上、幾つかの実施形態において、アグリゲーション層530は、VIDと複数の異なる論理アドレス空間132との間の、何れかから何れかへ、及び/又は範囲管理されるマッピングを維持するよう構成されてもよい。従って、アグリゲーション層530は、異なるそれぞれの記憶層130によって管理される複数の異なる記憶装置141の論理アドレス空間を、単一の集約VAS532に集約するか、及び/又は、組み合わせてもよい。
【0100】
図5Aの実施形態において、論理アドレス空間132は、直接アクセス可能でなくてもよく、よって、記憶クライアント106は、インタフェース531を介してVIDを用いて記憶リソースを参照してもよい。従って、1つ以上のVIDに関してアグリゲーション層530を介して記憶操作を実行することは、a)VIDに対応する記憶層130を特定すること、b)VAS変換モジュール534及び/又はVAS前方マップ560の使用により、VIDにマッピングされる記憶層130のLIDを決定すること、及びc)決定されたLIDに関して記憶層130の使用により記憶操作を実施することを含んでいてもよい。
【0101】
図5Bは、アグリゲーション層530の使用により実施されるクローン操作の一実施形態を示している。上で開示したように、VAS前方マップ560は、記憶層130の論理アドレス空間132を介して記憶アドレスに間接的にマッピングされるVAS532に対応してもよい。
図5Bは、アグリゲーション層530を介して記憶操作を実施するために用いられるアドレス指定層を示している。VAS532のVIDは、特に、アグリゲーション層530のインタフェース531を介して記憶クライアント106にアクセス可能な最上位アドレス指定層を備えていてもよい。記憶層130の論理アドレス空間132は、中間アドレス指定層を備えていてもよい。VAS前方マップ560は、VIDとLIDとの間の何れかから何れかへのマッピングを備えていてもよい。LIDは、前方マップ160の使用により記憶アドレス空間144内部の記憶アドレスにマッピングされてもよい。従って、VIDは、記憶層130の中間論理アドレス空間を介して記憶アドレス空間144にマッピングされてもよい。
【0102】
図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上の1つ以上の記憶アドレス(記憶アドレス20000)にマッピングするよう構成されてもよい。
【0103】
状態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(及び/又はその一部)を永続させることによって永続的及び/又はクラッシュセーフにされてもよい。
【0104】
状態536Cにおいて、記憶アドレス20000のデータは、記憶アドレス40000に再配置されてもよい。再配置は、標準の記憶媒体メンテナンス操作において生じ、クローン化されたデータのコンテキストフォーマットを更新しなくてもよい。データを再配置することは、前方マップ160内の単一のエントリを更新することを含んでいてもよい。VAS前方マップ560は、変化しないままであってもよい。VID範囲10,2及び400,2の異なるバージョンに対する修正は、中間の論理アドレス空間を介して管理されてもよい。VID10に対する修正は、a)新規LIDを論理アドレス空間132内に割り当てること、b)新規LIDと関連して修正されたデータを格納すること、及びc)新規LIDをVAS前方マップ560内のVID10にマッピングすることを含んでいてもよい。
【0105】
本明細書中に開示する範囲クローン、移動、及び/又はマージ操作を実施するための実施形態は、スナップショット、重複排除、アトミック操作、トランザクション、ファイルシステム管理機能、及び/又は同様のもの等の、他の、よりハイレベルな記憶操作を効率的に実施するために用いられてもよい。
図4Aに戻って参照すると、記憶層130は、記憶媒体140上の重複データを特定するよう構成される重複排除モジュール374を備えていてもよい。重複データは、任意の適切な機構を用いて特定されてもよい。幾つかの実施形態において、重複データは、a)記憶媒体140の内容を入念に調べること、b)様々なデータセグメントのための署名値を生成すること、及びc)重複データを特定するようデータ署名値を比較することによって特定される。署名値は、暗号署名、ハッシュコード、巡回符号、及び/又は同様のものを含んでもよいが、これらに限定されない。署名情報は、前方マップ160等の記憶メタデータ135内(例えば、エントリと関連するメタデータ内)に格納されてもよく、及び/又は、記憶メタデータ135の1つ以上の別々のデータ構造内で維持されるか、及び/又はインデックス化されてもよい。重複排除モジュール374は、データ署名を比較してもよく、署名一致を検出した際に、1つ以上の重複排除操作を実行してもよい。重複排除操作は、署名一致を検証する(例えば、バイト単位のデータ比較を実行する)ことと、2つ以上のLID範囲を介して重複データを参照するよう1つ以上の範囲クローン操作を実行することとを含んでいてもよい。
【0106】
図6は、重複排除操作の一実施形態を示している。前方マップ160は、異なるそれぞれの記憶アドレス3453〜4477及び7024〜8048に格納された重複データを参照してもよいエントリ662及び672を備えていてもよい。エントリ662及び672は、それぞれLID1024〜2048及び6144〜6656に対応する異なるそれぞれの論理インタフェース663及び673に対応してもよい。重複データセグメント(データセグメント612)は、上で開示したように、重複排除モジュール374によって特定及び/又は検証されてもよい。代替として、重複データは、データが記憶層130での格納のために受信された際に特定されてもよい。従って、データは、データの追加コピーが記憶媒体140に格納される前に、重複排除されてもよい。
【0107】
エントリ662及び672が重複データを参照することを特定及び/又は検証することに応じて、記憶層130は、データを重複排除するよう構成されてもよく、これは、LIDの2つの異なるセットを介して重複データの単一のコピーを参照するよう1つ以上の範囲クローンを作成することを含んでいてもよい。上で開示したように、範囲クローンを作成することは、データセグメントの論理インタフェース663及び673を修正することを含んでいてもよい。
図6の実施形態において、重複データは、記憶位置3453〜4477及び7024〜8048それぞれにおけるパケット610内のデータセグメント612として格納される。クローン操作は、データセグメントが両エントリ663及び673によって参照できるように、データセグメント(又は、データセグメントの新しいバージョン及び/又はコピー)のうちの1つの論理インタフェースを修正することを含んでいてもよい。
【0108】
範囲クローン操作は、
図3A〜Eの範囲クローン実施形態、
図4A〜Eの参照エントリ実施形態、及び/又は
図5A〜Bの中間マッピング実施形態を含む本明細書中で開示したクローン実施形態の何れかを用いて実施されてもよい。
図6の重複排除実施形態において、両LID範囲1024〜2048及び6144〜7168は、参照エントリ682を介してデータセグメント612の単一バージョン(他のデータセグメントは無効化されてもよい)を参照するよう修正されてもよい。よって、重複排除操作は、重複排除されたデータセグメント612(パケット610を参照する)を表すよう参照エントリ682を作成することを含んでいてもよい。重複排除操作は更に、上で開示したように、参照エントリ682を介してデータセグメント612にマッピングされてもよい、エントリ662及び672を各間接エントリ665及び675に修正及び/又は変換することを含んでいてもよい。重複排除操作は更に、データセグメント612をLID1024〜2048及び6144〜7168の両セット(並びに参照エントリ682)に関連付けるようデータセグメント612の論理インタフェース669を修正することを含んでいてもよい。重複排除操作は更に、上で開示したように、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。
【0109】
重複排除操作は更に、上で開示したように、修正された論理インタフェース669と一致するようデータセグメント612のコンテキストフォーマットを更新することを含んでいてもよい。コンテキストフォーマットを更新することは、1つ以上のバックグラウンド操作において、更新されたコンテキストフォーマット(データパケット610)でのデータセグメント612を記憶ログ(例えば、記憶位置84432〜85456における)に追記することを含んでいてもよい。更新されたデータパケット610は、データセグメント612を更新された論理インタフェース669(例えば、参照識別子0Z〜1023Zを介するLID1024〜2048及び6144〜6656)と関連付ける永続的メタデータ614を備えていてもよい。
【0110】
図6は、単一のエントリ又はLIDの範囲をクローン化及び/又は重複排除することを示しているが、本開示はこれに関して限定されない。幾つかの実施形態において、複数のフロント識別子範囲は、単一のクローン操作においてクローン化されてもよい。この種類のクローン操作は、アドレス範囲(又は論理アドレス空間132全体)の「スナップショット」を作成するために用いられてもよい。本明細書中で用いるように、スナップショットとは、特定の時点での記憶装置(又はLIDのセット)の状態を指す。スナップショットは、スナップショット操作を完了した後の範囲内に生じる変更に関わらず、LID範囲の「オリジナルの」状態を維持してもよい。
【0111】
図7は、スナップショット操作を効果的に実施するよう構成される記憶層130を備えるシステム700の一実施形態を示すブロック図である。
図7の実施形態は、論理アドレス空間132内部のアドレス範囲に関係する。しかし、本開示はこれに関して限定されず、上で開示したように、VAS532内の範囲及び/又は程度等の他の種類のアドレス範囲との使用に適合することができる。記憶層130は、本明細書中に開示するように、スナップショット操作を実施するよう構成されるスナップショットモジュール736及びタイミングモジュール738を備えていてもよい。
【0112】
状態773Aにおいて、記憶層130は、LID範囲FR1のスナップショットを作成するよう構成されてもよい。スナップショットを作成することは、特定の時間におけるLID範囲FR1の状態を保存することを含んでいてもよい。スナップショット操作は更に、LID範囲FR1を保存する一方で、その後の記憶操作がLID範囲内で実行されることを可能にすることを含んでいてもよい。
【0113】
上で開示したように、記憶層130は、特に、ログ記憶モジュール136の使用によって記憶媒体140上の記憶ログにデータを格納するよう構成されてもよい。記憶操作のログ順序は、(
図1D及び1Eと共に開示したような)記憶区分170A〜N上のシーケンスインジケータ113及び/又は記憶媒体144の記憶アドレス空間144内の順次記憶位置等のデータパケットと関連するシーケンス情報を用いて決定されてもよい。
【0114】
記憶層130は更に、ログ内のデータの相対的な時間順序等の他の種類の順序及び/又はタイミング情報を維持するよう更新されてもよい。しかし、幾つかの実施形態において、データのログ順序は、特に、媒体管理操作において記憶装置内で再配置されるデータにより、タイミング情報を正確に反映していない場合がある。データを再配置することは、記憶媒体140上のそのオリジナルの記憶位置からデータを読み取ることと、記憶ログ内の現在の追記点にデータを追記することとを含んでいてもよい。よって、古い再配置されたデータは、記憶ログ内のより新しい現在のデータと共に格納されてもよい。従って、記憶ログが、特定のLIDに関するデータ操作の相対的なログ順序を保存してもよいが、記憶ログは、絶対的なタイミング情報を正確に反映しない場合がある。
【0115】
幾つかの実施形態において、ログ記憶モジュール136は、データをタイミング情報と関連付けるよう構成され、これは、記憶媒体130上で実行される記憶操作の相対的なタイミング情報を確立するために用いられてもよい。幾つかの実施形態において、タイミング情報は、記憶媒体140上に格納される各データパケットに適用されてもよい(タイミングモジュール738によって維持される)それぞれのタイムスタンプを備えていてもよい。タイムスタンプは、データパケット310の永続的メタデータ314内に格納されてもよい。代替として、又は加えて、タイミングモジュール738は、より粗いレベルの粒度でタイミング情報を追跡するよう構成されてもよい。幾つかの実施形態において、タイミングモジュール738は、1つ以上のグローバルタイミングインジケータ(エポック識別子)を維持している。本明細書中で用いるように、「エポック識別子」とは、記憶層130を介して実行される記憶操作の相対タイミングを決定するために用いられる識別子を指す。ログ記憶モジュール136は、データパケット710内にエポックインジケータ739を含むよう構成されてもよい。エポックインジケータ739は、タイミングモジュール738によって維持される現在のエポック(例えば、グローバルタイミングインジケータ)に対応してもよい。エポックインジケータ739は、対応するデータセグメント712が記憶ログに書き込まれたエポックに対応してもよい。エポックインジケータ739は、パケット710の永続的メタデータ714内に格納されてもよく、よって、再配置操作中にデータパケット710と関連付けられたままであってもよい。タイミングモジュール738は、新しいスナップショットの作成、ユーザリクエスト、及び/又は同様のもの等の特定のイベントに応じてグローバルエポック識別子をインクリメントするよう構成されてもよい。データセグメント712のエポックインジケータ739は、再配置及び/又は他の媒体メンテナンス操作を通して変化しないままであってもよい。従って、エポックインジケータ739は、記憶ログ内のデータパケット710の相対位置とは無関係にデータセグメント712のオリジナルの記憶時間に対応してもよい。
【0116】
スナップショット操作は、特定の時間における特定のLID範囲(FR1)の状態を保存することを含んでいてもよい。スナップショット操作は、従って、記憶媒体140上のFR1に関するデータを保存することを含んでいてもよい。データを保存することは、a)特定の時間枠(エポック)に関するデータを特定することと、b)記憶媒体140上に特定されたデータを保存すること(例えば、特に、記憶回復操作において、特定されたデータが記憶媒体140から削除されることを防ぐこと)とを含んでいてもよい。スナップショットに関するデータは、その後の記憶操作(例えば、データを上書き、修正、トリム、及び/又は、そうでなければ不要にする操作)によって無効化されることにも関わらず保持されてもよい。特定のスナップショットのために保存される必要があるデータは、上で開示したエポックインジケータ739の使用により特定されてもよい。
【0117】
状態773A(エポックインジケータe0によって表記される時間t1)において、記憶層130は、スナップショット操作を実施するためのリクエストを受信してもよい。リクエストに応じて、スナップショットモジュール736は、タイミングモジュール738によって維持されるエポック識別子の現在の値を決定してもよい。エポック識別子の現在の値は、現在の「スナップショットエポック」と呼ばれてもよい。
図7の実施形態において、スナップショットエポックは0である。スナップショットモジュール736は更に、タイミングモジュール738に現在のグローバルエポックインジケータをインクリメントさせる(例えば、エポック識別子を1にインクリメントさせる)よう構成されてもよい。スナップショットを作成することは更に、現在の更新されたエポックインジケータを示すよう構成される記憶媒体上に永続的ノート366を格納することを含んでいてもよい。永続的ノート366は更に、スナップショットエポックに関するデータが保存されるべきである(例えば、スナップショット操作において保存されるべきLIDの特定の範囲FR1を特定する)ことを示すよう構成されてもよい。永続的ノート366は、a)現在のエポック識別子を決定する、及び/又は、b)特定のスナップショットエポック(例えば、エポックe0)と関連するデータを保存するようスナップショットモジュール736及び/又は媒体管理モジュール370を構成するために、メタデータ再構築操作中に用いられてもよい。
【0118】
スナップショットモジュール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がスナップショットエポック0で印を付けられ、X1がより後のエポックで印を付けられた場合(例えば、スナップショット操作後のエポック1)、媒体管理モジュール370は、スナップショットのデータを保存するために、データX0を記憶媒体140上に保存してもよい。
【0119】
状態773Bにおいて、スナップショットモジュール738は、スナップショットFR1に関するデータ(エポックe0と関連するデータ)を保存する一方で、記憶操作が引き続き、後続のエポック(例えば、エポックe1)の間に実行されることを可能にするよう構成されてもよい。FR1を保存することは、エポックe0におけるLID範囲のオリジナルの状態(FR1(e0))を保存するようFR1をクローン化する一方で、記憶操作がFR1に関して継続することを可能にすることを含んでいてもよい。クローン操作は、上で開示したように、重複エントリ、参照エントリ、及び/又は中間マッピング層のうちの1つ以上を用いて実施されてもよい。記憶操作は、LID FR1に関して、データを記憶媒体140上の記憶ログに追記することを含んでいてもよい。スナップショットFR1(e0)に対応するクローン化されたLIDは、不変であってもよい。従って、FR1(e0)のスナップショットは、LID範囲に対する変更に関わらず、保存されてもよい。状態773Bにおいて格納されたデータは、現在のエポック(e1)のエポックインジケータ739と共に格納されてもよい。スナップショットモジュール736は、エポックe1(及び後続のエポック)中に実行される記憶操作によって廃止と表現されるか、及び/又は無効化されるデータを保存するよう構成されてもよい。
図1Eの実施形態に戻って参照すると、媒体管理モジュール370は、データX0を、スナップショットFR1のために保存するデータとして特定してもよい(データX1は、スナップショット操作が実行された後に格納されてもよい)。スナップショットモジュール738及び/又は媒体管理モジュール370は、データがその後、エポックe1においてデータX1によって廃止とされたとしても、データX0を保存するよう構成されてもよい。データX0は、LID Aが削除、トリム、又は同様のことをされたとしても、保持されてもよい。
【0120】
LID範囲FR1(e0)及びエポックインジケータe0と共に印を付けられたデータを含むFR1(e0)のスナップショットは、対応するスナップショットが削除されるまで、保存されてもよい。スナップショットは、インタフェース131を介して受信されるリクエストに応じて削除されてもよい。状態773Cにおいて示すように、エポック0は、他の介在するエポック(エポックe1〜eN)が作成及び/又は削除された後でさえも、記憶媒体140上に保持されてもよい。エポックe0を削除することは、エポックe0と関連する無効/廃止データを削除するようスナップショットモジュール738及び/又は媒体管理モジュール370を構成することを含んでいてもよい。
【0121】
状態773Aにおいてスナップショットを作成した後に実行される記憶操作は、論理アドレス空間132及び、特に、前方マップ160を修正してもよい。修正は、データを記憶媒体140に追記すること、FR1に対するLIDを追加及び/又は削除すること等に応じて記憶アドレス結合を更新することを含んでいてもよい。幾つかの実施形態において、スナップショットモジュール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)の作成後の操作に対応するかかるデータが作成されたため)無視されてもよい。
【0122】
本明細書中に開示する記憶層130は更に、効果的な範囲移動操作を実施するよう構成されてもよい。
図8Aは、本明細書中に開示する記憶層130によって実施される移動操作の一実施形態を示している。前方マップ160は、LID1023〜1025を記憶媒体140上の各データセグメントに結合するよう構成されるエントリ862を含んでいる。エントリ862は、実施形態の詳細を良好に示すために別々に示されている。しかし、エントリ862は、LID1023〜1025の全範囲を備える単一のエントリ内に含まれてもよい。エントリ862は、記憶アドレス32、3096、及び872に格納されたデータの論理インタフェース863を定義してもよい。上で開示したように、記憶アドレス32、3096、及び872に格納されたデータは、データを対応するLID1023、1024、及び1025と関連付けるコンテキストフォーマットで格納されてもよい。
【0123】
記憶層130は、特に、LID1023、1024、及び1025と各媒体記憶位置32、3096、及び872のデータとの間の関連を、LIDの新規セット(例えば、9215、9216、及び9217)に対応する新規論理インタフェース863Bで置き換えることによって、エントリ862をLID9215〜9217に移動するよう構成されてもよい。移動操作は、インタフェース131を介して受信されるリクエストに応じて、及び/又は、よりハイレベルな記憶操作(例えば、ファイル名を変更するためのリクエスト、前方マップ160のバランスを取るか、及び/又はデフラグするための操作、又は同様のもの)の一部として、実行されてもよい。
【0124】
移動操作は、上で開示したクローン化実施形態のうちの1つ以上に従って実施されてもよい。幾つかの実施形態において、移動操作は、LID1023、1024、及び1025にマッピングされた記憶アドレスを目的LID9215、9216、及び9217と関連付けることを含んでいてもよく、これは、結果として、移動操作に従うデータの論理インタフェース863Aを修正することを招く。移動操作は更に、移動操作が永続的及びクラッシュセーフであることを確実にするよう、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。記憶アドレス32、872、及び3096に格納されたデータは、上で開示したように、1つ以上のバックグラウンド操作において、更新された論理インタフェース863Bに従って書き換えられてもよい。
【0125】
図8Bは、移動操作の別の実施形態を示している。上記のように、移動操作は、LID1023〜1025と関連するデータをLID9215〜9217に移動することを含んでいてもよい。
図8Bの移動操作は、
図4A〜Eと共に開示したような参照エントリを利用してもよい。従って、移動操作は、移動操作を表すよう参照マップ460内に参照エントリ882を作成することを含んでいてもよい。移動操作は更に、参照エントリ882を介してデータを参照するよう新しい間接エントリ866を割り当てることを含んでいてもよい。参照エントリ882は、アドレス32、3096、及び872と関連付けられてもよい移動前LID1023、1024、及び1025を備えていてもよい。データの新規論理インタフェース863Cは、従って、間接エントリ866及び対応する参照エントリ882を備えていてもよい。移動操作は更に、上で開示したように、移動操作が永続的及びクラッシュセーフであることを確実にするよう、記憶媒体上に永続的ノート366を格納することを含んでいてもよい。
【0126】
記憶アドレス32、3096、及び872に格納されるデータのコンテキストフォーマットは、更新された論理インタフェース863Cと矛盾している場合があり、データのコンテキストフォーマットは、各データセグメントを、9215、9216、及び9217(及び/又は参照エントリ)とは対照的に、LID1023、1024、及び1025と関連付けてもよい。永続的ノート366は、記憶メタデータ135(例えば、前方マップ160及び/又は参照マップ460)を、必要であれば、正しく再構築することができるように、データの更新された論理インタフェース863Cを備えていてもよい。
【0127】
記憶層130は、修正された論理インタフェース863C(LID9215、9216、及び9217)を介して矛盾したコンテキストフォーマットのデータに対するアクセスを提供してもよい。データは、移動操作の後(移動操作及び/又は他の記憶操作の経路の外側)で、修正された論理インタフェース863Cと一致するコンテキストフォーマットで書き換え及び/又は再配置されてもよい。幾つかの実施形態において、記憶アドレス32、3096、及び/又は872のデータは、上で説明したように、1つ以上のバックグラウンド操作において、媒体管理モジュール370によって書き換えられてもよい。従って、移動操作は、前方マップ160を更新すること及び/又は永続的ノート366を格納することに応じて完了してもよい(及び/又は、通知を返してもよい)。
【0128】
図8Cに示すように、前方マップ160及び/又は他の記憶メタデータ135は、移動操作のデータを書き換えることに応じて更新されてもよい。
図8Cの実施形態において、媒体記憶位置32に格納されたデータセグメント812Aは、修正された論理インタフェース863Cと一致するコンテキストフォーマット(データパケット810A)でデータを格納することを含んでいてもよい記憶回復操作において再配置されてもよい。データパケット810Aは、データセグメント812AをLID9215と関連付ける永続的メタデータ814Aを備えていてもよい。前方マップ160は、更新されたコンテキストフォーマットでデータを参照するよう更新されてもよく、それは、参照エントリではなくデータパケット810Aを直接参照するようLID9215の間接エントリを修正することを含んでいてもよい。LID9215に対応するエントリは、間接エントリから標準のローカルエントリに戻ってもよく、LID1023に対する参照エントリは、参照マップ460から削除されてもよい。
【0129】
図8Dを参照すると、記憶クライアント106は、LID9217と関連するデータを修正してもよく、これは、データセグメントを所定位置以外(例えば、記憶アドレス772)に格納することを含んでいてもよい。データセグメントは、修正された論理インタフェース863Cと一致する(例えば、データをLID9217と関連付ける)コンテキストフォーマットに書き込まれてもよい。これに応じて、前方マップ160は、LID9217に対するエントリをデータセグメントの記憶アドレス(例えば、記憶アドレス772)と関連付け、上で開示したように、LID1025に対する参照エントリを参照マップ460から削除するよう更新されてもよい。
【0130】
幾つかの実施形態において、参照マップ460は、その中のエントリ(例えば、エントリ882)が記憶クライアント106によって直接参照できないように、前方マップ160とは別に維持されてもよい。この分離により、記憶クライアント106がより効率的に動作することを可能にしてもよい。例えば、データが更新されたコンテキストフォーマットで書き換えられるか、及び/又は再配置されるまで操作を停止させるのではなく、データ操作は、データが1つ以上のバックグラウンドプロセスにおいて書き換えられている間に進んでもよい。
図8Eを参照すると、上で開示した移動操作に続いて、記憶クライアント106は、LID1024に関連してデータを格納してもよい。LID1024に対応する参照エントリ882は、特に、更新されたコンテキストフォーマットで未だ書き換えられていない記憶アドレス3096のデータのため、参照マップ460内に含まれてもよい。しかし、参照マップ460は、前方マップ160とは別に維持されるため、名前の衝突が生じる恐れはなく、記憶操作は完了できる。前方マップ160は、媒体記憶位置4322に格納されるデータに対する論理インタフェースを備える一方で、引き続き、論理インタフェース863C(及び参照マップ460)を介してLID1024に以前に結合されたデータに対するアクセスを提供する別のエントリ864を含んでもよい。
【0131】
開示した移動操作において、間接エントリが、特に、対応するデータを書き換え、再配置、修正、削除、及び/又は上書きすることに起因して、もはや参照マップ460の参照エントリにリンクされていない場合、参照エントリは削除されてもよく、間接エントリは、直接的なローカルエントリに戻ってもよい。加えて、移動操作と関連する永続的ノート366は、上で開示したように、無効化されるか、及び/又は、記憶媒体140から削除されてもよい。
【0132】
図1Aに戻って参照すると、記憶層130のインタフェース131は、本明細書中に開示する記憶操作を実行するためのAPI及び/又はインタフェースを提供するよう構成されてもよい。API及び/又はインタフェースは、ブロックインタフェース、拡張記憶インタフェース、及び/又は同様のもののうちの1つ以上を介して公開されてもよい。ブロックインタフェースは、fadviseパラメータ、I/O制御パラメータ、及び同様のものの使用により、追加のAPI及び/又は機能を含むよう拡張されてもよい。インタフェース131は、本明細書中に開示する範囲クローン操作、範囲移動操作、範囲マージ操作、重複排除、スナップショット、及び他のよりハイレベルな操作を実行するようAPIを提供してもよい。インタフェース131は、記憶クライアント106が、属性及び/又はメタデータをLID範囲に適用(例えば、範囲を凍結)し、範囲スナップショットを管理すること等を可能にしてもよい。本明細書中に開示するように、範囲クローン操作は、1つ以上のソースLIDのセットの論理コピーを作成することを含んでいてもよい。範囲クローン、移動、及び/又はマージ操作は、
図3A〜Eに示す範囲クローン実施形態、
図4A〜Eの参照エントリ実施形態、及び/又は
図5A〜Bの中間マッピング層実施形態を含むが、これらに限定されない本明細書中に開示した実施形態の何れかを用いて実施されてもよい。
【0133】
本明細書中に開示する範囲クローン、移動、及び/又はマージ操作は、重複排除、スナップショット、効果的なファイルコピー操作(論理ファイルコピー)、ファイル整合性管理、アドレス空間管理、mマップチェックポイント、アトミック書込み、及び同様のもの等のよりハイレベルな操作を実施するために用いられてもよい。これらのよりハイレベルな操作も、記憶層130のインタフェース131を介して公開されてもよい。開示する操作は、オペレーションシステム、ファイルシステム、データベースサービス、及び/又は同様のもの等の種々の異なる記憶クライアント106によって活用されてもよい。
【0134】
図9Aは、ファイル管理操作を実施するよう構成される記憶層130を備えるシステム900Aの一実施形態を示している。システム900Aは、複雑さ、オーバーヘッド、及び同様のものを低減するために記憶層130の機能を活用するよう構成されてもよいファイルシステム906を備えていてもよい。ファイルシステム906は、効果的なファイルレベルのスナップショット及び/又はコピー操作を実施するよう、本明細書中に開示する範囲クローン、移動、移動、スナップショット、重複排除、及び/又は他の機能を活用するよう構成されてもよい。ファイルシステム906は、クライアントリクエスト(例えば、コピーコマンド、ファイルスナップショットioctrl、又は同様のもの)に応じてかかる操作を実施するよう構成されてもよい。ファイルシステム906は、特に、a)ソースファイルのダーティページ(もしあれば)をフラッシュすること、b)コピーされたファイル及び/又はファイルレベルのスナップショットを表すよう新しい目的ファイルを作成すること、及びc)ソースファイルを目的ファイルにクローン化するよう構成される範囲クローン操作を実行するよう記憶モジュール130に指示することによって、ソースファイルに関する効果的なファイルコピー及び/又はファイルレベルのスナップショット操作を実施するよう構成されてもよい。
【0135】
図9Aは、ファイルシステム906のための範囲クローン操作を実施するための種々の実施形態を示している。幾つかの実施形態において、及び、状態911Aに示すように、記憶層130は、論理アドレス空間132を維持するよう構成されてもよく、これにより、ソースファイルのLID(クローン化されるファイル)が、前方マップ160の使用により記憶媒体上のファイルデータにマッピングされる。状態911Bに示す対応する範囲クローン操作は、a)目的ファイルのためにLIDのセットを割り当てることと、b)ソースファイル及び目的ファイルのLIDを記憶媒体140上のファイルデータにマッピングすることとを含んでいてもよい。範囲クローン操作は更に、ファイルデータがソースファイル及び目的ファイルLIDの両方と関連付けられていることを示すよう、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。範囲クローン操作は更に、本明細書中に開示するように、更新されたコンテキストフォーマットに従ってファイルデータを書き換えることを含んでいてもよい。
【0136】
他の実施形態において、記憶層130は、範囲クローン操作(例えば、
図4A〜Eに開示するような)を実施するために参照マップ460を活用してもよい。範囲クローン操作の前に、状態911Cにおいて、ソースファイルのLIDは、前方マップ160内の対応するファイルデータに直接マッピングされてもよい。状態911Dにおいて範囲クローンを作成することは、参照マップ460内の1つ以上の参照エントリをファイルデータと関連付けることと、ソースファイルLID及び目的ファイルLIDに対応する間接エントリを参照エントリにリンクさせることとを含んでいてもよい。範囲クローン操作は更に、本明細書中に開示するように、記憶媒体140上に永続的ノート366を格納すること、及び/又は、ファイルデータのコンテキストフォーマットを更新することを含んでいてもよい。
【0137】
幾つかの実施形態において、記憶層130は、中間層マッピング層(例えば、
図5A〜Bに開示するような)を用いて範囲クローン操作を実施するよう構成されてもよい。状態911Eにおいて示すように、ソースファイルは、中間アドレス空間(例えば、記憶層130の論理アドレス空間132)を介して記憶媒体140上のファイルデータにマッピングされてもよいVAS532のVIDのセットに対応していてもよい。範囲クローン操作を実行することは、a)目的ファイルのためにVIDをVAS532内に割り当てることと、b)目的ファイルのVISを中間マッピング層のLID(例えば、ソースファイルVIDにマッピングされるLIDの同じセット)と関連付けることとを含んでいてもよい。範囲クローン操作は更に、目的VIDがファイルデータLIDと関連付けられていることを示す永続的ノート366を記憶媒体140上に格納することを含んでいてもよい。ファイルデータは既に、中間識別子に結合されているため、ファイルデータのコンテキストフォーマットは、更新される必要がなくてもよい。
【0138】
ファイルシステム906は更に、チェックポイントmマップ操作に記憶層130を活用するよう構成されてもよい。本明細書中で用いるように、「mマップ」操作とは、ファイルの内容が、ファイルシステム906の標準の読取り/書込みインタフェースではなく、標準のロード及び格納操作を介してメモリのページとしてアクセスされる操作を指す。「msync」操作とは、記憶媒体140に対するファイルのダーティページ(もしあれば)をフラッシュするための操作を指す。mマップ操作の使用は、ファイルのチェックポイント設定を困難にする場合がある。ファイル操作はメモリ内で行われ、msyncは、状態をセーブしなければならない場合に発行される。しかし、msync後のファイルの状態は、現在のメモリ内状態を表し、最後にセーブされた状態は失われる場合がある。従って、仮にファイルシステム906がmsync中にクラッシュすると、ファイルは矛盾した状態のまま残る可能性がある。
【0139】
幾つかの実施形態において、ファイルシステム906は、msyncによる呼出し中にmマッピングされたファイルの状態のチェックポイントを設定するよう構成される。ファイルのチェックポイントを設定することは、上で開示したように、ファイルレベルのスナップショット(及び/又は範囲クローン)を作成することを含んでいてもよい。ファイルレベルのスナップショットは、変更が適用される前にファイルの状態をセーブするよう構成されてもよい。msyncが発行された場合、別のクローンが作成されて、msync操作において適用された変更を反映してもよい。
図9Bに示すように、状態913A(mマップ操作前)において、ファイル1は、LID10〜13及び記憶媒体140上の対応する記憶アドレスP1〜P4と関連付けられてもよい。mマップ操作に応じて、ファイルシステム906は、記憶層130のインタフェース131を介して範囲クローン操作を実行してもよく、これは、ファイル1のクローン(ファイル1.1と表記する)を作成することを含んでいてもよい。ファイル1.1は、同じファイルデータ(例えば、同じ記憶アドレスP1〜P4)を参照する異なるセットのLID40〜43と関連付けられてもよい。他の実施形態において、ファイル1は、上で開示したように、参照マップ460及び/又は中間変換層を用いてクローン化されてもよい。
【0140】
msync呼出しに応じて、ファイルシステム906は、(記憶層130の使用により)別の範囲クローン操作を実行してもよい。状態913Cにおいて示すように、msync操作と関連する範囲クローン操作は、ファイル1を1つ以上のダーティページ(記憶アドレスP5及びP6)と共に更新することと、更新されたファイル1をファイル1.2としてクローン化することとを含んでいてもよい。ファイル1.1は、msync操作前のファイル状態を反映していてもよい。従って、万一不具合の場合には、ファイルシステム906は、ファイル1の以前の状態を再構築することができてもよい。
【0141】
上で開示したように、記憶層130は、ファイル整合性(例えば、本明細書中で更に詳細に開示するような、ファイルクローズ−オープン整合性)、アトミック操作、及び同様のもの等の、よりハイレベルな操作を実施するよう活用されてもよい範囲クローン及び範囲マージ操作を実施するよう構成されてもよい。これらの操作は、a)論理アドレス空間132の特定の領域をクローン化すること、b)クローン化した領域内で記憶操作を実行すること、及びc)クローン化した領域を論理アドレス空間132の別の部分に選択的にマージするか、及び/又は折り畳むことを含んでいてもよい。本明細書中で用いるように、論理アドレス空間132の領域をマージ及び/又は折り畳むこととは、特に、範囲のうちの1つにおいて実施された変更を1つ以上の他の範囲に組み込むことによって、2つ以上のLID範囲を組み合わせることを指す。マージ操作は、異なるLID範囲の間の競合を解消するよう構成されてもよいマージポリシーに従って実施されてもよい。マージポリシーは、1つのLID範囲のうちの1つの内容が別のLID範囲の内容を「上書き」する「上書き」モード;LID範囲の内容が(例えば、論理OR操作において)共に組み合わされる「OR」モード;1つ以上のLID範囲の別の独立したコピーを作成することによって、競合が解消されるコピーオンコンフリクトモード;及び/又は同様のものを含んでもよいが、これらに限定されない。上書きモードにおいて、1つ以上の他のLID範囲の内容を上書きするLID範囲は、コミット時間(例えば、最近の操作が以前の操作を上書きする)、優先度、及び/又は同様のものを含むが、これらに限定されない任意の適切な基準に基づいて決定されてもよい。
【0142】
図9Cは、記憶層130の使用により実施される範囲マージ操作の実施形態を示している。
図9Cの実施形態において、記憶層130は、前方マップ160内の1つ以上のエントリによって表されてもよい識別子範囲914をクローン化するよう構成されてもよい。範囲914内のLID072〜083は、記憶アドレス95〜106に結合されてもよい。本明細書中に開示する範囲クローン及び/又はマージ操作は、
図3A〜Eの範囲クローン及び/又は移動実施形態、
図4A〜Eの参照エントリ実施形態、及び/又は
図5A〜Bの中間マッピング層実施形態のうちの何れかを用いて実施されてもよい。従って、幾つかの実施形態において、LID072〜083は、1つ以上の参照エントリ及び/又は中間マッピング層を介して記憶アドレス95〜106に結合されてもよい。
【0143】
記憶層130は、範囲914をクローン化するよう構成されてもよく、これは、状態941Aにおいて示すように、LID924の新しい範囲を記憶アドレス95〜106に結合することを含んでいてもよい。範囲914及び/又は924は、範囲914及び924が関係する(例えば、記憶アドレスの同じセットに結合される)ことを示すよう構成されるそれぞれのメタデータ984及び/又は994を備えていてもよい。メタデータ984及び/又は994は、LID範囲のうちの1つに関する修正が、他の範囲内のLIDと相互に関係できる(例えば、LID972に関連して書き込まれるデータが対応するLID072等と関連付けられる)ように、LID072〜083を972〜983にリンクさせるよう構成されてもよい。メタデータ984及び/又は994は、クローン化されたLID範囲のための同期ポリシーを示してもよく、これは、上で開示したように、クローン間の割当操作が同期されるかどうかを示してもよい。メタデータ984及び/又は994は更に、マージ競合がどの様に管理されるかを指定してもよいマージポリシーを備えるか、及び/又は参照する。マージポリシーは、記憶層130のインタフェース131を介して指定されてもよく、グローバル及び/又はデフォルトのマージポリシーに基づいて決定されてもよく、リクエストパラメータ(例えば、fadvise、ioctrl等)を介して指定されてもよく、及び/又は同様のことであってもよい。クローン操作は、上で開示したように、記憶アドレス95〜106のデータをLID範囲972〜983と関連付けるよう構成される永続的ノート366を記憶媒体140に追記すること(及び/又は、更新されたコンテキストフォーマットでデータを書き換えること)を含んでいてもよい。
【0144】
記憶層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に格納されるデータは、上で開示したように、無効化されてもよい。
【0145】
範囲914及び/又は924内で実行される記憶操作は、結果として、競合を生じる場合がある。幾つかの実施形態において、LID範囲と関連するマージポリシーは、競合を予め阻止してもよい。本明細書中で更に詳細に開示するように、アトミック記憶操作において、記憶層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つ(以上)のバージョンを作成することによって競合を解消してもよい。
【0146】
状態941Eは、LID972〜973と関連する競合する修正の代わりに、LID072〜073と関連する操作を組み込むよう構成されるマージ操作の結果の一実施形態を示している。従って、状態941Eにおいて、LID072〜073は、LID972〜973に関連して実行される記憶操作に対応する記憶アドレス721〜722ではなく、LID072〜073に関連して実行される記憶操作に対応する記憶アドレス756〜757に結合される。
【0147】
状態941Fは、LID072〜073に関して行われる競合する修正の代わりに、範囲972〜973の修正を組み込むよう構成されるマージ操作の結果の一実施形態を示している。従って、状態941Fにおいて、識別子072〜073は、LID072〜073に関連する記憶アドレス756〜757ではなく、LID972〜973に関連して実行される記憶操作に対応する記憶アドレス721〜722に結合される。
【0148】
状態941Gは、別々の範囲コピー又はバージョンを作成することによってマージ競を管理するよう構成されるマージ操作の結果の一実施形態を示している。範囲914は、識別子982〜983に関して行われる競合しない修正を組み込んでもよく、(記憶アドレス721〜722を組み込むのではなく)識別子072〜073に関する競合する記憶操作の結果を保持してもよい。他のLID範囲924は、識別子072〜073に関して行われた競合する記憶操作の結果を組み込むことなく、状態941Dの修正を保持してもよい。状態941Gは、オリジナルのクローン化されたLID範囲072〜083 914及び974〜981 924を用いるコピーを示しているが、本開示はこれに関して限定されず、論理アドレス空間132の何れかの領域内の範囲コピー及び/又はバージョンを作成するよう構成することができる。状態941E〜Gに関して開示する範囲マージ操作は更に、記憶アドレス721〜722、756〜757、及び/又は767〜768に格納されるデータを対応するLIDと関連付けるよう記憶媒体140に1つ以上の永続的ノート366を追記すること、及び/又は、本明細書中に開示するように、1つ以上のバックグラウンド記憶操作においてデータを書き換えることを含んでいてもよい。
【0149】
幾つかの実施形態において、クローン化されたLID範囲914及び/又は924のうちの1つ以上の内部の操作は、特に、範囲914及び/又は924を拡張すること、範囲914及び/又は924を縮小すること、又は同様のことによって、LID範囲914及び/又は924を修正することを含んでいてもよい。範囲914及び/又は924のうちの1つを拡張することは、他の範囲への対応する拡張を含んでいてもよく、よって、割当操作は、両範囲914及び924において追加のLIDを割り当てることに基づいてもよい。
【0150】
本明細書中に開示する範囲マージ操作は、
図3A〜Eの範囲クローン及び/又は移動実施形態、
図4A〜Eの参照エントリ実施形態、及び/又は
図5A〜Bの中間マッピング実施形態のうちの何れかを用いて実施されてもよい。
図9Dは、参照マップ460を用いる範囲マージ操作の一実施形態を示している。状態943Aに示すように、範囲914をクローン化することは、LID範囲924を論理アドレス空間132内に割り当てること、(特に、メタデータ984及び/又は994を用いて)範囲914及び924をリンクさせること、及び、範囲914及び924を参照マップ460内の参照識別子934と関連付けることを含んでいてもよい。範囲クローン操作は更に、上で開示したように、参照マップ460内の範囲934を間接範囲914及び/又は924と関連付けるよう構成される永続的ノート366を記憶媒体140上に格納することを含んでいてもよい。参照マップ460内の範囲934は、記憶アドレス95〜106に結合されてもよい。従って、両範囲914及び924は、同じ記憶アドレスの同じデータを間接的に参照してもよい。
【0151】
LID982〜983に対応するデータを修正するよう構成される範囲924内の記憶操作は、状態943Bに示すように、新しいLIDを範囲924内に割り当てることと、新しいローカルエントリ982〜983を対応する記憶アドレス767〜768に結合することとを含んでいてもよい。範囲914及び924をマージすることは、記憶アドレス767〜768の修正されたデータを、上で開示したように、マージポリシーに従って範囲914に組み込むことを含んでいてもよい。
図9Dの実施形態において、状態943Cの範囲マージ操作は、参照エントリ934を削除することと、範囲914のLID081〜083を更新して記憶アドレス767〜768の更新されたデータを参照することとを含んでいてもよい。マージ操作は更に、上で開示したように、更新されたコンテキストフォーマットで永続的ノート366を格納すること及び/又は記憶アドレス767〜768のデータを書き換えることを含んでいてもよい。
【0152】
図9Eは、記憶層130によって実施される範囲クローン及び範囲マージ操作の更なる実施形態を示す。
図9Eは、
図5A〜Bと共に開示したような、中間アドレス空間を備える実施形態における範囲クローン及び範囲マージ操作を示している。状態947Aにおいて、VID072〜083を備えるVID範囲914は、VAS前方マップ560内の中間識別子272Z〜283Zを介して記憶アドレス95〜106に間接的に結合される。中間識別子は、別々の中間アドレス空間2136の一部(例えば、記憶層130の論理アドレス空間132)であってもよい。
【0153】
状態947Bに示すように、VID範囲914をクローン化することは、VID972〜983を備えるVID範囲924を割り当てることと、範囲924をVAS前方マップ560内の中間識別子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と関連付けるよう記憶媒体140に1つ以上の永続的ノート366を追記することを含んでいてもよい。
【0154】
幾つかの実施形態において、記憶層130は、ファイルシステム、データベース、及び/又は同様のもの等の記憶クライアント106のためにファイル整合性機能を提供するよう本明細書中に開示する範囲クローン、移動、及び/又はマージ操作を活用してもよい。
図9Fを参照すると、ファイルシステム906は、ネットワークファイルシステム(NFS)バージョン3プロトコル及び/又は他のファイルシステム実装及び/又はプロトコルに従ってファイルクローズ−オープン整合性モデルを実装するよう記憶層130を活用してもよい。ファイルクローズ−オープン整合性モデルは、複数のプロセス及び/又はアプリケーション(ファイルシステムクライアント)に同じファイルを同時に操作することを可能にするよう構成されてもよい。ファイル修正は、ファイルが閉じられる時に処理され、ファイル上で並列に操作している他のクライアントは、ファイルが開かれる次の時まで変更を知らない。従って、ファイルの状態は、ファイルが開かれる時に設定され、他のクライアントによって並列で実施された変更は、ファイルが再度開かれるまで適用されない。
【0155】
幾つかの実施形態において、ファイルシステム906は、修正が作業しているクローン化された範囲内で行われている間、ファイルの「オリジナル」データ(例えば、ファイルの一致バージョン)を保存するよう記憶層130を活用してもよい。本明細書中で用いるように、ファイルの「オリジナル」データ及び/又はファイルの一致バージョンを保存することとは、ファイルが開かれた時に相当する状態でファイルデータを維持し、及び/又は、オリジナルの未修正の状態でファイルデータの状態を再構築できるファイル修正のログを保持することを指す。
【0156】
図9Fは、ファイルクローズ−オープン整合性モデルを実施するよう構成される記憶層130を備えるシステム900Fの一実施形態を示している。ファイルシステム906(及び/又は他の記憶クライアント106)は、効果的にファイルクローズ−オープン整合性を実施するよう記憶層130を活用してもよい。記憶層130は、a)ファイルシステムクライアント926A〜Nのファイルオープンリクエストに応じてファイルをクローン化して、結果として、「一次」又は「一致」バージョンのファイル及び「作業中」バージョンのファイルを生じ;b)作業中バージョンのファイルに関して記憶操作を実行し;及び、c)ファイルを閉じることに応じて、作業中バージョンのファイルを一次バージョンのファイルにマージするよう構成されてもよい。記憶層130は、本明細書中に開示するように、(例えば、
図3A〜E、4A〜E、5A〜B、及び/又は同様のものの範囲クローン実施形態を用いて)1つ以上の範囲クローン操作においてファイルデータをクローン化するよう構成されてもよい。記憶層130は更に、本明細書中に開示するように、1つ以上の範囲マージ及び/又は折り畳み操作を用いて、作業中バージョンのファイル及び一次又は一致バージョンのファイルをマージするよう構成されてもよい。作業中バージョンのファイルは、ファイルが特定の記憶クライアント926A〜Nによって開かれた時のファイルの状態を表してもよい。記憶クライアント926A〜Nは、作業中バージョンのファイルに対する排他的アクセスを有してもよく、よって、作業中バージョンのファイルは、他のクライアント926A〜Nによって行われるファイル修正から隔離されてもよい。記憶層130は、「一次」又は「一致」論理インタフェースのファイルに関してオリジナルの修正されていないファイルデータを維持するよう構成されてもよく、これは、記憶操作が作業中論理インタフェースのファイルに関して実行される間、ファイルデータと一致論理インタフェースとの間の関連性を維持することを含んでいてもよい。異なる記憶クライアント926A〜Nによって行われるファイル修正間の競合は、最後の書込み(例えば、以前の書込みを上書きする時の最後の書込み);コピーオンコンフリクト(例えば、別のバージョンのファイルを作成する);クライアント926A〜N、アプリケーション、プロセス、及び/又は同様のものに基づく優先度;及びその他等の競合解消ポリシー又はマージポリシーに従って解消されてもよい。
【0157】
図9Fの実施形態において、状態953Aで、変換モジュール134は、ファイルのLID(ファイルLID950A)と、記憶媒体140上の記憶アドレスP0〜P3のファイル952Aのデータとの間のマッピング951Aを備えている。マッピング951Aは、本明細書中に開示する前方マップ160及び/又は
図5A〜Bと共に開示するような1つ以上の中間マッピング層を用いて実装されてもよい。
【0158】
状態953Bにおいて、記憶層130は、記憶クライアント(記憶クライアント926B)のファイルオープンリクエストに応じてファイルをクローン化するよう構成されてもよい。リクエストは、明示的リクエスト、リクエストパラメータ(例えば、fadvise、ioctrl等)、及び/又は同様のものとして、インタフェース131を介して受信されてもよい。クローン操作は、本明細書中に開示するように、作業中バージョンファイルに対応する「クローン化」ファイルLID950Bの新規セットを割り当てることと、クローン化識別子950Bのセットを、一次バージョンのファイルのLID950A(オリジナルの論理識別子950A又はその一致するセット)と同じファイルデータ952Aと関連付けることとを含んでいてもよい、1つ以上の範囲クローン操作を含んでいてもよい。範囲クローン操作は更に、上で開示したように、ファイルデータ952Aを、一次ファイルLID950A及び作業中バージョンのファイルLID950Bの両方と関連付けるよう、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。
【0159】
幾つかの実施形態において、記憶層130及び/又はファイルシステム906は、記憶クライアント926Bによって実行されるファイル操作を作業中バージョンのファイル(LID950Bの作業中セット)に向けるよう構成されてもよい。従って、記憶クライアント926Bによって行われる修正は、クローン化されたファイルLID950Bに関して行われてもよい。かかる修正は、オリジナルの一次バージョンのファイルLID950Aの状態に影響を及ぼさない場合がある。従って、記憶クライアント926Bは、オリジナルの一次バージョンのファイルのLID950Aを変更することなく、LID950Bに関して作業中バージョンのファイルを修正してもよい。
【0160】
状態953Cにおいて、記憶クライアント926Bは、記憶アドレスP3に格納されたファイルのデータを修正するよう(記憶層130を介する)記憶操作を実行しており、修正されたデータは、記憶アドレスP64において記憶ログに追記されてもよい。これに応じて、変換モジュール134は、クローン化された作業中バージョンのファイル950BのLIDを、記憶アドレスP64の修正されたファイルデータ952Bに結合するようマッピング951Bを更新してもよい。記憶クライアント926Bによって修正されていない他のLIDは、引き続き、オリジナルの修正されていないファイルデータ952Aに結合されてもよい。記憶層130は、一次バージョンのファイルの識別子950Aと記憶アドレスP0〜3の未修正ファイルデータ952Aとの間のオリジナルのマッピング951Aを保存するよう構成される。
【0161】
別の記憶クライアント926Nは、記憶クライアント926Bがファイルを閉じる前に、ファイルを開くためのリクエストを発行する場合がある。これに応じて、及び、状態953Dにおいて示すように、記憶層130は、一次ファイルの別のクローンを作成(一次ファイル識別子950Aをクローン化)してもよい。クローン化されたLID(FID950C)は、クローン化された識別子範囲950Bに関して記憶クライアント926Bによって行われる修正のない、ファイルのオリジナルの状態に対応してもよい。従って、クローン化LID950Cは、記憶アドレスP0〜3のオリジナルの未修正ファイルデータ952Aにマッピング951Cされてもよい。記憶クライアント926Nは、記憶クライアント926Bと並行して、新規クローン化ファイル識別子範囲950Cに関して記憶操作を実行してもよい。クライアント926B及び926Nによって行われる変更は、それらそれぞれのLID範囲950B及び950C内で隔離されてもよく、よって、一次バージョンのファイル(LID950A及び/又は相互)に適用されなくてもよい。
【0162】
状態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に結合されたままであってもよい。
【0163】
本明細書中に開示するように、幾つかの実施形態において、修正されたファイルデータ952Bは、記憶アドレスP64の修正されたファイルデータ952Bを、(一次バージョンのファイルと関連するLID950Aとは対照的に)LID950Bのうちの1つ以上と関連付けるよう構成される永続的メタデータを含んでもよい。従って、範囲マージ操作は更に、LID950Aの範囲の1つ以上を記憶アドレスP64の修正されたファイルデータ952Bと関連付けるよう構成される永続的ノート366を記憶媒体140に追記することを含んでいてもよい。記憶アドレスP64のデータは、1つ以上のバックグラウンド操作において、更新された永続的メタデータで書き換えられてもよい。ファイルクローズ操作(及び対応する範囲マージ操作)に続いて、変換モジュール134は、範囲950BのLIDの割り当てを解除するよう構成されてもよい。
【0164】
クライアント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を参照してもよい。
【0165】
クライアント926B及び926Cは、それらそれぞれのファイルを最終的に閉じてもよく、これは、各LID範囲950B及び950Cに関して行われた修正を一次バージョンのファイルの範囲950Aにマージすることを含んでいてもよい。記憶層130は、マージポリシー944に従って、範囲950B及び950C間の競合を解消するよう構成されてもよい。幾つかの実施形態において、マージポリシー944は、記憶クライアント926B及び926Cがファイルを閉じた順序に基づいてもよく、最後に閉じられたファイルの修正は、以前に適用された修正を上書きしてもよい(例えば、修正はシリアル化されてもよい)。状態953Gに示すように、記憶クライアント950Bは、記憶クライアント950Cの前にファイルクローズリクエストを発行してもよい。クライアント950Bがファイルを閉じた後、記憶層130は、範囲950Bに関して行われた修正を、(
図9Fの状態953Eに示すように)一次バージョンのファイルの範囲950Aにマージしてもよい。クライアント926Cによるファイルのクローズは、結果として、
図9Gの状態953Gに示すように、記憶クライアント950B(修正されたデータ952B)によって行われる幾つかの修正をデータ952Cで上書きすることを招く場合がある。P3及びP64のデータは、それがもはや一次ファイル又は現在の作業中バージョンのファイルによって参照されないため、記憶媒体140から削除のために印を付けられてもよい。上で開示したように、記憶層130は、優先度ベースのマージポリシー944等の他のマージポリシーを実施するよう構成されてもよい。優先度ベースのマージポリシーは、記憶クライアント926B及び/又は926Cの相対的優先度に基づいて競合を解消してもよい。状態953Hにおいて、記憶クライアント926Cは、記憶クライアント926Bの後にファイルを閉じてもよいが、しかし、記憶クライアント926Bの修正は、記憶クライアント926Bの修正が、記憶クライアント926Cの競合する修正よりも高い優先度を有することを示すマージポリシー944により保持されてもよい。従って、一次バージョンのファイルのLID950Aは、引き続き、記憶クライアント926Bの修正されたファイルデータ952Bを参照してもよく、記憶クライアント926Cの競合するファイルデータ(P96のデータ952C)は、P3の廃止ファイルデータ952Aと共にガベージコレクションのために印を付けられてもよい。他の実施形態において、マージポリシー944は、結果として、2つの一次バージョンのファイルを作成するコピーオンコンフリクトポリシーを備えていてもよい。かかる実施形態において、及び、状態953Iに示すように、記憶層130は、記憶クライアント926Bの修正を(一次ファイルLID950Aを用いる)一次ファイルに組み込むよう構成されてもよく、記憶クライアント926Cの競合する修正を新しいバージョンのファイル(ファイル識別子950D)に組み込んでもよい。
【0166】
マージポリシー944の特定の実施形態を本明細書中で説明するが、本開示はこれに関して限定されず、任意の適切なマージポリシー944を実施及び/又は組み込むことができる。マージポリシー944は、記憶層130及び/又はファイルシステム906内で実施されてもよい。幾つかの実施形態において、記憶層130及び/又はファイルシステム906のマージポリシー944は、記憶層130のインタフェース131を介して構成されてもよい。マージポリシー944は、記憶層130を介して実行される全てのファイル操作に適用されてもよい。代替として、又は加えて、マージポリシー944は、特に、上で開示したように、ファイルシステムAPI呼出し、fadvise、ioctrl、及び/又は同様のものを介して、ファイル毎及び/又は競合毎ベースで設定されてもよい。
【0167】
記憶層130は更に、効果的なアトミック記憶操作を実施するよう構成されてもよい。
図10Aは、アトミック記憶操作を実施するよう構成される記憶層130を備えるシステム1000Aの一実施形態のブロック図である。本明細書中で用いるように、アトミック記憶操作とは、全体として完全に完了されるか、ロールバックされる記憶操作を指す。従って、アトミック記憶操作は、部分的に完了されず、記憶層130は、不完全なアトミック記憶操作のデータを無効化及び/又は削除するよう構成されてもよい。アトミック記憶操作を実施すること、及び、特に、複数のステップを備えるか、及び/又は、複数の異なる識別子範囲又はI/Oベクトルに関するアトミック記憶操作は、高い間接費を課す場合がある。例えば、幾つかのデータベースシステムは、冗長書込み操作の複数のセットを用いるアトミック記憶操作を実装している。
【0168】
記憶層130は、記憶トランザクションを実装するよう構成されるトランザクションモジュール1036を備えていてもよい。トランザクションモジュール1036は、アトミック記憶操作の効率を高めるために本明細書中に開示する範囲クローン、範囲移動、及び/又は他の操作を活用するようアトミック記憶モジュール1035を備えていてもよい。幾つかの実施形態において、インタフェース131は、ベクトル化されたアトミック記憶操作を実行するためのAPI及び/又はインタフェースを提供する。ベクトルは、以下のようなデータ構造として定義されてもよい。
【数1】
【0169】
iov_baseパラメータは、ベクトルのデータを備えるメモリ又はバッファ位置を参照してもよく、iov_lenは、データバッファの長さ又はサイズを指してもよく、dest_lidは、ベクトルのための目的論理識別子(例えば、入力バッファiov_lenから暗示されるか、及び/又は導出される範囲の長さを有するベース論理識別子)を指してもよい。
【0170】
データを1つ以上のベクトルに書き込むためのベクトル記憶リクエストは、従って、以下のように定義されてもよい。
【数2】
【0171】
上記のベクトル書込み操作は、*iovポインタによって参照され、及び/又は、ベクトルカウントパラメータ(iov_cnt)によって指定されるそれぞれのベクトルデータ構造からデータを収集し、それぞれのiovect構造において指定される目的論理識別子(例えば、dest_lid)にデータを書き込むよう構成されてもよい。flagパラメータは、ベクトル書込み操作がアトミックベクトル操作として実施されるべきかどうかを指定してもよい。
【0172】
上で示すように、ベクトル記憶リクエストは、複数のベクトルのそれぞれに関して同じ操作を実行する(例えば、1つ以上の異なるベクトルに関する書込み操作を暗示的に実行する)ことを含んでいてもよい。幾つかの実施形態において、ベクトル記憶リクエストは、各構成要素ベクトルに対し、異なるI/O操作を指定してもよい。従って、各iovectデータ構造は、それぞれの操作インジケータを備えていてもよい。幾つかの実施形態において、iovect構造は、以下のように拡張されてもよい。
【数3】
【0173】
iov_flagパラメータは、ベクトルに関して実行する記憶操作を指定してもよい。iov_flagは、書込み、読取り、アトミック書込み、トリム又は廃棄リクエスト、削除リクエスト、フォーマットリクエスト、パターン化書込みリクエスト(例えば、特定のパターンを書き込むリクエスト)、ゼロ書込みリクエスト、又は検証リクエストによるアトミック書込み操作、割当リクエスト、又は同様のものを含むが、これらに限定されない任意の適切な記憶操作を指定してもよい。上で説明したベクトル記憶リクエストインタフェースは、ベクトル構造を受け入れるよう拡張されてもよい。
【数4】
【0174】
flagパラメータは、ベクトルリクエストのベクトル操作がアトミックに実行されるかどうかを指定してもよい。アトミック記憶操作の更なる実施形態は、Ashish Batwaraらの2012年12月21日に出願された米国特許出願第13/725,728号明細書、名称「Systems,Methods,and Interfaces for Vector Input/Output Operations」に開示されており、引用して本明細書に組み込む。
【0175】
トランザクションモジュール1036は、記憶層130内でアトミック記憶操作を実施するよう構成されるアトミック記憶モジュール1035を備えていてもよい。アトミック記憶モジュール1035は、リクエストの目標又は目的識別子とは異なる識別子のセットに関してアトミック記憶リクエストの記憶操作を実施するよう構成されてもよい。アトミック記憶操作が完了した後、アトミック記憶モジュール1035は、本明細書中に開示するように、アトミック記憶リクエストのそれぞれの目標又は目的識別子にデータを移動するよう構成されてもよい。
【0176】
幾つかの実施形態において、アトミック記憶モジュール1035は、識別子の第2のセットに関して論理識別子の第1のセットに向けられるアトミック記憶操作を実施する。識別子の第2のセットは、短命、一時的、作業中、又はプロセス中の識別子であると見なされてもよい。識別子の第2のセットは、記憶クライアント106に対して直接アクセス可能でなくてもよい。識別子の第2のセットは、論理アドレス空間132の特定の領域、特定の仮想アドレス空間(例えば、VAS532)、別の名前空間、及び/又は同様のものに対応してもよい。アトミック記憶リクエストの記憶操作を完了した後、アトミック記憶モジュール1035は、アトミック記憶リクエストのデータを識別子の第1のセットと関連付けるよう構成される範囲移動操作を実施してもよい。データは、識別子の第2のセットとの関連付けを解除されてもよい。上記のように、識別子の第2のセットは、論理アドレス空間132のLID及び/又はVAS532のVIDと区別できてもよい。万一不具合状態の場合には、再構築モジュール1037は、失敗したトランザクション(例えば、不完全なアトミック記憶操作)に関するような識別子に結合されるデータを特定してもよい。特定されたデータは、メタデータ再構築操作の間、無効化されてもよく、及び/又は、対応するエントリは、記憶メタデータ135から除外(例えば、前方マップ160、VAS前方マップ560、参照マップ460、及び/又は同様のものから除外)されてもよい。
【0177】
幾つかの実施形態において、アトミック記憶モジュール1035は、
図10Aのトランザクションアドレス空間1032等の別のアドレス空間内でアトミック記憶操作を実施する。
図10Aはトランザクションアドレス空間1032の使用を説明しているが、本開示はこれに関して限定されず、論理アドレス空間132の一部(例えば、LIDの範囲、程度、及び/又はセット)、VAS532一部、参照マップ460、中間アドレス空間、及び/又は同様のものを含むが、これらに限定されない任意の適切なアドレス範囲及び/又は名前空間を用いるよう成すことができる。トランザクションアドレス空間1032の識別子(トランザクションの識別子)は、記憶クライアント106に対して直接アクセス可能でなくてもよい。
【0178】
アトミック記憶モジュール1035は、トランザクションアドレス空間1032に関してアトミック記憶操作を実行してもよく、アトミック記憶操作が完了した後、アトミック記憶操作のデータをトランザクションアドレス空間1032から論理アドレス空間132(又は特定のVAS532等の他の目的又は目標名前空間)へ移動するよう構成されるアトミック範囲移動操作を実行してもよい。アトミック範囲移動操作は、本明細書中に開示するように、前方マップ160内の結合を更新すること、メタデータを記憶媒体140に書き込むこと(例えば、永続的ノート366をログに追記すること)、及び/又は同様のことを含んでもよい。
【0179】
図10Aの実施形態において、記憶クライアント106は、論理アドレス空間132内のベクトル1040A及び1040Bに関するアトミック記憶リクエストを発行する。
図10Aに示すように、ベクトル1040A及び1040Bは、前方マップ160内の既存のエントリに対応してもよい。アトミック記憶操作が(状態1015Aにおいて)実施される前に、ベクトル1040AのLID10〜13は、記憶アドレスP1〜P4に結合されてもよく、ベクトル1040BのLID36〜38は、記憶アドレスP6〜8に結合されてもよい。他の実施形態において、アトミック記憶リクエストは、記憶アドレスに割り当てられていない、及び/又は、未だ結合されていないLIDに関連してもよく、よって、前方マップ160(及び/又は他のマッピング層)内に対応するエントリを有していない。
【0180】
アトミック記憶リクエストに応じて、アトミック記憶モジュール1035は、特に、リダイレクトモジュール1034の使用により、トランザクションアドレス空間1032内の識別子の第2のセットにアクセスしてもよい。リダイレクトモジュール1034は、識別子の第2のセットをトランザクションアドレス空間1032内に割り当てるよう構成されてもよい。トランザクション識別子は、アトミック記憶リクエストの一部を実施する(例えば、アトミック記憶操作のプロセス中部分を追跡する)ために用いられてもよい。リダイレクトモジュール1034は更に、特に、記憶メタデータ135、前方インデックス160及び/又は他のインデックスメタデータ内のエントリ、及び/又は同様のものの使用により、識別子の第2のセットをLIDの第1のセット(例えば、アトミック記憶リクエストの目標LID)にリンクさせるよう構成されてもよい。幾つかの実施形態において、アトミック記憶モジュール1035は更に、本明細書中に開示するように、識別子の第2のセットを、識別子の第1のセットと同じ記憶アドレス(ベクトル1040A及び1040B)に結合するよう構成される範囲クローン操作を実行するよう構成されてもよい。
【0181】
状態1015Bに示すように、リダイレクトモジュール1034は、トランザクション識別子Z0〜3及びZ6〜8を含むベクトル1042A及び1042Bを備える識別子の第2のセットを割り当ててもよい。トランザクション識別子と記憶位置との間の結合は、特に、トランザクションマップ1060等の中間マッピング層を用いて記憶メタデータ内に維持されてもよい。トランザクションマップ1060は、トランザクション識別子と論理アドレス空間132のLID(及び/又はVAS532のVID)との間のマッピングを備えていてもよい。
図10Aの実施形態において、トランザクションマップ1060は、ベクトル1042Aのトランザクション識別子とベクトル1040Aの対応するLID(LID10〜13)との間のリンク1064Aを備え、トランザクションマップ1060は更に、ベクトル1042Bのトランザクション識別子とベクトル1040BのLID36〜38との間のリンク1064Bを含む。トランザクションマップ1060は更に、トランザクション識別子と記憶位置との間の結合を含んでもよい。状態1015Bは、トランザクション識別子1042Aとベクトル1040A内のLIDの記憶位置P1〜4との間の結合1062A、及びトランザクション識別子1042Bとベクトル1040B内のLIDの記憶位置P6〜8との間の結合1062Bを含む、トランザクションマップ1060における範囲クローン操作を示している。
【0182】
アトミック記憶モジュール1035は、トランザクションアドレス空間1032内のアトミック記憶リクエストのアトミック記憶操作を実施してもよく、これは、LIDの第1のセット(ベクトル1040A及び/又は1040B)から識別子の第2のセット(1042A及び1042Bのトランザクション識別子)へ記憶操作をリダイレクトすることを含んでいてもよい。記憶操作リダイレクトすることは、特に、トランザクションマップ1060の使用により、アトミック記憶リクエスト内のLIDに対する参照をトランザクション識別子の第2のセットへ変換することを含んでいてもよい。例えば、LID10に関する記憶操作は、トランザクションマップ1060のマッピング1064Aに基づいてトランザクション識別子Z0へリダイレクトされてもよい。論理容量を割り当てるよう構成される記憶操作は、トランザクションアドレス空間1032へリダイレクトされ(及び、内部に維持され)てもよい。例えば、LID14〜20を含むようベクトル1040Aを拡張するリクエストは、a)LIDを論理アドレス空間132内で割り当てること、b)対応するトランザクション識別子をトランザクションアドレス空間1032内で割り当てること、及びc)割り当てたトランザクション識別子及びLIDをトランザクションマップ1060内でリンクさせることを含んでいてもよい。LIDをトリムするリクエストは、対応する識別子をトランザクションマップ1060内で無効として印を付けることを含んでいてもよい。論理アドレス空間132内の対応するLIDは、本明細書中で更に詳細に開示するように、アトミック記憶操作の完了時に実行される範囲移動操作に応じてトリムされてもよい。
【0183】
状態1015Cに示すように、アトミック記憶リクエストの記憶操作は、データを記憶位置P9〜13及びP100〜102において記憶媒体140に追記することを含んでいてもよい。対応する記憶操作は、本明細書中に開示するように、トランザクションアドレス空間1032へリダイレクトされてもよい。従って、アトミック記憶リクエストのデータは、トランザクション識別子Z0〜3及びZ6〜8と関連付けられてもよく、これは、a)トランザクションマップ1060において記憶位置P9〜13及びP100〜102をトランザクション識別子Z0〜3及びZ6〜8に結合することと、b)データを各トランザクション識別子Z0〜3及びZ6〜8と関連付けるよう構成される永続的メタデータ114と共にP9〜13及びP100〜102のデータを格納することとを含んでいてもよい。
【0184】
他の記憶操作は、アトミックベクトル操作と同時に実行されるか、及び/又は、その内部でインターリーブされてもよい。従って、アトミック記憶リクエストのデータは、記憶媒体140の記憶アドレス空間144内部で隣接する記憶位置に格納される必要はない。アトミック記憶リクエストのデータは、特に、記憶位置P9〜10及びP100〜102のデータとトランザクション識別子Z0〜3及びZ6〜8との間の結合に基づいて、アトミック記憶リクエストに関係しない他のデータと区別されてもよい。
【0185】
状態1015Cにおいて更に示すように、ベクトル1040A及び1040B内のオリジナルの修正されていない状態のLIDは、アトミック記憶操作の進行中に変更されなくてもよく、記憶位置P1〜4及びP6〜8におけるデータは記憶媒体140に残ってもよく、オリジナルの修正されていないデータとLID10〜13及び36〜38との間の結合は、前方インデックス160内に維持されてもよい。従って、ベクトル1040A及び1040Bに対応するオリジナルの修正されていないデータは、アトミック記憶操作が実行されている間、一貫した状態で維持されてもよく、アトミック記憶操作における不具合に関係なく保存されてもよい。
【0186】
アトミック記憶操作の完了は、トランザクションアドレス空間1032の内容を論理アドレス空間132にマージすることを含んでいてもよい。状態1015Dにおいて示すように、(状態1015Cにおいて示すような)トランザクションアドレス空間内のアトミック記憶操作を完了した後、アトミック記憶モジュール1035は、データをLIDの第1のセット(ベクトル1040A及び1040Bの目的LID)に結合するためにP9〜13及びP100〜102におけるデータの論理インタフェースを修正するよう範囲移動操作を実行してもよい。範囲移動操作は、ベクトル1040AのLID10〜13を記憶位置P9〜13と関連付け、ベクトル1040BのLID36〜38を記憶位置P100〜102と関連付けるよう前方マップ160を更新することを含んでいてもよい。範囲移動操作は更に、本明細書中に開示するように、記憶アドレスP9〜P13をLID10〜13に、及びP100〜102をLID36〜38に結合するよう、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。範囲移動操作は、
図4A〜Eの参照エントリ実施形態及び/又は
図5A〜Bの中間マッピング実施形態を含むが、これらに限定されない他の方法で実施されてもよい。範囲移動操作はまた、更新された論理インタフェースと一致するコンテキストフォーマットでデータを書き換えることを含んでいてもよく、これは、データをLIDの第1のセット(例えば、それぞれ、論理アドレス空間132のLID10〜13及び/又は36〜38)と関連付けるよう構成される永続的メタデータ114でデータを書き換えることを含んでいてもよい。データは、本明細書中に開示するように、1つ以上のバックグラウンド操作において書き換えられてもよい。
【0187】
アトミック記憶モジュール1035は、範囲移動操作の完了に応じてアトミック記憶リクエストの完了を通知するよう構成されてもよい。従って、完了は、永続的ノート366を格納すること及び/又は永続的ノート366を書込みバッファ(及び/又は記憶装置141の停電セーフ領域)に入れることに応じて通知されてもよい。アトミック記憶リクエストの完了は更に、アトミック記憶リクエストを実施するために用いられるトランザクション識別子の割り当てを解除することを含んでいてもよい。
【0188】
幾つかの実施形態において、範囲移動操作は更に、論理アドレス空間132内のLID割り当てを修正することを含んでいてもよい。上で開示したように、アトミック記憶操作は、論理アドレス空間132内にLIDを割り当てるためのリクエストを含んでいてもよい。かかる操作を実施することは、本明細書中に開示するように、a)要求されたLID(又は代替LID)を論理アドレス空間132内に割り当てること、b)対応するトランザクション識別子をトランザクションアドレス空間1032に割り当てること、及びc)LIDをトランザクション識別子にリンクさせることを含んでもよい。範囲移動操作は、本明細書中に開示するように、トランザクション識別子を削除すること、及び/又は、対応するトランザクション識別子と関連するデータを割り当てられたLIDに移動することを含んでいてもよい。1つ以上のLIDをトリムする操作を実施することは、対応するトランザクション識別子をトランザクションマップ1060内で無効として印を付けることを含んでいてもよい。対応する範囲移動操作は、特に、LIDを前方インデックス160から削除するか、及び/又は、LIDが削除されたことを示す永続的メタデータを格納することによって、トランザクション識別子にマッピングされたLIDをトリムすることを含んでいてもよい。
図10Aの実施形態において、LID12をトリムするためのリクエストを備えるアトミック記憶リクエストは、トランザクションマップ1060内のトランザクション識別子Z2を無効化することを含んでいてもよい。トランザクション識別子Z2を無効化することは、トランザクション識別子Z2を表すエントリをトランザクションマップ1060内に保持することと、エントリを無効、削除済、トリム済、又は同様のものとして印を付けることを含んでいてもよい。アトミック記憶リクエストを完了することは、a)トランザクション識別子Z2にマッピングされたLIDを無効化すること(例えば、前方マップ160内のLID12に対応するエントリ及び/又は他の記憶メタデータ135を無効化すること)、及び/又は、b)LID12をトリムするよう(例えば、LID12に結合された記憶位置におけるデータが記憶媒体140上で保持される必要がないことを示す)永続的ノート366を構成することを含んでいてもよい。
【0189】
幾つかの実施形態において、記憶層130は更に、記憶ログの内容から記憶メタデータ135を再構築するよう構成される再構築モジュール1037を備えていてもよい。再構築モジュール1037は、記憶メタデータ135に対する損失及び/又はその破損を結果としてもたらす不具合状態に応じて記憶メタデータ135を再構築してもよい。再構築モジュール1037は、(最新のものから最も古いものへ、又はその逆の)ログ順序で記憶アドレス空間144内の物理記憶位置をトラバースするよう構成されてもよい。再構築モジュール1037は、前方マップ160の記憶アドレス割当てに対して、特に、LIDを再構築するよう、記憶ログの永続的メタデータ114にアクセスしてもよい。
【0190】
図10Aのアトミック記憶操作の不具合に応じて、再構築モジュール1037は、P1〜4及びP6〜8のそれぞれの内容に基づいてベクトル1040A及び1040Bを再構築するよう構成されてもよい。再構築モジュール1037は、P9〜13及び/又はP100〜102に格納されたデータが、プロセス中のアドレス空間1032の識別子Z0〜3及びZ6〜9とのデータの関連付けに基づく不完全なアトミック記憶リクエストに関連することを認識してもよい。再構築モジュール1037は、従って、前方インデックス160からエントリを除外し、対応する記憶位置のデータを無効化してもよい。代替として、再構築モジュール1037は、部分的なアトミック記憶リクエストが完了できる(例えば、最初からアトミック記憶操作を再開するのではなく、障害発生時点から再開する)ように、トランザクションマップ1060内の対応するエントリを再構築してもよい。
【0191】
再構築モジュール1037は更に、完了したアトミック記憶リクエストに関するデータを特定するよう構成されてもよい。
図10Aのアトミック記憶リクエストが正常に完了した後、記憶メタデータ135を再構築する場合、再構築モジュール1037は、物理的な記憶位置P9〜13及びP100〜102が、記憶位置109に格納された永続的ノート366に基づいて、論理アドレス空間132のLIDに対応する(及び、正常なアトミック記憶リクエストの結果である)かを判断してもよい。上で開示したように、永続的ノート366は、P9〜13及びP100〜102のデータをベクトル1040A及び1040BのLIDと関連付けるよう構成される永続的メタデータを備えていてもよい。従って、再構築モジュール1037は更に、対応するデータが更新されたコンテキストフォーマットで書き換えられたかに関わらず、永続的ノート366の使用により状態1015Cの関連付けを再構築するよう構成されてもよい。
【0192】
図10Bは、特に、本明細書中に開示する記憶層130及びアグリゲーション層530の使用により実施されるアトミック記憶操作の更なる実施形態1000Bを示している。状態1017Aにおいて、VIDの第1のセットに関するアトミック記憶操作が受信されてもよい。状態1017Aに示すように、ベクトル4096〜4159の目標VIDは、既存のVID割当及び/又はデータに対応していなくてもよい。従って、VAS前方マップ560は、VID4096〜4159に対応するエントリ及び/又は中間マップ1070内のエントリを含んでいなくてもよい。
【0193】
状態1017Bに示すように、アトミック記憶リクエストに応じて、アトミック記憶モジュール1035は、アトミック記憶リクエストに対応するVID(エントリ4096,64)を割り当てるよう構成されてもよい。要求されたエントリが利用できない(例えば、既に別のクライアント及び/又は既存のデータに割り当てられている)場合、アトミック記憶リクエストは失敗する場合がある。代替として、アトミック記憶モジュール1035は、アトミック記憶リクエストを実施するようVIDの異なるセットを割り当ててもよく、これは、アトミック記憶リクエストの完了時に記憶クライアント106に返されてもよい。
【0194】
リダイレクトモジュール1034は、VID4096,64に対応する一時的なプロセス中の識別子9872Z,64を割り当てるよう構成されてもよい。本明細書中に開示するトランザクション識別子と同様に、プロセス中識別子9872Z,64は、目標VID(例えば、トランザクションアドレス空間1032)、VAS560の特定の領域、別のVAS560、及び/又は同様のものとは異なる名前空間に対応してもよい。リダイレクトモジュール1034は、特に、VAS前方マップ560内のそれぞれのエントリのメタデータ(及び/又は他の記憶メタデータ135)の使用により、及び/又はトランザクションマップ1060(又はプロセス中インデックス)の使用により、VID4096,64をプロセス中識別子9872Z,64にリンクさせるよう構成されてもよい。トランザクション識別子9872Z,64を中間識別子1032,64に結合することは、永続的ノート1066Aを記憶媒体140に追記することを含んでいてもよい。永続的ノート1066Aは、プロセス中識別子を中間識別子1032,64と関連付けるよう構成される永続的メタデータを備えていてもよい。
【0195】
状態1017Cにおいて、アトミック記憶モジュール1035は、プロセス中識別子に関してアトミック記憶リクエストに対応する記憶操作を実施するよう構成されてもよく、これは、アトミック記憶リクエストのVIDを対応するプロセス中識別子にリダイレクト(及び/又は変換)することを含んでいてもよい。記憶操作は、特に、ログ記憶モジュール137の使用によってデータを記憶媒体140に追記することを含んでいてもよい。プロセス中識別子9872Z,64は、中間マッピング層1070(識別子1032,64)及び/又は永続的ノート1066Aを介して追記されたデータに結合されてもよい。記憶ログに追記されたデータは、アトミック記憶操作のデータをそれぞれの中間識別子1032,64に結合するよう構成される永続的メタデータ114を備えていてもよい。永続的メタデータ114は更に、データをアトミック記憶リクエストの一部として特定するよう構成されるフラグ又は他のインジケータを備えていてもよい。
【0196】
アトミック記憶リクエストの完了は、データをアトミック記憶リクエストの目的VID(VID4096,64)に結合するために追記されたデータの論理インタフェースを修正するよう構成される範囲移動操作を含んでいてもよい。アトミック記憶リクエストの記憶操作を完了した後、アトミック記憶モジュール1035は、特に、a)目標VID4096,64を中間エントリ1032,64と関連付けるようVAS前方マップ560を更新すること、及びb)プロセス中識別子9872Z,64と中間エントリ1032,64との間のマッピングを削除することによって範囲移動操作を実施してもよい。
【0197】
範囲移動操作は更に、プロセス中識別子9872Z,64の割り当てを解除すること(例えば、上で開示したように、プロセス中インデックス1060からエントリ及び/又は対応するメタデータを削除すること)を含んでいてもよい。状態1017Dに示すように、範囲移動操作は更に、追記されたデータの修正された論理インタフェースを特定するよう構成されてもよい別の永続的ノート1066Bを記憶媒体140に追記することを含んでいてもよい。永続的ノート1066Bは、中間エントリ1032,64を目的VID範囲4096,64に結合してもよい。永続的ノート1066Bは更に、アトミック記憶操作が正常に完了したことを示してもよい。アトミック記憶モジュール1035は、永続的ノート1066Bを記憶媒体140上に格納すること(及び/又は、例えば、停電セーフ領域内の記憶のために永続的ノート1066Bをスケジュール設定すること)に応じてアトミック記憶リクエストの完了を通知するよう構成されてもよい。
【0198】
上で開示したように、幾つかの実施形態において、アトミック記憶モジュール1035によって実施される範囲移動操作は、目標名前空間(例えば、論理アドレス空間132)に対する修正を含んでいてもよい。一実施形態において、例えば、アトミック記憶リクエストは、I/Oベクトルをトリムするためのリクエストを含んでいてもよい。アトミック記憶リクエストを実施することは、上で開示したように、対応するプロセス中又はトランザクション識別子をトリムするよう構成される、永続的ノート366を記憶ログ内に格納することを含んでいてもよい。範囲移動操作は、目標名前空間内でトリム操作を実施することを含んでいてもよい。トリム操作は、本明細書中に開示するように、目標I/Oベクトルをトリムするよう永続的ノート1066Bを構成すること、及び/又は、格納されたトリムコマンドを目標I/Oベクトルに移動させることを含んでいてもよい。
【0199】
永続的ノート1066Bは、上で開示したように、万一の不具合状態の場合に記憶メタデータ135をリビルドするよう、再構築モジュール1037によって用いられてもよい。再構築モジュール1037は、中間マップ1070及び/又はVAS前方マップ560の結合をリビルドしてもよい。状態1017Dにおいて、再構築モジュール1037は、ログ内に(例えば、それぞれのパケットヘッダ内に)対応するデータセグメントと共に格納される永続的メタデータ114の使用により、1032,64に対応する記憶アドレスとの間の関連付けを再構築してもよい。再構築モジュール1037は更に、永続的ノート1066Bの使用により中間アドレス1032,64をVID4096,64と関連付けるよう構成されてもよい。
【0200】
状態1017Eに示すように、再構築モジュール1037は、アトミック記憶リクエストの完了を示す永続的ノート1066Bが記憶媒体140上に存在しないことを判断することに応じて、失敗したアトミック記憶操作のデータを特定してもよい。再構築モジュール1037は、a)プロセス中識別子9872Z,64に結合される、及び/又は、b)(それぞれの永続的メタデータ114において)アトミックとして印を付けられる中間識別子1032,64に結合されるデータを特定することに応じて、追記されたデータが不完全な失敗したアトミック記憶リクエストの一部だったかを判断してもよい。これに応じて、再構築モジュール1037は、a)エントリ1032,64を中間マップ1070から削除及び/又は除外し、b)エントリ4096,64及び/又は9872Z,64をVAS前方マップ560から削除及び/又は除外し、及び/又はc)記憶媒体140上の対応するデータを無効化してもよい。
【0201】
図11は、不揮発性記憶媒体上にコンテキストフォーマットで格納されるデータの論理インタフェースを管理するための方法1100の一実施形態のフロー図である。
【0202】
ステップ1120は、不揮発性記憶媒体上にコンテキストフォーマットで格納されるデータの論理インタフェースを修正することを含んでいてもよい。論理インタフェースは、クローン操作、重複排除操作、移動操作、又は同様のものを含んでもよいが、これらに限定されないデータに関する操作を実行することに応じて、ステップ1120において修正されてもよい。リクエストは、記憶クライアント106、記憶層130(例えば、重複排除モジュール374)、又は同様のものから生じてもよい。
【0203】
論理インタフェースを修正することは、データと関連するLIDを修正することを含んでいてもよく、これは、1つ以上の追加のLID(例えば、クローン、重複排除等)を用いてデータを参照すること、データと関連するLIDを変更すること(例えば、移動)、又は同様のことを含んでもよいが、これらに限定されない。修正された論理インタフェースは、上で説明したように、記憶媒体140上のデータのコンテキストフォーマットと矛盾する場合がある。
【0204】
ステップ1120は更に、論理インタフェースに対する修正を特定する永続的ノートを記憶媒体140上に格納することを含んでいてもよい。永続的ノートは、データの修正された論理インタフェース(例えば、記憶メタデータ135)が(必要であれば)記憶媒体140の内容から再構築できるように、論理操作を永続的及びクラッシュセーフにするために用いられてもよい。ステップ1120は更に、論理インタフェースが修正されたことを通知すること(例えば、API呼出しから返すこと、明示的な通知を返すこと、又は同様のこと)を含んでいてもよい。通知(及びステップ1130の修正された論理インタフェースを介するアクセス)は、データのコンテキストフォーマットが記憶媒体140上で更新される前に生じる。従って、論理操作は、データが書き換えられ、及び/又は再配置されるまで、待機しなくてもよく、本明細書中に開示するように、データのコンテキストフォーマットを更新することは、遅延されるか、及び/又は、方法1100の「クリティカルパス」及び/又は他の記憶操作及び/又はリクエストを処理するための経路の外側のプロセス中に実施されてもよい。
【0205】
ステップ1130は、ステップ1120修正された論理インタフェースを介して、矛盾したコンテキストフォーマット内のデータに対するアクセスを提供することを含んでいてもよい。上で説明したように、修正されたコンテキストインタフェースと一致するようデータのコンテキストフォーマットを更新することは、不揮発性記憶媒体上のデータを書き換えること及び/又は再配置することを含んでいてもよく、これは、ステップ1120の操作及び/又は修正された論理インタフェースに関する他の記憶操作に追加の待ち時間を課す場合がある。従って、記憶層130は、データのコンテキストフォーマットが更新される間(又は前)に、矛盾したコンテキストフォーマット内のデータに対するアクセスを提供するよう構成されてもよい。ステップ1130においてデータに対するアクセスを提供することは、上で説明したように、(1つ以上の間接エントリを介して)データに対応する1つ以上の参照エントリを参照すること、及び/又は、それにリンクさせることを含んでいてもよい。
【0206】
ステップ1140は、ステップ1120の修正された論理インタフェースと一致するよう記憶媒体140上のデータのコンテキストフォーマットを更新することを含んでいてもよい。ステップ1140は、データを記憶媒体140上の別の媒体記憶位置に書き換えるか、及び/又は、再配置することを含んでいてもよい。上で説明したように、ステップ1140は、ステップ1120のクリティカルパスの外側のプロセス、及び/又は、記憶層130によって実行される他の記憶リクエストを用いて実施されてもよく、ステップ1140は、媒体管理モジュール370、重複排除モジュール374、又は同様のもの等の別の自律モジュールによって実施されてもよい。従って、データのコンテキストフォーマットは、他の記憶操作及び/又はリクエストを処理することとは無関係に更新されてもよい。よって、ステップ1140は、データのコンテキストフォーマットの即時更新を遅延させることと、媒体管理プロセス等の1つ以上の「バックグラウンド」プロセスにおいて、データのコンテキストフォーマットを更新することとを含んでいてもよい。代替として、又は加えて、データのコンテキストフォーマットを更新することは、他の記憶操作に応じて(例えば、それと共に)生じてもよい。例えば、データを修正するための後続のリクエストは、データが所定位置以外及び更新されたコンテキストフォーマットで書き換えられることをもたらしてもよい。
【0207】
ステップ1140は更に、データのコンテキストフォーマットが更新されるように、記憶メタデータ135を更新することを含んでいてもよい。データが、更新されたコンテキストフォーマットで書き換えられるか、及び/又は再配置されるように、記憶層130は、それに従って、記憶メタデータ135(例えば、前方マップ160)を更新してもよい。更新は、上で説明したように、参照マップ460内の参照エントリへの1つ以上のリンクを削除すること、及び/又は、間接エントリをローカルエントリで置換することを含んでいてもよい。ステップ1140は更に、上で開示したように、データのコンテキストフォーマットを更新すること、及び/又は、記憶メタデータ135を永続させることに応じて、永続的ノートを無効化すること、及び/又は、それを記憶媒体140から削除することを含んでいてもよい。
【0208】
図12は、不揮発性記憶媒体上にコンテキストフォーマットで格納されるデータの論理インタフェースを管理するための方法1200の別の実施形態のフロー図である。方法1200は、本明細書中に開示するように、記憶層130の1つ以上のモジュール及び/又はコンポーネントによって実施されてもよい。
【0209】
ステップ1220は、消去ブロック又は論理消去ブロック等の、回復のための記憶区分を選択することを含んでいる。上で説明したように、ステップ1220の選択は、利用可能な記憶容量の不足、閾値に達する特定の論理消去ブロック内で無効として印を付けられたデータの割合を検出すること、有効データの連結、閾値に達するエラー検出率、データ分散を向上すること、データリフレッシュ、又は同様のもの等の多数の異なる要因に基づいてもよい。代替として、又は加えて、ステップ1220の選択基準は、記憶区分が、上で説明したように、その対応する論理インタフェースと一致しないコンテキストフォーマットでデータを備えているかどうかを含んでもよい。
【0210】
上で開示したように、記憶区分を回復すること(又は再利用すること)は、記憶区分を消去することと、その有効データ(もしあれば)を不揮発性記憶媒体上の他の記憶位置に再配置することを含んでいてもよい。ステップ1230は、グルーミング操作において再配置されるデータのコンテキストフォーマットが更新されるべき(例えば、データの論理インタフェースと一致しない)かどうかを決定することを含んでいてもよい。ステップ1230は、データの永続的メタデータ(例えば、論理インタフェースメタデータ)がデータの記憶メタデータ135と一致するかどうか決定するよう、上で説明したような、前方マップ160、参照マップ460、及び/又は中間アドレス空間等の記憶メタデータ135にアクセスすることを含んでいてもよい。永続的メタデータが記憶メタデータ135と一致していない(例えば、上で説明したように、データを異なるLIDと関連付けている)場合、フローはステップ1240で継続し、それ以外の場合、フローはステップ1250で継続する。
【0211】
ステップ1240は、データの論理インタフェースと一致するようデータのコンテキストフォーマットを更新することを含んでいてもよい。ステップ1240は、上で説明したように、LIDの異なるセット(及び/又は参照エントリ)を参照するよう論理インタフェースメタデータを修正することを含んでいてもよい。
【0212】
ステップ1250は、上で説明したように、不揮発性記憶媒体上で実行される記憶操作の順序付けられたシーケンスを保存するログフォーマットで異なる記憶位置にデータを再配置することを含んでいる。従って、再配置されたデータ(更新されたコンテキストフォーマットでの)は、記憶メタデータ135を再構築する場合(必要であれば)、有効で、最新バージョンのデータとして特定されてもよい。ステップ1250は更に、データの論理インタフェースをデータの新しい媒体記憶位置に結合、矛盾したコンテキストフォーマットのデータに対する間接及び/又は参照エントリを削除等するよう、記憶メタデータ135を更新することを含んでいてもよい。
【0213】
図13は、コンテキストフォーマットで格納されるデータの論理インタフェースを管理するための方法1300の別の実施形態のフロー図である。ステップ1315は、1つ以上の記憶装置120上の重複データを特定することを含んでいてもよい。ステップ1315は、記憶層130内で動作する重複排除モジュール374によって実行されてもよい。代替として、ステップ1320は、記憶操作が実行されるように、記憶層130によって実行されてもよい。
【0214】
ステップ1315は、記憶媒体140が重複データを備えている(又は、書込み及び/又は修正リクエストのデータを既に備えている)ことを判断すること及び/又は評価することを含んでいてもよい。従って、ステップ1320は、(例えば、重複データが記憶媒体140に書き込まれる際、又は、その前に)記憶操作の経路内で生じてもよいか、及び/又は、処理する記憶操作の経路の外側で生じてもよい(例えば、既に記憶媒体140上に格納された重複データを特定する)。ステップ1320は、記憶メタデータ135内でデータ署名を生成すること及び/又は維持することと、重複データを特定するために署名を用いることとを含んでいてもよい。
【0215】
ステップ1315における重複データを特定することに応じて、記憶層130(又は、重複排除モジュール374等の他のモジュール)は、単一コピーがLIDの2つ(以上)のセットによって参照されてもよいように、データのコピーの論理インタフェースを修正してもよい。ステップ1320における論理インタフェースに対する修正は、上で説明したように、記憶メタデータ135を更新すること及び/又は不揮発性記憶媒体135上に永続的ノートを格納することを含んでいてもよい。ステップ1320は更に、上で説明したように、不揮発性記憶媒体上のデータの他のコピーを無効化すること及び/又は削除することを含んでいてもよい。
【0216】
記憶媒体140上のデータのコンテキストフォーマットは、修正された論理インタフェースと矛盾する場合がある。従って、ステップ1330及び1340は、上で説明したように、修正された論理インタフェースを介して矛盾したコンテキストフォーマットのデータに対するアクセスを提供することと、記憶媒体140上のデータのコンテキストフォーマットを更新することを含んでいてもよい。
【0217】
図14は、本明細書中に開示する記憶層130によって実施される範囲マージ操作の一実施形態のフロー図である。ステップ1410は、論理アドレス空間132内のLIDのセットをクローン化することを含んでいてもよい。LIDをクローン化することは、LIDの2つ以上の異なるセットを介して記憶媒体140上のデータの同じセット(例えば、同じ記憶位置及び/又は記憶アドレス)を参照することを含んでいてもよい。2つ以上のセットは、LIDの作業中のセット及びLIDのオリジナルの一致するセットを含んでもよい。LIDの作業中のセットは、ファイル修正操作を実行するために用いられてもよく、LIDのオリジナルの一致するセットは、オリジナルの修正されていない状態のデータを維持するよう構成されてもよい。
【0218】
上で開示したように、ステップ1410においてクローン化されたデータは、記憶媒体140上のデータの記憶位置に結合されてもよいLIDのセットによって参照されてもよい。ステップ1410は、LIDの1つ以上の他のセットを論理アドレス空間132内及び/又は別のアドレス空間内に割り当てることを含んでいてもよい。LIDの1つ以上の他のセットは、LIDのオリジナルのセットの論理容量と等しい(例えば、同じ数のLIDを含むか、及び/又は、同じ量の記憶容量に相当する)論理容量を備えていてもよい。ステップ1410は更に、LIDの1つ以上の他のセットの論理識別子をLIDのオリジナルのセットによって参照される同じデータと関連付けるか、及び/又は結合することを含んでいてもよい。従って、ステップ1410は、データをLIDの2つ以上の異なるセットと関連付けるよう、データに対する論理インタフェースを修正することを含んでいてもよい。幾つかの実施形態において、ステップ1410は、LIDの1つ以上のセットを論理アドレス空間132内に割り当てることと、LIDを記憶アドレスの同じセットに結合することとを含んでいる。代替として、又は加えて、ステップ1410は、
図4A〜Eと共に開示したように、1つ以上の参照エントリを介して、LIDの2つ以上の異なるセットのLIDを記憶アドレスに間接的にリンクさせるよう、参照マップ460内で1つ以上の参照エントリを作成することを含んでいてもよい。代替として、ステップ1410は、(例えば、
図5A〜Bと共に開示したように)1つ以上の中間マッピング層の使用により実施されてもよい。ステップ1410は更に、特に、LIDと関連するメタデータ984及び/又は994を介してLIDの2つ以上のセットをリンクさせることを含んでいてもよい。メタデータ984及び/又は994は、LIDセットが同じ記憶エンティティ(例えば、同じファイルのバージョン)のクローンを表すことを示すよう構成されてもよい。メタデータ984及び/又は994は更に、上で開示したように、LIDの2つ以上のセットのためのマージポリシーを指定及び/又は参照するよう構成されてもよい。
【0219】
ステップ1410は更に、ステップ1410のクローン操作を永続的及びクラッシュセーフにするよう構成される永続的ノート366を記憶媒体140上に格納することを含んでいてもよい。永続的ノート366は、データの修正された論理インタフェースを示し(例えば、データをLIDの2つ以上のセットと関連付ける)、クローン操作のマージポリシーを示し、及び同様のことを行うよう構成されてもよい。
【0220】
ステップ1420は、ステップ1410の異なるLID範囲のうちの1つ以上の内部で記憶操作を実行することを含んでいてもよい。記憶操作は、1つ以上の記憶クライアント106からインタフェース131を介して受信されたリクエストに応じて実行されてもよい。記憶操作は、データを記憶媒体140に追記することを含んでいてもよい。記憶操作は、従って、LIDセットのうちの1つ以上におけるLIDと記憶媒体140上の記憶位置との間の関連性及び/又は結合を修正することを含んでいてもよい。関連性及び/又は結合を修正することは更に、直接、及び/又は、1つ以上の間接参照及び/又はマッピング層を介して、LIDセットのうちの1つ以上におけるLIDを追記されたデータにマッピングすることを含んでいてもよい。
【0221】
ステップ1430は、上で開示したように、LIDセットをマージすることを含んでいてもよい。LIDセットをマージすることは、上で開示したように、LID範囲のうちの1つにおいて行われた修正をLIDセットのうちの1つ以上に組み込むことを含んでいてもよい。ステップ1430は更に、マージポリシーに従って1つ以上のマージ競合を解消することを含んでいてもよい。幾つかの実施形態において、マージすることは、LIDセットのうちの1つ以上を削除すること(例えば、無効化すること)を含み、これは、エントリを前方マップ160から削除すること、記憶位置に対して共有された参照を参照カウントデータ構造から削除すること、参照エントリを参照マップ460から削除すること、中間マッピング層内の参照を削除すること、及び/又は同様のことを含んでいてもよい。ステップ1430は更に、上で開示したように、マージされたデータの論理インタフェースを修正することを含んでいてもよい。修正された論理インタフェースは、LIDセットのうちの1つ以上に関して当初格納されたデータを参照するために用いられるLIDを更新してもよい。修正された論理インタフェースは、記憶媒体140上のデータのコンテキストフォーマットと矛盾する場合がある。従って、ステップ1430は、マージされたデータをデータの更新された論理インタフェースと関連付ける(例えば、第2のセット内のLIDと関連して当初格納されたデータを第1のセット内のLIDと関連付ける)よう、記憶媒体140上の1つ以上の永続的ノート366を追記することを含んでいてもよい。ステップ1430は更に、上で開示したように、矛盾したコンテキストフォーマットのデータに対するアクセスを提供すること、及び/又は、1つ以上のバックグラウンド操作においてデータのコンテキストフォーマットを更新することを含んでいてもよい。
【0222】
図15は、範囲マージ操作のための方法1500の別の実施形態のフロー図である。ステップ1520は、LID範囲の論理コピーを作成するためのリクエストを受信することを含んでいてもよい。リクエストは、インタフェース131を介して記憶クライアント106から受信されてもよく、及び/又は、記憶層130によって提供されるよりハイレベルなAPIの一部であってもよい。リクエストは、仮に、クローンがどの様に同期されるか;マージはどのように生じるか(マージポリシー);論理コピーが短命として指定されているかどうか等を含んでもよいが、これらに限定されないクローンの「動作モード」を含んでもよい。
【0223】
ステップ1530は、リクエストを処理するようLIDを論理アドレス空間132内に割り当てることを含んでいてもよい。ステップ1530の割り当ては更に、クローン化されたLID範囲に対する変更を適応するよう物理記憶空間を確保することを含んでいてもよい。物理記憶空間の確保は、クローンの動作モードを前提としてもよい。例えば、全ての変更がクローンとオリジナルのアドレス範囲との間で同期されると、物理記憶空間の小さい部分(もしあれば)が確保されてもよい。代替として、記憶層130は、コピーオンコンフリクトマージポリシーを有する論理コピー操作のために追加の物理記憶容量を確保してもよい。ステップ1530は更に、論理アドレス空間132の指定部分又はセグメント(例えば、論理コピー及び/又はクローン操作と共に使用するための専用の範囲)内にクローンを割り当てることを含んでいてもよい。従って、ステップ1530は、LIDの第1のセットをクローン化するようLIDの第2の異なるセットを割り当てることを含んでいてもよい。
【0224】
ステップ1540は、データに結合されるオリジナルのLIDとステップ1530において割り当てられたクローン化LIDの両方を参照するようクローンに対応するデータの論理インタフェースを更新することを含んでいてもよい。ステップ1540は、上で開示したように、記憶媒体140上に永続的ノート366を格納することを含んでいてもよい。
【0225】
ステップ1550は、記憶リクエストを受信することと、記憶リクエストが第1及び/又は第2のセット(クローン化LID範囲)におけるLIDに関係するかどうかを判断することとを含んでいてもよい。もしそうであれば、フローはステップ1560で継続し、それ以外の場合、フローはステップ1550に留まる。
【0226】
ステップ1560は、(もしあれば)操作が他の関連するLID範囲上で行われるか(例えば、同期割当操作等)を決定することを含んでいてもよい。ステップ1560の決定は、メタデータ984及び/又は994にアクセスすることを含んでいてもよく、これは、クローンの同期ポリシーを備えるか、及び/又は参照してもよい。
【0227】
ステップ1570は、要求された記憶操作と共にステップ1560において決定された操作(もしあれば)を実行することを含んでいてもよい。同期操作のうちの1つ以上が実行できない(例えば、クローンのうちの1つ以上のための追加の論理アドレス空間132が割り当てられない)場合、基本となる記憶操作が失敗する場合がある。
【0228】
図16は、範囲クローン及び/又は範囲マージ操作を実施するための方法1600の別の実施形態のフロー図である。ステップ1610は、上で開示したように、LID範囲をクローン化することを含んでいてもよい。ステップ1610は、それぞれの記憶アドレスで記憶媒体140上に格納されたデータと関連するLIDのセットをクローン化することを含んでいてもよい。ステップ1610は、従って、LIDの2つ以上の異なるセットを記憶位置の同じセット(例えば、同じデータ)と関連付けることを含んでいてもよい。ステップ1610は更に、上で開示したように、1つ以上の永続的ノート366を記憶媒体140上に格納すること、及び/又は、更新されたコンテキストフォーマットでデータを書き換えることを含んでいてもよい。ステップ1610は、特に、メタデータ984及び/又は994を介してLIDの2つ以上のセットをリンクさせることを含んでもよい。メタデータ984及び/又は994は、上で開示したような、クローン同期ポリシー、マージポリシー、及び/又は同様のものを備えるか、及び/又は参照してもよい。
【0229】
ステップ1620は、2つ以上のクローン化LID範囲のうちの1つ以上に関して記憶操作を実行することを含んでいてもよい。ステップ1620は、クローン化された範囲間の割当操作を同期させることを含んでいてもよい。ステップ1620の記憶操作は、データを記憶媒体140に追記すること、及び/又は、追記されたデータを異なるLID範囲のうちの1つ以上のLIDと関連付けることを含んでいてもよい。
【0230】
ステップ1630は、ステップ1610の2つ以上のLID範囲をマージするためのリクエストを受信することを含む。マージリクエストは、インタフェース131を介して受信してもよく、及び/又は、アトミック記憶操作又は同様のもの等の別の、よりハイレベルな操作の一部であってもよい。
【0231】
ステップ1640は、LIDの2つ以上のセット(もしあれば)の間のマージ競合を特定することを含んでいてもよい。マージ競合を特定することは、2つ以上のクローン化されたLID範囲のうちの1つを超える内部で修正されたLIDを特定することを含んでいてもよい。
図9Cに戻って参照すると、ステップ1640は、範囲924内の対応するLID972〜973のように、範囲914内のLID072〜073が修正されたかを決定することに応じて、状態941Dにおけるマージ競合を特定することを含んでいてもよい。よって、ステップ1640は、競合する修正がマージ操作において同じLIDにマッピングされた場合を特定するよう、LIDクローン内部の修正を比較することを含んでいてもよい。
【0232】
ステップ1650は、ステップ1640において特定されたマージ競合を解消することを含んでいてもよい。ステップ1650は、適用できるマージポリシーを決定することを含んでいてもよく、これは、上で開示したように、マージ競合がどの様に解消されるかを決定してもよい。マージポリシーは、LIDのどのバージョンがマージされたLID範囲に含まれるか、及び/又は、競合が、LID範囲の別のコピーを維持することによって解消されるかどうかを指定してもよい。ステップ1650は更に、上で開示したように、解消されたマージ競合に従って、LID範囲をマージすることを含んでいてもよい。
【0233】
図17は、アトミック記憶操作を実施するための方法1700の一実施形態のフロー図である。ステップ1710は、アトミック記憶リクエストの識別子の第1のセットに対応する識別子の第2のセットにアクセスすることを含んでいてもよい。ステップ1710は、識別子の第1のセット(例えば、目標LID、VID、又は同様のもの)に関するアトミック記憶リクエストに応じて実行されてもよい。識別子の第1のセットは、記憶媒体140上に格納された既存のデータに対応してもよい。代替として、アトミック記憶リクエストは、論理アドレス空間132又はVAS532内の識別子の第1のセットのうちの幾つか(又は全部)を割り当てるためのリクエストを含んでいてもよい。アトミック記憶リクエストは、LID及び/又はVIDの異なる互いに素なベクトルに関する複数の記憶操作に対応してもよい。従って、識別子の第1のセットは、複数の互いに素なI/Oベクトルを備えていてもよい。
【0234】
幾つかの実施形態において、ステップ1710は、トランザクションアドレス空間1032、中間インデックス1070、VAS532、又は同様のもの等の別のアドレス空間内の識別子の第1のセットに対応する識別子を割り当てることを含む。代替として、ステップ1710は、論理アドレス空間132の特定の範囲又は領域内に識別子を割り当てることを含んでいてもよい。ステップ1710は、識別子の第1のセットと同じ量及び/又は論理容量の識別子の対応するセットを割り当てることを含んでいてもよい。識別子の第2のセットは、本明細書中に開示するように、特に、リダイレクトモジュール1034の使用によりアクセスされるか、及び/又は割り当てられてもよい。ステップ1710は更に、本明細書中に開示するように、特に、トランザクションマップ1060の使用により、識別子の第1及び第2のセットをリンクさせることを含んでもよい。
【0235】
ステップ1710は更に、識別子の第2のセットを識別子の第1のセットのデータ(もしあれば)に結合するよう範囲クローン操作を実施することを含んでいてもよい。範囲クローン操作は、
図3A〜Eの範囲クローン実施形態、
図4A〜Eの参照エントリ実施形態、及び/又は
図5A〜Bの中間マッピング層実施形態を含むが、これらに限定されない本明細書中で開示した実施形態の何れかを用いて実施されてもよい。
【0236】
ステップ1720は、ステップ1710においてアクセスされた識別子の第2のセットに関してアトミック記憶リクエストの記憶操作を実施することを含んでいてもよい。ステップ1720は、記憶操作を識別子の第1のセットから識別子の第2のセットにリダイレクトすること(例えば、本明細書中に開示するように、識別子の第1及び第2のセット間で変換すること)を含んでいてもよい。ステップ1720の記憶操作は、特に、ログ記憶モジュール137の使用によってデータを記憶媒体140上に格納することを含んでいてもよい。ステップ1720の記憶操作は、a)記憶リソースを割り当てる操作(例えば、論理及び/又は物理記憶リソースを割り当てる操作)、b)記憶リソースの割り当てを解除する操作(例えば、トリム、永続的トリム、及び/又は同様のもの)、c)データを記憶ログに書き込むこと、d)記憶媒体140上に格納された既存のデータを修正すること、e)記憶媒体140上に格納されたデータを上書きすること、及び/又は同様のことを含んでもよいが、これらに限定されない。ログ記憶モジュール136は、記憶媒体140上に格納された既存のデータを修正、上書き、及び/又は置換するよう構成される操作が、記憶ログに追記される一方で、追記されたデータによって修正、上書き、及び/又は置換されるデータが、記憶媒体140上で変更されないままで残るように、記憶アドレス空間144内部の所定位置以外で記憶操作を実施するよう構成されてもよい。
【0237】
ステップ1720において記憶媒体140に書き込まれたデータは、データの論理インタフェースを示すよう構成される永続的メタデータ114を備えていてもよい。永続的メタデータ114は、データを、ステップ1710でアクセスされた識別子の第2のセットに結合するよう構成されてもよい。代替として、又は加えて、永続的メタデータ114は、特に、記憶ログに格納される永続的ノート366を介して識別子の第2のセットに結合される中間アドレス空間に追記されたデータを結合するよう構成されてもよい。幾つかの実施形態において、永続的メタデータ114は更に、データがアトミック記憶操作の一部であることを示すよう構成されてもよい。代替として、又は加えて、データは、永続的メタデータ114の使用により(例えば、データと識別子の第2のセットとの間の関連性を介して)アトミック記憶操作の一部として特定されてもよい。
【0238】
ステップ1730は、アトミック記憶リクエストを完了させることを含んでいてもよい。アトミック記憶リクエストの完了は、識別子の第2のセットに関してステップ1720において実施された記憶操作のデータを目標識別子の第1のセットに移動させるよう構成される範囲移動操作を含んでいてもよい。範囲移動操作は、単一のアトミック書込み操作において完了されてもよい。単一のアトミック書込み操作は、永続的メタデータ(例えば、永続的ノート366及び/又は1066B)を記憶媒体140上に格納する操作を含んでいてもよい。永続的メタデータは、データを識別子の第1のセット(例えば、アトミック記憶リクエストの目標LID又はVID)に結合するようステップ1720において書き込まれたデータの論理インタフェースを修正するよう構成されてもよい。永続的メタデータは、複数の異なる記憶ベクトル(例えば、識別子の複数の異なる不連続なセット)の論理インタフェースを修正するよう構成されてもよい。ステップ1730は更に、識別子の第1のセットを介して追記されたデータを参照するよう記憶メタデータ135を更新することを含んでいてもよく、これは、前方インデックス160、参照マップ460、中間マッピング層1070、及び/又は同様のもの内の1つ以上のマッピングを修正することを含んでいてもよい。
【0239】
ステップ1730は更に、データを論理識別子の第1のセットと関連付けるよう構成されるコンテキストフォーマットで、1720において格納されたデータを書き換えることを含んでいてもよい。データは、1つ以上のバックグラウンド記憶操作において書き換えられてもよい。記憶層130及び/又はアグリゲーション層530は、データが書き換えられる前に、識別子の第1のセットを介したデータに対するアクセスを提供してもよい。
【0240】
ステップ1730は更に、アトミック記憶リクエストの完了を通知することを含んでいてもよい。完了は、永続的メタデータ(永続的ノート366及び/又は1066B)を記憶媒体140上に格納すること、及び/又は、適切な確実性で、永続的メタデータが記憶媒体140上に格納されることを判断することに応じて通知されてもよい。
【0241】
図18は、アトミック記憶操作のための方法1800の別の実施形態のフロー図である。ステップ1810は、アトミック記憶リクエストを受信することを含んでいてもよい。アトミック記憶リクエストは、特に、記憶インタフェース131を介して記憶層130で受信されてもよい。代替として、アトミック記憶リクエストは、アグリゲーション層530のインタフェース531を介して受信されてもよい。アトミック記憶リクエストは、それぞれのI/Oベクトル内で実行される複数のアトミック記憶操作を含んでいてもよく、それぞれは、異なるそれぞれのLID及び/又はVIDの目標セットに対応してもよい。
【0242】
ステップ1820は、トランザクション又はプロセス中識別子のセットに関してアトミック記憶リクエストの記憶操作を実施することを含んでいてもよい。トランザクション識別子は、論理アドレス空間132;VAS532(又は特定のVAS532内の領域);上で開示したトランザクションアドレス空間1032等の別の名前空間;及び/又は同様のものの特定の領域に対応してもよい。ステップ1820は、アトミック記憶リクエストの目標識別子に対応するトランザクション識別子を割り当てること及び/又は特定することを含んでいてもよく、トランザクション識別子は、ベクトル化されたアトミック記憶リクエストのI/Oベクトルに対応する複数の識別子範囲及び/又は程度を備えていてもよい。幾つかの実施形態において、トランザクション識別子は、目標識別子とは異なる範囲及び/又は程度において割り当てられ、及び/又は特定されてもよい。例えば、LID1024〜2048及び6144〜7186の2つの不連続な範囲に対応するアトミック記憶操作を実施するために用いられるトランザクション識別子は、短命識別子10240〜12288の単一範囲又はトランザクション識別子の複数のより小さな範囲及び/又は程度内で実施されてもよい。トランザクション識別子は、特に、記憶メタデータ135の使用により、目標識別子にリンクされてもよい。幾つかの実施形態において、トランザクション識別子は、トランザクションマップ1060内の目標識別子にリンクされる。トランザクションマップ1060は更に、トランザクション識別子を、目標LID及び/又はVIDに対応する記憶位置に結合するよう構成されてもよい。
【0243】
ステップ1820は更に、トランザクション識別子のセットに関してアトミック記憶リクエストの記憶操作を実施することを含んでいてもよい。アトミック記憶操作のうちの1つ以上は、論理アドレス空間132、VAS532、又は同様のもの等の目標又は目的名前空間内のリソースの可用性を前提としてもよい。幾つかの実施形態において、例えば、アトミック記憶リクエストは、LIDの特定のセットを割り当てるためのリクエストを含んでいてもよい。ステップ1820は、従って、上で開示したように、特に、1つ以上の永続的ノート366の使用により、目標名前空間内の論理容量を一時的に確保することを含んでいてもよい。ステップ1820は更に、上で開示したように、対応するトランザクション識別子を割り当てること及び/又は確保することを含んでいてもよい。割当操作の不具合に応じて、アトミック記憶モジュール1035は、a)アトミック記憶リクエストを失敗させるか、b)アトミック記憶操作の完了時に返却されてもよい目標名前空間内の目標LIDの異なるセットを割り当てるか、及び/又は確保してもよい。
【0244】
ステップ1820の記憶操作は更に、データをアトミック記憶操作の一部として特定するよう構成される永続的メタデータ114に関連して、データを記憶ログに追記することを含んでいてもよい。永続的メタデータは、ステップ1810のトランザクション識別子を備えていてもよい。代替として、又は加えて、永続的メタデータは、データが不完全なアトミック記憶操作の一部であることを示すよう構成されるアトミック記憶フラグ(又は他のデータ)を備えていてもよい。
【0245】
ステップ1830は、アトミック記憶リクエストを完了させることを含んでいてもよい。ステップ1830は、ステップ1820において実施されたアトミック記憶リクエストを閉じることを含んでいてもよい。アトミック記憶リクエストを閉じることは、ステップ1820の記憶操作のデータを目標識別子に結合するよう範囲移動操作を実行することを含んでいてもよく、それは、目標識別子をステップ1820の記憶操作において格納されたデータにマッピングするよう記憶メタデータ135を更新することを含んでいてもよい。範囲移動操作は更に、上で開示したように、目標名前空間内で1つ以上のトリム操作を実施することを含んでいてもよい。アトミック記憶リクエストを完了させることは更に、a)アトミック記憶リクエストのデータを目標識別子に結合し、及び/又は、b)アトミック記憶リクエストが完了したことを示すよう構成される永続的メタデータを記憶媒体140上に格納することを含んでいてもよい。永続的メタデータは、単一の記憶操作において、記憶ログ(例えば、永続的ノート366及び/又は1066B内)に追記されてもよい。ステップ1830は更に、アトミック記憶リクエストの完了を通知することを含んでいてもよい。完了は、範囲移動操作を完了すること、及び/又は対応する永続的メタデータを格納することに応じて通知されてもよい。
【0246】
図19は、アトミック記憶操作のための方法1900の別の実施形態のフロー図である。ステップ1910は、記憶媒体140上の記憶ログにアクセスすることを含んでいてもよい。ステップ1910は、不具合状態後に記憶メタデータ135を再構築するよう再構築モジュール1037によって実行されてもよい。再構築モジュール1037は、記憶ログのログ順序に従って、記憶ログにアクセスするよう構成されてもよい。再構築モジュール1037は、記憶ログ内の最後の追記点を特定し、(例えば、ログの先頭から末尾まで)逆のログ順序で記憶ログをトラバースするよう構成されてもよい。
【0247】
ステップ1920は、不完全なアトミック記憶リクエストのデータを特定することを含んでいてもよい。ステップ1920は、トランザクション又はプロセス中識別子、及び/又は、トランザクション及び/又はプロセス中のアドレス空間1032の識別子に結合されるデータを特定することを含んでいてもよい。ステップ1920は、記憶ログ内にデータセグメントと共に格納される永続的メタデータ114にアクセスすることを含んでいてもよい。ステップ1920は更に、記憶ログ内の他の永続的メタデータが、特定されたデータ結合を修正することに失敗した(例えば、データセグメントを、論理アドレス空間132及び/又はVAS532等の異なるアドレス空間内の識別子と関連付けられていない)かを判断することを含んでいてもよい。
【0248】
ステップ1930は、特定されたデータセグメントを記憶メタデータ135から省略することを含んでいてもよく、これは、データを備える記憶位置を無効化することと、データセグメントに対応するエントリを前方マップ160、中間マッピング層1070、及び/又は同様のものから省略することとを含んでいてもよい。ステップ1930は、従って、部分的に完了されたアトミック記憶操作のデータが目標識別子及び/又は名前空間に影響を及ぼさないように、失敗したアトミック記憶操作をロールバックすることを含んでいてもよい。
【0249】
本開示を、様々な例示的な実施形態を参照して行ってきた。しかし、当業者は、変更及び修正が、本開示の適用範囲から逸脱することなく、例示的な実施形態に対して行われてもよいことを認識するであろう。例えば、種々の動作ステップ、並びに動作ステップを実行するための構成部品は、特定の用途によって、又は、システムの運用に関連する幾らかの費用関数を考慮して、代替方法で実装されてもよい(例えば、ステップのうちの1つ以上は、削除、修正、又は他のステップと組み合わされてもよい)。従って、本開示は、限定的な意味ではなく、例示的に見なされるべきであり、かかる全ての修正は、これらの適用範囲内に含まれることを意図している。同様に、利益、他の利点、及び問題に対する解決は、種々の実施形態に関して、上で説明してきた。しかし、利益、利点、問題に対する解決、及び、何れかの利益、利点、又は解決が生じるか、より明白となる何れかの要素も、重要、必要、又は必須の特徴又は要素として解釈されるべきではない。本明細書中で用いるように、用語「備える」、「備えている」、及びそれらの何れか他の変形形態も、要素の目録を備えるプロセス、方法、製品、又は装置が、それらの要素のみを含むのではなく、明示的に列挙されていないか、かかるプロセス、方法、製品、又は装置に固有の他の要素を含むことができるように、非排他的包含をカバーすることを意図している。また、本明細書中で用いるように、用語「結合される」、「結合する」、及びそれらの何れか他の変形形態も、物理的接続、電気的接続、磁気的接続、光学的接続、通信接続、機能的接続、及び/又は、何れか他の接続をカバーすることを意図している。
【0250】
加えて、当業者によって正しく理解されるように、本開示の原理は、記憶媒体内で具現化される機械読取可能なプログラムコード手段を有する機械読取可能な媒体上のコンピュータプログラム製品に反映されてもよい。何れかの有体物の、非一時的機械読取可能な媒体は、磁気記憶装置(ハードディスク、フロッピーディスク及び同様のもの)、光学的記憶装置(CD−ROM、DVD、ブルーレイディスク、及び同様のもの)、フラッシュメモリ、及び/又は同様のものを含んで利用されてもよい。これらのコンピュータプログラム命令は、コンピュータ又は他のプログラマブルデータ処理装置上で実行される命令が、指定した機能を実施する手段を作成するように、汎用コンピュータ、特殊用途コンピュータ、又は、機械を作製する他のプログラマブルデータ処理装置上にロードされてもよい。これらのコンピュータプログラム命令はまた、機械読取可能なメモリに格納された命令が、指定した機能を実施する実施手段を含む製造品を作成するように、特定の方法で機能するようコンピュータ又は他のプログラマブルデータ処理装置を向けることができる機械読取可能なメモリに格納されてもよい。コンピュータプログラム命令はまた、コンピュータ又は他のプログラマブル装置上で実行する命令が指定した機能を実施するステップを提供するように、コンピュータ又は他のプログラマブルデータ処理装置上にロードされて、一連の動作ステップがコンピュータ又は他のプログラマブル装置上で実行されて、コンピュータ実装プロセスを生じさせる。
【0251】
本開示の原理を種々の実施形態において示してきたが、特定の環境及び動作要件に対して特になされる構造、配置、比率、要素、材料、及び構成部品の多くの修正形態は、本開示の原理及び適用範囲から逸脱することなく用いられてもよい。これらの、及び他の変更形態又は修正形態は、本開示の適用範囲内に含まれることを意図している。