(57)【要約】【課題】  分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法を提供する。【解決手段】  方法が、処理モジュールが、データ・オブジェクトを分散ストレージ（ＤＳ）ユニットに格納する要求を受け取ることから開始する。処理モジュールは、ソース名、ソース名についての値、及び提案試行識別子を含む提案メッセージを生成し、伝送する。次に、処理モジュールは、複数のＤＳユニットから閾値数の提案メッセージ応答を受け取り、提案メッセージ応答が、ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、提案メッセージ内に含まれるソース名についての値を、ソース名についての永続値として採用し、この方法は、処理モジュールが要求中のコンピューティング・デバイスに通知することを続行する。提案メッセージ応答が、複数のＤＳユニットのうちのＤＳユニットにより少なくとも１つの他の提案メッセージを受け取っていることを示すとき、方法は、処理モジュールがソース名についての第３の値をソース名についての永続値として採用することを続行する。【選択図】      図１５
2020524324.tif 000002
【特許請求の範囲】
【請求項１】
コンピューティング・デバイスであって、
分散又はディストリビューテッド・ストレージ・ネットワーク（ＤＳＮ）とインターフェース接続し、通信するように構成されたインターフェースと、
操作命令を格納するメモリと、
前記インターフェース及び前記メモリに動作可能に結合された処理モジュールと、
を含み、前記処理モジュールは、前記操作命令に基づいて前記コンピューティング・デバイス内で動作可能なとき、
要求中のコンピューティング・デバイスから、前記ＤＳＮを介して、データ・オブジェクトを複数のディストリビューテッド・ストレージ（ＤＳ）ユニット内に格納する要求を受け取ることと、
前記データ・オブジェクトと関連したソース名、前記ソース名についての第１の値、及び提案試行識別子を含む提案メッセージを生成することと、
前記提案メッセージを前記複数のＤＳユニットに伝送することと、
前記提案メッセージに応答して、前記複数のＤＳユニットから閾値数の提案メッセージ応答を受け取ることであって、前記閾値数の提案メッセージ応答のうちの１つの提案メッセージ応答は、前記複数のＤＳユニットのうちの１つのＤＳユニットから受け取られ、前記ＤＳユニットにより直近に受理された、前記ソース名についての第２の値に対応し、前記複数のＤＳユニットのうちの前記ＤＳユニットが他のいずれかの提案メッセージを受け取ったかどうかをさらに示す、受け取ることと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、前記提案メッセージ内に含まれる前記ソース名についての前記第１の値を、前記ソース名についての永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより、少なくとも１つの他の提案メッセージを受け取っていることを示すとき、前記複数のＤＳユニットからの前記閾値数の提案メッセージ応答に基づいて、前記ソース名についての第３の値を、前記ソース名についての前記永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
を行うように構成される、コンピューティング・デバイス。
【請求項２】
前記永続値は、前記処理モジュールによる決定性関数の実行に基づいて決定される、請求項１に記載のコンピューティング・デバイス。
【請求項３】
前記ソース名についての前記第３の値は、前記ソース名についての前記第２の値に等しい、請求項１に記載のコンピューティング・デバイス。
【請求項４】
前記決定性関数は、前記ソース名についての提案メッセージ応答を受け取る他の処理ユニットによりさらに実行され、さらに、前記決定性関数の実行は、前記ソース名についての前記第３の値をもたらす、請求項２に記載のコンピューティング・デバイス。
【請求項５】
前記永続値は、前記処理モジュールにより実行されるバロット・プロセスに基づいて決定される、請求項１に記載のコンピューティング・デバイス。
【請求項６】
前記バロット・プロセスは、前記提案メッセージと関連したタイムスタンプに基づいてバロット値を選択することを含む、請求項５に記載のコンピューティング・デバイス。
【請求項７】
前記バロット・プロセスは、２つの潜在的な永続値をもたらし、前記永続値は、前記２つの潜在的な永続値と関連した第２の処理モジュール及び第３の処理モジュールが、それぞれ、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に伝送された提案メッセージを再伝送した後、前記潜在的な永続値から選択される、請求項５に記載のコンピューティング・デバイス。
【請求項８】
他選択処理モジュールは前記第３の値と関連付けられ、前記第３の値は、前記他選択処理モジュールが、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送した後、決定される、請求項１に記載のコンピューティング・デバイス。
【請求項９】
前記他選択処理モジュールにより前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送することは、前記他選択処理モジュールが、前記第３の値と関連した前記提案メッセージが前記永続値についての好ましい候補値を含むと判断することに基づく、請求項８に記載のコンピューティング・デバイス。
【請求項１０】
分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法であって、前記方法は、
要求中のコンピューティング・デバイスから、前記ＤＳＮを介して、データ・オブジェクトを複数のディストリビューテッド・ストレージ（ＤＳ）ユニット内に格納する要求を受け取ることと、
前記データ・オブジェクトと関連したソース名、前記ソース名についての第１の値、及び提案試行識別子を含む提案メッセージを生成することと、
前記提案メッセージを前記複数のＤＳユニットに伝送することと、
前記提案メッセージに応答して、前記複数のＤＳユニットから閾値数の提案メッセージ応答を受け取ることであって、前記閾値数の提案メッセージ応答のうちの１つの提案メッセージ応答は、前記複数のＤＳユニットのうちの１つのＤＳユニットから受け取られ、前記ＤＳユニットにより直近に受理された、前記ソース名についての第２の値に対応し、前記複数のＤＳユニットのうちの前記ＤＳユニットが他のいずれかの提案メッセージを受け取ったかどうかをさらに示す、受け取ることと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、前記提案メッセージ内に含まれる前記ソース名についての前記第１の値を、前記ソース名についての永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより、少なくとも１つの他の提案メッセージを受け取っていることを示すとき、前記複数のＤＳユニットからの前記閾値数の提案メッセージ応答に基づいて、前記ソース名についての第３の値を、前記ソース名についての前記永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
を含む、方法。
【請求項１１】
前記永続値は、前記処理モジュールによる決定性関数の実行に基づいて決定される、請求項１０に記載の方法。
【請求項１２】
前記ソース名についての前記第３の値は、前記ソース名についての前記第２の値に等しい、請求項１０に記載の方法。
【請求項１３】
前記決定性関数は、前記ソース名についての提案メッセージ応答を受け取る他の処理ユニットによりさらに実行され、さらに、前記決定性関数の実行は、前記ソース名についての前記第３の値をもたらす、請求項１１に記載の方法。
【請求項１４】
前記永続値は、前記処理モジュールにより実行されるバロット・プロセスに基づいて決定される、請求項１０に記載の方法。
【請求項１５】
前記バロット・プロセスは、前記提案メッセージと関連したタイムスタンプに基づいてバロット値を選択することを含む、請求項１４に記載の方法。
【請求項１６】
前記バロット・プロセスは、２つの潜在的な永続値をもたらし、前記永続値は、前記２つの潜在的な永続値と関連した第２の処理モジュール及び第３の処理モジュールが、それぞれ、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に伝送された提案メッセージを再伝送した後、前記潜在的な永続値から選択される、請求項１４に記載の方法。
【請求項１７】
他選択処理モジュールは前記第３の値と関連付けられ、前記第３の値は、前記他選択処理モジュールが、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送した後、決定される、請求項１０に記載の方法。
【請求項１８】
前記他選択処理モジュールにより前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送することは、前記他選択処理モジュールが、前記第３の値と関連した前記提案メッセージが前記永続値についての好ましい候補値を含むと判断することに基づく、請求項１７に記載の方法。
【請求項１９】
分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法であって、前記方法は、
コンピューティング・デバイスにより、分散ストレージ・ネットワーク（ＤＳＮ）の閾値数のストレージ・ユニットに向けられたアクセス要求を受け取ることであって、前記アクセス要求は、ソース名と関連した値についてのものであり、さらに、前記コンピューティング・デバイスは、前記閾値数のストレージ・ユニットのうちの少なくとも幾つかから１つ又複数の提案メッセージ応答を受け取っている、受け取ることと、
前記ソース名と関連した前記値が、前記ソース名についての永続値であるかどうかを判断することであって、前記判断することは、前記コンピューティング・デバイスが、前記閾値数のストレージ・ユニットから閾値数の提案メッセージ応答を受け取ったことに基づき、さらに、前記判断することは、前記ソース名と関連した前記値についてコンセンサス値が決定されたことを、閾値提案メッセージ応答が示すかどうかにも基づく、判断することと、
前記ソース名と関連した前記値が前記ソース名についての前記永続値であるとき、前記ソース名と関連した前記値を前記要求中のコンピューティング・デバイスに伝送することと、
を含む、方法。
【請求項２０】
前記ソース名と関連した前記値が前記ソース名についての前記永続値でないとき、永続値を決定することができないと判断し、前記ソース名と関連した前記値についての前に格納した値を選択し、前記前に格納した値を前記要求中のコンピューティング・デバイスに伝送することをさらに含む、請求項１９に記載の方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、コンピュータ・ネットワークに関し、より特定的には、データの分散エラー符号化（dispersing error encoded data）に関する。
【背景技術】
【０００２】
コンピューティング・デバイスは、データの通信、データの処理、及び／又はデータの格納を行うことが知られている。そのようなコンピューティング・デバイスは、無線スマートフォン、ラップトップ、タブレット、パーソナル・コンピュータ（ＰＣ）、ワーク・ステーション、及びビデオ・ゲーム・デバイスから、毎日何百万ものウェブ検索、株式取引、又はオンライン購入をサポートするデータ・センタにまで及ぶ。一般に、コンピューティング・デバイスは、中央処理ユニット（ＣＰＵ）、メモリ・システム、ユーザ入力／出力インターフェース、周辺機器インターフェース、及び相互接続バス構造を含む。
【０００３】
さらに知られているように、コンピュータは、「クラウド・コンピューティング」を用いて、コンピュータの代わりに１つ又は複数のコンピューティング機能（例えば、サービス、アプリケーション、アルゴリズム、演算論理関数等）を実行することにより、そのＣＰＵを事実上拡張することができる。さらに、大規模なサービス、アプリケーション、及び／又は機能については、クラウド・コンピューティングを複数のクラウド・コンピューティング・リソースによりディストリビュート方式で行って、サービス、アプリケーション、及び／又は関数の完了のための応答時間を改善することができる。例えば、Ｈａｄｏｏｐは、数千のコンピュータによるアプリケーション実行を可能にするディストリビューテッド・アプリケーションをサポートするオープンソース・ソフトウェア・フレームワークである。
【０００４】
クラウド・コンピューティングに加えて、コンピュータは、そのメモリ・システムの一部として「クラウド・ストレージ」を用いることができる。知られているように、クラウド・ストレージは、ユーザがそのコンピュータを介して、ファイル、アプリケーションなどをインターネット・ストレージ・システム上に格納することを可能にする。インターネット・ストレージ・システムは、エラー訂正スキームを用いて格納のためにデータを符号化するＲＡＩＤ（redundant array of independent disks、独立ディスク冗長アレイ）システム、及び／又は分散ストレージ・システムを含むことができる。
【発明の概要】
【発明が解決しようとする課題】
【０００５】
分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法を提供する。
【課題を解決するための手段】
【０００６】
第一側面の観点から、本発明は、コンピューティング・デバイスであって、分散又はディストリビューテッド・ストレージ・ネットワーク（ＤＳＮ）とインターフェース接続し、通信するように構成されたインターフェースと、操作命令を格納するメモリと、前記インターフェース及び前記メモリに動作可能に結合された処理モジュールと、を含む。
前記処理モジュールは、前記操作命令に基づいて前記コンピューティング・デバイス内で動作可能なとき、
要求中のコンピューティング・デバイスから、前記ＤＳＮを介して、データ・オブジェクトを複数のディストリビューテッド・ストレージ（ＤＳ）ユニット内に格納する要求を受け取ることと、
前記データ・オブジェクトと関連したソース名、前記ソース名についての第１の値、及び提案試行識別子を含む提案メッセージを生成することと、
前記提案メッセージを前記複数のＤＳユニットに伝送することと、
前記提案メッセージに応答して、前記複数のＤＳユニットから閾値数の提案メッセージ応答を受け取ることであって、前記閾値数の提案メッセージ応答のうちの１つの提案メッセージ応答は、前記複数のＤＳユニットのうちの１つのＤＳユニットから受け取られ、前記ＤＳユニットにより直近に受理された、前記ソース名についての第２の値に対応し、前記複数のＤＳユニットのうちの前記ＤＳユニットが他のいずれかの提案メッセージを受け取ったかどうかをさらに示す、受け取ることと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、前記提案メッセージ内に含まれる前記ソース名についての前記第１の値を、前記ソース名についての永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより、少なくとも１つの他の提案メッセージを受け取っていることを示すとき、前記複数のＤＳユニットからの前記閾値数の提案メッセージ応答に基づいて、前記ソース名についての第３の値を、前記ソース名についての前記永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、を行うように構成される。
【図面の簡単な説明】
【０００７】
【図１】本発明の実施形態による、分散（dispersed）又はディストリビューテッド（distributed）ストレージ・ネットワーク（ＤＳＮ）の実施形態の模式的ブロック図である。
【図２】本発明の実施形態による、コンピューティング・コアの実施形態の模式的ブロック図である。
【図３】本発明の実施形態による、データの分散ストレージ・エラー符号化の例の模式的ブロック図である。
【図４】本発明の実施形態による、エラー符号化関数の一般的な例の模式的ブロック図である。
【図５】本発明の実施形態による、エラー符号化関数の特定の例の模式的ブロック図である。
【図６】本発明の実施形態による、符号化データ・スライス（ＥＤＳ）のスライス名の例の模式的ブロック図である。
【図７】本発明の実施形態による、データの分散ストレージ・エラー復号の例の模式的ブロック図である。
【図８】本発明の実施形態による、エラー復号関数の一般的な例の模式的ブロック図である。
【図９】本発明の実施形態による、符号化データ・スライスのセットに対する重複する書き込み要求の例の模式的ブロック図である。
【図１０】本発明の実施形態による、符号化データ・スライスに対する書き込み要求の例の模式的ブロック図である。
【図１１】本発明の実施形態による、符号化データ・スライスに対する読み取り要求の例の模式的ブロック図である。
【図１２】本発明の実施形態による、符号化データ・スライスのセットに対する重複する書き込み要求及び読み取り要求の別の例の模式的ブロック図である。
【図１３】本発明の実施形態による、ＤＳＮのストレージ・ユニットにより格納される、符号化データ・スライスについての提案記録の例の模式的ブロック図である。
【図１４】本発明の実施形態による、提案メッセージの例の模式的ブロック図である。
【図１５】本発明の実施形態による、提案メッセージを用いてＤＳＮにおける競合を管理する方法の例の論理図である。
【発明を実施するための形態】
【０００８】
図１は、複数のコンピューティング・デバイス１２〜１６、管理ユニット１８、完全性（integrity）処理ユニット２０、及びＤＳＮメモリ２２を含む分散又はディストリビューテッド・ストレージ・ネットワーク（ＤＳＮ）１０の実施形態の模式的ブロック図である。ＤＳＮ１０のコンポーネントは、ネットワーク２４に結合され、ネットワーク２４は、１つ又は複数の無線及び／又は有線通信システム；１つ又は複数の非パブリック・イントラネット・システム及び／又は公衆インターネット・システム；及び／又は１つ又は複数のローカル・エリア・ネットワーク（ＬＡＮ）及び／又は広域ネットワーク（ＷＡＮ）を含むことができる。
ＤＳＮメモリ２２は、地理的に異なる場所（例えば、１つはシカゴ、１つはミルウォーキー等）に、共通の場所に、又はその組み合わせで配置することができる複数のストレージ・ユニット３６を含む。例えば、ＤＳＮメモリ２２が８個のストレージ・ユニット３６を含む場合、各ストレージ・ユニットは、異なる場所に配置される。別の例として、ＤＳＮメモリ２２が８個のストレージ・ユニット３６を含む場合、８個のストレージ・ユニット全てが同じ場所に配置される。さらに別の例として、ＤＳＮメモリ２２が８個のストレージ・ユニット３６を含む場合、第１の対のストレージ・ユニットは第１の共通の場所にあり、第２の対のストレージ・ユニットは第２の共通の場所にあり、第３の対のストレージ・ユニットは第３の共通の場所にあり、第４の対のストレージ・ユニットは第４の共通の場所にある。ＤＳＮメモリ２２は、８個より多い又は少ないストレージ・ユニット３６を含み得ることに留意されたい。さらに、各々のストレージ・ユニット３６は、コンピューティング・コア（図２又はそのコンポーネントに示されるような）と、分散エラー符号化データを格納するための複数のメモリ・デバイスとを含むことに留意されたい。
【０００９】
コンピューティング・デバイス１２〜１６、管理ユニット１８、及び完全性処理ユニット２０の各々は、コンピューティング・コア２６を含み、コンピューティング・コア２６は、ネットワーク・インターフェース３０〜３３を含む。コンピューティング・デバイス１２〜１６はそれぞれ、携帯型コンピューティング・デバイス及び／又は固定型コンピューティング・デバイスとすることができる。携帯型コンピューティング・デバイスは、ソーシャル・ネットワーキング・デバイス、ゲーミング・デバイス、携帯電話、スマートフォン、デジタル・アシスタント、デジタル音楽プレーヤ、デジタル・ビデオ・プレーヤ、ラップトップ・コンピュータ、手持ち式コンピュータ、タブレット、ビデオ・ゲーム・コントローラ、及び／又はコンピューティング・コアを含む任意の他の携帯型デバイスとすることができる。固定型コンピューティング・デバイスは、パーソナル・コンピュータ（ＰＣ）、コンピュータ・サーバ、ケーブル・セットトップ・ボックス、衛星放送受信器、テレビ・セット、プリンタ、ファックス装置、家庭用娯楽機器、ビデオ・ゲーム機、及び／又は任意のタイプの家庭用若しくはオフィス用コンピューティング機器とすることができる。管理ユニット１８及び完全性処理ユニット２０の各々は、別個のコンピューティング・デバイスであってもよく、共通のコンピューティング・デバイスであってもよく、及び／又はコンピューティング・デバイス１２〜１６の１つ又は複数及び／又はストレージ・ユニット３６の１つ又は複数に統合されてもよいことに留意されたい。
【００１０】
各インターフェース３０、３２及び３３は、ネットワーク２４を介して間接的に及び／又は直接的に１つ又は複数の通信リンクをサポートするためのソフトウェア及びハードウェアを含む。例えば、インターフェース３０は、コンピューティング・デバイス１４と１６との間の通信リンク（例えば、有線、無線、直接、ＬＡＮを介する、ネットワーク２４を介するなど）をサポートする。別の例として、インターフェース３２は、コンピューティング・デバイス１２及び１６とＤＳＮメモリ２２との間の通信リンク（例えば、有線接続、無線接続、ＬＡＮ接続、及び／又はネットワーク２４との間の任意の他のタイプの接続）をサポートする。さらに別の例として、インターフェース３３は、ネットワーク２４に対する管理ユニット１８及び完全性処理ユニット２０の各々のための通信リンクをサポートする。
【００１１】
図３〜図８の１つ又は複数を参照して後で説明されるように、コンピューティング・デバイス１２及び１６は、コンピューティング・デバイスが、データ（例えば、データ４０）を分散ストレージ・エラー符号化及び復号するのを可能にする、分散ストレージ（ＤＳ）クライアント・モジュール３４を含む。この例示的な実施形態において、コンピューティング・デバイス１６は、コンピューティング・デバイス１４のための分散ストレージ処理エージェントとして機能する。この役割において、コンピューティング・デバイス１６は、コンピューティング・デバイス１４の代わりにデータを分散ストレージ・エラー符号化及び復号する。分散ストレージ・エラー符号化及び復号を用いれば、ＤＳＮ１０は、データ損失なしに、及び、データの冗長又はバックアップ・コピーを必要とせずに、かなりの数のストレージ・ユニットの障害に対する耐性がある（障害の数は、分散ストレージ・エラー符号化関数のパラメータに基づく）。さらに、ＤＳＮ１０は、データ損失なしにセキュアな方法で無期限にデータを格納する（例えば、システムは、権限のないデータ・アクセスの試行に対して非常に耐性がある）。
【００１２】
動作において、管理ユニット１８は、ＤＳ管理サービスを行う。例えば、管理ユニット１８は、コンピューティング・デバイス１２〜１４に対して個々に、又はユーザ・デバイスのグループの一部として、ディストリビューテッド・データ・ストレージ・パラメータ（例えば、ボールト（vault）の作成、ディストリビューテッド・ストレージ・パラメータ、セキュリティ・パラメータ、課金情報、ユーザ・プロファイル情報など）を確立する。特定の例として、管理ユニット１８は、ユーザ・デバイス、デバイスのグループ、又はパブリック・アクセスのためのＤＳＮメモリ２２内のボールト（例えば、ＤＳＮのネーム空間全体の一部と関連した仮想メモリ・ブロック）の作成を調整し、ボールトについての分散ストレージ（ＤＳ）エラー符号化パラメータを、ボールトごとに確立する。管理ユニット１８は、ＤＳＮ１０のレジストリ情報を更新することによって、各ボールトについてのＤＳエラー符号化パラメータの格納を容易にし、それにより、レジストリ情報は、ＤＳＮメモリ２２、コンピューティング・デバイス１２〜１６、管理ユニット１８、及び／又は完全性処理ユニット２０内に格納され得る。
【００１３】
管理ユニット１８は、ユーザ・プロファイル情報（例えば、アクセス制御リスト（ＡＣＬ））を作成し、ローカル・メモリ内及び／又はＤＳＮメモリ２２のメモリ内に格納する。ユーザ・プロファイル情報は、認証情報、許可、及び／又はセキュリティ・パラメータを含む。セキュリティ・パラメータは、暗号化／解読スキーム、１つ又は複数の暗号化鍵、鍵生成スキーム、及び／又はデータ符号化／復号スキームを含むことができる。
【００１４】
管理ユニット１８は、特定のユーザ、ユーザ・グループ、ボールト・アクセス、パブリック・ボールト・アクセス等に対する課金情報を作成する。例えば、管理ユニット１８は、非パブリック・ボールト及び／又はパブリック・ボールトにユーザがアクセスする回数を追跡し、それを用いてアクセスごとの課金情報を生成することができる。別の例では、管理ユニット１８は、ユーザ・デバイス及び／又はユーザ・グループによって格納された及び／又は取り出されたデータの量を追跡し、それを用いてデータ量ごとの課金情報を生成することができる。
【００１５】
別の例として、管理ユニット１８は、ネットワーク動作、ネットワーク管理、及び／又はネットワーク保守を実行する。ネットワーク動作は、ユーザ・データ割り当て要求（例えば、読み出し及び／又は書き込み要求）を認証すること、ボールトの作成を管理すること、ユーザ・デバイスに対する認証資格証明を確立すること、ＤＳＮ１０へ／からコンポーネント（例えば、ユーザ・デバイス、ストレージ・ユニット、及び／又はＤＳクライアント・モジュール３４を有するコンピューティング・デバイス）を追加／削除すること、及び／又はストレージ・ユニット３６に対する認証資格証明を確立することを含む。ネットワーク管理は、デバイス及び／又はユニットの障害を監視すること、ボールト情報を保持すること、デバイス及び／又はユニットのアクティブ化ステータスを決定すること、デバイス及び／又はユニットのロードを決定すること、及び／又はＤＳＮ１０の性能レベルに影響を与える任意の他のシステム・レベル動作を決定することを含む。ネットワーク保守は、ＤＮＳ１０のデバイス及び／又はユニットの交換、アップグレード、修理、及び／又は拡張を容易にすることを含む。
【００１６】
完全性処理ユニット２０は、「不良」又は欠損している符号化データ・スライスの再構築を実行する。高レベルにおいては、完全性処理ユニット２０は、ＤＳＮメモリ２２から、符号化データ・スライス、及び／又は符号化データ・スライスのスライス名の取り出し／列挙を定期的に試みることによって再構築を実行する。取り出された符号化スライスについて、それらは、データ破損、古いバージョン等に起因するエラーに関してチェックされる。スライスがエラーを含む場合、それは「不良」スライスとしてフラグが立てられる。受け取られなかった及び／又は列挙されなかった符号化データ・スライスについては、それらは、欠損スライスとしてフラグが立てられる。不良及び／又は欠損スライスは、その後、再構築されたスライスを生成するために良好なスライスとみなされる他の取り出された符号化データ・スライスを使用して再構築される。再構築されたスライスは、ＤＳＮメモリ２２内に格納される。
【００１７】
図２は、処理モジュール５０、メモリ・コントローラ５２、メイン・メモリ５４、ビデオ・グラフィック処理ユニット５５、入力／出力（ＩＯ）コントローラ５６、周辺コンポーネント相互接続（ＰＣＩ）インターフェース５８、ＩＯインターフェース・モジュール６０、少なくとも１つのＩＯデバイス・インターフェース・モジュール６２、読み出し専用メモリ（ＲＯＭ）基本入出力システム（ＢＩＯＳ）６４、及び１つ又は複数のメモリ・インターフェース・モジュールを含むコンピューティング・コア２６の実施形態の模式的ブロック図である。１つ又は複数のメモリ・インターフェース・モジュールは、ユニバーサル・シリアル・バス（ＵＳＢ）インターフェース・モジュール６６、ホスト・バス・アダプタ（ＨＢＡ）インターフェース・モジュール６８、ネットワーク・インターフェース・モジュール７０、フラッシュ・インターフェース・モジュール７２、ハード・ドライブ・インターフェース・モジュール７４、及びＤＳＮインターフェース・モジュール７６のうちの１つ又は複数を含む。
【００１８】
ＤＳＮインターフェース・モジュール７６は、従来のオペレーティング・システム（ＯＳ）ファイル・システム・インターフェース（例えば、ネットワーク・ファイル・システム（ＮＦＳ）、フラッシュ・ファイル・システム（ＦＦＳ）、ディスク・ファイル・システム（ＤＦＳ）、ファイル転送プロトコル（ＦＴＰ）、ウェブベースのディストリビューテッド・オーサリング及びバージョニング（ＷｅｂＤＡＶ）等）、及び／又はブロック・メモリ・インターフェース（例えば、スモール・コンピュータ・システム・インターフェース（ＳＣＳＩ）、インターネット・スモール・コンピュータ・システム・インターフェース（ｉＳＣＳＩ）等）を模倣するように機能する。ＤＳＮインターフェース・モジュール７６及び／又はネットワーク・インターフェース・モジュール７０は、図１のインターフェース３０〜３３の１つ又は複数として機能することができる。ＩＯデバイス・インターフェース・モジュール６２及び／又はメモリ・インターフェース・モジュール６６〜７６は、集合的に又は個々にＩＯポートと呼ぶことができることに留意されたい。
【００１９】
図３は、データの分散ストレージ・エラー符号化の一例の模式的ブロック図である。コンピューティング・デバイス１２又は１６が格納すべきデータを有するとき、コンピューティング・デバイス１２又は１６は、分散ストレージ・エラー符号化パラメータに基づく分散ストレージ・エラー符号化プロセスに従って、データを分散ストレージ・エラー符号化する。分散ストレージ・エラー符号化パラメータは、符号化関数（例えば、情報分散アルゴリズム、リード・ソロモン（Reed-Solomon）、コーシー・リード・ソロモン（CauchyReed-Solomon）、系統的符号化、非系統的符号化、オンライン・コード等）、データ・セグメント化プロトコル（例えば、データ・セグメント・サイズ、固定、可変等）、及びデータ・セグメント毎の符号化値を含む。データ・セグメント毎符号化値は、データ・セグメントの符号化当たりの（すなわち、符号化データ・スライスのセット内の）符号化データ・スライスの総数又はピラー幅（pillar width）数（Ｔ）；データ・セグメントを回復するのに必要な符号化データ・スライス・セットの符号化データ・スライスの復号閾値数（Ｄ）；データ・セグメントを復号するためにストレージから読み出すべきセット当たりの符号化データ・スライスの数を示す、符号化データ・スライスの読み出し閾値数（Ｒ）；及び／又は符号化データ・セグメントが適切に格納されたと見なされるまでに正確に格納されなければならないセット当たりの符号化データ・スライスの数を示す、書き込み閾値数（Ｗ）を含む。分散ストレージ・エラー符号化パラメータは、スライス（slicing）情報（例えば、各データ・セグメントに対して作成される符号化データ・スライスの数）、及び／又はスライス・セキュリティ情報（例えば、符号化データ・スライス毎の、暗号化、圧縮、完全性チェックサム等）をさらに含むことができる。
【００２０】
本例において、符号化関数としてコーシー・リード・ソロモンが選択され（一般的な例が図４に示され、特定の例が図５に示される）、データ・セグメント化プロトコルは、データ・オブジェクトを固定サイズのデータ・セグメントに分割することであり、データ・セグメント毎符号化値は、ピラー幅５、復号閾値３、読み出し閾値４、及び書き込み閾値４を含む。データ・セグメント化プロトコルに従って、コンピューティング・デバイス１２又は１６は、データ（例えば、ファイル（テキスト、ビデオ、音声等）、データ・オブジェクト、又は他のデータ配列）を複数の固定サイズのデータ・セグメント（例えば、キロバイトからテラバイト又はそれを上回る範囲の、１乃至Ｙの固定サイズ）に分割する。作成されるデータ・セグメントの数は、データのサイズ及びデータ・セグメント化プロトコルに依存する。
【００２１】
次に、コンピューティング・デバイス１２又は１６は、選択された符号化関数（例えば、コーシー・リード・ソロモン）を用いてデータ・セグメントを分散ストレージ・エラー・符号化し、符号化データ・スライスのセットを生成する。図４は、一般的なコーシー・リード・ソロモン符号化関数を示し、これは、符号化行列（encoding matrix、ＥＭ）、データ行列（ＤＭ）、及びコード化行列（codedmatrix、ＣＭ）を含む。符号化行列（ＥＭ）のサイズは、選択されたデータ・セグメント毎符号化値のピラー幅数（Ｔ）及び復号閾値数（Ｄ）に依存する。データ行列（ＤＭ）を生成するために、データ・セグメントは、複数のデータブロックに分割され、データブロックは、１行当たりＺのデータブロックを有する数Ｄの行に配列される。Ｚは、データ・セグメントから作成されるデータブロックの数及び復号閾値数（Ｄ）の関数であることに留意されたい。コード化行列は、データ行列に符号化行列を行列乗算することによって生成される。
【００２２】
図５は、ピラー数（Ｔ）５及び復号閾値数３の、コーシー・リード・ソロモン符号化の特定の例を示す。この例において、第１のデータ・セグメントは、１２個のデータブロック（Ｄ１〜Ｄ１２）に分割される。コード化行列は、５行のコード化データブロックを含み、ここで第１の行Ｘ１１〜Ｘ１４は、第１の符号化データスライス（ＥＤＳ１＿１）に対応し、第２の行Ｘ２１〜Ｘ２４は、第２の符号化データスライス（ＥＤＳ２＿１）に対応し、第３の行Ｘ３１〜Ｘ３４は、第３の符号化データスライス（ＥＤＳ３＿１）に対応し、第４の行Ｘ４１〜Ｘ４４は、第４の符号化データスライス（ＥＤＳ４＿１）に対応し、第５の行Ｘ５１〜Ｘ５４は、第５の符号化データスライス（ＥＤＳ５＿１）に対応する。ＥＤＳの名称の２番目の数は、データ・セグメント数に対応することに留意されたい。
【００２３】
図３の検討に戻ると、コンピューティング・デバイスはまた、符号化データ・スライスのセット内の各符号化データスライス（ＥＤＳ）についてのスライス名（ＳＮ）も作成する。スライス名８０の典型的な形式が、図６に示される。図示のように、スライス名（ＳＮ）８０は、符号化データ・スライスのピラー数（例えば、１〜Ｔのうちの１つ）、データ・セグメント数（例えば、１〜Ｙのうちの１つ）、ボールト識別子（ＩＤ）、データ・オブジェクト識別子（ＩＤ）を含み、さらに符号化データ・スライスのリビジョン（revision）レベル情報を含むことができる。スライス名は、少なくとも部分的に、ＤＳＮメモリ２２への格納及びそこからの取り出しための符号化データ・スライスのためのＤＳＮアドレスとして機能する。
【００２４】
符号化の結果として、コンピューティング・デバイス１２又は１６は、複数の符号化データ・スライスのセットを生成し、これらには、格納用のストレージ・ユニットに対するそれぞれのスライス名が与えられる。図示のように、第１の符号化データ・スライスのセットは、ＥＤＳ１＿１からＥＤＳ５＿１までを含み、第１のスライス名のセットは、ＳＮ１＿１からＳＮ５＿１までを含み、最後の符号化データ・スライスのセットは、ＥＤＳ１＿ＹからＥＤＳ５＿Ｙまでを含み、最後のスライス名のセットは、ＳＮ１＿ＹからＳＮ５＿Ｙまでを含む。
【００２５】
図７は、図４の例において分散ストレージ・エラー符号化されて格納されたデータ・オブジェクトの、分散ストレージ・エラー復号の一例の模式的ブロック図である。この例において、コンピューティング・デバイス１２又は１６は、ストレージ・ユニットから、少なくとも、データ・セグメント毎の復号閾値数の符号化データ・スライスを取り出す。特定の例として、コンピューティング・デバイスは、読出し閾値数の符号化データ・スライスを取り出す。
【００２６】
復号閾値数の符号化データ・スライスからのデータ・セグメントを回復するために、コンピューティング・デバイスは、図８に示すような復号関数を用いる。図示のように、復号関数は、本質的に図４の符号化関数の逆行列である。コード化行列は、復号閾値数（例えば、この例では３）の行を含み、復号行列は、コード化行列の対応する行を含む符号化行列の逆行列である。例えば、コード化行列が行１、２及び４を含む場合、符号化行列を行１、２及び４に減らし、次いで逆行列にして、復号行列を生成する。
【００２７】
図９は、同じスライス名のセットを有する符号化データ・スライスのセットに対する、重複する書き込み要求の例の模式的ブロック図である。書き込み要求の重複は、書き込み要求の１つのセットが保留中の（例えば、書き込みファイナライズ（finalize)コマンドがまだ発行されていない）ときに生じ、同じスライス名のセットを有する符号化データ・スライスのセットに対する書き込み要求の別のセットを、ストレージ・ユニットにより受け取る。この例では、コンピューティング・デバイスＡ及びＢは、同じスライス名のセットを有する符号化データ・スライスのセットに関する重複する書き込み要求を送る。
【００２８】
重複する書き込み要求（及び他の重複するデータ・アクセス要求）を処理するために、各ストレージ・ユニット３６（ＳＵ＃１〜ＳＵ＃５）は、スライス名又スライス名のグループについての、それぞれの提案記録（proposal record）９０−１乃至９０−５を格納する。提案記録９０は、保留中のトランザクション９２の順序付きリスト（ordered list）９２を含み、符号化データ・スライス（ＥＤＳ）９４の、可視の異なるバージョンの順序付きリストは、同じスライス名を有する。提案記録９０は、符号化データ・スライスの現在のリビジョン・レベルの表示をさらに含むことができる。
【００２９】
保留中のトランザクション９２の順序付きリストは、提案記録がオープンである（例えば、保留中の書き込み要求の１つに対して、書き込みファイナライズ・コマンドがまだ発行されていない）間に受け取ったスライス名に関するデータ・アクセス要求と関連した、トランザクション番号の時間順序リスト、又は他の表示を含む。例えば、ストレージ・ユニット＃１の提案記録９０−１は、スライス名のセットの第１のスライス名に関するデータ・アクセス要求に対するトランザクション番号の順序付きリストを含む。
【００３０】
特定の例として、第１のスライス名を有する符号化データ・スライスのバージョンに関するコンピューティング・デバイスＡからの第１の書き込み要求は、第１のトランザクション番号（例えば、０４１３）を有し、第１のスライス名を有する符号化データ・スライスの別のバージョンに関するコンピューティング・デバイスＢからの第２の書き込み要求は、第２のトランザクション番号（例えば、０２７９）を有する。ストレージ・ユニット＃１は、第２の書き込み要求を受け取る前に第１の書き込み要求を受け取っており、従って、提案記録９０−１は、第１の優先順位位置にある第１の書き込み要求（例えば、第１のトランザクション番号）、及び第２の優先順位位置にある第２の書き込み要求を有する。
【００３１】
別の特定の例として、第２のスライス名を有する符号化データ・スライスのバージョンに関するコンピューティング・デバイスＡからの書き込み要求は、第１のトランザクション番号（例えば、０４１３）を有し、第２のスライス名を有する符号化データ・スライスの別のバージョンに関するコンピューティング・デバイスＢからの書き込み要求は、第２のトランザクション番号（例えば、０２７９）を有する。ストレージ・ユニット＃２は、コンピューティング・デバイスＡから書き込み要求を受け取る前に、コンピューティング・デバイスＢから書き込み要求を受け取っている。従って、提案記録９０−２は、第１の優先順位位置にあるコンピューティング・デバイスＢの書き込み要求（例えば、第２のトランザクション番号）、及び第２の優先順位位置にあるコンピューティング・デバイスＡからの書き込み要求を有する。残りのストレージ・ユニットは、同様の方法でそれぞれの提案記録を生成する。
【００３２】
一般に、ストレージ・ユニットは、スライス名を有する符号化データ・スライスのバージョンに対する新しい書き込み要求を受け取ったとき、提案記録を「オープンする」（すなわち、他の書き込み要求は保留中でなくなる）。ストレージ・ユニットは、書き込み要求を送っているコンピューティング・デバイスに提案記録を送る。スライス名のセットを有する符号化データ・スライスのセットに対する重複する書き込み要求がない場合、他のストレージ・ユニット（ＳＵ＃２〜ＳＵ＃５）は、提案記録をオープンし、それらをコンピューティング・デバイスに送る。
【００３３】
コンピューティング・デバイスは、提案記録をインターセプトし、閾値数の又はそれより多い（例えば、デコード閾値数、書き込み閾値数等）の書き込み要求が、第１の優先順位位置にあるかどうかを判断する。重複する書き込み要求がない場合、書き込み要求は、第１の優先順位位置にある。従って、コンピューティング・デバイスは、ファイナライズ要求をストレージ・ユニットに送る。ストレージ・ユニットは、ファイナライズ要求を処理して、新しいバージョンの符号化データ・スライスを最新の符号化データ・スライスのセットにし、それぞれの提案記録を閉じる。
【００３４】
重複する書き込み要求がある（例えば、ストレージ・ユニットが、スライス名についてのオープンな提案記録を有する）場合、ストレージ・ユニットは、新しい書き込み要求を、前に受け取った保留中の書き込み要求よりも低い優先順位位置に置くことにより、新しい書き込み要求で提案記録を更新する。提案記録を更新した後、ストレージ・ユニットは、提案記録を、新しい書き込み要求を送ったコンピューティング・デバイスに送る。
【００３５】
コンピューティング・デバイスが提案記録を受け取ると、コンピューティング・デバイスは、少なくとも閾値数のそれぞれの書き込み要求が第１の優先順位位置にあるかどうかを判断する。肯定である場合、コンピューティング・デバイスは、ファイナライズ・コマンドを発行すする。肯定ではない場合、コンピューティング・デバイスは、その書き込み要求を取り消すか、又は何らかの他のフォールバック位置を実行する。
【００３６】
２つの書き込み要求に加えて、コンピューティング・デバイスＣは、符号化データ・スライス９８のセットに対する読み取り要求をストレージ・ユニットに送っている。ストレージ・ユニットは、読み取り要求をそれぞれの提案記録に付加し、更新した提案記録をコンピューティング・デバイスＣに送る。提案記録を受け取ると、コンピューティング・デバイスＣは、読み取り要求（例えば、符号化データ・スライスのセットの現在のリビジョン・レベルを読み取る）を続行するか、又は読み取り要求を終了させるかを判断する。代案として、コンピューティング・デバイスＣは、提案記録を処理して、コンピューティング・デバイスＡ又はコンピューティング・デバイスＢからの新しい符号化データ・スライスのセットが、符号化データ・スライスのセットの次の現バージョンになると判断する。この判断を行うと、コンピューティング・デバイスＣは、符号化データ・スライスのセットの次の現バージョンを読み取るように、その読み取り要求を修正する。
【００３７】
図１０は、図９の書き込み要求９６又１００の例の模式的ブロック図である。書き込み要求は、トランザクション番号フィールド、スライス名（ＳＮ）フィールド、符号化データ・スライス（ＥＤＳ）フィールド、現リビジョンレベル・フィールド、及び新バージョン・レベル・フィールドを含む。書き込み要求のセット内の各書き込み要求は、同じトランザクション番号、異なるスライス名、異なるＥＤＳ、同じ現リビジョン・レベル、及び同じ新リビジョン・レベルを含む。
【００３８】
図１１は、図９の読み取り要求１０２の例の模式的ブロック図である。読み取り要求は、トランザクション番号フィールド、スライス名（ＳＮ）フィールド、及び現リビジョンレベル・フィールドを含む。読み取り要求１０２のセット内の各読み取り要求は、同じトランザクション番号、異なるスライス名、及び同じ現リビジョン・レベルを含む。
【００３９】
図１２は、符号化データ・スライス９８のセットに対する重複する書き込み要求９６、１００及び読み取り要求１０２の別の例の模式的ブロック図である。この例では、コンピューティング・デバイスＡ及びＢの各々は、データ・セグメントを５つの符号化データ・スライスのセットに符号化している。従って、コンピューティング・デバイスＡ及びＢの各々は、５つの書き込み要求９６−１乃至９６−５及び１００−１乃至１００−５を生成する。コンピューティング・デバイスＡからの書き込み要求は、０４１３の同じトランザクション番号（ランダムに生成することができる、タイムスタンプとすることができる等）、異なるスライス名（ＳＮ１＿１乃至ＳＮ５＿１）、異なる符号化データ・スライス（ＥＤＳ  Ａ＿１＿１乃至ＥＤＳ  Ａ＿５＿１）、００３の同じ現リビジョン・レベル、及び００４の次のリビジョン・レベルを含む。
【００４０】
コンピューティング・デバイスＢからの書き込み要求は、０２７９の同じトランザクション番号、異なるスライス名（ＳＮ１＿１乃至ＳＮ５＿１）、異なる符号化データ・スライス（ＥＤＳ  Ｂ＿１＿１乃至ＥＤＳ  Ｂ＿５＿１）、００３の同じ現リビジョン・レベル、及び００４の次のリビジョン・レベルを含む。コンピューティング・デバイスＡからの書き込み要求とコンピューティング・デバイスＢからの読み取り要求を比較すると、書き込み要求が、同じスライス名、同じ現リビジョン・レベル、及び同じ次のリビジョン・レベルを有する。書き込み要求は、トランザクション番号及び符号化データ・スライスが異なる。
【００４１】
コンピューティング・デバイスＣは、符号化データ・スライス９８のセットに対する５つの読み取り要求を発行する。読み取り要求１０２−１乃至１０２−５は、０３３３８の同じトランザクション番号、異なるスライス名（ＳＮ１＿１乃至ＳＮ５＿１）、００３の現リビジョン・レベルを含む。書き込み要求及び読み取り要求は、ストレージ・ユニットＳＵ１乃至ＳＵ５に送られ、これらのストレージ・ユニットは、図１３を参照して説明されるように要求を処理する。
【００４２】
図１３は、ＤＳＮのストレージ・ユニットにより格納される符号化データ・スライスのセットについての提案記録の例の模式的ブロック図である。この例では、コンピューティング・デバイスとストレージ・ユニットとの間の異なる待ち時間及び／又は処理能力に起因して、書き込み要求９６及び１００、並びに読み取り要求１０２は、ほぼ同じ時間に送り出されるが、要求は、それらの要求が送信された順番ではなく、異なる時間に、及び潜在的には異なる順番で、ストレージ・ユニットにより受け取られる。
【００４３】
読み取り要求又は書き込み要求のいずれかを受け取る前に、ストレージ・ユニットは、符号化データ・スライスのセットの現リビジョン・レベルを格納する。示されるように、ストレージ・ユニットＳＵ＃１はＥＤＳ１＿１を格納し、ストレージ・ユニットＳＵ＃２はＥＤＳ２＿１を格納し、以下同様である。この例では、符号化データ・スライスの現リビジョン・レベルは、００３である。さらに、ストレージ・ユニットの各々は、それぞれの符号化データ・スライスについてのオープンな提案記録を持たない。
【００４４】
この例において、ストレージ・ユニットがデータ・アクセス要求を受け取ると、ストレージ・ユニットは、受け取ったばかりのデータ・アクセスを識別する提案記録、現リビジョン・レベル、及び符号化データ・スライスの現リビジョン・レベルが可視である（例えば、ＤＳＮのコンピューティング・デバイスによりアクセスされ得る）という表示をオープンする。提案記録をオープンすると、ストレージ・ユニットは、要求を受け取ったコンピューティング・デバイスに提案記録を送る。
【００４５】
例えば、ストレージ・ユニット１、３、４及び５の各々は、最初にコンピューティング・デバイスＡから書き込み要求を受け取った。従って、各ストレージ・ユニットは、保留中のトランザクション９２の順序付きリストと、コンピューティング・デバイスＡに送られる、ＥＤＳ９４の可視の異なるバージョンの順序付きリストとを含む提案記録を作成する。例えば、保留中のトランザクション９２−１、９２−３、９２−４及び９２−５の順序付きリストの各々は、第１の優先順位位置にある０４１３のトランザクション番号（コンピューティング・デバイスＡの書き込み要求に対するトランザクション番号）を含む。さらに、ＥＤＳ９４−１、９４−３、９４−４及び９４−５の可視の異なるバージョンの順序付きリストの各々は、符号化データ・スライスの現リビジョン・レベル及びコンピューティング・デバイスＡからの符号化データ・スライスが可視である（例えば、ＳＵ＃１の場合、ＥＤＳ１＿１及びＥＤＳ  Ａ＿１＿１は可視である）という表示を含む。
【００４６】
例を続けると、ストレージ・ユニット＃２は、最初にコンピューティング・デバイスＢから書き込み要求を受け取る。従って、ストレージ・ユニット＃２は、保留中のトランザクション９２−２の順序付きリストと、コンピューティング・デバイスＢに送られる、ＥＤＳ９４−４の可視の異なるバージョンの順序付きリストとを含む提案記録を作成する。例えば、保留中のトランザクション９２−２の順序付きリストは、第１の優先順位位置にある０２７９のトランザクション番号（コンピューティング・デバイスＢの書き込み要求に対するトランザクション番号）を含む。さらに、ＥＤＳ９４−２の可視の異なるバージョンの順序付きリストは、符号化データ・スライスの現リビジョン・レベル及びコンピューティング・デバイスＢからの符号化データ・スライスが可視である（例えば、ＥＤＳ  Ａ＿２＿１及びＥＤＳ  Ｂ＿２＿１は視認可能である）との表示を含む。
【００４７】
コンピューティング・デバイスＡから書き込み要求を受け取った後、ストレージ・ユニット１、３、４及び５は、コンピューティング・デバイスＢから書き込み要求を受け取る。従って、各ストレージ・ユニットは、その提案記録を更新し、提案記録は、コンピューティング・デバイスＡに送られる。例えば、保留中のトランザクション９２−１、９２−３、９２−４及び９２−５の順序付きリストの各々は、第２の優先順位位置にある０２７９のトランザクション番号（コンピューティング・デバイスＢの書き込み要求に対するトランザクション番号）を含むように更新される。さらに、ＥＤＳ９４−１、９４−３、９４−４及び９４−５の可視の異なるバージョンの順序付きリストの各々は、符号化データ・スライスの現リビジョン・レベル、並びにコンピューティング・デバイスＡ及びＢからの符号化データが可視である（例えば、ＳＵ＃１の場合、ＥＤＳ１＿１、ＥＤＳ  Ａ＿１＿１及びＥＤＳ  Ｂ１＿１は視認可能である）という表示を含むように更新される。
【００４８】
コンピューティング・デバイスＢから書き込み要求を受け取った後、ストレージ・ユニット２は、コンピューティング・デバイスＡから書き込み要求を受け取る。従って、ストレージ・ユニット＃２は、その提案記録を更新し、提案記録は、コンピューティング・デバイスＢに送られる。例えば、保留中のトランザクション９２−２の順序付きリストは、第２の優先順位位置にある０４１３のトランザクション番号（コンピューティング・デバイスＡの書き込み要求に対するトランザクション番号）を含む。さらに、ＥＤＳ９４−２の可視の異なるバージョンの順序付きリストは、符号化データ・スライスの現リビジョン・レベル、並びにコンピューティング・デバイスＡ及びＢからの符号化データが可視である（例えば、ＥＤＳ２＿１、ＥＤＳ  Ｂ＿２＿１及びＥＤＳ  Ａ＿２＿１は可視である）という表示を含む。
【００４９】
コンピューティング・デバイスＡ及びＢ両方から書き込み要求を受け取った後、提案記録を閉じる前、ストレージ・ユニットは、コンピューティング・デバイスＣから読み取り要求を受け取る。従って、ストレージ・ユニットの各々は、読み取り要求を含むように、その提案記録を更新する。特に、各ストレージ・ユニットは、第３の優先順位位置にある読み取り要求のトランザクション番号０２７９を含むように、保留中のトランザクション９２の順序付きリストを更新する。更新された提案記録は、コンピューティング・デバイスＣに送られる。
【００５０】
複数の符号化データ・スライスに対する更新は、単一のトランザクションの一部として達成することができる。「アトミック操作（atomic operation）」として説明されることが多いこれらの操作は、動作中、他のいずれかのプロセスが状態を読み取ること又は変更することなく（読み取り又は変更が更新される以外に）、実行することができる。アトミック操作は、事実上、単一のステップとして実行され、複数のアルゴリズムが複数の独立したプロセスを処理する（同期を必要とすることなく共有データを更新するアルゴリズム、及び同期を必要とするアルゴリズムに対して）システムにおいて重要な属性であり得る。通常のアトミック書き込み操作は、次のように実行することができる。（１）ＤＳプロセッサは、データ・オブジェクトと関連したメタデータに対するロックを取得する；（２）ＤＳ処理ユニットは、オブジェクトをメモリに書き込む；（３）ＤＳ処理ユニットは、データ・オブジェクトが書き込まれるコンテナについての割り当ての使用量を有するデータ・オブジェクトと関連したメタデータを更新する；（４）データ・オブジェクトと関連したメタデータの割り当ての更新に失敗した場合、データ・オブジェクトをメモリから削除する；及び（５）ＤＳ処理ユニットは、データ・オブジェクトと関連したメタデータに対するロックを解放する。
【００５１】
この例において、アトミック操作は、現在のトランザクションにおいて行われている全ての更新が即座に一貫性をもつことを強要し、更新中に何らかの障害が生じた場合、トランザクション全体がアボートされ、既に書き込まれたあらゆるオブジェクトがロールバックされる。関連したメタデータ更新が失敗したという理由での、既に書き込まれたデータ・オブジェクトの削除に関する非効率性に加えて、同じコンテナ内に複数の書き込みがある場合、上述したもののようなアトミック操作は、データ・オブジェクトと関連したメタデータの競合をもたらし得る。
【００５２】
ＤＳＮプロトコルは、単一の要素のアトミックな「ｃｏｍｐａｒｅ  ａｎｄ  ｓｗａｐ  ｏｆ  １  ｅｌｅｍｅｎｔ（ＣＡＳ−１）」を可能にし、ここで、アトミック・トランザクション操作で、データ・ソースをアトミックにインクリメントすることができる。複数の（任意のＮ個の）アトミックなｃｏｍｐａｒｅ  ａｎｄ  ｓｗａｐ（ＣＡＳ−Ｎ）トランザクションは、ＤＳＮプロトコルの拡張を必要とし、それは、Ｎ−要素のｃｏｍｐａｒｅ  ａｎｄ  ｓｗａｐ（ＣＡＳ−Ｎ）を可能にするように、プロトコルを用いて達成される。ＣＡＳ−Ｎは、アトミックな読み取り可視性（visibility）を有する任意の要素間の強い一貫性を提供する。ＣＡＳ−Ｎトランザクションは、（ソース（ＳＯＵＲＣＥ）、古いリビジョン（ＯＬＤ  ＲＥＶＩＳＩＯＮ）、新しいリビジョン（ＮＥＷ  ＲＥＶＩＳＩＯＮ））の形をとる「提案（proposal）」のセットから成り、ここで、トランザクションが完了するために、各提案のリビジョンの比較をアトミックに履行しなければならず、何らかの失敗があった場合、いずれのソースの更新も行われない。これは、少なくともトランザクションの間、各データ位置に（例えば、ＣＡＳ−Ｎ操作内のソースの少なくとも１つのスライスを保持する各々の関与するＤＳユニット上に）、完全な「トランザクション記述」（全ての提案のセット）を格納することにより、達成される。次に、進行中の（オープンの）トランザクションにおいてソースに遭遇するあらゆる読取者（reader）又は書込者（writer）は、そのソースに関して、新しいリビジョン又は古いリビジョンが可視であるかどうかを判断する前に、トランザクションの提案全体を検証しなければならない。場合によっては、このことは、クライアントが、トランザクション記述内で参照される以前は未知であったソースに対する付加的な要求の発行を必要とすることがある。ＣＡＳ−Ｎトランザクションが完了すると、全ての参加するＤＳユニットからトランザクション記述を除去することができ、そうしたとき、各ソースの新しいリビジョンは可視である。
【００５３】
１より多い提案者（proposer）がデータ・ソースの同じリビジョン／バージョンを同時に更新しようと試みるとき、競合が生じる。この場合、提案者は、通常、同じデータ・ソース（セグメント、又はメタデータ・オブジェクトを表すデータ・ソース）を同時に更新しようと試みる２又はそれより多いＤＳ処理ユニットである。ディストリビューテッド・ストレージ・システムにおいて強い一貫性は望ましい特性であるので、一般に、何らかの形態のコンセンサス・プロトコルが必要とされる。一般的に、システム内の全ての行為者（actor）がこうしたプロトコルに従い、強い一貫性がさらに保証される場合、複数の書込者が同じデータ・オブジェクトを更新しようと試みている場合（すなわち、「競合がある場合」）に、受理可能なように実行しながら、競合がある場合において単一のラウンドトリップでコンセンサスが達成可能であることも有利である。
【００５４】
Ｐａｘｏｓのようなプロトコルは、コンセンサス問題を処理するために、アウト・オブ・バンド式プロセスを用いて区別されるクライアントを確立するために開発された。Ｐａｘｏｓの目的は、幾つかのピア（peer）が、値に関する合意に達することである；Ｐａｘｏｓは、あるピアが何らかの値が大多数により合意されたと信じる場合、大多数が、決して異なる値に合意しないことを保証する。プロトコルは、いずれの合意も、ノードの大多数の承認を経たものでなければならないように設計される。Ｐａｘｏｓのアウト・オブ・バンド式プロセスは、ラウンドトリップを必要とし得るので、ディストリビューテッド・ストレージ・システムにオーバーヘッドを付加することがある。強い一貫性特性は、特定のリビジョン、又はＤＳＮメモリ内の何らかの名称の初期的権利（initial right）（「コンテスト（contest）」と呼ばれることもある）の上書きの際に達成される。複数のＤＳ処理ユニッは、同じＤＳＮメモリ内に格納されたデータ・ソースの同じリビジョンを更新しようと試みる場合、同じコンテストに参加する。
【００５５】
「Ｆａｓｔ  Ｐａｘｏｓ」と呼ばれるＰａｘｏｓの変形は、競合のない理想的な場合において単一のネットワーク・ラウンドトリップ時間（ＲＴＴ）にコンセンサスを確立するのを可能にするように開発された。Ｆａｓｔ  Ｐａｘｏｓは、一般に、（１）リーダー（leader）を選出し、（２）コンセンサスのために新しい値を提案するための別個の明確な段階を有する。提案をリーダー選出段階と組み合わせるＦａｓｔ  Ｐａｘｏｓ変形のための提案が、以下に示される。これは、提案メタデータをリーダー選出におけるバロット（ballot）として使用することにより行われる。このＦａｓｔ  Ｐａｘｏｓ変形は、「暗黙のリーダー選出を用いるＦａｓｔ  Ｐａｘｏｓ（Fast Paxos with Implicit Leader Election）」（ＦＰＩＬＥ）と呼ばれる。ＦＰＩＬＥは、保証される強い一貫性及び迅速な競合解決（典型的には、２ＲＴＴ）と共に、最良の場合に単一のＲＴＴ書き込みを可能にする。
【００５６】
ＦＰＩＬＥは、以下の目的を達成するように設計される：すなわち、（１）安全性（強い一貫性（読取者は受理された（accepted）値のみを見ることができる））；（２）可用性（デッドロック・フリー（常に進行し得る））；及び（３）性能（迅速な競合解決（平均ケースにおいて単一のラウンドトリップで））。
【００５７】
一般的なデータ・プロトコルは、様々な故障状態にさらされる。これらのプロトコルは、強い一貫性を提供できるが、ここで説明されるような可用性又は性能を提供しない。従来のプロトコル下では、クライアントの機能停止及びストアの停止がシステムを不確定な状態のままにすることがあり、その場合、最新の回復可能なリビジョンを判断することができないので、進行することはできない。これらのプロトコルは、クライアントが、指数バックオフの他に調整されたバックオフ機構を有さずに要求を再試行し続けることがあるという点で、不十分な競合の解決に悩まされることもある。これは、競合に遭遇した場合、長い遅延をもたらす。
【００５８】
ＦＰＩＬＥの目的は、（これに限定されるものではないが）既存のプロトコルの強い一貫性の保証を維持しながら、性能及び可用性も向上させることを含む。これらの特性は、以下により詳細に論じられる。
【００５９】
上述のように、ＣＡＳ−Ｎがディストリビューテッド・ストレージ・ネットワークに与える複数の有益な改善があるが、利点の一部として、オブジェクトの古いリビジョン又は新しいリビジョンのいずれかが可視であることの強い保証が挙げられる（Ｓｌｉｃｅｓｔｏｒ（ＩＢＭサーバ）の場合における、停電（例えば、Ｗ−Ｔ  ＳＳを超える停電）など）。これは、電力損失の際、インデックスのようなコンカレントな構造体が、破損がないことが常に保証されることを意味する。停電の場合、「部分的書き込み」はなく、全ての書き込みはアトミックである（図１３に見られるように）。これは、クライアントが機能停止した後でも、インデックス、メタデータ及び使用が常に同期していることを意味する。
【００６０】
競合が存在しない場合、単一のラウンドトリップで、書き込みをユーザに確認応答することができる。これは、書き込みの待ち時間を２分の１に減らすことにより、ＷＡＮ環境における性能を改善する。複数の書き込みが同じノードを更新している場合、大きな競合の発生したオブジェクト（委譲なしのインデックスへの連続的な書き込みのような）をより予測可能なかつ低遅延の方法で完了するのを可能にすることにより、競合のオーバーヘッドも低減される。インテント（intents）を用いれば、インデックス及び他の「導出された」構造体を非同期的に更新することができ、このことも、書き込みの成功を達成するためのラウンドトリップの数を減らす。
【００６１】
既存の及び新しく提案されたプロトコルの安全性、特性を、「強い、即時の、一貫性」の形として説明することができ、これは、多数の保証を具体化する。：ＰＦＩＬＥは、安全性の概念において、少なくともこれらの特性を含む。
（１）読取者は、成功裡に書き込まれた、すなわち、システムにより「受理された」値のみを戻すことができる（非自明性）。多くとも１つの受理された値があることができ、そこで、受理された値は、所定のリビジョンのための提案された後継者（successor）である（安全性）；
（２）全てのクライアントは、受理された値が何であるかについての決定的な最終合意を行うことができる（一貫性）；
（３）成功した書き込みの後に開始された読み取りは、常に、その書き込み又はより新しい書き込みを見る（即時性、線形化可能性(linearizability）とも呼ばれる）；
（４）Ｃｏｍｐａｒｅ  ａｎｄ  Ｓｗａｐ操作は、完全に失敗するか又は完全に成功するかのいずれかである（アトミック性）。
【００６２】
以下のセクションは、独立して動作しているクライアントの観点からプロトコル及びアルゴリズムを概説する。：
Ｃｏｍｐａｒｅ  ａｎｄ  Ｓｗａｐアルゴリズム（書き込み／更新／削除）
書込者：
書込者は、ｔｘｉｄ、リビジョン、データを各ストアに書き込む。ストアは、同じ契約を順守し、バロット内のあらゆるテーブルについて、どのラウンドがアクティブであるかも含むことを除き、ｆａｓｔ−ｃａｓｎにおいて概説された同じバロットを返す。
write(source_name, data, proposed_revision,txid, current_round, stores[],
to_rebuild, current_revision):
for i in stores.size:
//最適化：if(current_round == 0)の場合（又は、他の誰かを再構築するとき）
slice = current_round == 0 || i in to_rebuild ? get_slice(data, i) :null
ballots[i] = write(current_revision, current_round, store[i], (txid,
proposed_revision, slice)) to all W stores.
//幾つのバロットが現在のラウンドについての首位のtxidとしてのtxidを含むかを判断する
success_count = count_my_successes(ballots, current_round)
if success_count >= Threshold.WRITE:
//我々は、current_revisionを更新するために勝利した
finalize()
return Operation.SUCCESS;
else if (count_max_successes(ballots, current_round) >=Threshold.WRITE)
or contains_finalized_slice(ballots):
//この更新のために他の誰かが我々を打ち負かした、我々のスライスを除去することが安全であるとストアに伝える
withdraw_writes()
//最適化：バロットから判断できる場合、新しいデータ又はリビジョンが何であるかのヒントを与えることができる
return Operation.RETRIABLE_FAILURE
else:
//この更新のために、我々も他の誰かも決定的には勝利していない
（競合がある）
//最初に、少なくともThreshold.WRITEの成功を有するものとして決定的に除外することはできないトランザクションのセットを判断する
potential_winners = potentially_at_wt(ballots, current_round)
if potential_winners.size() == 0:
//誰もこのラウンドにおいて書き込み閾値に達することはできなかった、我々は進行するためのリーダーを決定する必要がある
excluded_candidates = [] //まだ誰も排斥されていない
leader = sloppy_leader_election(ballots, current_round,
excluded_candidates)
while leader is all inactive and below Threshold.IDA:
excluded_leaders.append(leader)
leader = sloppy_leader_election(ballots, current_round,
excluded_leaders)
//定義上、我々はアクティブなリーダーを有する（誰もいない場合、我々は依然としてアクティブである）
else if potential_winners.size() == 1:
leader = potential_winner[0] // この潜在的な勝者は、リーダー選出もすれば勝利したであろう
won the leader election
else if potential_winners.size() > 1:
//彼らが失敗したストア上で勝利した可能性があるので、我々は、これらのいずれも勝者にすることはできない
//これは、if f > min(W - WT, WT - T)の場合にのみ生じ得る
return Operation.FAILURE;
if leader == txid:
//我々はリーダーであり、次のラウンドに入る
write(data, proposed_revision, txid, (current_round + 1), stores[],{},
current_revision)
else:
//他の誰かがリーダーである
leader_successes = count_leader_successes(ballots, current_round,
leader)
if is_inactive(leader):
if (leader_successes < Threshold.IDA):
withdraw_writes()
//潜在的な勝者は、Ｔより下である（再構築不能）
//これは、if f > min(W - WT, WT - T)の場合にのみ生じ得る
return Operation.FAILURE;
else:
withdraw_writes()
if (leader_successes < Threshold.WRITE):
//リーダーのデータを再構築する、それらは、Threshold.IDAより上であるが、Threshold.WRITEより下である
//リーダーを有さないストアを得る
to_rebuild = {i for i in ballots.size if not
has_leader-revision(ballots[i])}
else:
//何も再構築する必要はない
to_rebuild = {}
write(leader-data, leader-revision, leader-txid, leader_round + 1,
stores[], to_rebuild, current_revision)
else:
//リーダーはアクティブである
withdraw_writes()
write(data, proposed_revision, txid, current_round /* notcurrent_round
+ 1 !!! */, stores[], {}, current_revision)
potentially_at_wt(ballots, current_round):
return all candidates whose first place votes + num_failures >=WT
/***
* 次のラウンドに進むことができる単一の候補のリーダーを返す（リーダーが誰であるかについて幾つかのクライアントが同意しないことがある分割がある場合）
*/
sloppy_leader_election(ballots, current_round, excluded_leaders):
valid_candidates = remove_excluded_leaders(ballots, current_round,
excluded_leaders)
m = get_max_first_places_in_round(ballots, current_round,
valid_candidates)
potential_leaders = {c in valid_candidates(ballots) | num_first_places(c)
== m}
return potential_leader having the highest txid
読み取り
読取者：
書込者に非常に類似している：
read():
ballots = 読取者は、最初に、単にＴのｓｌｉｃｅｓｔｏｒｓを読み取ることができる
if 少なくとも１つのファイナライズされたスライスを有するリビジョンのＴのスライスの場合:
rerutn そのリビジョン
else：
ＷＴを達成したソースがあるまで、又はどのソースもＷＴを達成できなくなるまで、さらに読み取り、次いで再実行する
if ＷＴを達成するリビジョンがある場合：
それが少なくともアクティブでないＷＴである場合、それを返し、そうでない場合、単に再試行する
else：
if 失敗がワイルドカードであり、どのリビジョンもＷＴを達成したことがあり得ない場合：
前のリビジョンにフォールバックすることができる
else：
leader = sloppy_leader_election(ballots, current_round)
if all_inactive(leader)及びリーダーがＷＴ（失敗を有する）の唯一の可能な達成者であり、リーダーがＴより上である場合：
それをＷＴに再構築する
else：
再試行する
アルゴリズム特性
ｆは、失敗したストアの数とする
書込者の進行を、成功、競争者の勝利による失敗、又は競争者が協働する場合に成功する再試行と定める
クレーム１：ｆ＜＝ｍｉｎ（ＷＴ−Ｔ，Ｗ−ＷＴ）である限り、書込者は常に進行する
利用可能なＷＴストアより少ない場合、書込者は、明らかに成功することはできず、従って、ｆ＜＝Ｗ−ＷＴである
Ａは、競争する書込者とし、首位の投票の数Ａが達成されたとする。ａ＋ｆ＜ＷＴの場合、我々は、アルゴリズムに記述されるように新しいラウンドを安全にオープンすることができる。そうでない場合、ａ＋ｆ＞＝ＷＴである。ａ＞＝Ｔの場合、我々は、単にそのリビジョンを回復することができ、我々の書き込みは失敗する。次に、ａ＝Ｔ−１と仮定する。我々は、ＡがＷＴを達成するのは不可能であるようになることを好む。つまり、我々は：
(W - (T - 1)) - x < WT - (T - 1)となるＸ個の「非Ａ」を必要とする（Ａ−Ｘにおいて勝利していないストアは、ＡがＷＴを達成するために必要な残りの勝利の量より少ないことが必要である）
=>
x > W - WT
次いで、必要な「非Ａ」の最小数は、x = W - WT + 1である
次いで、最大のｆは次のとおりとすることができる
f <= (W - (T - 1)) - X (Ａ−ｎｕｍ個の「非Ａ」をまだ受理していないｎｕｍ個のストアが必要)
f <= (W - (T - 1)) - (W - WT + 1)
f <= WT - T
s >= 3f + 1 (or W >= 4f + 1)
【００６３】
図１４は、ＤＳＮの処理モジュールからの提案メッセージの例の模式的ブロック図である。書き込み要求は、トランザクション番号フィールド、更新したいスライス名（ＳＮ）フィールド、処理モジュールが永続値（persistent value）であることを要求している符号化データ・スライス（ＥＤＳ）フィールド、及び提案の試行により表される、提案試行に従ってインクリメントされ得る提案識別子を含む。
【００６４】
図１５の論理図に示されるように、処理モジュールは、ステップにおいて、データ・オブジェクト格納要求を受け取り、ステップ５０４において、少なくとも閾値数のディストリビューテッド・ストレージ（ＤＳ）ユニットについての提案メッセージ（書き込み要求）を生成する。方法は、処理モジュールが提案メッセージを閾値数のＤＳユニットに伝送するステップ５０６に引き継がれる。１つのＤＳユニット（閾値数のＤＳユニットのうちの）が別の提案を受け取っていないソース名についての提案メッセージを受け取ったとき、又は、ソース名に対する全ての以前の要求がより少ないラウンドを有していた場合、ＤＳユニットは、要求を受け入れ、それが直近に受理された値であることを示す応答、並びに、それが見たあらゆる提案の表示を処理モジュールに返す。ＤＳ処理モジュールが、書き込み閾値のＤＳユニットから受理された値が、関係する最も多いラウンドに対するものであると判断した場合、その値についてコンセンサスが達成されたものとみなし、通常の一貫性保証を仮定する。この時点で、ＤＳ処理ユニットは、提案された値が、閾値数のＤＳストレージ・ユニットにより成功裡に受理されたこと、及び、その値が対象のソース名についての永続値になることを、要求者（requester）に通知する。
【００６５】
書き込み閾値数のＤＳユニットがコンセンサスを達成しなかった（すなわち、同じ提案メッセージが受理され、書き込み閾値数のＤＳユニットに対して応答が返された）場合、次に、処理モジュールは、提案メッセージ応答を調べ、他のいずれかの提案メッセージを受け取り、対象ソース名が受理されたのかどうかを判断する。提案メッセージを受け取り、閾値数のＤＳユニットにより対象ソース名が受理された場合、処理モジュールは、対象ソース名についての提案メッセージを伝送したサード・パーティの処理モジュールと共に、ＤＳユニットにより受理された提案メッセージのいずれかが、ソース名の値についてのコンセンサスを達成できるかどうか判断することができる。コンセンサス値が利用可能であると判断されると、その値を再提案することができ（すなわち、その値についての提案メッセージを再び閾値数のＤＳユニットに伝送することができ）、その提案メッセージを生成した処理モジュールがリーダーであると判断する。
【００６６】
リーダーのみが、インクリメントされたラウンドを有する値の再提案を続行することができ、対象ソース名についての提案メッセージを伝送した他の全ての処理ユニットは、この時点で、失敗（すなわち、コンテストに負けたこと）を要求者に通知するように選択することができる。全ての他の処理ユニットは、ラウンドトリップを減らすために、要求者への通知に加えて、ネットワーク効率／負荷に応じて永続値を提供することができる。
【００６７】
場合によっては、誰も明らかなリーダーでなくても、処理モジュールは（他の全ての処理モジュールと共に）、コンセンサス値として潜在的に利用可能な２つの値があると判断することができる。この場合、潜在的なコンセンサス値の両方と関連した処理モジュールは、コンセンサス値及びリーダーを判断するために。その提案メッセージを再提案することができる。この２ラウンド・システム（第２のバロット、決選投票（runoff voting)、又はバロテージ（ballotage)としても知られる）が、コンセンサスが達成されない場合に、リーダーを選択するために使用され、最も多く投票された２つを除く全ての候補値が排除され、投票の第２のラウンドが行われる。
【００６８】
当業者により理解されるように、ＤＳ処理ユニットは、安全性のためにいずれかの特定の値を提案する義務はないが、上に示されるように、値を選択する際の特定のスキームにより、競合が発生するコンテストを解決するのに必要なラウンドトリップの数を大きく減らすことができる。例えば、ＤＳ処理ユニットは、提案への応答を選出におけるバロットとみなすことができる。これらのバロットから値を選択するためのスキームの幾つかの例として、最も古いタイムスタンプを有する提案を選ぶこと、又は値の決定性関数を使用することが挙げられる。さらに、ＤＳユニットは、これらが見た提案をランク付けするように選択することができ、ＤＳ処理ユニットは、即時決選投票（instant runoff voting）（上記を参照）のようなランク付け投票スキームを使用することができる。ひとたび値が選択されると、関連したリーダーが決定され、インクリメントされたラウンドを続行し、コンテストにおけるサード・パーティ処理ユニットは、この時点で失敗するように選択するか、又は幾らかの遅延を有してその提案メッセージ自体を再試行するか、又は今の永続値及び再試行を修正することにより更新することができる。
【００６９】
指数バックオフを含む、及び／又はＤＳユニットからの情報を用いる種々のアルゴリズムを用いてこの遅延を求め、リーダーが依然としてアクティブであるかどうかを推定することができる。対象ソース名についての現在の合意された値を読み取りたいと思うＤＳ処理ユニットは、これが読み取るあらゆる値が、それを要求者に返す前に書き込み閾値に永続されていたことを保証する必要がある。いずれの値も現在のコンテストの生じている更新においてコンセンサスを達成できないと判断することができる場合、読取者は、前のソース名の値にフォールバックすることができる。付加的な最適化として、書込者は、コンセンサスを達成した後、ソース名及び値に対する「ファイナライズ」要求を送り、値に関して、コンセンサスが達成されたことをＤＳユニットに通知することができる。その後で処理モジュールが対象ソース名に対する読み取り要求を伝送する処理モジュールは、ソースがファイナライズされているおかげで、値を要求者に返す前に、値に関して書き込み閾値が達成されたことを判断するための付加的な作業を行う必要はないことになる。
【００７０】
当業者によりさらに理解されるように、Ｆａｓｔ  Ｐａｘｏｓは、（上述のように）トリム書き込み（Trimmed Writes）とうまく機能する。トリム書き込みシステムにおいて、幅−ＷＴ＝ＷＴ−閾値を構成することは一般的であり、ファイナライズ段階は、前のスライスだけでなく、成功裡に書き込まれたスライスのスライス・コンテンツもクリーンアップする新しいクリーンアップ・メッセージ（例えば、ブーリアン・フラグを有するファイナライズ・メッセージ）を挿入する理想的な位置を提供する。このフラグは、ストアに送られたファイナライズ・メッセージの多くとも（Ｗ−ＷＴ）「上に」しか設定されない。このことは、余分の（Ｗ−ＷＴ）スライスにより利用された可能性がある過剰なデータ・ストレージを解放する。
【００７１】
本明細書で使用され得る場合、ビットストリーム、ストリーム、信号シーケンス等（又はその均等物）などの用語は、そのコンテンツが多数の所望のタイプ（例えば、いずれも一般に「データ」と呼ぶことができるデータ、ビデオ、スピーチ、音声等）のいずれかに対応するデジタル情報を記述するために互換的に用いられていることに留意されたい。
【００７２】
本明細書で使用できる場合、「実質的に」及び「約」という用語は、その対応する用語及び／又は項目間の相関性について業界で受け入れられる許容範囲を与える。そのような業界で受け入れられる許容範囲は、１パーセント未満から５０パーセントまでに及び、これらに限定されるものではないが、成分値、集積回路プロセス変動、温度変動、立ち上がり及び立ち下がり時間、及び／又は熱雑音に対応する。そのような項目間の相関性は、数パーセントの差から大規模な差に及ぶ。同じく本明細書で使用できる場合、「動作可能に結合された」、「結合された」、及び／又は「結合」という用語は、項目間の直接結合、及び／又は介在する項目を介する項目間の間接結合を含み（例えば、項目は、これらに限定されるものではないが、コンポーネント、要素、回路、及び／又はモジュール）、ここで、間接結合については、介在する項目は、信号の情報を変更しないが、その電流レベル、電圧レベル、及び／又は電力レベルを調整することができる。さらに本明細書で使用できる場合、推論結合（inferred coupling）（すなわち、１つの要素が別の要素に推論によって結合される）は、「結合される」と同じように２つの項目間の直接及び間接結合を含む。さらに本明細書で使用できる場合、「動作可能」又は「動作可能に結合された」という用語は、項目が、アクティブにされたときに１つ又は複数の対応する機能を実行するための電力接続、入力、出力等のうちの１つ又は複数を含むことを示し、１つ又は複数の他の項目に推論結合することをさらに含むことができる。さらに本明細書で使用できる場合、「関連付けられた」という用語は、別個の項目、及び／又は別の項目内に埋め込まれている１つの項目の直接及び／又は間接結合を含む。
【００７３】
本明細書で使用できる場合、「比較して好ましい（compares favorably）」という用語は、２つ又はそれより多い項目、信号等の間の比較が望ましい関係を与えることを示す。例えば、望ましい関係が、信号１が信号２より大きい強さを有することである場合、信号１の強さが信号２の強さよりも大きいとき、又は信号２の強さが信号１の強さよりも小さいときに、好ましい比較が達成され得る。本明細書で使用し得る場合、「比較して好ましくない（compares unfavorably）」という用語は、２つ又はそれより多い項目、信号等の間の比較が所望の関係を与えないことを示す。
【００７４】
また本明細書で使用できる場合、「処理モジュール」、「処理回路」、及び／又は「処理ユニット」という用語は、単一の処理デバイス又は複数の処理デバイスであり得る。そのような処理デバイスは、マイクロプロセッサ、マイクロコントローラ、デジタル・シグナル・プロセッサ、マイクロコンピュータ、中央処理装置、フィールド・プログラマブル・ゲート・アレイ、プログラマブル論理デバイス、状態機械、論理回路、アナログ回路、デジタル回路、及び／又は回路のハード・コーディング及び／又は操作命令に基づいて信号（アナログ及び／又はデジタル）を操作する任意のデバイスであり得る。処理モジュール、モジュール、処理回路、及び／又は処理ユニットは、メモリ及び／又は集積メモリ要素であることができ、又はそれらをさらに含むことができ、それらは、単一のメモリ・デバイス、複数のメモリ・デバイス、及び／又は別の処理モジュール、モジュール、処理回路、及び／又は処理ユニットの組み込み回路であり得る。そのようなメモリ・デバイスは、読み出し専用メモリ、ランダム・アクセス・メモリ、揮発性メモリ、不揮発性メモリ、スタティック・メモリ、ダイナミック・メモリ、フラッシュ・メモリ、キャッシュメモリ、及び／又はデジタル情報を格納する任意のデバイスであり得る。処理モジュール、モジュール、処理回路、及び／又は処理ユニットが１つより多い処理デバイスを含む場合、処理デバイスは、中央に配置されてよく（例えば、有線及び／又は無線のバス構造を介して一緒に直接結合される）、又は分散して配置されてもよい（例えば、ローカル・エリア・ネットワー及び／又は広域ネットワークを介した間接結合によるクラウド・コンピューティング）ことに留意されたい。さらに、処理モジュール、モジュール、処理回路、及び／又は処理ユニットが、状態機械、アナログ回路、デジタル回路、及び／又は論理回路を介してその機能の１つ又は複数を実装する場合、対応する操作命令を格納するメモリ及び／又はメモリ要素は、状態機械、アナログ回路、デジタル回路、及び／又は論理回路を含む回路の内部又は外部に組み込まれ得ることに留意されたい。さらに、図の１つ又は複数に示されるステップ及び／又は機能の少なくとも幾つかに対応するハード・コード命令及び／又は操作命令を、メモリ要素が格納し、処理モジュール、モジュール、処理回路、及び／又は処理ユニットが実行することができることにも留意されたい。そのようなメモリ・デバイス又はメモリ要素は、製造品内に含まれ得る。
【００７５】
１つ又は複数の実施形態は、指定された機能及びその関係の性能を示す方法ステップを用いて上記に説明されている。これらの機能的な基本構成要素（functional building block）及び方法ステップの範囲及びシーケンスは、説明の便宜のために本明細書では任意に定められている。指定された機能及び関係が適切に実施される限り、代替的な範囲及びシーケンスを定めることもできる。従って、いずれのそのような代替的な範囲又はシーケンスも、特許請求される発明の範囲内にある。さらに、これらの機能的基本構成要素の範囲は、説明の便宜のために任意に定められている。特定の重要な機能が適切に実施される限り、代替的な範囲を定めることができる。同様に、フロー図のブロックは、特定の重要な機能を示すために本明細書では任意に定められ得る。
【００７６】
使用される範囲において、フロー図のブロックの範囲及びシーケンスは、別様に定められてもよく、依然として特定の重要な機能を実施することができる。従って、機能的基本構成要素及びフロー図のブロックの両方のそうした代替的定義は、特許請求される発明の範囲内にある。当業者であれば、本明細書における機能的基本構成要素、及び他の例示的なブロック、モジュール、及びコンポーネントは、例示されたように実装されてよく、又は個別部品、特定用途向け集積回路、適切なソフトウェアなどを実行するプロセッサ、又はこれらの任意の組み合わせによって実装されてもよいことも認識するであろう。
【００７７】
加えて、フロー図は、「開始」及び／又は「続行」の表示を含むことができる。「開始」及び「続行」表示は、提示されたステップを他のルーチンに任意に組み込むことができること又は別様に他のルーチンと関連して用いることできることを反映する。この文脈において、「開始」は、提示された最初のステップの始まりを示すものであり、具体的に示されていない他の活動がその前に先立っていてもよい。さらに、「続行」表示は、提示されたステップを複数回実行することができること、及び／又は具体的に示されていない他の活動がその後に続いていてもよいことを反映する。さらに、フロー図は、ステップの特定の順序を示すが、因果律が維持される条件で、他の順序も同様に可能である。
【００７８】
１つ又はそれ以上の実施形態は、本明細書において、１つ又は複数の態様、１つ又は複数の特徴、１つ又は複数の概念、及び／又は１つ又は複数の例を示すために使用されている。装置、製品、機械、及び／又はプロセスの物理的実施形態は、本明細書で論じられる実施形態の１つ又は複数を参照して説明される態様、特徴、概念、例等の１つ又は複数を含み得る。さらに、図ごとに、実施形態は、同じ若しくは異なる参照番号を使用することができる同じ又は類似した名前の機能、ステップ、モジュール等を組み込んでもよく、従って、それらの機能、ステップ、モジュール等は、同じ又は類似した機能、ステップ、モジュール等であってもよく、又は異なるものであってもよい。
【００７９】
特に記述されていない限り、本明細書に提示された図面のいずれかの図における要素への、要素からの、及び／又は要素間の信号は、アナログ又はデジタル、連続時間又は離散時間、及びシングルエンド又は差動であり得る。例えば、信号経路がシングルエンド経路として示されている場合、それは差動信号経路も表す。同様に、信号経路が差動経路として示されている場合、それはシングルエンド信号経路も表す。１つ又は複数の特定のアーキテクチャが本明細書に説明されるが、当業者により認識されるように、明確に示されていない１つ又は複数のデータ・バス、要素間の直接接続、及び／又は他の要素間の間接結合を使用する他のアーキテクチャが同様に実装されてもよい。
【００８０】
「モジュール」という用語は、本発明の種々の実施形態の説明で使用される。モジュールは、本明細書で説明され得るような１つ又は複数の機能を実行するための処理モジュール、機能ブロック、ハードウェア、及び／又はメモリ上に格納されたソフトウェアを含む。モジュールがハードウェアによって実装される場合、ハードウェアは、ソフトウェア及び／又はファームウェアと独立して及び／又は関連して動作することができることに留意されたい。本明細書で使用される場合、モジュールは、１つ又は複数のサブ・モジュールを含むことができ、サブ・モジュールの各々は、１つ又は複数のモジュールであり得る。
【００８１】
本明細書においてさらに使用し得るように、コンピュータ可読メモリは、１つ又は複数のメモリ要素を含む。メモリ要素は、別個のメモリ・デバイス、複数のメモリ・デバイス、又はメモリ・デバイス内のメモリ位置の集合とすることができる。このようなメモリ・デバイスは、読出し専用メモリ、ランダム・アクセス・メモリ、揮発性メモリ、不揮発性メモリ、静的メモリ、動的メモリ、フラッシュ・メモリ、キャッシュメモリ、及び／又はデジタル情報を格納するあらゆるデバイスとすることができる。メモリ・デバイスは、固体メモリ、ハードドライブメモリ、クラウドメモリ、サムドライブ、サーバメモリ、コンピューティング・デバイスメモリ、及び／又はデジタル情報を格納するための他の物理媒体の形態とすることができる。
【００８２】
本発明の種々の機能及び特徴の特定の組み合わせが本明細書で明示的に説明されているが、これらの特徴及び機能の他の組み合わせも同様に可能である。本発明は、本明細書に開示された特定の例により限定されるものではなく、これらの他の組み合わせを明白に組み込む。
【符号の説明】
【００８３】
１〜５：ストレージ・ユニット
１０：分散又はディストリビューテッド・ストレージ・ネットワーク（ＤＳＮ）
１２〜１６、Ａ、Ｂ、Ｃ：コンピューティング・デバイス
１８：管理ユニット
２０：完全性処理ユニット
２２：ＤＳＮメモリ
２４：ネットワーク
２６：コンピューティング・コア
３０〜３３：ネットワーク・インターフェース
３４：クライアント・モジュール
３６：ストレージ・ユニット
４０：データ・オブジェクト
５０：処理モジュール
５２：メモリ・コントローラ
５４：メイン・メモリ
５５：ビデオ・グラフィック処理ユニット
５６：入力／出力（ＩＯ）コントローラ
５８：周辺コンポーネント相互接続（ＰＣＩ）インターフェース
６０：ＩＯインターフェース・モジュール
６２：ＩＯデバイス・インターフェース・モジュール
６４：読み出し専用メモリ（ＲＯＭ）基本入出力システム（ＢＩＯＳ）
６６：ユニバーサル・シリアル・バス（ＵＳＢ）インターフェース・モジュール
６８：ホスト・バス・アダプタ（ＨＢＡ）インターフェース・モジュール
７０：ネットワーク・インターフェース・モジュール
７２：フラッシュ・インターフェース・モジュール
７４：ハード・ドライブ・インターフェース・モジュール
７６：ＤＳＮインターフェース・モジュール
８０：スライス名
９０、９０−１〜９０−５：提案記録
９２、９２−１〜９２−５：保留中のトランザクション
９４、９４−１〜９４−５：符号化データ・スライス（ＥＤＳ）
９６、９６−１〜９６−５、１００、１００−１〜１００−５：書き込み要求
９８：符号化データ・スライス
１０２、１０２−１〜１０２−５：読み取り要求
【図１】
2020524324.tif 000003
【図２】
2020524324.tif 000004
【図３】
2020524324.tif 000005
【図４】
2020524324.tif 000006
【図５】
2020524324.tif 000007
【図６】
2020524324.tif 000008
【図７】
2020524324.tif 000009
【図８】
2020524324.tif 000010
【図９】
2020524324.tif 000011
【図１０】
2020524324.tif 000012
【図１１】
2020524324.tif 000013
【図１２】
2020524324.tif 000014
【図１３】
2020524324.tif 000015
【図１４】
2020524324.tif 000016
【図１５】
2020524324.tif 000017
【手続補正書】
【提出日】令和2年6月9日(2020.6.9)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピューティング・デバイスであって、
分散又はディストリビューテッド・ストレージ・ネットワーク（ＤＳＮ）とインターフェース接続し、通信するように構成されたインターフェースと、
操作命令を格納するメモリと、
前記インターフェース及び前記メモリに動作可能に結合された処理モジュールと、
を含み、前記処理モジュールは、前記操作命令に基づいて前記コンピューティング・デバイス内で動作可能なとき、
要求中のコンピューティング・デバイスから、前記ＤＳＮを介して、データ・オブジェクトを複数のディストリビューテッド・ストレージ（ＤＳ）ユニット内に格納する要求を受け取ることと、
前記データ・オブジェクトと関連したソース名、前記ソース名についての第１の値、及び提案試行識別子を含む提案メッセージを生成することと、
前記提案メッセージを前記複数のＤＳユニットに伝送することと、
前記提案メッセージに応答して、前記複数のＤＳユニットから閾値数の提案メッセージ応答を受け取ることであって、前記閾値数の提案メッセージ応答のうちの１つの提案メッセージ応答は、前記複数のＤＳユニットのうちの１つのＤＳユニットから受け取られ、前記ＤＳユニットにより直近に受理された、前記ソース名についての第２の値に対応し、前記複数のＤＳユニットのうちの前記ＤＳユニットが他のいずれかの提案メッセージを受け取ったかどうかをさらに示す、受け取ることと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、前記提案メッセージ内に含まれる前記ソース名についての前記第１の値を、前記ソース名についての永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより、少なくとも１つの他の提案メッセージを受け取っていることを示すとき、前記複数のＤＳユニットからの前記閾値数の提案メッセージ応答に基づいて、前記ソース名についての第３の値を、前記ソース名についての前記永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
を行うように構成される、コンピューティング・デバイス。
【請求項２】
前記永続値は、前記処理モジュールによる決定性関数の実行に基づいて決定される、請求項１に記載のコンピューティング・デバイス。
【請求項３】
前記ソース名についての前記第３の値は、前記ソース名についての前記第２の値に等しい、請求項１に記載のコンピューティング・デバイス。
【請求項４】
前記決定性関数は、前記ソース名についての提案メッセージ応答を受け取る他の処理ユニットによりさらに実行され、さらに、前記決定性関数の実行は、前記ソース名についての前記第３の値をもたらす、請求項２に記載のコンピューティング・デバイス。
【請求項５】
前記永続値は、前記処理モジュールにより実行されるバロット・プロセスに基づいて決定される、請求項１に記載のコンピューティング・デバイス。
【請求項６】
前記バロット・プロセスは、前記提案メッセージと関連したタイムスタンプに基づいてバロット値を選択することを含む、請求項５に記載のコンピューティング・デバイス。
【請求項７】
前記バロット・プロセスは、２つの潜在的な永続値をもたらし、前記永続値は、前記２つの潜在的な永続値と関連した第２の処理モジュール及び第３の処理モジュールが、それぞれ、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に伝送された提案メッセージを再伝送した後、前記潜在的な永続値から選択される、請求項５に記載のコンピューティング・デバイス。
【請求項８】
他選択処理モジュールは前記第３の値と関連付けられ、前記第３の値は、前記他選択処理モジュールが、前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送した後、決定される、請求項１に記載のコンピューティング・デバイス。
【請求項９】
前記他選択処理モジュールにより前記処理モジュールが前記閾値数の提案メッセージを受け取った後に前記第３の値と関連した提案メッセージを伝送することは、前記他選択処理モジュールが、前記第３の値と関連した前記提案メッセージが前記永続値についての好ましい候補値を含むと判断することに基づく、請求項８に記載のコンピューティング・デバイス。
【請求項１０】
分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法であって、前記方法は、
要求中のコンピューティング・デバイスから、前記ＤＳＮを介して、データ・オブジェクトを複数のディストリビューテッド・ストレージ（ＤＳ）ユニット内に格納する要求を受け取ることと、
前記データ・オブジェクトと関連したソース名、前記ソース名についての第１の値、及び提案試行識別子を含む提案メッセージを生成することと、
前記提案メッセージを前記複数のＤＳユニットに伝送することと、
前記提案メッセージに応答して、前記複数のＤＳユニットから閾値数の提案メッセージ応答を受け取ることであって、前記閾値数の提案メッセージ応答のうちの１つの提案メッセージ応答は、前記複数のＤＳユニットのうちの１つのＤＳユニットから受け取られ、前記ＤＳユニットにより直近に受理された、前記ソース名についての第２の値に対応し、前記複数のＤＳユニットのうちの前記ＤＳユニットが他のいずれかの提案メッセージを受け取ったかどうかをさらに示す、受け取ることと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより他の提案メッセージを受け取っていないことを示すとき、前記提案メッセージ内に含まれる前記ソース名についての前記第１の値を、前記ソース名についての永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
前記複数のＤＳユニットのうちの前記ＤＳユニットから受け取った前記閾値数の提案メッセージ応答のうちの前記提案メッセージ応答が、前記複数のＤＳユニットのうちの前記ＤＳユニットにより、少なくとも１つの他の提案メッセージを受け取っていることを示すとき、前記複数のＤＳユニットからの前記閾値数の提案メッセージ応答に基づいて、前記ソース名についての第３の値を、前記ソース名についての前記永続値として採用し、前記ソース名についての前記永続値を前記要求中のコンピューティング・デバイスに通知することと、
を含む、方法。
【請求項１１】
分散ストレージ・ネットワーク（ＤＳＮ）の１つ又は複数のコンピューティング・デバイスの１つ又は複数の処理モジュールにより実行するための方法であって、前記方法は、
コンピューティング・デバイスにより、分散ストレージ・ネットワーク（ＤＳＮ）の閾値数のストレージ・ユニットに向けられたアクセス要求を受け取ることであって、前記アクセス要求は、ソース名と関連した値についてのものであり、さらに、前記コンピューティング・デバイスは、前記閾値数のストレージ・ユニットのうちの少なくとも幾つかから１つ又複数の提案メッセージ応答を受け取っている、受け取ることと、
前記ソース名と関連した前記値が、前記ソース名についての永続値であるかどうかを判断することであって、前記判断することは、前記コンピューティング・デバイスが、前記閾値数のストレージ・ユニットから閾値数の提案メッセージ応答を受け取ったことに基づき、さらに、前記判断することは、前記ソース名と関連した前記値についてコンセンサス値が決定されたことを、閾値提案メッセージ応答が示すかどうかにも基づく、判断することと、
前記ソース名と関連した前記値が前記ソース名についての前記永続値であるとき、前記ソース名と関連した前記値を前記要求中のコンピューティング・デバイスに伝送することと、
を含む、方法。
【請求項１２】
前記ソース名と関連した前記値が前記ソース名についての前記永続値でないとき、永続値を決定することができないと判断し、前記ソース名と関連した前記値についての前に格納した値を選択し、前記前に格納した値を前記要求中のコンピューティング・デバイスに伝送することをさらに含む、請求項１１に記載の方法。
【国際調査報告】
2020524324.tif 000018
2020524324.tif 000019