(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2022-11-04
(45)【発行日】2022-11-14
(54)【発明の名称】高速コピー可能データベースを効率的に実装するための方法及び機器
(51)【国際特許分類】
G06F 16/182 20190101AFI20221107BHJP
G06F 16/2452 20190101ALI20221107BHJP
G06F 16/17 20190101ALI20221107BHJP
【FI】
G06F16/182
G06F16/2452
G06F16/17 200
【外国語出願】
(21)【出願番号】P 2020191399
(22)【出願日】2020-11-18
(62)【分割の表示】P 2020520649の分割
【原出願日】2018-10-31
【審査請求日】2020-12-01
(32)【優先日】2017-11-01
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】518066035
【氏名又は名称】スワールズ,インコーポレイテッド
(74)【代理人】
【識別番号】100079108
【氏名又は名称】稲葉 良幸
(74)【代理人】
【識別番号】100109346
【氏名又は名称】大貫 敏史
(74)【代理人】
【識別番号】100117189
【氏名又は名称】江口 昭彦
(74)【代理人】
【識別番号】100134120
【氏名又は名称】内藤 和彦
(72)【発明者】
【氏名】ベアード,リーモン シー.,3世
(72)【発明者】
【氏名】ハーモン,マンス
【審査官】北村 学
(56)【参考文献】
【文献】特開2005-216167(JP,A)
【文献】特開2010-033227(JP,A)
【文献】特表2014-506345(JP,A)
【文献】米国特許第06584476(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
IPC G06F 16/00-16/958
(57)【特許請求の範囲】
【請求項1】
プロセッサと、
前記プロセッサと電子通信するメモリと、を備え、
前記プロセッサは、
データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することであって、前記複数の仮想クローンは第1の仮想クローン、前記第1の仮想クローンの子の仮想クローンである第2の仮想クローン、及び前記第2の仮想クローンの後継仮想クローンである第3の仮想クローンを含む、生成すること、
前記第2の仮想クローンを削除するための命令に応答し、前記階層ツリー内の且つ前記第3の仮想クローンに関連する後継関係を修正すること、
前記第2の仮想クローンを削除するための前記命令に応答して前記第2の仮想クローンを削除すること、及び
前記第2の仮想クローンを削除するための前記命令に応答し、前記第2の仮想クローンの前記削除後に前記第1の仮想クローンが子の仮想クローンを有さない場合、前記複数の仮想クローンから前記第1の仮想クローンを削除すること、
を行うための命令を実行するように構成されている、機器。
【請求項2】
前記複数の仮想クローンが、前記第1の仮想クローンの後継仮想クローンである第4の仮想クローンを更に含み、前記命令は、前記第2の仮想クローンを削除するための前記命令及び前記第2の仮想クローンの削除後に前記第4の仮想クローンが前記第1の仮想クローンの唯一の子孫だという判定に応答し、前記第4の仮想クローンに関連する後継関係を修正することを前記プロセッサに行わせるために更に実行可能である、請求項1に記載の機器。
【請求項3】
前記命令が、
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、及び
前記自動で識別することに基づいて前記第4の仮想クローンを削除すること、
を前記プロセッサに行わせるために更に実行可能である、請求項1に記載の機器。
【請求項4】
前記命令が、
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、並びに
前記自動で識別することに応答して
前記複数の仮想クローンからの第5の仮想クローンに関連する後継関係を修正すること、及び
前記第4の仮想クローンを削除すること、
を前記プロセッサに行わせるために更に実行可能である、請求項1に記載の機器。
【請求項5】
前記命令が、前記第3の仮想クローンに関連する前記後継関係を修正することに応答し、前記複数の仮想クローンから少なくとも1つの更なる仮想クローンを削除することを引き起こすことを前記プロセッサに行わせるために更に実行可能である、請求項1に記載の機器。
【請求項6】
前記後継関係が第1の後継関係であり、前記メモリが前記第1の後継関係を含む複数の後継関係を更に記憶する、請求項1に記載の機器。
【請求項7】
前記データベーステーブルが複数のレコードを含み、前記複数のレコードからの各レコードが、前記複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む、請求項1に記載の機器。
【請求項8】
データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを、プロセッサを介して、生成することであって、前記データベーステーブルが複数のレコードを含み、前記複数のレコードからの各レコードが、前記複数の仮想クローンからの仮想クローンに関連するバージョン識別子を有する複合キーを含み、前記複数の仮想クローンは第1の仮想クローン、前記第1の仮想クローンの子の仮想クローンである第2の仮想クローン、及び前記第2の仮想クローンの後継仮想クローンである第3の仮想クローンを含む、生成すること、
前記第2の仮想クローンを削除するための命令を、前記プロセッサを介して、受信すること、及び
前記第2の仮想クローンを削除するための前記命令の受信に応答し、前記階層ツリー内の且つ前記第3の仮想クローンに関連する後継関係を、前記プロセッサを介して、修正すること、
を含む、方法。
【請求項9】
前記第2の仮想クローンを削除するための前記命令に応答して前記第2の仮想クローンを、前記プロセッサを介して、削除すること、及び、
前記第2の仮想クローンを削除するための前記命令に応答し、前記第2の仮想クローンの前記削除後に前記第1の仮想クローンが子の仮想クローンを有さない場合、前記複数の仮想クローンから前記第1の仮想クローンを、前記プロセッサを介して、削除すること、
を更に含む、請求項8に記載の方法。
【請求項10】
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを、前記プロセッサを介して、自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、並びに
前記自動で識別することに応答して
前記複数の仮想クローンからの第5の仮想クローンに関連する後継関係を、前記プロセッサを介して、修正すること、及び
前記第4の仮想クローンを、前記プロセッサを介して、削除すること、
を含む、請求項8に記載の方法。
【請求項11】
前記第3の仮想クローンに関連する前記後継関係を修正することに応答し、前記複数の仮想クローンから少なくとも1つの更なる仮想クローンを削除することを、前記プロセッサを介して、引き起こすことを更に含む、請求項9に記載の方法。
【請求項12】
データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することであって、前記複数の仮想クローンは第1の仮想クローン、前記第1の仮想クローンの子の仮想クローンである第2の仮想クローン、及び前記第2の仮想クローンの後継仮想クローンである第3の仮想クローンを含む、生成すること、
前記第2の仮想クローンを削除するための命令に応答し、前記階層ツリー内の且つ前記第3の仮想クローンに関連する後継関係を修正すること、及び
前記第2の仮想クローンを削除するための前記命令に応答して前記第2の仮想クローンを削除すること、
を行うためのプロセッサ実行可能命令を含む、非一時的な有形のプロセッサ可読媒体。
【請求項13】
前記第2の仮想クローンを削除するための前記命令に応答し、前記第2の仮想クローンの前記削除後に前記第1の仮想クローンが子の仮想クローンを有さない場合、前記複数の仮想クローンから前記第1の仮想クローンを削除することを行うためのプロセッサ実行可能命令を更に含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項14】
前記複数の仮想クローンが、前記第1の仮想クローンの後継仮想クローンである第4の仮想クローンを更に含み、前記有形のプロセッサ可読媒体が、
前記第2の仮想クローンを削除するための前記命令及び前記第2の仮想クローンの削除後に前記第4の仮想クローンが前記第1の仮想クローンの唯一の子孫だという判定に応答し、前記第4の仮想クローンに関連する後継関係を修正することを行うためのプロセッサ実行可能命令を更に含む、
請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項15】
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、及び
前記自動で識別することに基づいて前記第4の仮想クローンを削除すること、
を行うためのプロセッサ実行可能命令を更に含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項16】
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、並びに
前記自動で識別することに応答して
前記複数の仮想クローンからの第5の仮想クローンに関連する後継関係を修正すること、及び
前記第4の仮想クローンを削除すること
を行うためのプロセッサ実行可能命令を更に含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項17】
前記第3の仮想クローンに関連する前記後継関係を修正することに応答し、前記複数の仮想クローンから少なくとも1つの更なる仮想クローンを削除することを引き起こすことを行うためのプロセッサ実行可能命令を更に含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項18】
前記後継関係が第1の後継関係であり、前記有形のプロセッサ可読媒体が、前記第1の後継関係を含む複数の後継関係を記憶することを行うためのプロセッサ実行可能命令を更に含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項19】
前記データベーステーブルが複数のレコードを含み、前記複数のレコードからの各レコードが、前記複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む、請求項12に記載の非一時的な有形のプロセッサ可読媒体。
【請求項20】
前記複数の仮想クローンが、前記第1の仮想クローンの後継仮想クローンである第4の仮想クローンを更に含み、前記方法が、
前記第2の仮想クローンを削除するための前記命令及び前記第2の仮想クローンの削除後に前記第4の仮想クローンが前記第1の仮想クローンの唯一の子孫だという判定に応答し、前記第4の仮想クローンに関連する後継関係を、前記プロセッサを介して、修正することを更に含む、
請求項9に記載の方法。
【請求項21】
前記複数の仮想クローンの
中の1つの仮想クローンである、第4の仮想クローンを、前記プロセッサを介して、自動で識別することであって、前記第4の仮想クローンは、子の仮想クローンを有さない、識別すること、及び
前記自動で識別することに基づいて前記第4の仮想クローンを、前記プロセッサを介して、削除すること、
を更に含む、請求項8に記載の方法。
【発明の詳細な説明】
【技術分野】
【0001】
関連出願の相互参照
[0001] 本願は、参照によりその全開示を本明細書に援用する、2017年11月1日に出願され、「ネットワーク内に分散データベースを効率的に実装するための方法及び機器(Methods and Apparatus for Efficiently Implementing a Distributed Database within a Network)」と題された米国仮特許出願第62/580,056号の優先権及び利益を主張する。
【背景技術】
【0002】
背景
[0002] 本明細書に記載する実施形態は、一般に効率を高めたデータベースシステムを実装するための方法及び機器に関する。
【発明の概要】
【課題を解決するための手段】
【0003】
概要
[0003] 一部の実施形態では、高速コピー可能データベース機器が、プロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、バージョン識別子を含む複合キーをそれぞれ有する複数のレコードを有するデータベーステーブルを記憶する。メモリは、データベーステーブルの第1の仮想クローン及びデータベーステーブルの第2の仮想クローンを生成すること、第1の仮想クローンにおいてクエリを受信すること、及びクエリが第1の仮想クローンのバージョン識別子を含むようにクエリを修正することをプロセッサに行わせるために実行可能な命令も記憶する。プロセッサは修正済みのクエリを使用してデータベーステーブルをクエリして、第1の仮想クローンのバージョン識別子の祖先パスに関連するバージョン識別子を有する1組のレコードからの各レコードに部分的に基づく応答を生成し、その応答を送信することができる。各複合キーはバージョン識別子及びデータ部分を含む。
【図面の簡単な説明】
【0004】
図面の簡単な説明
【
図1】[0004]一実施形態による、高速コピー可能データベースを実装するためのシステムを示すブロック図である。
【
図2A】[0005]一実施形態による、クエリ可能階層ツリー及び関連するデータベーステーブルの図である。
【
図2B】[0006]一実施形態による、競合制約が強制されたクエリ可能階層ツリー及び関連するデータベーステーブルの図である。
【
図3A】[0007]一実施形態による、階層ツリーの仮想クローンを生成し、それと相互作用するための方法を示す流れ図である。
【
図3B】[0008]
図3Aの階層ツリーによる、データベーステーブルの時間的発展及びかかるデータベーステーブルとの相互作用を示す一連の図を含む。
【
図4A】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4B】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4C】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4D】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4E】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4F】[0009]一実施形態による、仮想クローンの表現を含む階層ツリーの時間的発展及び関連するデータベーステーブルを示す図を含む。
【
図4G】[0010]一実施形態による、クエリプロセスを示す図を含む。
【
図5】[0011]一実施形態による、インクリメンタルガベージコレクションプロセスを示す一連の図を含む。
【
図6】[0012]一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション(又は連鎖削除)方法のプロセス流れ図である。
【
図7】[0013]一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション(又は連鎖削除)方法のプロセス流れ図である。
【
図8A】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【
図8B】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【
図8C】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【
図8D】[0014]一実施形態による、高速コピー可能データベースシステムの実装を示す図である。
【
図9】[0015]一実施形態による、高速コピー操作を示す一連の図を含む。
【発明を実施するための形態】
【0005】
詳細な説明
[0016] 本開示の高効率データベースシステムは、非一時的プロセッサ可読メモリ内にそれぞれ記憶される(「データベーステーブル」を含む及び/又は本明細書では「データベーステーブル」と区別なく使用する)1つ又は複数の物理リレーショナルデータベースと、複数の仮想クローンであって、それによりリレーショナルデータベースのデータが所定の条件下で及び/又は既定の期間内にアクセスされ及び/又は修正され得る、複数の仮想クローンをそれぞれ含む1つ又は複数の関連する動的階層ツリーとを含む。本明細書に記載するデータベースの実装及び管理の方法は、データベースの複製及び相互作用の既知の方法よりも大幅に速く効率的である。本開示に従って実装されるとき、本明細書に記載するリレーショナルデータベースは「高速コピー可能」と呼ぶことができ、それは新たな仮想クローンをインスタンス化することによって多くの異なる「コピー」を素早く作成し及び/又は定義することができるからであり、それぞれの異なるコピーは「仮想」コピー(関連する異なる仮想クローンの観点から認識され、かかる仮想クローンからアクセス可能なコンテンツ)を指す。別の言い方をすれば、リレーショナルデータベースを高速コピー可能データベースに変換するクラスでリレーショナルデータベースが「包まれる」と言うことができる。
【0006】
[0017] 一部の実装形態では、リレーショナルデータベースの集中型の「マスタ」又は「リーダ」コピーはないが、任意選択的にそれぞれが異なる関連する管理者を有する複数の関連する地理的に分散した位置に、関連する動的階層ツリーを有する複数の物理リレーショナルデータベース(即ちリレーショナルデータベースの「インスタンス」)がある点で、本開示の高効率データベースシステムは「リーダレス」だと言うことができる。換言すれば、複数の物理リレーショナルデータベースのそれぞれにおいて異なる変更を異なる順序で及び/又は異なる時点において適用することができる。分散データベースシステム内にリーダを有さないことは分散データベースシステムのセキュリティを高めることができる。例えばリーダがあると、単一攻撃点及び/又は単一障害点がある。悪意あるソフトウェアがリーダに侵入する及び/又はリーダのデータベーステーブル内の値が正しくない値を有するように悪意を持って変更される場合、その侵入及び/又は正しくない値がデータベースインスタンスのネットワークの全体にわたって伝搬し、又は別の分散データベースインスタンスに転送される可能性がある。対照的に、本開示のリーダレスシステムでは単一攻撃点及び/又は単一障害点がない。本明細書に記載するリーダレス分散データベースシステムは、装置間のデータ伝送量を減らしながら1つ又は複数の合意アルゴリズムの収束速度を高めることもできる。本明細書に記載する分散データベースシステムは、データベーステーブルのコンテンツに対する異なる増分変化を追跡するために使用可能な仮想クローンを生成することにより「高速コピー可能」でもある。本明細書で使用するとき、「高速コピー」は「仮想クローン」の語句と同じ意味を有する。そのため、一部の知られている分散データベースと異なり、とりわけ管理されているデータのコーパスが大きい場合に資源集約的であり且つ時間がかかる可能性がある複製及び複写を使用することなしに更新を達成することができる。
【0007】
[0018] 一部の実施形態では、階層ツリーの1組の仮想クローンからの各仮想クローンは、その仮想クローンと相互作用するユーザによって(例えばクエリによって)リレーショナルデータベースのデータがアクセスされ得る点で「仮想データベース」の役割を果たすことができ、そのためその仮想クローンは、実際にはそうでなくてもデータがその仮想クローンにおいて記憶され及び/又は局所的に探索されているようにユーザには見える(即ち記憶及びクエリがリレーショナルデータベース/テーブル上で行われる)。リレーショナルデータベースのデータテーブルに対する修正は1組の仮想クローンからの複数の仮想クローンにおいて適用することができ、「複合キー」を使用して(例えばデータベーステーブルに追加される属性及びデータベーステーブルのレガシキーフィールドを使用して)リレーショナルデータベース内のその仮想クローンに関連付けることができる。複合キーは少なくとも2つの値、つまり少なくとも1つの仮想クローンに関連するバージョン識別子(「バージョンID」)と、そのデータベーステーブルのレガシキーフィールド(本明細書では「仮想主キーフィールド」とも呼ぶ)等、参照されているデータベーステーブルの特性(例えば行(即ち「レコード」又は「タプル」)の識別子又は名前、列(即ち「属性」)の識別子又は名前、データラベル、データ値等)を指すフィールドとを含むことができる。属性の例は、これだけに限定されないが仮想主キーの名前、値(例えば収支、借方、貸方、送金額)、通貨、説明、日にち、量、タリー、バージョン、継続期間、順序等を含む。複合キーの部分はデータベーステーブルのレコードの一部として記憶することができ、そのため或る仮想クローンによって加えられる編集が他の任意の仮想クローンの観点からデータベーステーブルのデータに影響を及ぼさない。一部の実施形態では、所与の複合キーの複数のインスタンスが任意の所与の時点においてデータベーステーブル内で共存することが認められない(即ちデータベーステーブル内には所与の複合キーの1つのインスタンスしかあり得ない)。特定の仮想クローンによって行われるリレーショナルデータベースのデータテーブルに対する修正は、その仮想クローンのバージョン識別子によってその仮想クローンに関連付けられ、そのためその仮想クローンによって行われるその後のクエリ又は修正は、その仮想クローン/バージョンIDによってデータベーステーブルに行われた累積的相互作用によって定められるリレーショナルデータベースの直近の形式に適用され得る。しかし、特定の仮想クローンによって行われるデータベーステーブルへの修正は、他の仮想クローンの観点からは認められず又はアクセスすることができない。変更に関連する修正側の仮想クローンにとっての変更の帰属が仮想クローンの関連するバージョンIDに基づきながらこの分散方式で変更を実施することは、(例えば仮想クローンをホストする1組のサーバノードのそれぞれにおいて)各リレーショナルデータベースのデータの複数のコピーを複製し、分散させ、局所的に記憶する必要性をなくす。本明細書に記載する方法は、多くのマシンとネットワーク通信する各マシンによって行われる各変更に応答し、多くのマシンにリレーショナルデータベースの全コンテンツを複数回伝送する必要性を除去することができる。
【0008】
高速コピー可能データベースシステム
[0019]
図1は、一部の実施形態による、高速コピー可能データベースシステム100の構成要素を示すシステム図である。
図1に示すように、システム100は、ネットワーク105と無線通信又は有線通信する第1の計算装置110と、同じくネットワーク105と無線通信又は有線通信する1つ又は複数の追加の計算装置120とを含む。第1の計算装置110は、オンボードメモリ112と動作可能に通信するプロセッサ111及びディスプレイ113を含む。メモリ112は、1つ又は複数のデータベーステーブル114(即ちリレーショナルデータベースのインスタンス)、高速コピア115、及び(例えば合意アルゴリズムをプロセッサに実施させる)合意命令116を記憶する。各データベーステーブル114は、以下でより詳細に説明する1つ又は複数の複合キー114Aを含む。1つ又は複数の更なる計算装置120からの各計算装置は、オンボードメモリ122と動作可能に通信するプロセッサ121及び任意選択的に1つ又は複数のインタフェース(例えばディスプレイ、グラフィカルユーザインタフェース(GUI)、無線トランシーバ等)(不図示)を含む。メモリ122は、1つ又は複数のデータベーステーブル124(即ちリレーショナルデータベースのインスタンス)、高速コピア125、及び(例えば合意アルゴリズムをプロセッサに実施させる)合意命令126を含む。
【0009】
[0020] プロセッサ111及び121のそれぞれは、汎用プロセッサ、中央処理装置(CPU)、マイクロプロセッサ、デジタル信号プロセッサ(DSP)、コントローラ、マイクロコントローラ、状態機械等のうちの1つ又は複数を含み得る。一部の状況下では、本明細書で使用するとき「プロセッサ」は特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(PLD)、書換可能ゲートアレイ(FPGA)等を指す場合がある。「プロセッサ」という用語は処理装置の組み合わせ、例えばDSPとマイクロプロセッサとの組み合わせ、複数のマイクロプロセッサの組み合わせ、DSPコアに関連する1つ又は複数のマイクロプロセッサの組み合わせ、又はそのような他の任意の構成を指し得る。
【0010】
[0021] メモリ112及び122のそれぞれは、データ及びコード(例えば命令)等の電子情報を記憶することができる任意の電子部品を含み得る。メモリという用語は、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、不揮発性ランダムアクセスメモリ(NVRAM)、プログラマブル読取専用メモリ(PROM)、消去プログラム可能読取専用メモリ(EPROM)、電気的消去可能PROM(EEPROM)、フラッシュメモリ、磁気又は光データ記憶域、レジスタ等の様々な種類の非一時的プロセッサ可読媒体を指し得る。プロセッサがメモリから情報を読み取ることができる及び/又はメモリに情報を書き込むことができる場合、メモリはプロセッサと動作可能に通信する又は電子通信すると言われる。プロセッサに欠かせないメモリはプロセッサと電子通信する。非一時的コンピュータ可読媒体の例は、これだけに限定されないがハードディスク、フロッピディスク、及び磁気テープ等の磁気記憶媒体、コンパクトディスク/デジタルビデオディスク(CD/DVD)、コンパクトディスク読取専用メモリ(CD-ROM)、及びホログラフィック装置等の光記憶媒体、光ディスク等の光磁気記憶媒体、搬送波信号プロセッサ、並びに特定用途向け集積回路(ASIC)、プログラマブル論理デバイス(PLD)、読取専用メモリ(ROM)、及びランダムアクセスメモリ(RAM)装置等、プログラムコードを記憶し実行するように特に構成されるハードウェア装置を含む。本明細書に記載する他の実施形態は、例えば本明細書で論じる命令及び/又はコンピュータコードを含み得るコンピュータプログラム製品に関する。
【0011】
[0022] 本開示の高速コピー可能データベースシステムは、一部の実施形態では、
図1に関して以下で示し説明するようにハードウェアとして又はソフトウェア、例えば高速コピアとして、又は非一時的メモリ内に記憶されメモリと動作可能に通信するプロセッサによって実行可能な命令を含む他のソフトウェア形式として実装することができる。メモリ(及び/又はプロセッサ)は、リレーショナルデータベースを記憶する(にアクセスする)こともできる。高速コピアは、関連するリレーショナルデータベースを「包み込む」「ラッパークラス」(「ラッパーパターン」又は「ラッパー関数」とも呼ばれる)であり得る。例えばソフトウェアが実行されており、構造化照会言語(SQL)クエリがプロセッサにおいて受信される場合、そのプロセッサはリレーショナルデータベースにクエリを送信する前にクエリを修正することができるラッパークラス内のメソッドを呼び出すことにより、リレーショナルデータベースにSQLクエリを送信する/伝えることができる。次いで、SQLクエリに応答してリレーショナルデータベースによって返される結果がラッパークラス内のメソッドによって返され得る/送信され得る。高速コピーソフトウェアは、リレーショナルデータベースへの呼び出しをインタセプトすること、リレーショナルデータベースからの呼び出しをインタセプトすること、リレーショナルデータベースにフィールド(例えば以下で論じる「バージョン」)を追加すること、リレーショナルデータベースのフィールドを修正すること、リレーショナルデータベースのフィールドを削除すること、リレーショナルデータベースの構造を修正すること(例えばレコード/行又は属性/列を追加し又は除去すること)、又は
図2~
図7に関して図示し以下で説明する任意の機能のうちの1つ又は複数を任意の組み合わせで行うように構成され得る。
【0012】
[0023] 一部の実施形態では、高速コピー可能データベースシステムが、リレーショナルデータベースのインスタンス及び高速コピーソフトウェアをホストする非一時的メモリに動作可能に結合されるプロセッサをそれぞれ含む、単一のマシン(又は「ノード」)又は複数のマシン若しくは「ノード」を含む。最初(即ち如何なる変更も適用される前)、リレーショナルデータベースの各インスタンスは同じである。ノードは、互いに地理的に隔てられてもよく及び/又は異なる管理者の個人及び/又はエンティティに関連することができる。各ノードは、1つ又は複数の仮想クローン(本明細書では「オブジェクト」又は「仮想オブジェクト」とも呼ぶ)であって、それによりリレーショナルデータベースを修正し及び/又はクエリすることができる、1つ又は複数の仮想クローンを含む関連する階層ツリー及び/又は階層ツリー(又は階層ツリーの表現)の後続の部分を生成し及び/又は記憶することができる。基礎を成す階層ツリーが拡大され及び/又は修正されるとき、階層ツリーの生成は複数回行うことができる。例えば各ノードは少なくとも2つの仮想クローン、つまり第1の仮想クローン及び第2の仮想クローンを生成することができる。第1の仮想クローンはリレーショナルデータベースのフィールドに対して、例えばアクティビティデータが(例えば別のノードから)そのノードにおいて受信されるとき変更を適用するために使用され得る。これらの変更は、例えばアクティビティデータを受信することに応答して及び/又はアクティビティデータに基づいて自動で及び/又は管理者によって適用され得る。アクティビティデータは、受信ノードがパーティであるノードのネットワーク内で生じている又は生じたとされている1つ又は複数のイベント又はトランザクションに関係するデータを含み得る。第1の仮想クローンによって適用される変更は、1つ又は複数のトランザクション又はイベントに関連する受信されたままのアクティビティデータの「ランニングタリー」を集合的に表すものだと見なすことができる。
【0013】
[0024] 一部の実装形態では、ノードの1つ又は複数によって開始される及び/又は(例えばノードのネットワーク内で検出される変更によって及び/又は既定の時間的スケジュールに従ってトリガされる)高速コピーソフトウェアによって自動で実施される「同期」イベントの結果としてアクティビティデータが所与のノードにおいて受信される。同期中、ノードのネットワークからの少なくとも2つのノードが自らの関連するデータベーステーブルからのデータをやり取りする。データは、例えばアクティビティデータ又はその一部とすることができる。少なくとも2つのノード間で/のうちでやり取りされるデータは、ノードネットワーク内の集約アクティビティの部分集合又は部分ビューを表すことができる。かかる一部の例では、第1の仮想クローンによってノードのデータベーステーブルに適用される変更は、その合意順序及び/又は有効性が到達されておらず、及び/又は介在する変更がデータベーステーブルから欠けているかどうかの判定がまだ行われていない(即ちそれらの変更について合意にまだ達していない/合意がまだ満たされていない)「仮の変更」である。第1の仮想クローンによってノードにおいて修正されるデータベーステーブル内のレコードは、第1の仮想クローンに関連する第1のバージョンIDを含む複合キーを含み得る。
【0014】
[0025] 一部の実装形態では、同期プロセスが(1)同期中に受信される1つ又は複数のイベント(例えば1つ又は複数のトランザクションを含む)又はトランザクションに基づき、(例えばノードによって定められるデータベース状態変数によって捕捉される)データベーステーブルの「現在の状態」を繰り返し更新すること、及び(2)イベント又はトランザクションの順序付けに関する新たな情報を受信するたびに、例えば前の状態のコピーに戻り、イベント又はトランザクションを新たな順序で処理することによって現在の状態を再計算することにより、その現在の状態を繰り返し再構築すること(例えばイベントの順序を再構成すること)を含む。従って、例えば各計算装置は状態の2つのバージョン、つまり新たなイベント及びトランザクションが受信されるとき更新される(例えば上記で論じた第1の仮想クローンによって実施される)状態と、合意に達した後でのみ更新される(例えば上記で論じた第2の仮想クローンによって実施される)状態とを維持することができる。何らかの時点において(例えば所定の期間の後、所定のイベント数が定められ及び/又は受信された後等)、新たなイベント及びトランザクションが受信されるとき更新される状態のバージョンを階層ツリーから破棄し又は削除することができ、新たなイベント及びトランザクションが受信されるとき更新される状態の新たなバージョンとして、合意に達した後で更新される状態の新たなコピーを生成することができる(例えば上記で論じた第3の仮想クローンによって実施される)。上記の手法は両方の状態の同期を確実にすることができる。一部の例では、状態(状態の様々なコピーを含む)は、例えば「高速コピー可能」arrayList(本明細書では高速クローンarrayList、高速クローンアレイ、又は高速コピー可能アレイとも呼ぶ)、「高速コピー可能」ハッシュテーブル、高速コピー可能」リレーショナルデータベース、又は「高速コピー可能」ファイルシステム(本明細書では高速クローンファイルシステム及び/又は高速コピー可能ファイルシステムとも呼ぶ)等の任意の適切なデータ構造内に、任意選択的に高速コピー可能ファイルシステム内のファイルのNバイト(例えば4096バイト又は1024バイト)部分ごとに別個のファイルがホストオペレーティングシステム上で作成され及び/又は定められた状態で記憶され得る。
【0015】
[0026] 本明細書で使用するとき、「合意」は、合意アルゴリズムによって検討されている1つ又は複数の変更が正しく順序付けられており、重複ではなく、介在する如何なる変更も欠かしておらず、及び/又は正当だと(即ち悪意がない又は不正ではないと)合意アルゴリズムを使用して到達される判定を指す。合意は、例えば変更が正しく順序付けられており、重複ではなく、介在する如何なる変更も欠かしておらず、及び/又は有効だと全ての又は少なくとも既定の閾値数のノードが合意するとき又は少なくとも既定の閾値確実性レベルで結論付けたときに達したと言うことができる。例えば合意に達している一連の変更は、一連のイベント及び/又はトランザクションの「真の」又は正確な表現を反映していると言うことができる。一部の実装形態では、合意アルゴリズムの所定の反復回数後に及び/又は既定のスケジュールに従って合意が所定の時間枠の中の「ラウンド」で到達される。
【0016】
[0027] 第1の仮想クローンによって適用される変更又は1組の変更について合意に達した後、その変更又は1組の変更を第2の仮想クローンによってデータベーステーブルに適用することができ、データベーステーブルの影響を受ける各レコードは第2の仮想クローンに関連する第2のバージョンIDを含む複合キーを呼応して含むことができる。この変更又は1組の変更が第2の仮想クローンによって及び任意選択的に自動で適用可能になった後、及び/又はそれらの変更が適用されることに応答して第1の仮想クローンを削除することができ、第2の仮想クローンの子孫である少なくとも2つの更なる仮想クローン(例えば第3の仮想クローン及び第4の仮想クローン)を生成することができる。次いで上記で説明したのと同様のやり方で、第3の仮想クローンによってデータベーステーブルに対する仮の変更が行われ、第4の仮想クローンによってデータベーステーブルに対する合意後の変更が行われながら、高速コピープロセスが続行され得る。
【0017】
[0028] 一部の実装形態では、合意アルゴリズム又はメソッドがプラットフォーム(即ち
図1の計算装置110のメモリ112内に記憶され、プロセッサ111によって実行される合意命令116等、計算装置及び/又はシステムのプロセッサ上で実行されるソフトウェアプログラム)によって実装され得る。プラットフォームはトランザクションを収集し、広め、順序付け、合意プロセスに関連する他の適切なタスクを実行することができる。
【0018】
[0029] 一部の実装形態では、仮想クローン及び/又はその関連するノードから依存する(即ち仮想クローン及び/又はその関連するノードから直接伸び、階層ツリー内で下降する)1つ又は複数の子孫ノードが生成されると、たとえ階層ツリーから1つ又は複数の子孫ノードを削除し又は除去した場合及びその後でさえ、仮想クローン及び/又はその関連するノードによってクエリをもはや行うことはできない。
【0019】
[0030] 一部の実装形態では、本開示の1つ又は複数のデータベーステーブルを1つ又は複数の仮想クローンによってクエリすることができる。
図2A及び
図2Bは、一実施形態によるクエリ可能階層ツリー(本明細書では「バージョンツリー」とも呼ぶ)の図を示す。一部の実装形態では、階層ツリー(本明細書では「バージョンツリー」とも呼ぶ)及び/又は階層ツリーの表現が非一時的メモリ内に保たれ及び/又は記憶される。
図2A及び
図2Bに示すように、クエリ可能階層ツリーは、リレーショナルデータベースインスタンス230とその複数の仮想クローンV1、V2、V3、及びV4とを含む。仮想クローンV1、V2、及びV3の直列提示は仮想クローンV1が最初に生成され(及び任意選択的にV1によってデータベース230に変更が加えられ)、仮想クローンV2(V1の「子孫」仮想クローン)が2番目に生成され(及び任意選択的にV2によってデータベース230に変更が加えられ)、仮想クローンV3(V2の「子孫」仮想クローン)が3番目に生成された(及び任意選択的にV3によってデータベース230に変更が加えられた)ことを示す。V3にはV3から伸びる/依存する子ノードがない点で、V3は「葉ノード」である。一部の実装形態では、子孫仮想クローンが生成されると、直系の祖先仮想クローンによってデータベース230への変更はもはや行うことができないことに留意されたい。換言すれば、仮想クローンV3が生成されると、仮想クローンV2又は仮想クローンV1によってデータベース230への変更はもはや適用することができない。
【0020】
[0031] (
図2Aに示す)一実施形態では、V3において受信されるクエリを次のように逐次的に実施/実行することができる。データベース230はレコードであって、(同じくデータベース230内にある)そのレコードの祖先バージョンと同じ仮想主キーを有する、レコードを含むと仮定されたい。例えば
図2Aのデータベーステーブルは属性レコードID(RID)(仮想主キー)、名前、ランク、及びバージョンを含み、(1)複合キー(1001,V3)を有するデータベース230内のレコード、(2)複合キー(1001,V2)を有するデータベース230内のレコード、及び(3)複合キー(1001,V1)を有するデータベース230内のレコードがある。かかる実装形態では、バージョンツリーが
図2Aに示す通りであり(V3はV2の子孫仮想クローンであり、V2はV1の子孫仮想クローンであり)、仮想主キーRID=1001について仮想クローンV3によってクエリが受信される場合、プロセッサは(1001,V3)の複合キーを有するレコードをまず探す。(
図2Aの例ではそうであるように)かかる複合キーを有するレコードが見つかった場合、そのレコードが返されクエリが終了する。しかし、複合キー(1001,V3)を有するレコードがデータベース230内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて複合キー(1001,V2)を求めてデータベース230をクエリする。かかる複合キーを有するレコードがデータベース230内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは複合キー(1001,V1)を求めてデータベース230をクエリする。このようにして、クエリはバージョンツリー内の高位番号のバージョンを最初に参照し、結果が返されない場合はバージョンツリーを段階的に/逐次的に上がって行くことによって行うことができる。上記のクエリプロセスは、競合制約が強制されないクエリプロセスとして説明することができる。換言すれば、階層ツリーの同じ祖先系統/分岐内で同じ仮想主キー及びバージョンIDを有する複合キーを有するレコードがデータベース230内で共存することができる。
【0021】
[0032]
図2Aに示す階層ツリーを所与とし、代わりに仮想主キー1001について仮想クローンV4(V1の子孫仮想クローン)によってクエリが受信される場合、プロセッサは(1001,V4)の複合キーを有するレコードをまず探す。(
図2Aの例ではそうであるように)かかる複合キーを有するレコードが見つかった場合、そのレコードが返されクエリが終了する。しかし、複合キー(1001,V4)を有するレコードがデータベース230内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて複合キー(1001,V1)を求めてデータベース230をクエリし、それはV1がV4の祖先仮想クローンだからである。かかる複合キーを有するレコードがデータベース230内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは「ヌル」又は「該当結果なし」の応答を返す。
【0022】
[0033] 上記の説明は仮想主キーに関するクエリに言及したが、クエリは多岐にわたる他のやり方で構成することができる。例えばクエリは、指定の属性の値を有する全てのレコード(例えば「名前」の属性について「Smith」の値を有する全てのレコード)、2つ以上の指定の属性について値が一致する全てのレコード(例えば「Smith」の「名前」及び「4」のランクの属性の値を有する全てのレコード)、指定の主仮想キー及び指定の属性の値を有する全てのレコード(例えば「1001」の主仮想キー及び「名前」の属性について「Smith」の値を有する全てのレコード)等を要求することができる。一部の実装形態では、クエリが仮想主キーへの参照を含まない。
【0023】
[0034] (
図2Bに示す)別の実施形態では、競合制約を強制した状態でV3において受信されるクエリを実施/実行することができる。競合制約は、仮想クローン「X」に関する仮想主キー及びバージョンIDを含む所与の複合キーについて、Xの祖先に関連する同じ仮想主キー及びバージョンIDを有する他の複合キーがデータベース230内にないと規定する規則及び/又は命じるデータベースアーキテクチャを含み得る。別の言い方をすれば、競合制約が適用され/強制され/守られる場合、任意の所与の仮想主キーについて、その仮想主キー及び階層ツリーの所与の「分岐」上の任意の仮想クローンに関連するバージョンIDを有する複合キーを1つしか所与の時点においてデータベーステーブル内に記憶することができない。従って、その仮想主キー及び階層ツリーの祖先パス沿いの仮想クローンに関連するバージョンIDをそれぞれ参照する複数の複合キーがあることはあり得ない。例として、競合制約を強制した状態でクエリを次のように実施/実行することができる。バージョンツリー及びデータベース230が
図2Bに示す通りだと仮定する。仮想主キーRID=1001について仮想クローンV3によってクエリが受信される場合、プロセッサはRID=1001及び(バージョン=3、又はバージョン=2、又はバージョン=1)を有するレコードを探し、見つける。V3によって最初に受信されるクエリはバージョンIDの参照を含まなくてもよく、又はバージョンID V3だけを参照してもよいことに留意されたい。(例えば高速コピーソフトウェアを実行する)プロセッサは、バージョンID V3、V2、及びV1のそれぞれが含まれるようにクエリを修正することができる。データベースが競合制約を満たす場合、結果として生じる1組のレコードは同じ仮想主キーを有する2つのエントリを含まず、その理由はそれらの結果がバージョンツリー内の単一パスから来るバージョンを有するレコードを有し、そのため2つのレコードが同じ仮想主キーを有する場合はそれらのキーが競合制約に違反するからであることに留意されたい。結果テーブルを生成することができ、検索の結果として結果テーブルを返す前に結果テーブルからバージョン属性(列)を(例えばプロセッサによって)削除することができる。
【0024】
[0035]
図2Bに示す階層ツリーを所与とし、代わりに仮想主キー1001について仮想クローンV4によってクエリが受信される場合、(例えば高速コピアを実行する)プロセッサは、バージョンID V4及びV1のそれぞれが含まれるようにクエリを修正することができる。次いでプロセッサはRID=1001及び(バージョン=V4又はバージョン=V1)を有するレコードを探し、見つける。プロセッサが修正済みのクエリと一致するレコードを一切見つけない場合、プロセッサは「ヌル」又は「該当結果なし」の応答を返す。
【0025】
[0036] 上記で述べたように、
図2Bの上記の説明は仮想主キーに関するクエリを参照するが、クエリは多岐にわたる他のやり方で構成することができる。例えばクエリは、指定の属性の値を有する全てのレコード(例えば「名前」の属性について「Smith」の値を有する全てのレコード)、2つ以上の指定の属性について値が一致する全てのレコード(例えば「Smith」の「名前」及び「4」のランクの属性の値を有する全てのレコード)、指定の主仮想キー及び指定の属性の値を有する全てのレコード(例えば「1001」の主仮想キー及び「名前」の属性について「Smith」の値を有する全てのレコード)等を要求することができる。一部の実装形態では、クエリが仮想主キーへの参照を含まない。
【0026】
[0037]
図3Aは、階層ツリーの仮想クローンを生成し、それと相互作用するための方法を示す流れ図である。
図3Bは、
図3Aの方法による階層ツリーの時間的発展及び階層ツリーによるデータベーステーブルとの相互作用を示す一連の図を含む。理解を助けるために、
図3A及び
図3Bを一緒に読んで理解することができる。
図3Bに示すように、
図3Aの方法200を開始する前に、1つ又は複数のデータベーステーブルを含むデータベース230が存在する。
図3Aでは、202で、方法200は第1の仮想クローンを生成することを含む。それに応じて及び同時に(b)で、データベース230の少なくとも1つのデータベーステーブルの第1の仮想クローンが定められ、これにより222で「V1」として表す階層ツリーが開始される。その後204で、方法200は第2の仮想クローンを生成することを含み、それに応じて及び同時に(c)で、第2の仮想クローン「V2」(224)が階層ツリーに追加される。
図3BではV1から生じる及び/又は発生する(従ってV1の「子」又は「子孫」仮想クローンであり、V1をV2の「祖先」又は「先行」仮想クローンにする)ように示すが、他の例ではV2が先行仮想クローンを有さないように、V2がデータベース230から直接生じる及び/又は発生することができる(その場合V1及びV2は階層ツリー内の兄弟仮想クローンと呼ばれる)。方法200を続け、206で、
図3Bの(d)に示すようにV2によってクエリが受信される。クエリQ(X)はV2によって受信され、レコードID「X」を参照する。クエリを受信することに応答し、高速コピーソフトウェア(例えば
図1の高速コピア115)を実行するプロセッサが
図3Aの208でクエリを修正して、レコードID「X」並びにバージョン又は複数のバージョン(
図3Bの(e)に示すようにこの事例ではV1又はV2)を参照する修正済みのクエリQ(X, V1 又は V2)を生成する。修正済みのクエリは、要求されたレコードID「X」と一致し、且つV1又はV2(どちらの仮想クローンもデータベース230から生じる直接の祖先系統内にあるので)に関連するバージョン識別子を有するデータベーステーブルレコードについてリレーショナルデータベースが検索されることを引き起こす。210で、
図3Bの(f)に示すように修正済みのQ(X, V1 又は V2)クエリが実行され、212で、
図3Bの(g)に示すようにクエリの結果(応答)R(X,V1)又はR(X,V2)がV2によって返され送信される。(g)に示すように、レコードID X及びV1に関連する応答又はレコードID X及びV2に関連する応答が返される。レコードID Xに対する修正が仮想クローンV2によってまだ行われていない場合はレコードID X及びV2を参照するレコードはなく、レコードID Xに関連するレコードの最新形式はV1に関連するバージョンIDを有する。
【0027】
[0038]
図4A~
図4Fは、競合制約が適用された状態の階層ツリーの時間的発展(ステップ(a)から(t))を示す、仮想クローンの表現及び関連するデータベーステーブルを含む。
図4Aの始まり(300)で、データベーステーブル230aは属性「FID」(基礎を成すデータベーステーブルに対するレコードID及び/又はキーの役割を果たす「フルーツID」)、「アイテム」、「フルーツ」、及び「バージョン」、並びに単一の投入レコード(FID=1001、アイテム=パイ、フルーツ=リンゴ、及びバージョン=V1)を含む。更に300で、((a)に示す階層ツリーによって表されているように)仮想クローンV1及びV2(V1の直接の子孫)が既に存在している。その後302で、データベーステーブル230aへの変更がまだ行われていない状態で、新たな仮想クローンV3(226)がインスタンス化され階層ツリーに追加される。その後304で、フルーツの値が「洋梨」であるようにパイのレコードを変更するための要求がV3によって受信される。この要求を受信することに応答し、306で、バージョンV3を有する新たなレコードがデータベーステーブル230aに追加される。
図4Aに示すように、FID1001に関連する第2のレコードはアイテム属性で「パイ」の値を保持し、フルーツ属性で「リンゴ」の代わりに「洋梨」を含み、(それにより変更が要求された仮想クローン)V3の関連するバージョン識別子を有する。加えて、競合制約が守られているので、競合制約が満たされていることを確実にするために、データベーステーブル230a内の第1のレコード内のバージョン属性の値が(306に示すように)V1からV2に変更される。競合制約が強制されていない場合、かかる変更を第1のレコードに行う必要がないことに留意されたい。複合キーがFID及びバージョン属性の両方を含むので、(
図4Aの306に示すように)複数のレコードが同じFID(又は「仮想主キー」)を有し得ることに留意されたい。換言すれば、306における第1のレコードはFID=1001及びバージョン=V2の複合キーを有し、306における第2のレコードはFID=1001及びバージョン=V3の複合キーを有し、そのため複合キーは依然として一意であり互いに区別可能である。
【0028】
[0039]
図4Bへと続き、及び306でのデータベーステーブル230aの修正の後、308で、「パイ」の値を参照するクエリQ(Pie)がV3によって受信される。310で、「パイ」及び「V3又はV1」の値の両方を参照するようにクエリがQ(Pie,V3 又は V1)へと修正され、これは上記の解説と同様に仮想クローンV3及びV1がデータベース230から生じる及び/又は発生する共通の祖先系統を共有するからである。次いで、修正済みのクエリがデータベーステーブル230aに対して実行される。「パイ」及び「V3又はV1」の両方と一致するデータベーステーブル230内の唯一のレコードはFID1001及びバージョンV3を有するレコードなので、(312に示すように)クエリはそのレコードを返す。従って、クエリはV3から発生したのでV1及びV3に関連するレコードが検索されるが、V3と同じ祖先系統内にないV2に関連するレコードは検索されない。
【0029】
[0040]
図4Bの310において競合制約を守らない実装形態では、クエリが修正されないことに留意されたい。代わりに、プロセッサは「パイ」及び「V3」の値と一致するレコードを最初に検索する。(
図4Bの310の例ではそうであるように)かかるレコードが見つかった場合、そのレコード(FID=1001、アイテム=パイ、フルーツ=洋梨)が返されクエリが終了する。しかし、「パイ」及び「V3」の値と一致するレコードがデータベース230内で見つからなかった場合、次にプロセッサはバージョンツリーに基づいて「パイ」及び「V1」の値と一致するレコードを求めてデータベース230をクエリする(即ちバージョンツリーを上がって行く)。かかる複合キーを有するレコードがデータベース230内で見つかった場合、そのレコードが返されクエリが終了する。さもなければ、プロセッサは「ヌル」又は「該当応答なし」の応答を返す。
【0030】
[0041]
図4Cへと続き、314で、「パイ」の属性値を参照する更なるクエリQ(Pie)がV2によって受信される。ここでも「パイ」及び「V2又はV1」の値の両方を参照するようにクエリがQ(Pie,V2 又は V1)へと修正され、これは仮想クローンV2及びV1がデータベース230から生じる及び/又は発生する共通の祖先系統を共有するからである。次いで316で、修正済みのクエリがデータベーステーブル230aに対して実行される。「パイ」及び「V2又はV1」の両方と一致するデータベーステーブル230a内の唯一のレコードはFID1001及びバージョンV2を有するレコードなので、(318に示すように)クエリはそのレコードを返す。クエリはV2から発生したのでV1及びV2に関連するレコードが検索されるが、V2と同じ祖先系統内にないV3に関連するレコードは検索されない。従ってV2及びV3は、同じレコード1001の異なるバージョンをデータベーステーブル230a内にどちらも有することができる。
【0031】
[0042]
図4Dへと続き、320で、更なるクエリQ(Pear)がやはりV2によってだが、今回は「洋梨」の属性値を参照して受信される。ここでも「洋梨」及び「V2又はV1」の値の両方を参照するようにクエリがQ(Pear,V2 又は V1)へと修正され、これは仮想クローンV2及びV1がデータベース230から生じる共通の祖先系統を共有するからである。次いで322で、修正済みのクエリがデータベーステーブル230aに対して実行される。「洋梨」及び「V2又はV1」の両方と一致するレコードはデータベーステーブル230a内にないので、324で結果は返されない(例えばクエリと一致するレコードが見つからないという信号及び/又は通知が返される)。換言すれば、V3によって行われたデータベーステーブルのデータへの修正はV2によってアクセス不能であり、V2のクエリ可能データに影響を及ぼさない。
【0032】
[0043]
図4Eの326へと続き、フルーツ属性のリンゴ及びアイテム属性のパイを有するレコードをデータベーステーブル230aから削除し、フルーツ属性のバナナ及びアイテム属性のパンを有するレコードを追加するための要求が326でV2によって受信される。328で、及び326でV2によって受信された要求に応答し、「リンゴ」及び「パイ」の属性値を参照するレコードを識別し、次の操作のうちの1つ又は複数が行われ、その操作とはつまり「リンゴ」及び「パイ」の属性値を参照するレコードをデータベーステーブル230aから削除し、そのバージョンIDを除去する(その後V2によってアクセス可能でなくなることを確実にする)こと、又は「削除済み」フラグを表す属性をデータベーステーブル230aに追加し、そのレコードについて「真」に設定することである。更に328で、1002のFID、「パン」のアイテム属性値、「バナナ」のフルーツ属性値、及びV2のバージョンIDを有する新たなレコードがデータベーステーブル230aに追加される。その後330で、パンの値を有するアイテム属性を有するレコードを探すクエリQ(Bread)がV3によって受信される。上記の解説と同様に、パンのアイテム属性値及びバージョンID「V3又はV1」の両方を参照するようにクエリがQ(Bread,V3 又は V1)へと最初に修正される。「パン」及び「V3又はV1」の両方と一致するレコードはデータベーステーブル230a内にないので、332で結果は返されない(例えばクエリと一致するレコードが見つからないという信号及び/又は通知が返される)。
【0033】
[0044]
図4Eで示すように、一部の実装形態では、データベーステーブル230aからレコードを削除することが、(即ちデータベーステーブル230aに関連する任意の仮想クローンによって行われるその後のクエリがレコード又はその任意の部分を返さないように)レコードからバージョン属性をなくすことによって達成される。例えば削除を要求している仮想クローンが属する祖先パス内に存在するバージョンIDを削除されているレコードが有する場合、削除はこのように達成することができる。しかし、削除要求が要求側の仮想クローンの祖先パス及び削除を要求していない別のパスによって共有されるバージョンIDを有するレコードを参照する場合、削除は参照されているレコードをデータベーステーブル230aから削除することによって、及び1つ又は複数の新たなレコードをデータベース230に追加することによって達成することができ、1つ又は複数の新たなレコードは(即ち関連データが他のパス沿いの仮想クローンにとってアクセス可能なままであるように)削除を要求していない他のパス(又は複数のパス)を参照する関連バージョンIDを有する。
【0034】
[0045] 他の実装形態では、データベーステーブル230a内のレコードの削除を達成するために、データベーステーブル230aの各レコードに(真又は偽の値を取る)「削除済み」属性を追加することができ、それにより(1)削除を要求している仮想クローンの祖先パス上にしか存在しないバージョンIDについてレコードを削除することがそのレコードの「削除済み」属性を「真」に変えることによって実現され、(2)削除を要求している仮想クローンの祖先パス及び別のパスによって共有されるバージョンIDを有するレコードを削除することが、(i)削除を要求している仮想クローンのバージョンIDを有する新たなレコードをデータベーステーブル230a内で定め、新たに作成したレコードの「削除済み」属性を「真」に設定すること、及び(ii)他のパス上の仮想クローンのバージョンIDを有する新たなレコードをデータベーステーブル230a内で定め、新たに作成したレコードの「削除済み」属性を「偽」に設定することによって達成される。
【0035】
[0046]
図4Fへと続き、334で、バナナの値を有するフルーツ属性を有するレコードを検索する要求Q(Banana)がV2によって受信される。336で、バナナのアイテム属性値及びバージョンID「V2又はV1」の両方を参照するようにクエリをQ(Banana,V2 又は V1)へと修正し、修正済みのクエリをデータベーステーブル230aに対して実行する。「バナナ」及び「V2又はV1」の両方と一致するデータベーステーブル230a内の唯一のレコードはFID1002及びバージョンV2を有するレコードなので、(338に示すように)クエリはそのレコードを返す。
【0036】
[0047]
図4Gは、仮想クローンV1、V2、及びV3のそれぞれに関するレコードを含む340におけるデータベーステーブル230a(FID=1001及びバージョン=V1のレコードを削除せずに示す)と共に、
図4Fのバージョンツリーを示す。340におけるデータベーステーブル230aは、例えばデータベーステーブル230aが競合制約と共に実装されない場合に生じることができ、
図4Aの304から開始し、(1)「パイ」を「リンゴ」から「洋梨」に変更する要求はFID=1001、「洋梨」の「フルーツ」属性の値、及びV3の「バージョン」属性の値を有する(306に示す)新たなレコードを追加すること、及びFID=1001、「リンゴ」の「フルーツ」属性の値、及びV1の「バージョン」属性の値を有する(304に示す)レコードを保持することをもたらし、(2)バナナパンを追加する(FID=1002、「パン」の「アイテム」属性の値、「バナナ」の「フルーツ」属性の値、及びV2の「バージョン」属性の値を有するレコードをデータベーステーブル230aに追加することを引き起こす)要求がV2によって行われた。
【0037】
[0048] 340におけるデータベーステーブル230aの実装が競合制約を守らないという仮定を続け、「パイ」の「アイテム」属性の値を参照するV2において受信されるクエリは、V2及びV1の両方を同時に検索するようにプロセッサによって修正されない。代わりに、プロセッサは「パイ」及び「V2」の値と一致するレコードを最初に検索する。かかるレコードは340においてデータベーステーブル230a内にないので、プロセッサは次に「パイ」及び「V1」の値と一致するレコードを求めてデータベース230をクエリする(即ちバージョンツリーを上がって行く)。データベーステーブル230a内で単一のレコード(FID=1001、アイテム=パイ、フルーツ=リンゴ、バージョン=V1)が見つかり、そのレコードが返されクエリが終了する。V3に対して行われる同様のクエリはレコード(FID=1001、アイテム=パイ、フルーツ=洋梨、バージョン=V3)を返し、それはV3が最初に検索され、レコードが識別されるのでクエリが終了し、祖先パスに沿ってV1の検索まで進まないからである。代わりに、「全てのパイ」を求めるクエリがV3において受信される場合、プロセッサは「パイ」及び「V3」の値と一致するレコードをデータベーステーブル230aで最初に検索し、それにより第1のレコード(FID=1001、アイテム=パイ、フルーツ=洋梨、バージョン=V3)を識別する。次いでプロセッサは、「アイテム」属性について「パイ」の値を含む任意の更なるレコードを求めて(祖先パスに沿って)V1を検索することによって続行し、第2のレコード(FID=1001、アイテム=パイ、フルーツ=リンゴ、バージョン=V1)を識別する。第1のレコード及び第2のレコードのFIDが(例えばレコードFIDの比較に基づいてプロセッサによって検出されるように)一致するが、V3の検索がFID=1001を有するレコードを既に識別しているのでバージョンV1を有するレコードはクエリ結果から除外される。代わりに、「パイ」の値と一致するが1001と異なるFIDを有する追加のレコードがV1の検索時に識別される場合、それらのレコードがクエリ応答の一部として返される。
【0038】
ガベージコレクション
[0049] 一部の実装形態では、階層ツリー(本明細書では「バージョンツリー」とも呼ぶ)及び/又は階層ツリーの表現が、メモリに動作可能に且つ通信可能に結合されるプロセッサ(例えば
図1の高速コピア115を実行するプロセッサ111等)によって行われるインクリメンタルガベージコレクションの一種により、削減された形で及び/又はより最適な形で非一時的メモリ内に保たれ及び/又は記憶される。かかる実装形態では、階層ツリーの各ノードが仮想クローン及び一連の複数の整数のシーケンスIDの終点を表す2つのシーケンスIDに関連する。例として、一連のシーケンスID 10、11、12、及び13をシーケンスIDペア(10,13)によって表すことができる。シーケンスID 42とだけ関連するノードは、シーケンスIDペア(42,42)と示す。本明細書で使用するとき、シーケンスIDはバージョンIDと異なるように定義する。シーケンスIDは、階層ツリーの仮想クローンが生成された順番に関する。そのため、特定の仮想クローンのシーケンスID及びバージョンIDは同じ値を有することができ、又は異なってもよい。かかる一部の実装形態では、
図5の図(a)~(g)に示すように、バージョンツリーは(a)においてツリーに拡張する前、最初は単一のノード(1,1)しか含まない。高速コピーイベントがバージョンツリー内の新たなノードの作成及び/又は定義を引き起こすたび、次の整数のシーケンスIDがその新たなノードに順番に割り当てられる。そのため、バージョンツリーに追加される第2のノードにはシーケンスID(2,2)が割り当てられ、N番目のノードにはシーケンスID(N,N)が割り当てられる。本明細書で使用するとき、ノードXにシーケンスIDペア(A,B)が指定され、ノードYにシーケンスIDペア(B+1,C)が指定される場合、ノードXは「後継」ノードYを有する。換言すれば、YはXのシーケンスID範囲の直後に来るシーケンスID範囲を表す。メモリ内の(及びデータベース内の)データ構造は、バージョンツリーのノードごとに、自らの後継であるノードへの参照を記憶することができる。後継関係は
図5の破線で表す。本明細書で使用するとき「後継」及び「子孫」は(相互排他的ではないが)異なる概念であることに留意されたい。例えば前のノードの後継であるノードは、必ずしもその前のノードの子孫ではなく(例えば
図5の(a)において、ノード(6,6)はノード(5,5)の後継だがノード(5,5)の祖先パス上の子孫ではなく)、前のノードの子孫ノードは必ずしもその前のノードの直の後継ではない(例えば
図5の(a)において、ノード(6,6)はノード(3,3)の子孫だがノード(3,3)の直の後継ではない)。
【0039】
[0050] 一部の実装形態では、メモリ内に記憶されるノードのための(例えばバージョンツリーから冗長性を除去し、性能及び効率を高め、記憶域及び/又は資源消費を減らす等するための)(例えばノードX及びその後継Yノードを含む)「シーケンス更新」が高速コピーソフトウェア(例えば
図1の高速コピア115、125)を実行するプロセッサによって行われ、プロセッサはバージョンツリーを記憶するメモリと動作可能に通信する。シーケンス更新は次のように達成される。まず、(A,B)のシーケンスID範囲を有するノードXが、(B+1,C)のシーケンスID範囲を有する後継Yを有し、ノードX及びYを含む一連のノードが更新されると仮定する。(A,C)のシーケンスID範囲を有する(即ちノードXの第1の終点及びノードYの第2の終点を有する)新たなノードZを定めることができる。次に、ノードX又はノードYに対するバージョンツリー内の他のノードの(例えば
図5の実線及び破線で表す)任意の関係が更新され、それによりそれらのノードはもはやノードX若しくはYに接続せず及び/又はノードX若しくはYを参照せず、代わりにノードZに接続し及び/又はノードZを参照する。ノードX及びYはバージョンツリーから除去/削除する(及びそれに応じて関連するデータベーステーブルから削除する又は削除済みとして注釈を付ける)ことができ、それによりシーケンス更新イベントを完了する。一部の実装形態では、シーケンス更新がノードであって、そのノードの後継でもある単一の子ノードだけを有する、ノードをもたらす場合、そのノード及びその単一の子ノードを含む別のシーケンス更新を(例えばノードがそのノードの後継でもある単一の子ノードだけを有するという条件を検出したとき自動で)上記と同様のやり方で行うことができる。
【0040】
[0051] 一部の実装形態では、バージョンツリーからノードXを削除することが次のように達成される。まず、ノードXがバージョンツリー内に存在する親ノードを有する場合、ノードXとその親ノードとの間の(例えば
図5に示すバージョンツリー内の実線によって表す)関係を除去する。次にノードXが後継ノードを有する場合、その後継ノードに新たなシーケンスIDを割り当て、ノードXを削除する。或いはノードXが後継ノードを有さない場合、ノードXを単に削除する。ノードXの前の親ノードが自らから生じる子ノードを現在有していない場合は前の親ノードを削除する。ノードXを後継として有していたノードWがあり、ノードWが現在1つの子ノードしか有さず、その子が自らの後継である場合、ノードWの子ノードに新たなシーケンスIDを割り当てる。
【0041】
[0052] 上記の任意の削除イベント又はシーケンス更新イベントは新たに子を有さないノードをもたらす場合があり、そのため別の削除を引き起こす可能性がある。或いは又は加えて、上記の任意の削除イベント又はシーケンス更新イベントは自らの後継である単一の子ノードを有する新たなノードをもたらす場合があり、そのため別のシーケンス更新イベントを引き起こす可能性がある。従って、単一のシーケンス更新又は削除によって引き起こされるシーケンス更新及び削除の連鎖があり得る。一部の実装形態では、本開示のシステムが連鎖型のガベージコレクションを行うように構成され、他の形式のガベージコレクションはバージョンツリーに対して行われない。本明細書に記載の(及びプロセッサによって実行される)インクリメンタルガベージコレクション方法は、作成されるバージョンツリー内であり得る/許容可能な単純化(又はその既定の部分集合)を(例えばほぼ継続的に及び/又はほぼリアルタイムで)自動認識し、実行し/実施し/引き起こすことができる。改正された/単純化されたバージョンツリー(例えば
図5(d)のバージョンツリーを置換する
図5(e)のバージョンツリー)の表現は、後のアクセスのためにメモリ内に記憶することができる。
【0042】
[0053] 一部の実装形態では、削除イベントがインクリメンタルガベージコレクションプロセスを引き起こすことができる。例えば
図5(a)に示すようにバージョンツリーが表現される場合、破線矢印は後継ノードへの参照を表す。高速コピー可能データベースの一部の実装形態では、葉ノードだけを削除することができる。換言すれば、高速コピーソフトウェアは、或る「バージョン」が「葉」ノードに関連する場合にのみそのバージョンを削除するように構成され得る。「葉ノード」は子を有さないノードとして定義する(
図5では子ノードを実線によって表す)。破線は葉ノードの識別中は無視すべきである。
【0043】
[0054] ユーザが
図5の(a)において陰影付けしてある葉ノード(5,5)の削除を要求したと仮定する。葉ノード(5,5)の削除後、バージョンツリーは
図5の(b)に示すように見える。(b)のバージョンツリーは、ノード(6,6)にシーケンスIDペア(5,6)を割り当て、次いで(ノード(4,4)をノード(5,6)に接続する破線によって示すように)自らの後継としてノード(5,6))を参照するようにノード(4,4)を更新するシーケンス更新の結果である。(2,2)である前のノード(5,5)の親ノードは依然として子ノード(ノード(4,4))を有し、自らの唯一の子として自らの後継ノード(ノード(3,3))を有さず、そのためこの削除プロセスは
図5の(b)に示すバージョンツリーで終わることに留意されたい。
【0044】
[0055] 次に、ユーザが(
図5の(b)において陰影付けしてある)ノード(4,4)の削除を要求したと仮定する。ノード(4,4)を削除するこの要求は幾つかのアクションを引き起こし得る。まずノード(4,4)は親ノード(2,2)を有するので、
図5の(b)において実線で示すノード(2,2)とノード(4,4)との間の関係を除去する。更に、
図5の(c)に示すようにノード(5,6)にシーケンスIDペア(4,6)を割り当てるようにシーケンス更新を行い、今度はノード(3,3)とノード(4,6)との間の更新済みの後継関係が示される(ノード(4,6)はノード(3,3)の後継である)。上記のアクションの結果、(
図5の(c)に示すように)ノード(2,2)はもはや子ノードを一切有さない。そのため及び/又はこの状態に応答し、且つ(ノード(2,2)の子孫ノードがその除去前に過去に生成されている結果として)ノード(2,2)によってクエリをもはや行えないことにより、この削除プロセスは
図5の(d)に示すバージョンツリーをもたらすノード(2,2)の削除を自動で続行することによって「連鎖」し得る。この段階においてノード(1,1)には1つの子ノード(ノード(2,3))しかなく、その子はノード(1,1)の後継ノードである。従って上記で解説したように、子ノード(2,3)に新たなシーケンスIDペア(1,3)を割り当てるようにシーケンス更新を行い、
図5の(e)に示すバージョンツリーをもたらすことができ、この時点で連鎖が終了する。換言すれば、
図5の(e)に示すバージョンツリーは、ノード(4,4)を削除するユーザの要求の最終結果である。
【0045】
[0056] 次に、ユーザが(
図5の(e)において陰影付けしてある)葉ノード(4,6)の削除を決めたと仮定する。この削除イベントは、
図5の(f)に示すようにバージョンツリーが見えるようにバージョンツリーの変形をもたらし、ノード(4,7)(ノード(1,3)の子ノード)に新たなシーケンスIDペア(1,7)が割り当てられ、
図5の(g)に示す最終結果(単一のノード(1,7))がもたらされるように、それ自体が最終的なシーケンス更新を自動で引き起こす。ガベージコレクションが進むにつれ、例えば
図5の(g)において全てのレコードが同じバージョン属性(例えば「7」)を含むように、関連するデータベーステーブルへの対応する変更を加えることができる。(例えば
図5の(g)において)1つのノードしか残らない段階(即ちバージョンツリーがガベージコレクションされ、サイズが低減されるとき)の前に、データベーステーブル(例えば
図4A~
図4Gのデータベーステーブル230a等)のレコードは残存しているノードを参照するように修正することができ、又は(例えばそのレコードに一意に関連するノードの削除に応じて)削除することができる。
【0046】
[0057]
図6は、一実施形態による、高速コピーデータベースのためのプロセッサによって実施されるガベージコレクション(又は連鎖削除)方法400のプロセス流れ図である。
図6に示すように、方法400は、430で仮想クローンの階層ツリーを生成することから始まる。その後432で、仮想クローンの階層ツリーから第2の仮想クローンを削除するための命令を受信する。第2の仮想クローンを削除するための命令に応答し、434で、第3の仮想クローンの後継関係を修正する。更に第2の仮想クローンを削除するための命令に応答し、436で第2の仮想クローンを削除する。438で、第2の仮想クローンの削除後に、仮想クローンの階層ツリーの第1の仮想クローンに子の仮想クローンが残っているかどうかをプロセッサが評価する。第2の仮想クローンの削除後に仮想クローンの階層ツリーの第1の仮想クローンに子の仮想クローンが残っているが、その子が第1の仮想クローンの後継ではない場合はこのプロセスは終了する。第2の仮想クローンの削除後に仮想クローンの階層ツリーの第1の仮想クローンに子の仮想クローンが残っており、その子が第1の仮想クローンの後継である場合、上記で解説したようにシーケンス更新を行うことができる。第2の仮想クローンの削除後に仮想クローンの階層ツリーの第1の仮想クローンに子の仮想クローンが残っていない場合、440で仮想クローンの階層ツリーから第1の仮想クローンを削除する。
【0047】
[0058]
図7は、一実施形態による、高速コピーデータベースのためのプロセッサによって実施される更なるガベージコレクション(又は連鎖削除)方法500のプロセス流れ図である。
図7に示すように、方法500は、530で仮想クローンの階層ツリーを生成することから始まる。その後532で、仮想クローンの階層ツリーから第1の仮想クローンを削除するための命令を受信する。第1の仮想クローン(例えば
図5のノード(4,4))を削除するための命令に応答し、534で、第2の後継仮想クローン(例えば
図5のノード(5,6))の後継関係を修正する。536で、第1の仮想クローンを削除する。次いで538で、第4の仮想クローン(例えば
図5のノード(3,3))の後継関係を修正し、第4の仮想クローンは第1の仮想クローンの祖先である第3の仮想クローン(例えば
図5のノード(2,2))の後継である。次いで540で、第3の仮想クローンを削除する。
【0048】
[0059]
図8A~
図8Dは、一実施形態による、高速コピーデータベースシステムの実装形態の一例を示す図である。
図8Aに示すように、800で(及び最初の時点t=0において)、ノード「Jane」におけるデータベースの第1のインスタンス830Aが、データベースインスタンス830Aから依存する3つの仮想クローンV1、V2、及びV3を含む階層ツリーの一部を形成する。ノードJaneにおけるデータベースインスタンス830Aは、RID、名前、ランク、及びバージョンの属性を有するデータベーステーブルを含む。800では、データベーステーブル内に2つの投入レコード、つまり名前=Smithのレコードと名前=Jonesのレコードとがある。800における仮想クローンV1は過去の「第1の」合意イベントに関連することができる。800における仮想クローンV2は、(例えばトランザクションデータ等の新たなデータが受信されるとき、データベーステーブルが進行中のタリー又は状態を反映するように)データベース830Aのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために使用することができる一方、800における仮想クローンV3はデータベース830Aのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。同じく
図8Aには、802で(及び最初の時点t=0において)ノード「Bob」におけるデータベースの第2のインスタンス803Bが示されており、このインスタンスは同じくそれぞれデータベースインスタンス830Bの直接依存である2つの仮想クローンV1及びV2を含む別の階層ツリーの一部を形成する。ノードBobにおけるデータベースインスタンス830Bは、RID、名前、ランク、及びバージョンの属性を有するデータベーステーブルを同じく含む。802では、データベーステーブル830B内に2つの投入レコード、つまり名前=Smithのレコードと名前=Jonesのレコードとがある。換言すれば、Janeのノードにおけるデータベースインスタンス830A及びBobのノードにおけるデータベースインスタンス830Bのデータベーステーブルが、第1の時点t=0において同じレコードを含む。Janeのノードにおけるデータベーステーブル830A及びBobのノードにおけるデータベーステーブル830B内のレコードのそれぞれが、V1のバージョン属性の値を含むことに留意されたい。802における仮想クローンV1は、新たな子の仮想クローンV2及びV3の生成を引き起こした過去の「第1の」合意イベントに関連することができる。802における仮想クローンV2は、データベース830Bのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために使用することができる一方、802における仮想クローンV3はデータベース830Bのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。
【0049】
[0060]
図8Bでは同期イベントが生じ、その間データ(関係するトランザクションと同時にリアルタイムで又はほぼリアルタイムで受信され得る「イベント」、例えばトランザクションデータと本明細書では呼ぶことがある)が、Janeのノード830A、Bobのノード830B、並びに任意選択的にJaneのノード830A及び/又はBobのノード830Bとネットワーク通信する1つ又は複数の追加のノードのうちの2つ以上の間でやり取りされる。同期中、Janeのノード830Aは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を1インクリメントすべきだと規定する第1のイベントを第1の時点において受信する。第1のイベントを受信することに応答し、Janeのノード830Aにおけるプロセッサが「Smith」のための新たなレコードを生成し、「バージョン」の属性についてV2の値、「RID」の属性について1001の値、及び「ランク」の属性について2+1=3(不図示)の値をそのレコード内に含める。更に、第1のイベントを受信することに応答し、Janeのノード830Aにおけるプロセッサは、バージョン属性の値がV1ではなくV3であるようにデータベーステーブル内の第1のレコードを修正する。更に、同期中(同じ同期イベント中又は別個の同期イベント中)、Janeのノード830Aは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を10に変更すべきだと規定する第2のイベントを第1の時点の後の第2の時点において受信する。第2のイベントを受信することに応答し、Janeのノード830Aにおけるプロセッサは、(
図8Bの804に示すように)レコードが「ランク」の属性について10の値を有するように、名前の属性について「Smith」の値、及びバージョンの属性について「V2」の値を有するレコードを修正する。
【0050】
[0061] 同期(Janeのノード830Aと同じ又は別個の同期イベント)中、Bobのノード830Bは、Jane 830Aがイベントを受信したのと逆順に第1のイベント及び第2のイベントを受信する。より詳細には、Bobのノード830Bは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を10に変更すべきだと規定する第1のイベントを第1の時点において受信する。第1のイベントを受信することに応答し、Bobのノード830Bにおけるプロセッサが「Smith」のための新たなレコードを生成し、「バージョン」の属性についてV2の値、「RID」の属性について1001の値、及び「ランク」の属性について10(不図示)の値をそのレコード内に含める。更に、第1のイベントを受信することに応答し、Janeのノード830Aにおけるプロセッサは、バージョン属性の値がV1ではなくV3であるようにデータベーステーブル内の第1のレコードを修正する。更に、同期中(同じ同期イベント中又は別個の同期イベント中)、Bobのノード830Bは、「名前」の属性について「Smith」の値を有するレコードの「ランク」の属性の値を1インクリメントすべきだと規定する第2のイベントを第1の時点の後の第2の時点において受信する。第2のイベントを受信することに応答し、Bobのノード830Bにおけるプロセッサは、(
図8Bの806に示すように)レコードが「ランク」の属性について11の値を有するように、名前の属性について「Smith」の値、及びバージョンの属性について「V2」の値を有するレコードを修正する。
【0051】
[0062] Janeのノード及びBobのノードにおいてV2経由で受信されるイベント/データ(トランザクションデータ等)は、Janeのノード及びBobのノードそれぞれの関連するメモリ内に、例えば分散非循環グラフ(DAG)、ハッシュグラフ、データチェーン、ブロックチェーン、又は他の任意の適切なデータ構造若しくは形式内に記憶することができる。適合するデータ構造を含む更なる実装の詳細が、参照によりその全内容を本明細書において全ての目的のために援用する米国特許第9,646,029号の中に記載されている。
【0052】
[0063] 同期イベントの後、及び
図8Cの808に示すように、Janeのノード830A及びBobのノード830Bのプロセッサが(例えば
図1の合意命令116及び126等の合意命令を実施した結果として)合意に達する。換言すれば、Janeのノード830Aの(そのノードのメモリ内に記憶される高速コピーソフトウェアを実行する)プロセッサによって実施される合意アルゴリズム、及びBobのノード830Bの(例えばそのノードのメモリ内に記憶される高速コピーソフトウェアを実行する)プロセッサによって実施される合意アルゴリズムが、合意に達したことを検出し及び/又はそのように判定する。合意は、非限定的な例として、合意アルゴリズムによって定められる「ラウンド」が完了したとき、階層ツリーが開始されてから所定の時間が経過したとき、前の合意イベントから所定の時間が経過したとき、そのノードのデータベーステーブルの所与のレコードについて他のノードから所定の投票数が受信されているとき、所定数の同期イベントが生じたとき等の条件のうちの1つ又は複数の下で達することができる。
図8Cに示すように、Smithのランクを最初にインクリメントし、次に10の値に変更することが受信イベントの正しい順序付けであるのが合意の結果であった。そのため、名前の属性についてSmithの値を有し、バージョンの属性についてV2の値を有するレコードのランク属性の正しい現在値は「10」である。同様に述べると、808に示すようにこのレコードのランク値は「10」であるようにV3によって更新される。合意に達した結果、仮想クローンV3に依存し/そこから下降する1対の新たな仮想クローンV4及びV5が生成される。808において新たに生成される仮想クローンV4は、Janeのノード830Aにおけるデータベースインスタンスのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために後で使用することができる一方、808における仮想クローンV5はJaneのノード830Aにおけるデータベースインスタンスのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。換言すれば、新たな仮想クローンV4及びV5は、仮想クローンV2及びV3のそれぞれによって前に行われていた機能を実行することができる。一部の実装形態では、仮想クローンV4及びV5が生成されると、データベーステーブルに対する編集は(たとえ仮想クローンV4及びV5が後で削除されても)仮想クローンV3によってもはや行うことができないことに留意されたい。
【0053】
[0064]
図8Cの解説と同様に、
図8Dにおいて、Bobのノード830Bが(例えば
図1の合意命令116及び126等の合意命令を実施した結果として)合意に達する。換言すれば、Janeのノード830Aの(例えばそのノードのメモリ内に記憶される高速コピーソフトウェアを実行する)プロセッサによって実施される合意アルゴリズム、及びBobのノード830Bの(そのノードのメモリ内に記憶される高速コピーソフトウェアを実行する)プロセッサによって実施される合意アルゴリズムが、合意に達したことを検出し及び/又はそのように判定する。
図8Dに示すように、Bobのノード830Bにおけるデータベースインスタンスのデータベーステーブルは、名前の属性についてSmithの値を有し、バージョンの属性についてV2の値を有するレコードのランク属性について「10」の正しい現在値を今では反映している。同様に述べると、810に示すようにこのレコードのランク値は「10」であるようにV3によって更新される。
図8Cの解説と同様に、及び第2の合意に達した結果、仮想クローンV3に依存し/そこから下降する1対の新たな仮想クローンV4及びV5が生成される。808において新たに生成される仮想クローンV4は、Bobのノード830Bにおけるデータベースインスタンスのデータベーステーブルに対してリアルタイムの又はほぼリアルタイムの編集を行うために後で使用することができる一方、808における仮想クローンV5はBobのノード830Bにおけるデータベースインスタンスのデータベーステーブルに対して合意後の編集を行うために確保しておくことができる。換言すれば、新たな仮想クローンV4及びV5は、仮想クローンV2及びV3のそれぞれによって前に行われていた機能を実行することができる。一部の実装形態では、仮想クローンV4及びV5が生成されると、データベーステーブルに対する編集は(たとえ仮想クローンV4及びV5が後で削除されても)仮想クローンV3によってもはや行うことができないことに留意されたい。
【0054】
[0065]
図8A~
図8Dは、データベーステーブル内のレコードの現在の「収支」、「タリー」、又は「状態」の正確性を確実にするためにイベント(例えばトランザクション)の正しい順序付けを決定するものとして合意を図示し説明したが、代わりに又は加えて合意は、資産の現在の所有者を決定すること、データベーステーブル内のレコードの正しい順序付けを決定すること、商品の生産物流管理又は権原連鎖を決定すること等のうちの1つ又は複数の目的でイベントの正しい順序付けを決定するために使用することができる。
【0055】
[0066] 本明細書に記載の一部の実施形態では、機器(例えば
図1の計算装置110及び/又は計算装置120)がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリ(例えば
図1のメモリ112及び/又はメモリ122)は複数のレコードを含むデータベーステーブルを記憶し、複数のレコードからの各レコードはバージョン識別子を有する複合キーを含む。メモリは、データベーステーブルの第1の仮想クローン及びデータベーステーブルの第2の仮想クローンを生成することをプロセッサに行わせるために実行可能な命令を含む。メモリは、第1の仮想クローンにおいてクエリを受信すること、及び第1の仮想クローンにおいてクエリを受信することに基づいて第1の仮想クローンに関連するバージョン識別子を含む修正済みのクエリを定めるためにクエリを修正することをプロセッサに行わせるために実行可能な命令も含む。メモリは、(1)クエリを満たす1組のレコードからの各レコード、及び(2)第1の仮想クローンに関連するバージョン識別子の祖先パスに関連するバージョン識別子を有する1組のレコードからの各レコードに基づき、複数のレコードからの1組のレコードを含む応答を生成するために修正済みのクエリを使用してデータベーステーブルをクエリすることをプロセッサに行わせるために実行可能な命令も含む。メモリは、クエリへの応答として1組のレコードを含む応答を送信することをプロセッサに行わせるために実行可能な命令も含む。かかる一部の実施形態では、複数のレコードからの各レコードの複合キーが、その複合キーのバージョン識別子及びデータ部分を含む。複数のレコードは、(1)データ部分の値及び第1の仮想クローンに関連するバージョン識別子を含む複合キー、又は(2)データ部分の値及び第2の仮想クローンに関連するバージョン識別子を含む複合キーのうちの1つだけが任意の所与の時点においてデータベーステーブル内に存在するように構成することができる。
【0056】
[0067] 一部の実施形態では、メモリが、第1の仮想クローンによって受信される挿入命令に応答してデータベーステーブルにレコードを追加することをプロセッサに行わせるために実行可能な命令も含む。レコードは、データ及び第1の仮想クローンに関連するバージョン識別子を有する複合キーを含み、そのため(1)第1の仮想クローンにおいて後で受信されデータを参照するクエリがレコードを返し、(2)データを求めて第3の仮想クローンにおいて後で受信されるクエリはレコードを返さない。
【0057】
[0068] 一部の実施形態では、メモリが、データベーステーブルの第1のレコードのフィールドの値を第1の値から第2の値に更新するための、及び第3の仮想クローンによって受信される命令に応答し、データベーステーブルに第2のレコードを追加することをプロセッサに行わせるために実行可能な命令も含む。第2のレコードは、第2の値及び第3の仮想クローンに関連するバージョン識別子を有する複合キーを含む。この命令は、第1のレコードのフィールドの値を更新するための命令に応答し、第3の仮想クローンに関連するバージョン識別子を含まないように第1のレコードの複合キーを修正するために更に実行可能とすることができ、そのため第3の仮想クローンにおいて後で受信され、フィールドを参照するクエリが第2のレコードを返し、第1の仮想クローンにおいて受信され、フィールドを参照するクエリが第1のレコードを返す。
【0058】
[0069] 一部の実施形態では、メモリが、複数のレコードからレコードを削除するための、及び第3の仮想クローンによって受信される命令に応答し、第3の仮想クローンに関連するバージョン識別子を含まないようにレコードの複合キーのバージョン識別子を修正することをプロセッサに行わせるために実行可能な命令も含み、そのため第3の仮想クローンにおいて後で受信されるレコードのためのクエリがレコードを返さず、第1の仮想クローンにおいて後で受信されるレコードのためのクエリがレコードを返す。
【0059】
[0070] 一部の実施形態では、応答が第1の応答であり、修正済みのクエリが第1の修正済みのクエリである。命令は、第1の応答がヌルの場合に第2の仮想クローンのバージョン識別子を含む第2の修正済みのクエリを生成することをプロセッサに行わせるために更に実行可能とすることができ、第2の仮想クローンは第1の仮想クローンにとっての祖先である。命令は、(1)第2の修正済みのクエリを満たす第2の応答の1組のレコードからの各レコード、及び(2)第2の仮想クローンのバージョン識別子の祖先パスに関連するバージョン識別子を有する第2の応答の1組のレコードからの各レコードに基づき、複数のレコードからの1組のレコードを含む第2の応答を生成するために第2の修正済みのクエリを使用してデータベーステーブルをクエリし、クエリへの応答として1組のレコードを含む第2の応答を送信することをプロセッサに行わせるために更に実行可能であり得る。
【0060】
[0071] 一部の実施形態では、この命令は、第1の仮想クローンが第2の仮想クローンの子孫であるという指示をメモリ内に記憶することをプロセッサに行わせるために更に実行可能である。
【0061】
[0072] 一部の実施形態では、この命令が、データベーステーブルの第3の仮想クローンを生成することであって、第3の仮想クローンは第1の仮想クローンの祖先でも子孫でもなく、複数のレコードはデータ部分の値及び第3の仮想クローンに関連するバージョン識別子を含む複合キーを有するレコードを含む、生成することをプロセッサに行わせるために更に実行可能である。
【0062】
[0073] 一部の実施形態では、機器がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、データベーステーブル及びプロセッサ実行可能命令を記憶する。プロセッサ実行可能命令は、データベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することをプロセッサに行わせるための命令を含み、複数の仮想クローンは第1の仮想クローン(例えば
図5のノード(2,2))、第1の仮想クローンの子の仮想クローンである第2の仮想クローン(例えば
図5のノード(4,4))、及び第2の仮想クローンの後継仮想クローンである第3の仮想クローン(例えば
図5のノード(5,6))を含む。プロセッサ実行可能命令は、第2の仮想クローンを削除するための命令に応答し、第3の仮想クローンに関連する後継関係を修正することをプロセッサに行わせるための命令も含む。プロセッサ実行可能命令は、第2の仮想クローンを削除するための命令に応答して第2の仮想クローンを削除することをプロセッサに行わせるための命令も含む。プロセッサ実行可能命令は、第2の仮想クローンを削除するための命令に応答し、第2の仮想クローンの削除後に第1の仮想クローンが子の仮想クローンを有さない場合、複数の仮想クローンから第1の仮想クローンを削除することをプロセッサに行わせるための命令も含む。
【0063】
[0074] 一部の実施形態では、複数の仮想クローンが、第1の仮想クローンの後継仮想クローンである第4の仮想クローンを更に含む。命令は、第2の仮想クローンを削除するための命令及び第2の仮想クローンの削除後に第4の仮想クローンが第1の仮想クローンの唯一の子孫だという判定に応答し、第4の仮想クローンに関連する後継関係を修正することをプロセッサに行わせるために更に実行可能である。
【0064】
[0075] 一部の実施形態では、この命令が、複数の仮想クローンからの且つ子の仮想クローンを有さない第4の仮想クローンを自動で識別すること、及び自動で識別することに基づいて第4の仮想クローンを削除することをプロセッサに行わせるために更に実行可能である。或いはこの命令は、複数の仮想クローンからの且つ子の仮想クローンを有さない第4の仮想クローンを自動で識別すること、並びに自動で識別することに応答して(1)複数の仮想クローンからの第5の仮想クローンに関連する後継関係を修正すること、及び(2)第4の仮想クローンを削除することをプロセッサに行わせるために更に実行可能であり得る。
【0065】
[0076] 一部の実施形態では、この命令が、第3の仮想クローンに関連する後継関係を修正することに応答し、複数の仮想クローンから少なくとも1つの更なる仮想クローンを削除することを引き起こすことをプロセッサに行わせるために更に実行可能である。
【0066】
[0077] 一部の実施形態では、後継関係が第1の後継関係であり、メモリが第1の後継関係を含む複数の後継関係を更に記憶する。
【0067】
[0078] 一部の実施形態では、データベーステーブルが複数のレコードを含み、複数のレコードからの各レコードが、複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む。
【0068】
[0079] 一部の実施形態では、機器がプロセッサ及びプロセッサと電子通信するメモリを含む。メモリは、データベーステーブル及びデータベーステーブルの複数の仮想クローンの表現を含む階層ツリーを生成することをプロセッサに行わせるために実行可能な命令を記憶する。命令は、複数の仮想クローンから第1の仮想クローン(例えば
図5のノード(4,4))を削除するための命令に応答し、第2の仮想クローン(例えば
図5のノード(5,6))に関連する後継関係を修正することであって、第2の仮想クローンは第1の仮想クローンの後継仮想クローンである、修正すること、第1の仮想クローンを削除すること、第4の仮想クローン(例えば
図5のノード(3,3))に関連する後継関係を修正することであって、第4の仮想クローンは第3の仮想クローン(例えば
図5のノード(2,2))の後継仮想クローンであり、第3の仮想クローンは第1の仮想クローンの祖先仮想クローンである、修正すること、及び第3の仮想クローンを削除することを行うために実行可能とすることもできる。
【0069】
[0080] 一部の実施形態では、この命令は、第2の仮想クローンが第4の仮想クローンの唯一の子孫仮想クローンであり且つ後継仮想クローンだと検出すること、及び第2の仮想クローンが第4の仮想クローンの唯一の子孫仮想クローンであり且つ後継仮想クローンだと検出することに応答して第2の仮想クローンを削除することをプロセッサに行わせるために更に実行可能である。
【0070】
[0081] 一部の実施形態では、データベーステーブルが複数のレコードを含み、複数のレコードからの各レコードは、複数の仮想クローンからの仮想クローンに関連するバージョン識別子を含む複合キーを含む。
【0071】
[0082] 一部の実施形態では、この命令が、第1の仮想クローンを削除するための命令に応答し、複数の仮想クローンから少なくとも1つの更なる仮想クローンを削除することを引き起こすことをプロセッサに行わせるために更に実行可能である。
【0072】
[0083] 一部の実施形態では、この命令が、複数の仮想クローンからの且つ子孫仮想クローンを有さない第5の仮想クローンを自動で識別することをプロセッサに行わせるために更に実行可能である。この命令は、自動で識別することに応答し、第6の仮想クローンに関連する後継関係を修正すること、及び第5の仮想クローンを削除することを行うために実行可能とすることもできる。
【0073】
[0084] 一部の実施形態では、メモリが、第2の仮想クローンに関連する後継関係及び第4の仮想クローンに関連する後継関係を含む複数の後継関係を更に記憶する。
【0074】
[0085] 一部の実装形態では、(1001,N)等の所与の複合キーを有するレコードがテーブル内に存在する場合、そのテーブルが(1001,M)の複合キーを有する如何なるレコードも含まないことを競合制約が確実にし、Mはバージョンツリー内でNの祖先であるバージョン番号である。例えばバージョンツリーが
図8Cに示す通りであり、(1001,4)のキーを有するレコードがある場合、(1001,V3)又は(1001,V1)のキーを有するレコードが一切ないことが保証される。しかし(1001,2)のキーを有するレコードは存在することができ、それはツリー内でV2がV4の祖先ではないからである。
【0075】
[0086] 一部の実装形態では、データベーステーブルの各レコード/行が1のバージョンIDを最初に含む。データベーステーブルは、本明細書に記載の高速コピー、追加、削除、又は修正を行う操作の結果として増大及び縮小し得る。
【0076】
[0087] 一部の実装形態では、削除操作を次のように行うことができる。仮想クローン(又は「ビュー」)によって受信されるSQLクエリが、削除するための1つ又は複数のレコードを参照し得る。そのような各レコードは次のように削除することができる。レコードがバージョンNを有する場合、そのレコードを削除する。次に、階層ツリー(即ちデータベーステーブルインスタンス)のビューから「ルート」までの直接の祖先パス沿いの各仮想クローンについて、直接の祖先パス上にないそれらの仮想クローンの子がある場合、そのバージョンがMに変更してある削除済みレコードのコピーをそれらの子のデータベーステーブルに追加する。例えば
図4Bの階層ツリーを所与とし、(Pie,V2)のキーを有するレコードがV2によって削除される場合、そのレコードがテーブルから削除される。(Pie,V1)のキーを有するレコードがV2によって削除される場合、そのレコードが削除され、バージョンV3を有するそのレコードのコピーがテーブルに追加され、それはV3がV1の子であり且つデータベース230からV2までの直接の祖先パス上にないからである。バージョン番号が結果から削除されると、この削除操作は、V2によるその後の読み取りがパイの仮想主キーを有する如何なるレコードも返さないこと、及びV3によるその後の読み取りが削除前と同じ結果を返すことを確実にすることに留意されたい。加えて、かかる削除操作が競合制約を満たすテーブルに対して行われる場合、修正済みのテーブルは引き続き競合制約を満たす。
【0077】
[0088] 一部の実装形態では、削除命令が或るレコードを削除すること、及びK>0が成立する状態で異なるバージョンを有するK個の新たなレコードを追加することを命令する場合、この命令はレコードのバージョン番号を新たなバージョン番号の1つに変更し、(それぞれ異なるバージョン番号を有する)K-1個のコピーを作成することによって実施することができる。この最適化は1つの追加を節約し、かかる節約は基礎を成すデータベースにとって修正を実行することが追加を実行するよりも速い場合に有益であり得る(例えばデータベースの効率を高める)。
【0078】
[0089] 他の実装形態では、「削除済み」のブール属性を各レコードに追加することができる。一例として
図4Bの階層ツリーを所与とし、V2によって削除されるレコードがバージョンV2を有する場合、そのレコードの削除済み属性を偽から真に変更することができる。しかしV2によって削除されるレコードがバージョン1を有する場合、プロセッサはバージョンV2を有し削除済み属性を真に設定したレコードの新たなコピーを作成し及び/又は定めることができる。テーブルが競合制約を満たす必要がない場合、削除済み属性を偽に設定した状態でバージョンV1を有するレコードを残すことができる。しかしテーブルが競合制約を満たす必要がある場合、バージョンV3を有し削除済み属性を偽に設定したレコードの別のコピーを作成し及び/又は定めることができ、バージョンV1を有するレコードをテーブルから除去することができる。
【0079】
[0090] 一部の実装形態では、挿入(即ちデータベーステーブル内にレコードを挿入するための)操作が、挿入しようとするレコードの仮想主キーと一致するレコードをまず削除し、次いでそれにより挿入操作を引き起こす挿入命令が受信された仮想クローンの親であるバージョン番号を有する新たなレコードを挿入することによって行われる。例えば
図4Bの階層ツリーを所与とし、(例えば「ブラックベリー」の仮想主キー値を有する新たなレコードの挿入を命令する)挿入命令を含むSQLクエリがV2によって受信される場合、ブラックベリーの仮想主キーを有するV2によってアクセス可能な任意のレコード(即ちV2の祖先パス内の仮想クローン、即ちV2又はV1と一致するバージョン属性の値を有する任意のレコード)をまず見つけて削除し、次いで複合キー(Blackberry,V2)を有する新たなレコードを追加するようにクエリを修正することができる。この追加操作は競合制約への準拠を守ることに留意されたい。
【0080】
[0091] 一部の実装形態では、挿入操作(即ちデータベーステーブル内にレコードを挿入するための要求に応じたプロセス)が、その仮想主キーを使用してデータベーステーブルをまず読み取る(又はクエリする)ことによって行われる。挿入しようとするレコードと一致する結果が読み取り中に返される場合、レコードを挿入するための要求に応答してエラーメッセージを返すことができる。他方で、挿入しようとするレコードと一致する結果が返されない場合、要求を受信した仮想クローンの親であるバージョン番号を有するレコードをデータベーステーブル内に挿入する。例えば
図4Bの階層ツリーを所与とし、V2によるSQL挿入操作がブラックベリーの仮想主キーを有するレコードを挿入する場合、この挿入操作は、上記の読み取り操作を使用し、ブラックベリーの仮想主キー及びV2又はV1のバージョン属性の値を有する任意のレコードについて読み取りをまず行うように修正される。この読み取りに対する任意の結果をクエリが返す場合、それは共通の祖先パスに関連する重複レコードを追加する試みなので、プロセッサは挿入操作に応答してエラーメッセージを返す。読み取りに対する結果をクエリが返さない場合、プロセッサは複合キー(Blackberry,V2)を有するレコードを追加する。この挿入操作は競合制約への準拠を守ることに留意されたい。
【0081】
[0092] 一部の実装形態では、レコードXに対する修正操作が、上記のようにXの古いバージョンをまず削除し、上記のようにXの修正済みのバージョンを追加/挿入することによって実施され得る。削除も挿入も競合制約への準拠を守るので、修正操作も競合制約への準拠を守る。
【0082】
[0093] 一部の実装形態では、
図4Bの階層ツリー等のバージョンツリーは、データベースに追加される又は関連付けられる別個のテーブル内で記述することができる。高速コピーデータベースシステムは、例えばクエリを素早く変換することができるように、メモリ内のバージョンツリー情報であることをキャッシュすることもできる。
【0083】
[0094] バージョンツリーが、一番下に小さいツリーがある長い連鎖である場合、バージョン比較を単純化することができる。例えばバージョンを多数の許容可能なバージョンと比較する代わりに、例えば「バージョン<80」と規定することにより、全て80未満の多数のバージョン番号ではなく、そのリストの部分集合を比較に使用することができる。或いは、「バージョン=11又はバージョン=12又はバージョン=13又はバージョン=14」を明確に検索する代わりに、例えば「10<バージョン且つバージョン<15」の選択等の範囲を使用することができる。上記の内容は、例えば元のSQLクエリを表すストリングをパーズし、その結果生じるパーズツリーを修正し、再びストリングに変換してから実際のデータベースにそのストリングを伝えることによって行うことができる。
【0084】
[0095] 或いは他の例では、基礎を成すデータベースがビュー及びストアドプロシージャをサポートすることができる。その場合、データベースの高速コピーが作成されるとテーブルごとにビューを定めることができ、このことはテーブルのそのバージョンからの選択が上記で定めた通りに行われることを確実にする。ビューへの書き込みが上記のレコードコピーに変わるようにストアドプロシージャを作成することができる。
【0085】
[0096] 一部の実装形態では、(例えばJavaからアクセスされる)高速コピー可能リレーショナルデータベースのためのシステムが、(例えばJavaで書かれた)高速コピー可能データベースプラットフォームにSQLクエリを送信する(例えば同じくJavaで書かれた)ユーザプログラムを含み、高速コピー可能データベースプラットフォームはSQLクエリを変換してからそれを実際のデータベースに伝える。例えばリレーショナルデータベースが「people」と名付けられた以下のテーブルを有すると仮定されたい。
【0086】
【0087】
[0097] 仮想主キーはid_であり、名前、年齢、及び州の3つの他の属性がある。(例えばプロセッサによって高速コピー可能データベースプロセスを実行している)高速コピー可能データベースシステムは、1つの隠れ属性version_を追加し、他の属性及びテーブル名に下線を追加することによってこれを高速コピー可能テーブルに変換することができる。
【0088】
【0089】
[0098] この新たなテーブルは複合キー(id_,version_)を有し、id_は上記の仮想主キーと呼ぶことができる。そのため、今では2つのレコードがそのversion_が異なる限り同じid_を有することができる。上記の例は競合制約に準拠し、この例による操作はその準拠を守ることができる。他の何らかのテーブルがidの外部キーを有する場合、外部キーはidではなくid_と名付けられた属性と一致することを除き変更されないままである。元々、外部キーは仮想主キーpeople.idにリンクしており、これは外部キーがpeopleのテーブル内の最大で単一のレコードにリンクしていたことを意味する。しかし現在、外部キーがクエリ内で使用される場合、外部キーが幾つかのレコードのid_と一致する可能性があり、そのため外部キーは、クエリを行うために使用されているビューの祖先であるバージョンを有する、その1組のレコードの中の単一のレコードにリンクすると解釈される。競合制約に準拠する例では、競合制約の違反になるのでそのようなレコードは2つとあり得ない。そのため、外部キーのリンクは高速コピー可能データベースに適合することができる。
【0090】
[0099] 一部の実装形態では、ユーザによって作成されるテーブルの名前及び属性に対する制約を強制することができる。例えば名前及び/又は属性が最大で基礎を成すデータベースの典型的なテーブル/属性のサイズよりも1文字短い長さ(例えば80文字の代わりに79文字の最大サイズ、又は64文字の代わりに63文字の最大サイズ)を有すると規定する規則を実装することができる。或いは又は加えて、名前及び/又は属性が下線で終わってはならないと規定する規則を実装することができる。かかる規則はテーブル及び属性を再命名することを可能にする。かかる規則は、特定の実装形態にとって有用な場合は元のテーブル名がストアドプロシージャと共にビューとして使用されることも可能にする。
【0091】
[00100] 次に、例えばシステム(又はプロセッサ)がバージョン1に対して高速コピー操作を行って(以下に示すように)バージョン2及びバージョン3を作成すると仮定されたい。(プロセッサによって実行される)ユーザコードは、SQLクエリごとに読み取り及び書き込みの両方についてバージョン番号を提供することができ、そのバージョン番号がバージョンツリー内の葉のバージョンになる。この時点において、(プロセッサによって実行される)ユーザコードはバージョン1を直接読み取る又は書き込むことがもはやできず、それは読み取り及び書き込みがバージョンツリーの葉において行われるからである。システムが今度は次のようになり、操作は葉の仮想クローン(円)によって行われるものとして記載する。
【0092】
【0093】
[00101] 高速コピー操作はテーブルを全く変えなかった。高速コピー操作は、右側に示すバージョンツリーであって、ここでは不図示だが親と子の2つの属性を含む(例えば末尾に2本の下線を有する)versions__と実装形態によっては名付けられ得る専用テーブル内に記憶される、バージョンツリーを変えただけである。
【0094】
[00102] 一部の実装形態では、データベースの或る特定のバージョンに送信されるSQLクエリであるストリングをユーザプログラムが作成する。システムはそのストリングをパーズし、その結果生じるパーズツリーを修正し、それを再びストリングに変換し、その修正済みのストリングをSQLクエリとして実際のデータベースに送信する。そのためユーザの観点からは、実際には高速コピーを表す単一の統合データベースと読み書きしているとき、多くのデータベースコピーの1つと読み書きしているかのように見える。
【0095】
[00103] ユーザが(例えばプロセッサを使用して)Daveのための新たなレコードを仮想クローン3によって追加すると仮定されたい。これにより以下のデータベーステーブルがもたらされる:
【0096】
【0097】
[00104] 次に、バージョン2によるクエリはDaveのための新たに作成されたレコードを無視する(即ち検出しない)が、バージョン3によるクエリはDaveを認識する。ユーザが今度は(例えばプロセッサを使用して)バージョン3の高速コピーを行い、以下のデータベーステーブルをもたらすと仮定されたい。
【0098】
【0099】
[00105] Daveのレコードは「バージョン」の属性について3の値を含み、そのためそのレコードは仮想クローン4及び5によって行われるクエリによって返されるが、仮想クローン2へのクエリによっては返されない。次いでユーザが(例えばプロセッサを使用して)仮想クローン2によってBobをBobbieに変更すると仮定されたい。その結果生じるデータベーステーブルは下記の通りである。
【0100】
【0101】
[00106] この「変更」は、削除とその後に続く2つの追加によって実施されることに留意されたい。元のレコード(Bob,1)が削除され、3のバージョンと共にそのレコードのコピーが追加され、それは3が2から1へのパス上のノードの子だがそれ自体はそのパス上にないからである。次いで、変更された新たなレコードが2のバージョンと共に追加され、それはレコードが仮想クローン2によって修正されているからである。
【0102】
[00107] 現在id_=456を有する2つのレコードがある。古いレコードのコピーは今ではバージョン3であり、そのため操作前と同様に4及び5にとって依然として認識可能である。新たなレコードはバージョン2であり、変更がバージョン2によって行われたので仮想クローン2によってしか認識することができない。次にユーザが(例えばプロセッサを使用して)仮想クローン4によってCarolを削除すると仮定されたい。その結果生じるデータベーステーブルは下記の通りである。
【0103】
【0104】
[00108] この操作は元の(Carol,1)のレコードを削除し、次いでバージョン2及び5を有するレコードの2つのコピーを追加し、それは2及び5が4から1へのパス上のノードの子だがそれ自体はそのパス上にないからである。
【0105】
[00109] 要約すると、一部の例では仮想クローンVによって行われる操作が以下のように実行される:
・レコードの削除:バージョンNを有する元のレコードを削除するが、それ自体がパス上にない、仮想クローンVから仮想クローンNへのパス上にあるノードの子ごとに元のレコードのコピーを挿入する。
・レコードの追加:同じ祖先パスに関連する重複レコードを回避するために、追加しようとするレコードと共通の少なくとも1つの値(例えば仮想主キー)を含み、且つ同じ祖先パス内にある過去のレコードをまず削除し、次いでバージョンVを有するレコードを追加することができる。
・レコードの追加(任意選択的な改変形態):読み取りがその仮想主キーを有する如何なるレコードも返さないことをまず確実にし、かかるレコードを返す場合はエラーを返し、さもなければバージョンVを有するレコードを追加する。
・レコードの修正:古いレコードを削除し、次いでそのレコードの修正済みのバージョンを追加する。
・クエリ、結合等:結合等の外部キーを伴う操作ではそれを通常通り行うが、仮想クローンVによってアクセス可能であるように同じ祖先パス内にあるバージョン番号を有するレコードだけを2つのテーブルから結合する。
・テーブルの作成/削除:ユーザがテーブルの正当な名前(十分短く最後の文字が下線ではない)を選択することを確実にし、次いでテーブル名に下線を追加する。version__属性を追加する。
・属性の作成/削除:属性の名前が十分短く下線で終わらないことを確実にし、次いで下線を追加する。
【0106】
[00110] データベーステーブルのクエリはバージョン番号を含む。一部の例では、仮想クローンを高速コピーするための(例えばプロセッサによって実行される)メソッドがある。一部の例では、仮想クローンを削除するための(例えばプロセッサによって実行される)メソッドもある。一部の実装形態では、ユーザは仮想クローンが葉である場合にのみその仮想クローンを削除することができる。仮想クローンを削除することが子を一切有さない内部仮想クローンを残す場合、その仮想クローンも削除することができる。かかる例では、葉ではない仮想クローンが葉になることはない。自らの子が削除されるや否や消滅するだけである。次第にかかる操作は、ルートから深いレベルまで進み、その後幾つかの分岐及び幾つかのノードしかない小さなツリーがある、単一の子の仮想クローンの連鎖のようにツリーを見せる場合がある。これらの単一の子の仮想クローンは貢献なしに空き容量及び時間を無駄にし得る。
【0107】
[00111] 一部の例では、そのような単一の子のバージョンをなくすために、システムが(例えばプロセッサによって実行される)圧縮操作を定期的に(又は散発的に)実行することができる。例えば仮想クローン42が、仮想クローン99である単一の子しか有さない場合、42の各version__属性値を99に変更する(例えばプロセッサによって実行される)操作をテーブルに対して行うことができ、ツリー内の2つの仮想クローンを含むシーケンス更新を行うことができ、結果はバージョン99を有する単一の仮想クローンとして表される。
【0108】
[00112] データベースは幾つかの仮想クローンによってアクセスされ得るが、例えば一度に1つの仮想クローンのクエリしか処理しない及び/又は圧縮操作中はクエリを処理しないと規定する単一の規則で全データベースを保護することが許容可能である。圧縮操作を(例えばプロセッサによって)行う前でさえ、ツリー内の長い連鎖を反映するようにクエリを最適化することができる。例えばクエリがバージョンV=99に対して行われ、且つバージョンV=99の祖先がバージョン{1,10,12,20,23,32,42}である場合、それらの7個のバージョンの何れかを有するレコードに自らを制限するようにクエリが(例えばプロセッサによって)修正され得る。しかし、23未満の数字を有する他の頂点がツリー内にない場合、{<=23,32,42}を尋ねるようにクエリを(例えばプロセッサによって)単純化することができる。換言すれば、そのクエリはバージョン42、又はバージョン32、又は23以下の任意のバージョン番号を有するレコードを要求することになる。同様に、バージョンツリー内の適用可能な頂点が{1,10,12,20,23,32,42}だが、10から32の間の他の頂点がツリー内にない場合、クエリは{1,10...32,42}のためのものであり得る。換言すれば、そのクエリは1に等しい、42に等しい、又は10から32までの任意の数字に等しいバージョンと一致する。これらの最適化は、多くのバージョンが作成され削除されている場合に特に有用である。
【0109】
[00113] 完全なSQL言語は複雑であり、クエリしている仮想クローンによってアクセス可能なコマンド以上に、悪意あるユーザが情報にアクセスするために使用し得る多くの強力なコマンドがある。一部の実装形態では、完全なSQLのうちの小さい部分集合だけがユーザによって使用可能であるようにし、その部分集合外の内容がユーザによって受信される場合はノードに例外を投げさせることでこの脆弱性を減らすことができる。例えば一部の例では、その名前がストリング操作によって構築されたテーブル又は属性へのクエリを許可しないようにシステムを構成することができ、それはユーザがかかるクエリを使用してpeople_又はversion__又はversions__に直接アクセスし得るからである。システムは実行時にコンパイルされるtransact-sqlステートメント等の動的SQLを許可しないことができる。一部の例ではこれらの制約が一時的であり得る。クエリがテーブル内の属性の名前又は全てのテーブルの名前を要求する場合、version_属性及びversions__テーブルを除去し、他のテーブル名から末尾の下線を除去するようにクエリを修正することができる。
【0110】
[00114] 上記の説明はテーブル及び属性が仮想クローン1において作成され、その後修正されないと仮定する。しかし、ユーザは高速コピー(本明細書では「仮想クローン」とも呼ぶ)の作成後に、異なるバージョンが異なるスキームを有するようにデータベースシステムのスキームを変更したい場合がある。一部の例では、(どちらも2本の下線を有する)tables__及びattributes__と名付けられた2つの新たなテーブルが(例えばプロセッサによって)定められ得る(且つメモリ内に記憶され得る)。tables__テーブルは、バージョン内のテーブル名を記録することができる。attributes__テーブルは、各バージョン内の各テーブル内の属性名を記録することができる。
【0111】
[00115] 一部の例では、何れか2つの仮想クローンが同じ名前Xを有するテーブルを有する場合、どちらもX_と名付けられる同じ物理テーブル内に記憶することができる。そのX_テーブルは、Xテーブルの何れかの中で現れる属性を含むことができる。それらの2つのXテーブルが属性Yをそれぞれ含むが異なる種類のエントリを有する場合、X__テーブルは、attributes__テーブルによって対応するY属性にマップされる異なる名前を有する2つの異なる属性を含むことができる。
【0112】
[00116] 2つの異なる仮想クローンに関連するXと名付けられた2つの異なるテーブルが、自らの仮想主キーとして異なる属性(又は1組の属性)を有する場合、それらの2つのテーブルを別々に記憶することができ、tables__テーブルは別個のテーブルにどの名前が割り当てられたのかを記憶することができる。
【0113】
[00117] 一部の例では、システムが、単一の仮想クローンをシリアル化及び逆シリアル化するための、及び単一の仮想クローンのハッシュを得るための(例えばプロセッサによって実行される)メソッドを実施することができる。シリアル化は、その仮想クローンにとって可視であり及び/又は適用可能なテーブル及びデータを、その仮想クローンに関するスキーム及びデータを符号化するバイトのストリームへと変換することができる。逆シリアル化は、そのストリームを完全なデータベースへと戻すことができる。一部の実装形態では、シリアル化及び逆シリアル化の両方をユーザコードによってではなく(例えばプロセッサによって実行される)信頼できるコードによって行うことができる。一部の例では、逆シリアル化は仮想クローン1が作成された瞬間にしか行うことができない。通常、仮想クローン1はユーザコードにとって可視のテーブルを有さない空のデータベースである。仮想クローンを逆シリアル化することは、シリアル化の前に可視であったテーブル及びデータを再生成する。
【0114】
[00118] 一部の例では、データベースのハッシュは、何らかの正規順序で作成されていると仮定し、そのシリアル化ストリームのSHA2-384ハッシュであり得る。同様に述べると、データベースがSQLクエリの特定のシーケンスによって作成される場合、どのコンピュータがそのクエリを実行しようともそのデータベースは同じハッシュを与える。そのため、例えばシステムはテーブルをその作成順にシリアル化し、テーブル内の属性をその作成順にシリアル化することができる。或いは、システムはテーブルをアルファベット順にシリアル化し、テーブル内のフィールドをアルファベット順にシリアル化することができる。他の実装形態では、各テーブル及び各レコードのハッシュをキャッシュに入れることによってこれを最適化することができる。
【0115】
高速コピー対スナップショット
[00119] 一部の実装形態では、データベース又はデータ構造を3つの異なるやり方で、つまり通常コピーを定め及び/又は作成することによって、又は「高速コピー」(仮想クローン)を定め及び/又は作成することによって、又は「スナップショット」を定め及び/又は作成することによってコピーすることができる。スナップショットは、変更不能であることによって通常コピー及び高速コピーと異なる。通常コピー及び高速コピーはどちらも変更可能だが、記憶される情報量の点で異なる。
【0116】
[00120]
図9では、最初に((a)の一番左のツリー)データ1が「ビュー」Xによってアクセス可能である。ビューXによってこのデータを読み取ることも書き込むこともできる。後に((b)において)スナップショットYがXから作成され、かかる作成はデータのコピー2を作成し、その後1が変更不能(灰色)になる。その後、Xによって2内のデータを修正し又は読み取ることができ、Yは1内のデータを読み取ることはできるがそのデータを修正することはできない。次に(c)において、スナップショットZがXから作成され、かかる作成は変更可能コピー3を作成し、2が変更不能になる。これらのスナップショットは、2を1の完全なコピーにすることによって実装することができる。或いは、スナップショットは、スナップショットの作成後に生じる変更だけを2に含ませることによって実装することができる。何れにせよ、ビューY及びZはデータの書き込みではなくデータの読み取りだけを可能にする。
【0117】
[00121] スナップショットの挙動は通常コピーの挙動と異なる。通常コピーの挙動は
図9に関して説明することができる。最初に
図9の(a)において、データ1がビューXによって読み取り又は修正可能である。後の(b)で、ビューYを作成し、1内のデータの2つのコピー2及び3も作成する通常コピーが行われる。この時点において1を削除することができる。その後、2はXによって2にアクセスすることによって読み取り又は修正することができ、3はYによって3にアクセスすることによって読み取り又は修正することができる。
【0118】
[00122] この通常コピーの挙動は、
図9に関して説明することができる以下のように高速コピーの挙動と異なる。最初の(a)において、データ1がビューXによって読み取り又は修正可能である。後の(b)で、ビュー(「高速コピー」とも呼ぶ)Yを作成する高速コピー操作が実行される。この高速コピー操作は、そのそれぞれが最初は空である2及び3を作成する。1内のデータは削除されないが変更不能になる。X又はYによって読み取りが直ちに行われる場合、X又はYは通過して1から読み取る。Xによって書き込みが行われる場合、2内に変更が記録され、1は変わらない。Yによって書き込みが行われる場合、3内に変更が記録され、1は変わらない。X上で読み取りが行われ、要求された情報が2内に記録されている変更の一部である場合、2からのその情報が返される。しかし、2がそのデータ片に対する如何なる変更も含まない場合、読み取りは1に通過する。同様に、Yによる読み取りはまず3を確認し、3内で応答が見つからない場合にのみ1へと続く。高速コピーの瞬間におけるデータは1として示し、変更不能なので灰色である。更にその後の(c)では、ビューXを高速コピーしてZが得られ、この高速コピーは新たな4及び5をもたらし2を変更不能にする。最後にビューYが削除される場合、その結果は
図9の(d)に示す通りである。
図9の(d)には3がない。3に到達可能なビューがもはや一切ないので削除されている。
図9では、X、Y、及びZのそれぞれを「ビュー」と呼び、「高速コピー」とも呼ぶ。
【0119】
[00123] 一部の実装形態では、
図9の(d)に示すデータ構造に対してガベージコレクションの一種を最終的に行うことができる。1内のデータを取り、2内の変更を適用することによって1と2とをマージすることができる。次いで、そのマージデータで2を置換し、1を完全に削除することができる。このガベージコレクションは、X及びZからの将来の読み取りの速度を高めることができる。Xからの読み取りは4、2、及び1を確認しなければならないのではなく、4及び最悪でも2を確認するだけでよいので、かかる読み取りはより高速であり得る。同様に、Zからの読み取りは5、2、及び1ではなく、5及び最悪でも2を確認するだけでよいのでより高速である。
【0120】
高速コピー可能マップ
[00124] 1組のキー値ペアをハッシュテーブル等の幾つかのやり方で実装することができる。かかるシステム(又はプロセッサ)は、キーに関連する値をO(1)時間で追加し、削除し、又は修正することができる。かかるシステム(又はプロセッサ)は、キー値ペアを1ペア当たりO(1)時間で未定義の順序で反復処理することもできる。各ペア内の値として空のストリングを有すること等により、かかるデータ構造は親子集合を実装することもできる。そのことは要素に関する親子関係を調べるためにO(1)時間与えるが、AND演算及び合併集合演算等の操作はそれよりも遅くなる。
【0121】
[00125] 高速コピー可能マップは幾つかのやり方で実装することができる。(一例として
図9を使用する)1つのやり方は、円(又は仮想クローン)ごとにオブジェクトを作成することであって、各オブジェクトは例えばJava HashMapを含む、作成すること、及びビューを表す正方形ごとにオブジェクトを作成することである。最初に、Xによる読み書きは1内の基礎を成すマップまで直接通過する。
【0122】
[00126] Yの高速コピーを作成した後、空のマップ2及び3を作成し、1を変更不能として印付けする。キー値ペアがXに書き込まれると、かかる書き込みは2への書き込みをもたらす。Xへの読み取りは、最初は2への読み取りをもたらす。キーが2内で見つからない場合、1への読み取りを行う。同様に、Zを高速コピーした後、Zへの読み取りは5への読み取りをもたらす。それが失敗した場合は2を読み取る。それが失敗した場合は1を読み取る。そのため、所与の正方形への書き込みは隣接する円の変更を引き起こし、キーが見つかるまで又はルートがクエリされるまで読み取りがツリーを上がって行く。
図9(b)では、Xへの書き込み操作が所与のキー値ペアを削除する場合、プロセッサはキー値ペアが存在しないことを表す特殊値である「値」と共にそのキーを1から2内にコピーすることができる。従って、そのキー値ペアを求める将来のXへの読み取りは、1へと続いてそのキーに関する元の値を返すのではなく、2で止まってそのキーに関する値がないと報告する。
【0123】
[00127] Z内のペアに対する反復は、1内のペア、次いで2内のペア、次いで5内のペアを反復することによって行うことができる。例えば1内のキー値ペアは、自らのキーが2内にも5内にもないことをクエリが示す場合にのみ使用される。同様に、例えば2内のキー値ペアは、自らのキーが5内にないことをクエリが示す場合にのみ使用される。例えば5内のキー値ペアは他の任意のマップを調べることなしに使用され、それは5が円のツリーの葉だからである。
【0124】
[00128] 基礎を成すマップが任意の順序で反復する場合、この手法も任意の順序で反復を行う。基礎を成すマップが、キー値ペアが最後に修正された順序でキー値ペアを反復する場合、この手法は同じことを行う。どちらの場合にも、要素ごとの時間は決まった深度のツリーではO(1)であり、又はツリーがdレベル深い場合はO(log d)である。
【0125】
[00129] アルファベット順にキーをソートすることによって等、基礎を成すマップが他の何らかの順序で反復する場合、この手法は自動で同じことは行わない。代わりにシステムは、キーをまずバッファにコピーし、次いでそれらをソートし、そのバッファを反復処理することができる。これは高価な操作であり、n個のアイテムに関して要素ごとの償却時間をO(1)からO(log n)に増やす。一部の応用では、かかる増加が依然として許容可能であり得る。
【0126】
[00130] 更なる最適化が実行時に可能である。例えば
図9(c)では、2と1とをマージする新たなマップで2内のマップを置換することができる。すると新たな2が自らのツリーのルートになり、1がその子を失う。1が子を一切有さない場合、1を削除することができる。同様に
図9(c)で、5は1、2、及び5のマージで置換し、自らのルートになることができる。1及び2等の2つの変更不能なテーブルをマージするには幾らかの時間がかかり得るが、それはバックグラウンドスレッド内で行うことができる。加えて、それが完了すると、マージ済みのマップを古いマップと交換することができ、その結果生じるツリーはより浅くなり、読み取り及び反復の速度を高める。
【0127】
[00131] 加えてビューが削除される場合、円の一部はアクセス不能になり、メモリから削除することができ、それらをマージすることに関する如何なる作業も中止することができる。このことはシステムが
図9(d)を反映することを可能にする。これは基礎を成す言語におけるガベージコレクションプロセスによって引き起こされ得る。或いは、システムはビューを明確に削除するための方法を実施し、その時点で円が削除されるときで、ある円に親がないときを明らかにするために参照カウントを保つことができる。
【0128】
[00132] キー値ペアの削除は、キー値ペアを実際に削除することによってルートマップ内で実施することができる。ルート以外のマップでは、かかる削除は値を専用の「削除済み」オブジェクトに変更することによって行われ得る。マップをマージすることが新たなマップをルートにする場合、そのキー値ペアの反復処理を行って「削除済み」オブジェクトを有するキー値ペアを除去することができる。
【0129】
[00133] 別の手法は、ハッシュテーブルのツリーを有する代わりにトライ等の単一データ構造を使用することである。トライでは、各キーが例えば16ビット、32ビット、又は64ビット等の既定のサイズの固定長ハッシュであり得る。マップは、そのn番目のレベルがキーのn番目のビットを表す二分木によって表され、キーは16(又は32又は64)レベルを降りて行くことによって探索される。次いで一番下のレベルの葉において値が記憶される。キーハッシュ衝突を処理するために葉はキー値ペアのリストを記憶するが、とりわけ過度な衝突を引き起こすためにキーを選択しようと試み得る攻撃者にハッシュ関数が知られていない場合、そのリストは平均して非常に短いことが期待される。二分木ではなくn分木を使用することにより、速度及びメモリ要件の両方を改善することもできる。例えば32=25なので、32分木は5分の1のレベルしか有さない。
【0130】
[00134] 上記の内容は標準的なトライについて説明した。標準的なトライを高速コピー可能トライに変換するために、どのデータバージョンが適用されるのかに関する情報を用いてツリー内の各エッジをラベル付けすることができる。そのため
図9(a)では、所与のキー値ペアを追加することができ、そのエッジを1で印付けすることができる。次いでY及びZを高速コピーした後、キー値ペアをZに追加することができる。かかる追加は、それぞれ5で印付けすることができる更に多くのエッジをツリーに追加することを含み得る。ビューZからキーが読み取られる場合、システムはルートから開始し、1、2、又は5で印付けされているエッジだけだがキーのビットと一致するエッジをたどることができる。当然ながら、これは
図9(c)のグラフがメモリ内に明確に記憶されること、又は
図9(c)のグラフのルートまでの自らのパスが1、2、及び5で印付けされている円を通過することを少なくともZが(例えばZとの関連付けを記憶することによって)識別できることを意味する。
【0131】
[00135] より多くの高速コピーが作成されるにつれ、エッジに対する条件付きの確認がより複雑になり得る。例えばクエリは、{1,2,5,17,32,65,82,97,99}の数字のうちの1つで印付けされているエッジだけをたどってトライを徐々に降りて行くことができる。しかし一部の応用では、
図9のグラフがルートから底付近まで細長い連鎖へと長期的に発展し、底付近で多くの分岐を広げることが予期される場合がある。円内の数字が(図の場合と同様に)番号順に割り当てられる場合、エッジが長いリスト{1,2,5,17,32,65,82,97,99}内の任意の数字で印付けされているかどうかを確認するのではなく、数字が{<80,82,97,99}のリスト内にあることを確認できる可能性があり、この「<80」のエントリは80未満の任意の数と一致する。換言すれば、たとえ
図9のツリーが経時的に高く伸びても、そのツリーが一番下に小さいツリーを有する連鎖である限り、ブール条件の複雑さが経時的に増大する必要はない。上記で説明したように、キー値ペアを削除するには専用の「削除済み」オブジェクトを使用することができる。又はかかる削除は、特定のバージョンにおいて削除されているものとしてエッジを印付けすることによって行うことができる。次いでバージョンは、そのバージョンについて削除されたものとしてトライ内の一部のエッジを印付けするキーを削除することができる。その場合
図9(c)では、或るエッジについて言及される{1,2,5}の最大数が、エッジが削除されたのではなく追加されたことを示す場合、そのエッジはビューZのトライ内にあると見なされる。
【0132】
高速コピー可能アレイ
[00136] 高速コピー可能マップが作成されると、他のデータ構造の高速コピー可能バージョンが作成され得る。例えば高速コピー可能アレイは、実アレイを前の節で説明した高速コピー可能マップ等の高速コピー可能マップと組み合わせることによって構築することができる。最初に、仮想クローン又はビューが1つしかない場合、読み取り及び書き込みがアレイに直接行く。高速コピー後、書き込みはマップに行き、各キー値ペアはキーとしてアレイインデックスを使用し、値としてアレイ要素を使用する。読み取りはマップを最初に確認し、インデックスが見つからない場合はアレイから読み取る。複数の高速コピー操作がマップのツリーをもたらし得る。或る仮想クローン又はビューからの読み取りは、そのキーを有するマップを見つけるまで又は実アレイであるツリーのルートに到達するまでツリーを上がって行く。
【0133】
[00137] 前と同様に、バージョンツリーを時々圧縮することができる。例えば
図9(c)では、1、2、及び5を反映する新たなアレイを作成することができる。新たなアレイが作成されると、空のマップに関連するその新たなアレイにビューZが接続し得る。かかる圧縮の後、ツリーを再び成長させる更なる高速コピーがあるまで読み取り及び書き込みが両方ともより高速になる。このプロセスは繰り返す/反復することができる。同じ手法がアレイだけでなくほぼ全ての集合に適用される。高速コピー可能マップを含むオブジェクト内に任意の集合が包まれ、読み取り及び書き込みは集合を確認する前にマップを確認する。読み取り及び書き込みは、複数の高速コピー操作がバージョンツリーを成長させると遅くなり、ツリーが圧縮されると速くなる。
【0134】
高速コピー可能ファイルシステム
[00138] 高速コピー可能ファイルシステムでは、仮想クローン又はビューオブジェクトが全ファイルシステムを表すことができる。仮想クローン又はビューオブジェクトは、ユーザにとってはファイルを含むディレクトリのツリーを含む別個のハードドライブのように見える。高速コピー操作は、ユーザにとってはオリジナルの正確なコピーを有する新たなハードドライブを作成することのように見える。そのため、両方のドライブを独立に修正することができ、何れへの変更も他方に影響を及ぼさない。これは、全てのバージョンからのファイルを含む1つの実ディレクトリを有することによって実施され得る。本明細書に記載の高速コピー可能データベースは、各バージョンのディレクトリツリー及び各ディレクトリ内のファイルへのポインタを記憶する。2つのバージョンがどちらも同一ファイルを含む場合、システムは現実のハードドライブ上で1つの実コピーしか必要でなく、データベースは実コピーへの2つのポインタを記憶することができる。ファイルを認識可能な最後のビューからファイルを削除することによってファイルへの最後のポインタが削除されると、システムは物理ハードドライブ上の物理ファイルを削除する。この手法はコピーをO(1)操作にする。この手法は、重複ファイルの単一コピーだけを記憶することによってハードドライブの空き容量も節約する。
【0135】
[00139] システムは、例えば2KBチャンク等の小さなチャンクへとファイルを区分化することによって更に最適化することができる。次いでデータベースは、ファイルを構成するチャンクを指すポインタのリストをファイルごとに記憶する。このようにして、2つのファイルが最初の2KBについて同じコンテンツを有する場合、そのチャンクの一方のコピーだけを物理的に記憶し、それにより空き容量を更に節約する。このようにして、2つの仮想クローン又はビューが同じファイルにアクセスできる場合だけでなく、単一の仮想クローン又はビューが2つの異なるディレクトリ内で同一のファイルを有するディレクトリツリーを表す場合にも重複が減らされる。
【0136】
[00140] ファイル又は全ディレクトリサブツリーのハッシュを素早く計算する必要がある場合、その情報をデータベース内に記憶することもできる。各チャンクのハッシュを記憶し、チャンクの修正時に修正することができる。実際に一部の例では、16進数のファイルのハッシュであるように、基礎を成すファイルシステム内のチャンクのファイル名を定めることができる。所与のチャンクXに対して1つのポインタしか存在しない場合、チャンクを修正することはファイル名を変更することを含み得る。所与のチャンクYに対して複数のポインタがある場合、チャンクのコピーを作成し、コピーを修正し、コピーをそのハッシュで再命名することによってチャンクYの修正を実施することができる。
【0137】
[00141] かかる例では、ファイルのチャンクの連結のハッシュ等、ファイルのハッシュがインクリメンタルハッシュであり得る。或いはファイルのハッシュは、ファイル内のチャンクに関する(位置,データ)ペアのハッシュの和として定めることができる。ディレクトリのハッシュは、ディレクトリ内のファイルのハッシュの和とすることができる。ファイルが変更されると、データベースは影響を受けたハッシュを例えばバックグラウンドスレッド内で更新することができる。或いは、メソッドへの呼び出しがハッシュを要求するまでハッシュを計算しなくてもよい。かかる例では、ハッシュを要求に応じて計算することができる。このアーキテクチャは、従来のファイルシステムには通常存在しない追加機能の実装を促進する。ファイルシステムの「トランザクション」は、データベースの意味において実施することができる。システムが(例えばプロセッサによって)ファイルシステムメソッドを呼び出してファイルシステムを操作する場合、システムはトランザクションを開始するための(例えばプロセッサによって実行される)メソッドを呼び出し、次いでファイルを追加し、除去し、又は修正するために複数の呼び出しを行い、次いでトランザクションをコミットするために(例えばプロセッサによって実行される)メソッドを呼び出すことができる。かかる一部の実装形態では、システムの電源が任意の時点において切られても、ファイルシステムはそれらの操作の全てを反映する又はどれも反映しないことになる。システムを遅くするやり方で従来のデータベースを呼び出すことを伴うので、この能力は従来のファイルシステムには概して追加されていない。しかし本明細書に記載の高速コピー可能ファイルシステムはその計算コストを他の理由で既に払っており、そのためトランザクションを追加することは実際には僅かな追加/増分コストしかない。
【0138】
[00142] 一部の実装形態では、ファイルシステムレベルでの「トランザクション」をデータベースレベルでの「トランザクション」として実施することができる。操作の途中でクラッシュがある場合、(例えばプロセッサによって実行される)データベース回復方法が、データベーストランザクションの始まりまでデータベースをロールバックすることを含み得る。次いでデータベース回復方法は、何れかがデータベースによってもはや参照されていないかどうかを確認するために記憶済みのチャンクのパススルーを行い、識別したそのような任意のチャンクを削除することができる。このことは正しい状態の素早い回復と、その後に続く無駄な空間を回復するための(例えばバックグラウンドスレッド内の)長いプロセスを促進する。この手法では、データベースにコミットが送信され、データベースが更新される後までチャンクファイルが削除されない。
【0139】
[00143] 以下の内容は、(例えばJavaからアクセスされる)高速コピー可能ファイルシステム用のシステムの詳細な解説を含む。(例えばJavaで書かれプロセッサによって実行される)ユーザプログラムが、共通のファイルシステム操作と幾つかの非共通操作とをサポートする(例えば同じくJavaで書かれプロセッサによって実行される)高速コピー可能ファイルシステムプラットフォームのメソッドを呼び出す。
【0140】
[00144] 高速コピー可能ファイルシステムは、(プロセッサによって実行される)ユーザコード及び/又はプロセスが、ボリューム、ディレクトリ、及びファイルのように見えるものにアクセスすることを可能にし得る。知られているファイルシステムと異なり、本明細書に記載の高速コピー可能ファイルシステムは以下を促進することができる:
-ファイル、ディレクトリツリー、又はボリュームの高速コピー
-ファイル、ディレクトリツリー、又はボリュームのハッシュの高速計算
-ファイル、ディレクトリツリー、又はボリュームのシリアル化及び逆シリアル化
-(差分コピーに関する)それらのものの部分集合のシリアル化及び逆シリアル化
-書き込み速度よりも読み取り速度を重要視すること
-冗長なディレクトリ、ファイル、及びファイルの一部の自動重複排除
-そのハッシュだけを所与としてファイル又はディレクトリを見つける能力(即ちハッシュはポインタである)
-ファイルシステムのためのメタデータのデータベースに対する読み取り専用SQLクエリ
【0141】
[00145] 一部の実装形態ではファイルシステムが以下を実装する:
ボリューム-自らのルートディレクトリを有する/としての仮想ハードドライブ
ディレクトリ-幾らかのメタデータと、0以上(<263)のファイル及びディレクトリのソートされたリスト
ファイル-幾らかのメタデータと、0以上(<263)のバイトのシーケンス
ACL(アクセス制御リスト)-識別情報のグループを含むファイル又はディレクトリ
識別情報-ファイルシステムにアクセスし得る者を表す(ACL内に記憶される)公開鍵
エンティティ-ファイル又はディレクトリ(ACLでもACLでなくてもよい)
チャンク-0からCHUNK_SIZEバイトまでのシーケンス(Javaファイルとして物理的に記憶される)
チャンクツリー-1つのエンティティを表すためにツリー状に構成される1組の1つ以上のチャンク
CHUNK_SIZE=4096(又は異なる定数)
メタデータ-その名前、(複数のやり方で計算される)サイズ、アクセス許可、ユーザ定義メタデータ等を含む、1つのエンティティに関する情報
許可-エンティティは全員のためのREAD許可を有するか、又はREAD許可を有する者の指定のACLグループを有する。WRITEについても同様である。
【0142】
[00146] 一部の実装形態ではファイルシステムが以下を実装しない:
リンク-このファイルシステムはリンク、ハードリンク、ソフトリンク、シンボリックリンク、エイリアス等を有さない。しかし高速クローニングは同様のものを可能にし、ディレクトリ内のライブラリにリンクを張るのではなく、単純に自分のディレクトリに全ライブラリをコピーすることができ、そうすることはリンクを使用した場合と同じ位少ない記憶域を使用する。
ディレクトリ .and..-データ構造は.or..ディレクトリの存在を反映しない。しかし、「/here/../there」等、インタフェースはそれらを含むユーザからのパスストリングを正しく解釈することができる。
圧縮/暗号化されたディレクトリ-Windows又はOSXのように圧縮され又は暗号化されたディレクトリの等価物はない。しかし、より弱い形の圧縮(チャンクの重複排除)が広く実施される。更に、ディレクトリツリーが自らのファイル及びサブディレクトリのそれぞれについてreadAclフラグを真に設定されている場合、データ、ファイル名、及びディレクトリ名が暗号化されるが、ディレクトリツリーのトポロジ及びファイルサイズは依然として可視である。
Rsync及びTime Machine-一部の例では、ファイルシステムに対して差分コピー及び/又は差分バックアップを実施することができる。
Unix型の許可-高速コピー可能ファイルシステムの性質により、ファイル又はディレクトリに関する固有の概念、所有者、グループ、又はユーザがない。読み取り操作、書き込み操作、及び実行操作のうち、最初の2つだけが有意味である。従って高速コピー可能ファイルシステムは、各ファイル又はフォルダにREAD用の任意選択的なアクセス制御リスト(ACL)及びWRITE用の別のACLを与えることができる。ユーザのアプリケーションがそれ以上のものを要求する場合、ユーザはそれをユーザメタデータの一部として追加することができる。更に、本明細書でのREAD及びWRITEの厳密な定義はUnix及び他のシステムの定義と僅かに異なる。
【0143】
[00147] ユーザにとってファイルシステムは次のように機能するように見える:ボリュームは、ルートディレクトリを有する/としての外部のハードドライブのようなものである。ボリュームはディレクトリツリーを含む。各ディレクトリは1組のディレクトリ及びファイルを含む。2つのディレクトリ及び/又は何らかの等価物は含まない(但し一部の例ではユーザインタフェースがその存在をシミュレートし得る)。一部の例では、ユーザはハードリンク、ソフトリンク、シンボリックリンク、エイリアス等を作成すること又は認めることができない。可視ディレクトリツリーは(ユーザにとって)DAG又は循環グラフではなくツリーのように見える。ユーザは高速コピー可能ファイルシステムを通常のファイルシステムだが、書き込みが通常よりも遅く、以下の操作が通常よりも速いファイルシステムとして認める:
-ファイル、ディレクトリ、又はボリュームを高速コピーすること
-ファイル又は全ディレクトリツリーのハッシュを得ること
-ファイル、ディレクトリ、又は全ディレクトリツリーのバイト単位のサイズを得ること
-ファイル又はディレクトリツリーをストリーム(例えばJavaストリーム)にシリアル化/逆シリアル化すること
-1組のチャンクをストリーム(例えばJavaストリーム)にシリアル化/逆シリアル化すること
-差分コピーを定めるのを簡単にする情報を得ること(rsync等)
-所与のボリューム内のファイルに関するメタデータのデータベースに対する読み取り専用SQLクエリ
【0144】
[00148] システムは(例えばプロセッサを使用して)ファイル及びディレクトリの高速クローニングを行い、ファイル又はディレクトリのハッシュを素早く取得し、ファイル及びディレクトリツリーをシリアル化/逆シリアル化することができる。一部の例では、高速コピー可能ファイルシステムプラットフォームに分散ハッシュテーブル(DHT)が追加され、ユーザはファイル又はディレクトリツリーをそのハッシュを所与としてインターネットから見つけダウンロードすることができる。かかる例では、ダウンロードはユーザがまだ有していないデータだけを転送する効率的なものであり得る。
【0145】
[00149] ユーザは、ボリュームのコンテンツをディレクトリの(DAG、循環グラフ、又は無限ツリーとしてではなく)有限ツリーとして認める。それらのディレクトリのそれぞれがファイル及び他のディレクトリを含み得る。ファイル及びディレクトリの一部はACLであるものとして印付けすることができ、通常は隠されているが、要求時にユーザによって見られ得る。
【0146】
[00150] 一部の例では、アクセス許可モデルがREAD及びWRITEを含むがEXECUTEは含まず、IDの階層的なACLグループに基づいて構築される。ユーザは、ファイル又はフォルダのreadAllが真の場合又はそのreadAllが偽でありreadAclがそのユーザを含む場合、そのファイル又はフォルダのREAD許可を有する。WRITE許可も(writeAll及びwriteAclを用いて)同様に定められる。
【0147】
[00151] 以下の表では、行の始めに挙げた許可をユーザが有する場合、そのユーザはその列に関して挙げた内容に対して色付けされた操作を行うことを許可されている(赤色=権利なし、黄色=読み取りの権利だけ、緑色=読み取り及び修正の権利)。最初の4列はメタデータ用である。
【0148】
【0149】
読み取り=ユーザはデータを読み取ることができる。
読み取りの欠如=ユーザはデータの暗号化バージョンだけを読み取ることができ、又はファイル若しくはディレクトリを別の位置にコピーすることができ、又はデータをシリアル化/逆シリアル化することができる。
修正=ユーザはデータの任意の部分を変更することができる。ディレクトリでは、ディレクトリ自体の名前を変更すること及びそのディレクトリ内でファイル/ディレクトリを追加/削除することを含むが、そのディレクトリ内のそれらのもののファイル名を読み取ること又は修正することは必ずしも許可しない。
【0150】
一部の例では、ユーザはファイル又はディレクトリツリーをその許可に関係なくコピーし、シリアル化し、又は逆シリアル化することができる。ユーザがそれを行う時点において、ユーザはファイル又はディレクトリツリー内の全てのものについて書き込み許可を任意選択的に設定する(即ちそのそれぞれについてwriteAll及びwriteAclを設定する)ことができる。
【0151】
[00152] 「エンティティ」は、ファイル又はディレクトリであり得る。各エンティティは独自のメタデータ及びコンテンツを有する。ファイルの「コンテンツ」は、そのファイル内のバイトシーケンスだと定められる。ディレクトリのコンテンツは、そのディレクトリ内のファイル及びディレクトリのハッシュのソートされたシーケンスだと定められる。一部の例では、以下で定めるように各エンティティがチャンクで作られるチャンクツリー内に物理的に記憶される。
【0152】
[00153] 「チャンク」は、(例えばJavaによって提供される)基礎を成すファイルシステム内に単一のファイルとして物理的に記憶されるバイトのシーケンスである。高速コピー可能ファイルシステム内のディレクトリ及びファイル及びACLは仮想的とすることができる。かかる実装形態では、チャンクだけがユーザのハードドライブ上に物理的に存在する。ユーザはそれらのチャンクを見ないが、基礎を成す物理ファイルシステムがチャンクを操作し及び/又は使用する。
【0153】
[00154] チャンクは、(例えばJavaによって提供される)ハードドライブの物理ファイルシステム内でファイル名を有する。一部の例ではそのファイル名は、小文字の16進数でのそのコンテンツの256ビットハッシュであり得る。従ってディスクメモリにチャンクが書き込まれると、チャンクは修正されないが削除され得る。一部の例では、チャンクはメモリ内の(例えばJavaによって提供される)物理ファイルシステム内の単一のディレクトリ内に記憶され得る。他の例では、サブディレクトリを含むディレクトリであって、チャンクがそのファイル名の最初の数文字に従って分けられる、ディレクトリを使用してメモリ内にチャンクを記憶することができる。
【0154】
[00155] 一部の例では、チャンクがCHUNK_SIZEバイトよりも大きくない。この全体的制約は、例えば4*1024であるように定めることができる。他の例では、CHUNK_SIZEは、OSXスパースバンドルによって使用される4*1024から8*1024*1024の間である。
【0155】
[00156] 単一のエンティティ(ファイル又はディレクトリ)を記憶するために使用される「チャンクツリー」を形成するために、1つ又は複数のチャンクを組み合わせることができる。最初のチャンクは、ツリーの深度を与える「深度」バイトで始まる。そのため0x01はツリーがルート及び葉の両方である単一のチャンクに過ぎないことを意味し、0x02はルートの子が全て葉であること等を意味する。深度バイトの後、以下のメタデータの節で定めるエンティティのための「固定」メタデータ要素が続く。
【0156】
[00157] 十分小さいエンティティでは、この後に残りのメタデータが続き、その後にファイル又はディレクトリのコンテンツが続く(ディレクトリの「コンテンツ」はディレクトリ内の各ファイル及びサブディレクトリの32バイトハッシュのソートされたリストである)。一例として、記憶されるデータが最大でCHUNK_SIZEバイトである場合、そのデータは単一のチャンク内に入り、そのチャンクは1(0x01)の深度を有し、そのエンティティに関する全チャンクツリーを含む。
【0157】
[00158] エンティティが1つのチャンクに入るには大き過ぎる場合、固定メタデータの後に子のチャンクのハッシュのシーケンスが続く。ツリー内の内部チャンクに関して、子のチャンクのそれぞれは自らの子のチャンクのハッシュのシーケンスを含み、その後も同様に続く。
【0158】
[00159] 幅優先順にアクセスされる場合、葉チャンクは残りのメタデータ、次いでファイル又はディレクトリのコンテンツを含む。一部の例では、コンテンツの始まりがメタデータの終わりと別個の葉チャンク内にある。
【0159】
[00160] 一部の例では、ツリートポロジが以下のように一意に定められる。ツリーが単一のチャンク内に入ることができる場合、そのツリーは単一のチャンク内に入れられる。さもなければシステムは、ノードが幅優先順にアクセスされる場合、単一の葉ノードがメタデータ及びコンテンツの両方からのバイトを含むことができない制約を受けて先のノードが可能な限り大きいようにツリーを定めることができる。
【0160】
[00161] 一部の例では、各エンティティ(ファイル又はディレクトリ)が以下のメタデータを以下の順序でここでは便宜上3つのカテゴリ(固定、可変、センシティブ)に分けて含み得る。
【0161】
固定:
1.filesystem-2バイト-最後に修正されたときのファイルシステムのバージョン
2.entity type-1バイト
0x00=ENTITY_FILE=ファイル
0x01=ENTITY_DIR=ディレクトリ
0x80=ACL_FILE=ACLグループを表すファイル
0x81=ACL_DIR=ACLグループを表すディレクトリ
3.size-8バイト-チャンクのデデュープが一切ない場合のこのファイル又は単一のディレクトリ内のバイト数
4.sizeSMetadata-8バイト-センシティブメタデータのバイト数
5.sizeVMetadata-8バイト-可変メタデータのバイト数
6.sizeTree-8バイト-ディレクトリについてのみ存在する。デデュープが一切ない場合のこのディレクトリツリー内のファイル及びディレクトリの合計サイズ
7.readALL-1バイト-このファイル又はディレクトリに対するREAD許可を全員が有する場合は真(0x01)である。さもなければ、かかる許可をACLに限定するために偽(0x00)である。
8.writeALL-1バイト-このファイル又はディレクトリに対するWRITE許可を全員が有する場合は真(0x01)である。さもなければ、かかる許可をACLに限定するために偽(0x00)である。
【0162】
センシティブ:
9.name-ファイル名又はディレクトリ名は、String.length()<=255を有する非空のストリング(例えばJavaストリング)である。同様に述べると、最大で255のUTF-16コード単位。一部の例では、スラッシュ及びコロンを含む全てのユニコード文字が許可される。一部の例ではパス長の制限がない。
10.userMetadata-キー値ペアのリストであり、キー及び値がどちらもストリングであり(例えば任意の正当なJava Stringでもよく)、同じキーについて複数のペアが存在し得る。ユーザがペアを追加するためにメソッドを呼び出さない限りこれは空である。
【0163】
可変:
11.readAcl-32バイト-readAllが偽の場合に存在する-READ許可を有するIDのACLグループを表すACLファイル又はACLディレクトリツリーのハッシュ。システムはディレクトリのreadAclが、ディレクトリ内に記憶されているACLファイル又はACLディレクトリのハッシュであることを確実にすることができる。ファイルのreadAclは、ファイルと同じディレクトリ内に記憶されているACLファイル又はACLディレクトリのハッシュであり得る。
12.writeAclHash-32バイト-writeAllが偽の場合に存在する-readAclと同様だが、ことによると異なるエンティティを指すハッシュ。
13.encryptedKeys-readAllが偽の場合に存在する。ACLグループ内の公開鍵当たり1つの暗号化キーのリスト。ACLグループ内のIDのソートされたリストに対応する順序で、このリストは8バイト数と、その後に続く暗号化キーのそれぞれとして記憶される。
【0164】
[00162] 一部の例では、記憶される4種類のサイズに加えて、記憶されないが必要に応じて(例えばプロセッサによって)再計算される5番目の種類がある。それが「デデュープサイズ」であり、デデュープサイズはこのファイル又はディレクトリツリー内の固有のチャンクの合計サイズである。これは、ファイル又はディレクトリツリーの外側のチャンクを無視しながらこのファイル又はディレクトリツリー内でデデュープが行われる場合のディスクメモリ上のサイズである。
【0165】
[00163] 一部の例では、そのreadAllが偽であるエンティティを(例えばプロセッサを使用して)部分的に暗号化することができる。「センシティブ」メタデータは暗号化されるが、「固定」及び「可変」メタデータは暗号化されない。ファイルのコンテンツは暗号化されるが、ディレクトリのコンテンツは暗号化されない。
【0166】
[00164] 一部の例では、暗号化はランダムキーを用いるXTS(NIST SP800-38E)であり得る。XTSの「データユニット」は、センシティブメタデータ及び可変メタデータの両方を含み、データユニットがセンシティブ部分だけである任意のチャンクを除き、それぞれのチャンク全体である。センシティブメタデータの暗号化はランダムキーを用いたXTS暗号化であり得る。ファイルのコンテンツの暗号化は、そのビットが反転された同じキーを使用する別個のXTS暗号化であり得る。従って、センシティブメタデータがその長さを拡張することによって修正される場合、メタデータの一部を再暗号化することができるがコンテンツは再暗号化されず、それはコンテンツが新たなチャンクの冒頭から始まるからである。
【0167】
[00165] 次いで、ACLグループからの公開鍵のソートされたリスト内の公開鍵のそれぞれと共に(例えばプロセッサを使用して)ランダムキーを暗号化することができ、その結果がencryptedKeysとして記憶される。ACLファイルでは、ACLグループはACLファイル内のIDのソートされたリストである。ACLディレクトリでは、ACLグループは、ルートがそのディレクトリであるディレクトリツリー内のACLファイル内のIDのソートされたリストである。
【0168】
[00166] 一部の例では、IDを追加することによってACL IDグループが変化する場合、暗号化キーのリストに新たな暗号化キーを追加することができる。IDが削除される場合、新たなランダムキーが選択され、暗号化キーのリストが再計算され、センシティブメタデータ及びコンテンツの両方が古いキーで復号され、新たなキーで再暗号化される。例えばACLへの幾つかの変更を続けざまに行えるようにし、変更に関して再暗号化を一度行うことにより、書き込みキャッシュを使用してこのプロセスを最適化することができる。
【0169】
[00167] ユーザメタデータは、(キー,値)ペアのソートされたリストであり得る。各キーはストリング(例えばJava String)であり、各キーは一意である。各値はJava List<byte[]>とすることができ、リスト内の順序は様々な値がユーザによって追加された順序である。ユーザは値を追加及び削除することができる。値が残っていない場合はペアが削除される。
【0170】
[00168] これらのキーは、ユーザが望む任意のストリングであり得る。一部の実装形態では空のストリングが許容可能だが、ヌルは許容されない。例は「creatorApp」又は「openWith」又は「source」を含み、値はディレクトリツリーのハッシュである(最初の2つの事例は最上位のディレクトリ内に単一の実行可能ファイルを含む)。他の例は小さいjpgに関連する「thumbnail」、又は日時に関連する「createdDate」若しくは「modifiedDate」、又はこのファイルが存在し続けることを望む各ユーザのIDに関連する「pinned」を含む。高速コピー可能ファイルシステムプラットフォームは、ユーザがどのようなキーを提供するのかにもよるが、これらの一部又は全てを使用することができる。
【0171】
[00169] 一部の実装形態では、sizeフィールドは、そのエンティティのためのチャンクツリー内の全てのチャンクのバイト単位の合計サイズを与える符号付きの64ビット整数であり得る。チャンクツリー内で同じチャンクが2度現れる場合、そのチャンクは2回カウントされる。従ってsizeフィールドは、デデュープがない場合にエンティティのチャンクツリーが占めることになる物理ディスクメモリ空間の量である。
【0172】
[00170] treeSizeフィールドはディレクトリについて存在するが、ファイル又はACLについては存在しない。treeSizeフィールドは、このディレクトリのサイズと、このディレクトリ内の各ファイルのサイズと、このディレクトリ内の各サブディレクトリのtreeSizeとの和であり得る。これは、デデュープがない場合にこのディレクトリツリーがメモリ内で占めることになる空き容量である。
【0173】
[00171] 一部の例では、高速コピー可能ファイルシステムプラットフォームは各ユーザが何バイトの責任を負うのかを追跡することもできる。ファイルでは、そのファイルをpinするユーザには「size」バイトが課され得る。ディレクトリでは、そのディレクトリをpinするユーザには「treeSize」バイトが課され得る。誰もファイルをpinしていない場合、アプリケーションはメモリ空間を節約するためにそのファイルを削除することに決めることができる。pinされているファイル又はディレクトリをディレクトリツリーが含まない場合、メモリ空間を節約するためにその全ディレクトリツリーを(例えばプロセッサを使用して)削除することができる。これはつまり、2人のユーザが同じものをpinする場合に生じるデデュープは無視し、ユーザは自身が使用を引き起こしている空間に関して課されることを意味する。高速コピー可能ファイルシステムプラットフォームは、そのディレクトリツリー内のディレクトリ及びエンティティの両方を高速コピー可能ファイルシステムプラットフォームがpinしないことを確実にすることができる。
【0174】
[00172] 上記のファイルシステムは、高速の読み取り及び低速の書き込みを有する。上記のファイルシステムは高速のハッシュ計算も有する。ユーザがファイル又はディレクトリのハッシュを要求する場合、応答は単純にそのチャンクツリーのルートチャンクの物理ファイル名である。これはメタデータと共にリレーショナルデータベース内に記憶することができ、そのため素早く返すことができる。一部の例では、ファイルシステムの全体を通してSHAZ-256ハッシュを使用することができる。他の例では、ファイルシステムの全体を通してSHA3-256ハッシュ(又は他の任意の適切なハッシュ)を使用することができる。
【0175】
[00173] 一部の実装形態ではファイルシステムが低速の書き込みを有するが、このファイルシステムは、そのチャンクの1つの中で同じバイトを偶然有する2つのファイルが作成される場合、そのチャンクの単一のコピーだけをメモリ内に物理的に記憶し、それにより記憶空間の消費を減らし、さもなければ作成することができないコピーをユーザが作成できるようにするという利点を有する。例えばライブラリへのリンクをディレクトリ内に作成する代わりに、ユーザは(例えばプロセッサを使用して)単純にそのディレクトリ内に全ライブラリをコピーすることができ、その仮想コピーは実際のコピーよりも少ない記憶域を使用する。
【0176】
[00174] 一部の例では、(或るボリュームから別のボリュームであっても)ユーザがファイル又はディレクトリをコピーする場合、物理的にはシステムは(例えばプロセッサを使用して)実際のチャンク自体ではなくエンティティのルートチャンクへのポインタをコピーするに過ぎない。ここでは「ポインタ」は他のエンティティのメタデータ内に、及びデータベース内に記憶されるエンティティのハッシュを意味することができる。ディレクトリ/X/及び/Y/の両方がファイル名Nを有するファイルAを含み、ユーザが/X/Nを修正した場合、システムはAのコピーとしてBを作成し、要求された修正をBに対して行い、Bをポイントするように/X/Nからのポインタを変更し、元の/Y/NはAをポイントさせたままにしておく。
【0177】
[00175] 最初に、上記の内容を記載した通りにコード化することができる。つまりそれぞれの書き込みは、ハッシュを再計算すること、及び新たな物理ファイル内に記憶される新たなチャンクを作成することを含むことができる。一部の例では、RAM内に書き込みをキャッシュし、単に遅延の後にそれらをディスクメモリに書き込むことによってシステムを高速化することができ、そのため同じファイルへの複数の書き込みがハッシング及びチャンク作成の単一のステップへと合体する。加えてかかる一部の例では、単一のディレクトリ内で変化する複数のファイルが、そのディレクトリ及びディレクトリツリー内のそのディレクトリの上位のディレクトリに対する単一の変化をもたらし得る。その場合、値の読み取りに影響を与えるキャッシュ済みの任意の書き込みが現在あるかどうかを調べるために読み取りの前にデータベースがクエリされる。
【0178】
[00176] 一部の実装形態では、ファイルを構成するチャンクをユーザが見ることができず、むしろユーザはファイル自体を見るに過ぎない。しかし他の実装形態では、チャンクハッシュに関係する(例えばプロセッサ内で実行される)幾つかのメソッドを実行するようにシステムを構成することができる。システムは、ファイル又はディレクトリのルートチャンクのハッシュをユーザが見つけることを可能にし得る。これはそのファイル又はディレクトリのハッシュであるように定められ、そのファイル又はディレクトリへのポインタとしてシステム全体を通して使用され得る。
【0179】
[00177] 一部の実装形態では、ユーザは、ファイル又はディレクトリツリー又はチャンクのリスト(そのハッシュによって参照される)をバイトのストリームへとシリアル化するための(例えばプロセッサによって実行される)メソッドを呼び出すことができる。或いは又は加えて、一部の実装形態では、ユーザはかかるストリームを逆シリアル化し、自らが選択したディレクトリ内に新たなファイル又はディレクトリを作成するための(例えばプロセッサによって実行される)メソッドを呼び出すことができる。逆シリアル化されたチャンクはトランスペアレントに/見えないようにファイルシステムに追加し、その後、例えば全ファイル又はディレクトリのチャンクが存在するとき、可視ファイル及びディレクトリツリーに変換することができる。逆シリアル化を終えたとユーザが指示する場合、システムは使用されなかった任意のチャンクをガベージコレクションすることができる。かかるガベージコレクションは定期的に(例えば1分に1回、1時間に1回、1日1回等)、散発的に、又は他の任意の所定の時間若しくは時間間隔で行うこともできる。
【0180】
[00178] ユーザがファイルに関して(例えばプロセッサによって実行される)シリアル化メソッドを呼び出す場合、プロセッサは全ファイルを(即ち深さ優先順、行きがけ順探査で全チャンクツリーを)シリアル化し、各チャンクのコンテンツを出力することができる。一部の実装形態では、チャンク名のどれもシリアル化されない。ユーザがディレクトリツリーのシリアル化を要求する場合、プロセッサはディレクトリツリーのディレクトリの深さ優先探索を行い、全ディレクトリツリー(即ちディレクトリツリー内のサブディレクトリ及びファイルのチャンクツリー)をシリアル化することができる。何れの場合にもシリアル化は再帰的に働き、ルートチャンクをシリアル化し、次いでルートチャンクが含むハッシュのそれぞれをシリアル化し、その後も同様に続く。プロセッサが同じチャンクを2回シリアル化しないように、システムはそれまでにシリアル化されたチャンクの指示を記憶し及び/又はかかるチャンクを記憶しておく。
【0181】
[00179] 逆シリアル化時に、システムは各チャンクのハッシュをそのコンテンツから(例えばそのチャンクを記憶するためのファイル名を決定するために)計算することができ、そのプロセスの完了後、完全なエンティティの有効な部分にならなかった任意のチャンクを破棄することができる。
【0182】
[00180] システムが1組のチャンクを(それらのハッシュの組を入れることによって)シリアル化する場合、システムはそれらのチャンク内のバイトだけを所与の順序でシリアル化する。メソッドは1組のチャンクによって参照される1組のチャンクを返す。かかる1組のチャンクをユーザが逆シリアル化する場合、そのチャンクがシステムに追加され、システムはユーザのコンピュータ上にまだない1組のチャンクによって参照される1組のチャンクを返す。
【0183】
[00181] システム(又はプロセッサ)は、ファイル又はディレクトリツリーの葉でないチャンクをシリアル化するためのメソッドを実行することもできる。逆シリアル化時に、システムはユーザのシステム上にまだない葉チャンクのハッシュをユーザに返す。そのため、例えばAliceは(計算装置Aliceにおけるプロセッサを使用して)Bobに(計算装置Bobにおけるプロセッサに)葉を、次いで葉でないものをシリアル化することができ、BobはAliceからBobに厳密に何バイト送信されるのかを可能な限り早く知ることになる。又は代替的なシステムでは、AliceがBobに葉でないチャンクをシリアル化することができ、Bobは自分がまだ受信していない葉のハッシュをAliceに知らせることができ、AliceはBobがまだ受信していない葉だけをシリアル化することができる。
【0184】
[00182] チャンクセットのシリアル化の1つの利点は、Bobが既に有する多くのファイルを図らずも含むディレクトリツリーをAliceがBobに効率的に送信できるようにすることである。Aliceはルートチャンクのハッシュだけをまずシリアル化し、それを送信する。Bobはルートチャンクのハッシュを自分が選択したディレクトリ内に逆シリアル化する。(例えばBobにおけるプロセッサによって実行される)そのメソッドの呼び出しがハッシュの非空のリストを返す場合、BobはそのリストをAliceに送信し、Aliceはそれらのチャンクのシリアル化に返信する。次いでBobはチャンクを逆シリアル化し、Bobがまだ有していないと参照するチャンクのリストをAliceに送信する。Bobが全ディレクトリツリーのコピーを有するまでこれが繰り返される。このようにして、AliceはBobが既に有するチャンクを送信することなしに全ディレクトリツリーを転送する。
【0185】
[00183] 一部の例では、逆シリアル化の間、リレーショナルデータベースが新たなチャンク、ファイル、及びディレクトリのメタデータを追跡する及び/又は記憶することができる。一部の例では、任意の所与の時点において、ファイル又はディレクトリのチャンク(及び再帰的にそのサブディレクトリのチャンク)の全てが受信されると、ユーザはファイルシステム内に存在するものとしてファイル又はディレクトリを認識することができる。
【0186】
[00184] 一部の例では、ユーザが逆シリアル化を終えたことをシステム(又はプロセッサ)によって実行されるdeserializeDoneメソッドが示す。その時点において、システムは有効なエンティティの一部にならなかった任意のチャンクを破棄することができる。逆シリアル化時に、ユーザは新たなファイル又はディレクトリツリーが所与のWRITE許可を有するように設定されることを要求することができる。これはコピー時にも行うことができる。
【0187】
[00185] 高速コピー可能ファイルシステムプラットフォームは、
-前回のサインド状態(signed state)以降のファイルシステムデータベースの及び現在のイベントリストのスナップショットを撮るステップと、
-ディスクメモリにそのスナップショットをシリアル化するステップと、
-それらの新たなファイルが今では公式バックアップであることを示すためにディスクメモリ上のバイトを変更するステップと
を含む操作を定期的に行うことができる。
【0188】
[00186] クラッシュ後(更には通常のシャットダウン及び再起動後)、高速コピー可能ファイルシステムプラットフォームは、
-最新のサインド状態をロードすること、
-最新の公式バックアップからイベントを逆シリアル化すること、
-最新の公式バックアップからデータベースを逆シリアル化すること、
-同期と共に通常の高速コピー可能ファイルシステムプラットフォームを実行し始めること等
を行うことができる。
【0189】
[00187] 加えて一部の実装形態では、チャンクのガベージコレクションのためにバックグラウンドスレッドを実行することができる。ガベージコレクションスレッドはチャンクディレクトリを定期的に調べ、それらのファイル名をデータベースに照らして確認することができる。ガベージコレクションスレッドが現在のボリュームのどれによっても参照されない、且つ最新のサインド状態によって参照されないチャンクを識別する場合、ガベージコレクションスレッドはそのチャンクをハードドライブから削除すべきである。加えて一部の例では、ガベージコレクションスレッドは既存のチャンク内で定期的に読み取りを行い、それぞれがそのコンテンツのハッシュと一致するファイル名を有することを確認することができる。それらが一致しない場合、そのチャンクをハードドライブから削除することができる。(データベースに応じて)チャンクが引き続き必要な場合、DHTから又は別のメンバからチャンクを再ダウンロードする措置を取ることができる。
【0190】
[00188] 本明細書に記載の一部の実施形態及び/又は方法は、(ハードウェア上で実行される)ソフトウェア、ハードウェア、又はその組み合わせによって実行することができる。ハードウェアは、例えば汎用プロセッサ、書換可能ゲートアレイ(FPGA)、及び/又は特定用途向け集積回路(ASIC)を含み得る。(ハードウェア上で実行される)ソフトウェアは、C、C++、Java(商標)、Ruby、Visual Basic(商標)、及び/又は他のオブジェクト指向、手続き型、若しくは他のプログラミング言語及び開発ツールを含む様々なソフトウェア言語(例えばコンピュータコード)で表すことができる。コンピュータコードの例は、これだけに限定されないがマイクロコード又はマイクロ命令、コンパイラによって作成されるような機械命令、ウェブサービスを作り出すために使用されるコード、及びインタプリタを使用してコンピュータによって実行される高水準命令を含むファイルを含む。例えば実施形態は、命令型プログラミング言語(例えばC、Fortran等)、関数型プログラミング言語(Haskell、Erlang等)、論理型プログラミング言語(例えばProlog)、オブジェクト指向プログラミング言語(例えばJava、C++等)、又は他の適切なプログラミング言語及び/又は開発ツールを使用して実施することができる。コンピュータコードの更なる例には、これだけに限定されないが、制御信号、暗号化コード、及び圧縮コードが含まれる。
【0191】
[00189] 「命令」及び「コード」という用語は、任意の種類のコンピュータ可読ステートメントを含むように広く解釈すべきである。例えば「命令」及び「コード」という用語は、1つ又は複数のプログラム、ルーチン、サブルーチン、関数、手続き等を指し得る。「命令」及び「コード」は、単一のコンピュータ可読ステートメント又は多くのコンピュータ可読ステートメントを含み得る。