(57)【要約】いくつかの実施形態では、クライアントは、コンテンツ管理システムにおいてユーザアカウント上でコンテンツアイテムのローカルコピーを修正する操作を生成し、コンテンツ管理システムにおいてリビジョンのジャーナルに操作をコミットするインテント情報を記録する。この操作に基づき、クライアントは、ジャーナルに操作をコミットする第一要求をコンテンツ管理システムに送信し、第一要求がジャーナル中でクライアントの現在の位置を識別するカーソルを含む。クライアントは、コミットのステータスについての第二要求をコンテンツ管理システムに送信し、第二要求に基づき、ジャーナルへの操作のコミットが成功したかどうかを判定する。ジャーナルへの操作のコミットが成功したかどうかに基づき、クライアントは、クライアント上で１つ以上のツリーデータ構造を更新してコミットするインテント情報をクリアするべきかどうかを判定する。【選択図】図４Ａ
2021509508.tif 000002
【特許請求の範囲】
【請求項１】
方法であって、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作をクライアントデバイスにおいて生成することと、
前記コンテンツ管理システム上のリビジョンのジャーナルに前記操作をコミットするインテント情報を前記クライアントデバイスにおいて記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記クライアントデバイスによって、前記操作を前記リビジョンのジャーナルにコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナルにおける前記クライアントデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記クライアントデバイスによって、前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記クライアントデバイスによって、前記第二要求への応答を前記コンテンツ管理システムから受信することと、
前記クライアントデバイスによって、前記リビジョンのジャーナルへの前記操作の前記コミットが成功した指標を前記応答が含むかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含むかどうかに基づき、１つ以上のツリーデータ構造を前記クライアントデバイス上で更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することであって、前記１つ以上のツリーデータ構造が前記クライアントデバイス上での前記コンテンツアイテムの前記ローカルコピーの同期状態を表す、前記判定することと、
を含む、方法。
【請求項２】
前記１つ以上のツリーデータ構造は、ローカルツリー、リモートツリー、及び同期ツリーを含み、前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムのローカル状態を表し、前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおけるリモート状態を表し、前記同期ツリーが前記コンテンツアイテムと関連する前記ローカル状態と前記リモート状態との間の比較を表す、請求項１に記載の方法。
【請求項３】
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含むときに、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記クライアントデバイスにコミットする前記インテント情報をクリアすることと、
をさらに含む、請求項２に記載の方法。
【請求項４】
前記ローカルツリーを更新して前記コンテンツアイテムの前記ローカルコピーに前記修正を反映することをさらに含み、
コミットする前記インテント情報を記録することは前記操作が前記クライアントデバイスによって生成されるセルフオーサリングされた操作を含む、請求項３に記載の方法。
【請求項５】
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含まないときに、前記リモートツリーまたは前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することなく、前記クライアントデバイスにコミットする前記インテント情報をクリアすること、
をさらに含む、請求項２に記載の方法。
【請求項６】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中の前記現在の位置を識別する、請求項１に記載の方法。
【請求項７】
前記クライアントデバイスによって前記コンテンツ管理システムから、前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを取得することをさらに含み、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、請求項６に記載の方法。
【請求項８】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子について前記クライアントデバイスによって前に受信したそれぞれのリビジョン番号を含み、
前記方法は、前記それぞれのリビジョン番号が前記それぞれのネームスペース識別子に対応する前記リビジョンのジャーナルに最新のリビジョンを含むときに、前記クライアントデバイスによって前記コンテンツ管理システムから、前記コミットが成功した前記指標を受信することをさらに含む、請求項１に記載の方法。
【請求項９】
命令を含む非一時的コンピュータ可読媒体であって、
前記命令は、コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作を生成することと、
前記コンテンツ管理システム上でリビジョンのジャーナルに前記操作をコミットするインテント情報を記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記リビジョンのジャーナルに前記操作をコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナル中の前記コンピューティングデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記第二要求に基づき、前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかに基づき、前記コンピューティングデバイス上で１つ以上のツリーデータ構造を更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することであって、前記１つ以上のツリーデータ構造が前記コンピューティングデバイス上での前記コンテンツアイテムの前記ローカルコピーの同期状態を表す、前記判定することと、
を行わせる、非一時的コンピュータ可読媒体。
【請求項１０】
前記１つ以上のツリーデータ構造は、ローカルツリー、リモートツリー、及び同期ツリーを含み、前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムのローカル状態を表し、前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおけるリモート状態を表し、前記同期ツリーが前記コンテンツアイテムと関連する前記ローカル状態と前記リモート状態との間の比較を表す、請求項９に記載の非一時的コンピュータ可読媒体。
【請求項１１】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した判定に基づき、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記コンピューティングデバイスにコミットする前記インテント情報をクリアすることと、
を行わせる命令を格納する、請求項１０に記載の非一時的コンピュータ可読媒体。
【請求項１２】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記ローカルツリーを更新して前記コンテンツアイテムの前記ローカルコピーに前記修正を反映することであって、コミットする前記インテント情報を記録することは、前記操作が前記クライアントデバイスによって生成されるセルフオーサリングされた操作を含むことを示すことを含む、前記反映すること、
を行わせる命令を格納する、請求項１１に記載の非一時的コンピュータ可読媒体。
【請求項１３】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功しなかった判定に基づき、前記リモートツリーまたは前記同期ツリーを前記操作に基づき更新することなく、前記クライアントデバイスにコミットする前記インテント情報をクリアすること、
を行わせる命令を格納する、請求項１０に記載の非一時的コンピュータ可読媒体。
【請求項１４】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中で前記現在の位置を識別し、
前記非一時的コンピュータ可読媒体は、前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを前記コンテンツ管理システムから取得することであって、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、前記取得すること、
を行わせる命令を格納する、請求項９に記載の非一時的コンピュータ可読媒体。
【請求項１５】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子について前記クライアントデバイスによって前に受信したそれぞれのリビジョン番号を含み、
前記非一時的コンピュータ可読媒体は、前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記コンテンツ管理システムから、前記第二要求への応答を受信することであって、前記それぞれのリビジョン番号が前記それぞれのネームスペース識別子に対応する前記リビジョンのジャーナルに最新のリビジョンを含むときに前記コミットが成功したことを前記応答が示す、前記受信すること、
を行わせる、命令を格納する、請求項９に記載の非一時的コンピュータ可読媒体。
【請求項１６】
１つ以上のプロセッサと、
少なくとも１つの非一時的コンピュータ可読媒体であって、その中に命令を格納し、前記命令が前記１つ以上のプロセッサによって実行されるときに、コンピューティングデバイスに、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作を生成することと、
前記コンテンツ管理システムにおいてリビジョンのジャーナルに前記操作をコミットするインテント情報を記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記リビジョンのジャーナルに前記操作をコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナル中の前記コンピューティングデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記第二要求に基づき、前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかに基づき、前記コンピューティングデバイス上で１つ以上のツリーデータ構造を更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することであって、前記１つ以上のツリーデータ構造が前記コンピューティングデバイス上での前記コンテンツアイテムの前記ローカルコピーの同期状態を表す、前記判定することと、
を行わせる、前記少なくとも１つの非一時的コンピュータ可読媒体と、
を備える、コンピューティングデバイス。
【請求項１７】
前記１つ以上のツリーデータ構造は、ローカルツリー、リモートツリー、及び同期ツリーを含み、前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムのローカル状態を表し、前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおけるリモート状態を表し、前記同期ツリーが前記コンテンツアイテムと関連する前記ローカル状態と前記リモート状態との間の比較を表す、請求項１６に記載のコンピューティングデバイス。
【請求項１８】
前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した判定に基づき、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記コンピューティングデバイスにコミットする前記インテント情報をクリアすることと、
を行わせる、命令を格納する、請求項１７に記載のコンピューティングデバイス。
【請求項１９】
前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功しなかった判定に基づき、前記リモートツリーまたは前記同期ツリーを前記操作に基づき更新することなく、前記クライアントデバイスにコミットする前記インテント情報をクリアすること、
を行わせる、命令を格納する、請求項１７に記載のコンピューティングデバイス。
【請求項２０】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中の前記現在の位置を識別し、
前記非一時的コンピュータ可読媒体は、前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記コンテンツ管理システムから、前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを取得することであって、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、前記取得すること、
を行わせる、命令を格納する、請求項１６に記載のコンピューティングデバイス。
【発明の詳細な説明】
【関連出願へのクロスリファレンス】
【０００１】
本出願は、２０１８年１月１０に出願された米国非仮出願第１５／８６７，６１２号、及び２０１７年１２月２８日に出願された米国仮出願第６２／６１１，４７３号に優先権を主張し、これら両方は、それらの全体が本明細書に参照により明示的に援用される。
【技術分野】
【０００２】
本技術は、分散ストレージ、コラボレーション及び同期システムに関する。
【背景技術】
【０００３】
クラウドストレージシステムにより、ユーザがクラウド上でデータを格納し、このデータにアクセスすることが可能である。いくつかのクラウドストレージシステムにより、コラボレーション方式において、ユーザが他のユーザとデータを共有し、このデータにアクセスすることが可能である。いくつかの事例において、ユーザはユーザのクライアントデバイス上にデータのローカルコピーを格納し、これらのローカルコピーにアクセスすることができる。データのローカルコピーは、ユーザにデータへのより高速なアクセスを提供することができる。加えて、ローカルコピーにより、ユーザがオフラインであるときに、ユーザがデータにアクセスすることを可能にすることができる。また、クラウドストレージシステムにより、ユーザがデータのそれらのローカルコピーをクラウド上のデータと同期させることが可能であり、一貫性を確保することができる。クラウドストレージシステムは、複数のクライアントデバイス及びサーバにわたるデータのコピーを同期させようとすることができるため、データの各コピーは、同一である。しかしながら、複数のデバイスにわたるデータの同期は、非常に困難なタスクである可能性があり、データ及び一貫性の望ましくない損失をもたらすことが多い。
【発明の概要】
【０００４】
本技術の上記に列挙されている利点及び特徴、ならびに他の利点及び特徴は、添付の図面に示される具体的な実施態様への参照によって明らかになるであろう。当業者は、これらの図面が本技術のいくつかの実施例を示すに過ぎず、本技術の範囲をこれらの実施例に限定しないことを理解するであろう。さらに、当業者は、添付の図面の使用を通じて追加の特殊性及び詳細が記述され、説明される通りに、本技術の原理を理解する。
【図面の簡単な説明】
【０００５】
【図１Ａ】コンテンツ管理システム及びクライアントデバイスの実施例を示す。
【図１Ｂ】いくつかの態様によるクライアント同期サービスの実施例を示す。
【図２Ａ】図１Ａに示されるコンテンツ管理システムとクライアントデバイスとの間でコンテンツを同期させる例示的なアーキテクチャの概略図を示す。
【図２Ｂ】図２Ａに示されるコンテンツ管理システムとクライアントデバイスとの間でコンテンツを同期させる例示的なアーキテクチャにおいて、コンテンツアイテムのブロックを格納して追跡するための例示的なコンフィグレーションを示す。
【図３Ａ】コンテンツ管理システム上でクライアントデバイスとサーバファイルジャーナルとの間のファイルジャーナルインタフェースによって処理される例示的な通信の図を示す。
【図３Ｂ】コンテンツ管理システム上でクライアントデバイスとサーバファイルジャーナルとの間で通信を変換するための例示的なプロセスの図を示す。
【図４Ａ】サーバファイルジャーナルデータを線形化された操作に変換するための例示的な変換及び線形化プロセスの図を示す。
【図４Ｂ】クライアントデバイスからの操作をサーバファイルジャーナルについてのリビジョンに変換するための例示的な変換及び線形化プロセスの図を示す。
【図５Ａ】ネームスペース間操作の例示的な線形化を示す。
【図５Ｂ】イベント用に計算されたランポートクロックに従い順序付けされるネームスペースにわたるイベントの図を示す。
【図６Ａ】さまざまな態様による、ツリーデータ構造の実施例を示す。
【図６Ｂ】図６Ａに示されるツリーデータ構造への更新の実施例を示す。
【図７Ａ】ツリーデータ構造を使用してサーバ状態及びファイルシステム状態を同期させるための例示的な方法を示す。
【図７Ｂ】ツリーデータ構造を使用してサーバ状態及びファイルシステム状態を同期させるときに競合を解消するための例示的な方法を示す。
【図８】コンテンツアイテム操作に基づきコンテンツアイテムを修正するインテント情報を反映する、図６Ａに示されるツリーデータ構造への例示的な更新を示す。
【図９Ａ】コンテンツアイテム操作をサーバファイルジャーナルにコミットするための例示的な方法を示す。
【図９Ｂ】コンテンツアイテム操作をクライアントデバイスからコミットする要求を処理するための例示的な方法を示す。
【図１０】本技術のさまざまな態様を実装するためのシステムの実施例を示す。
【発明を実施するための形態】
【０００６】
本技術のさまざまな実施例は、以下に詳細に考察される。具体的な実施態様を考察するが、これが例示目的のみのために行われていることを理解するであろう。当業者は、本技術の趣旨及び範囲から逸脱することなく他の構成要素及び構成を使用することができることを認識するであろう。
【０００７】
クラウドストレージシステムにより、ユーザが複数のデバイスにわたりコンテンツアイテムを格納し、これらのコンテンツアイテムにアクセスすることが可能である。コンテンツアイテムは、ファイル、ドキュメント、メッセージ（例えば、電子メールメッセージまたはテキストメッセージ）、メディアファイル（例えば、写真、ビデオ、及びオーディオファイル）、フォルダ、またはいずれかの他のコンテンツユニットを含むことができるが、これらに限定されない。コンテンツアイテムは、複数のユーザと共有される、編集される、削除される、追加される、リネームされる、または移動され得る。しかしながら、いくつかのデバイス及びユーザアカウントにわたり共有される、または格納されるコンテンツアイテムを同期させることにより、不具合が残り、技術的な障害が広まっている。
【０００８】
図示するように、第一マシン（例えば、クライアントデバイスまたはサーバ）は、クラウドストレージシステム上でのコンテンツアイテムのユーザの修正方法についての情報を提供する通信を、第二マシンに送信することができる。第一マシン上のコンテンツアイテムに実行されるアクションが第二マシン上のコンテンツアイテムに反映されるように、これらの通信を第二マシンが使用して、コンテンツアイテムを第二マシン上で同期させることができ、第一マシン上のコンテンツアイテムは、第二マシン上のコンテンツアイテムと実質的に同一である。
【０００９】
しかしながら、多くの場合、管理するのが困難である可能性がある、さまざまなマシン間に送信されるいくつかの通信がある場合がある。さらに、これらの通信のいくつかを、クライアントまたはネットワーク問題などのさまざまな問題の結果として、順不同に受信する場合がある。これは、コンテンツアイテム間の競合及びエラーをさまざまなマシンにもたらすことが多い。また、ユーザのアクティビティは、多数のリビジョンを生成する可能性があり、これらのリビジョンは、同期作業をさらに複雑にし、一貫性がないことを悪化させる可能性がある。例えば、ユーザは、多数の修正をさまざまなコンテンツアイテムに実行する、修正を短期間に取り消す、または追加の修正を以前に修正されたコンテンツアイテムに迅速に実行する可能性がある。これは、期限切れの修正の原因となり、コンテンツアイテムを競合させる、ユーザからの変更及びリビジョンを順不同に受信する尤度を増加させる。結果として、いくつかの操作は、コンテンツアイテムの現在の状態と互換性がない場合がある。さらに、操作が競合しているかどうかを検出することは、非常に困難である可能性がある。
【００１０】
また、同期アクションによる固有のレイテンシがある。例えば、第一マシン上で行われるこれらのアクションを第一マシンが最初に検出し、次に、通信を生成し、ネットワークを介して送信する。以前の通信をまだ処理している可能性がある第二マシンが通信を受信し、通信に詳述されるアクションを第二マシンにおいて行う可能性がある。この例示的なシナリオにおいて、第一マシン、第二マシン、及びネットワークを含む、いくつかの可能なレイテンシポイントがある。レイテンシが増加すると、コンテンツアイテム間の競合の尤度も増加する。これらのような競合した通信を処理すること、及び競合を解消することは、非常に困難であり、計算上コストが高いタスクである。
【００１１】
コンテンツアイテムへのアクセスを有する第二マシンまたは他のマシン上の同一の、または異なるユーザが修正をコンテンツアイテムに行うときに、さらに複雑になる。追加の技術上の問題は、コンテンツアイテムをローカルに、またリモートに大規模なコラボレーション環境において修正するときに発生する。本明細書に示されるように、これらの問題は、コンテンツアイテムにおいて幅広い問題、及び一貫性がないことを引き起こすため、急速に増加し、複雑になる可能性がある。
コンテンツ管理システム
いくつかの実施形態において、開示されている科学技術は、とりわけ、コンテンツアイテム同期機能及びコラボレーション特徴を有するコンテンツ管理システムのコンテキストに展開される。例示的なシステムコンフィグレーション１００は、クライアントデバイス１５０とインタラクトするコンテンツ管理システム１１０を描く、図１Ａに示される。
アカウント
コンテンツ管理システム１１０は、アカウントと関連するコンテンツアイテムを格納し、コンテンツアイテム（複数可）を取得する、修正する、閲覧する、及び／または共有するなどの、さまざまなコンテンツアイテム管理タスクを実行することができる。さらに、コンテンツ管理システム１１０は、アカウントが複数のクライアントデバイスからコンテンツアイテム（複数可）にアクセスすることを可能にすることができる。
【００１２】
コンテンツ管理システム１１０は、複数のアカウントをサポートする。エンティティ（ユーザ、ユーザグループ、チーム、会社など）は、コンテンツ管理システムによってアカウントを作成することができ、アカウント詳細は、アカウントデータベース１４０に格納されることができる。アカウントデータベース１４０は、登録されたエンティティについてのプロファイル情報を格納することができる。いくつかの事例において、登録されたエンティティについてのプロファイル情報は、ユーザ名及び／または電子メールアドレスを含む。アカウントデータベース１４０は、アカウントタイプ（例えば、無料のアカウント、または有料のアカウントのさまざまなティア）、割り振られるストレージスペース、使用されるストレージスペース、それらの上に常駐する登録されたコンテンツ管理クライアントアプリケーション１５２を含むクライアントデバイス１５０、セキュリティ設定、パーソナルコンフィグレーション設定などのような、アカウント管理情報を含むことができる。
【００１３】
アカウントデータベース１４０は、エンティティと関連するアカウントグループを格納することができる。グループは、グループポリシー及び／またはアクセス制御リストに基づくパーミッションを有することができ、これらのグループのメンバーは、これらのパーミッションを継承することができる。例えば、マーケティンググループは、１セットのコンテンツアイテムへのアクセスを有することができ、エンジニアリンググループは、別の１セットのコンテンツアイテムへのアクセスを有することができる。管理者グループは、グループを修正すること、ユーザアカウントを修正することなどができる。
コンテンツアイテムストレージ
コンテンツ管理システム１１０の特徴は、コンテンツストレージ１４２に格納されることができる、コンテンツアイテムのストレージである。コンテンツアイテムは、ドキュメント、コラボレーションコンテンツアイテム、テキストファイル、オーディオファイル、画像ファイル、ビデオファイル、ウェブページ、実行可能ファイル、バイナリファイルなどのような、いずれかのデジタルデータであり得る。また、コンテンツアイテムは、フォルダ、ｚｉｐファイル、プレイリスト、アルバムなどのような、異なるビヘイビアと共にコンテンツアイテムをグループ化するためのコレクションまたは他のメカニズムを含むことができる。コレクションは、フォルダ、または共通属性によって関連する、またはグループ化される複数のコンテンツアイテムを指すことができる。いくつかの実施形態において、コンテンツストレージ１４２を他のタイプのストレージまたはデータベースと組み合わせ、特定の機能をハンドリングする。コンテンツストレージ１４２は、コンテンツアイテムを格納し、これらのコンテンツアイテムについてのメタデータは、メタデータデータベース１４６に格納されることができる。同様に、コンテンツアイテムをコンテンツストレージ１４２に格納する位置についてのデータを、コンテンツディレクトリ１４４に格納することができる。加えて、変更、アクセスなどについてのデータをサーバファイルジャーナル１４８に格納することができる。コンテンツストレージ１４２、コンテンツディレクトリ１４４、サーバファイルジャーナル１４８、及びメタデータデータベース１４６のような、さまざまなストレージ／データベースのそれぞれは、１つより多いこれらのようなストレージまたはデータベースから構成されることができ、多くのデバイス及び位置上に分散されることができる。他のコンフィグレーションも可能である。例えば、コンテンツストレージ１４２、コンテンツディレクトリ１４４、サーバファイルジャーナル１４８、及び／またはメタデータデータベース１４６からのデータは、１つまたは複数のコンテンツストレージもしくはデータベースに統合される、または追加のコンテンツストレージもしくはデータベースにさらにセグメント化されることができる。したがって、コンテンツ管理システム１１０は、図１Ａに示されるものより多い、または少ないストレージ及び／またはデータベースを含むことができる。
【００１４】
いくつかの実施形態において、コンテンツストレージ１４２は、少なくとも１つのコンテンツストレージサービス１１６と関連付けられ、少なくとも１つのコンテンツストレージサービスは、ストレージ用のコンテンツアイテムを受信すること、ストレージ用のコンテンツアイテムを準備すること、コンテンツアイテム用のストレージ位置を選択すること、コンテンツアイテムをストレージから取得することなどを含むが、これらに限定されない、コンテンツアイテムのストレージを管理するために、ソフトウェアまたは他のプロセッサ実行可能命令を含む。いくつかの実施形態において、コンテンツストレージサービス１１６は、コンテンツストレージ１４２におけるストレージのために、コンテンツアイテムをより小さなチャンクに分割することができる。コンテンツアイテムを構成する各チャンクの位置をコンテンツディレクトリ１４４に記録することができる。コンテンツディレクトリ１４４は、コンテンツストレージ１４２に格納される各コンテンツアイテムについてのコンテンツエントリを含むことができる。コンテンツエントリは、コンテンツアイテムを識別する、一意のＩＤと関連付けられることができる。
【００１５】
いくつかの実施形態において、一意のＩＤは、コンテンツディレクトリ１４４中のコンテンツアイテムを識別するが、確定的ハッシュ関数から導出されることができる。コンテンツアイテムに対して一意のＩＤを導出するこの方法は、確定的ハッシュ関数が同一のコンテンツアイテムのすべてのコピーに対して同じ識別子を出力するが、異なるコンテンツアイテムに対して異なる識別子を出力することなどから、コンテンツアイテム重複を認識することを確保することができる。この方法論を使用して、コンテンツストレージサービス１１６は、各コンテンツアイテムに対して一意のＩＤを出力することができる。
【００１６】
また、コンテンツストレージサービス１１６は、メタデータデータベース１４６中のコンテンツアイテムについてのコンテンツパスを指定する、または記録することができる。コンテンツパスは、コンテンツアイテム及び／またはこのコンテンツアイテムと関連するフォルダ階層の名前を含むことができる。例えば、コンテンツパスは、コンテンツアイテムをクライアントデバイス上のローカルファイルシステムに格納するフォルダ、またはフォルダのパスを含むことができる。コンテンツアイテムをブロック中のコンテンツストレージ１４２に格納し、ディレクトリ構造のようなツリー下に格納しなくてもよいが、このようなディレクトリ構造は、ユーザにとって快適なナビゲーション構造である。コンテンツストレージサービス１１６は、ディレクトリ構造の「ルート」ノードが各アカウントについてのネームスペースであることができる、コンテンツアイテムについてのコンテンツパスを定義する、または記録することができる。ネームスペース内には、アカウント及び／またはコンテンツストレージサービス１１６のユーザによって定義されるディレクトリ構造があることができる。メタデータデータベース１４６は、各コンテンツアイテムについてのコンテンツパスをコンテンツエントリの部分として格納することができる。
【００１７】
いくつかの実施形態において、ネームスペースは、それらがルートノード内に格納されるかのようにディレクトリ構造にネストされる追加のネームスペースを含むことができる。これは、アカウントが共有されたコレクションへのアクセスを有するときに起こり得る。共有されたコレクションは、それら自体のネームスペースをコンテンツ管理システム１１０内に割り当てられ得る。いくつかの共有されたコレクションは、実際には共有されたコレクションについてのルートノードであるが、それらは、ディレクトリ構造中のアカウントネームスペースの下位に位置し、アカウント用のフォルダ内のフォルダとして出現することができる。上述されるように、ディレクトリ構造は、ユーザにとって単に快適なナビゲーション構造であるが、コンテンツストレージ１４２中のコンテンツアイテムのストレージ位置に相関しない。
【００１８】
アカウントがコンテンツアイテムを表示するディレクトリ構造は、コンテンツ管理システム１１０においてストレージ位置に相関しないが、ディレクトリ構造は、クライアントデバイス１５０によって使用されるファイルシステムに依存するクライアントデバイス１５０上のストレージ位置に相関することができる。
【００１９】
上述されるように、コンテンツディレクトリ１４４中のコンテンツエントリは、コンテンツアイテムを構成する各チャンクの位置をも含むことができる。より具体的に、コンテンツエントリは、コンテンツアイテムを構成するチャンクのコンテンツストレージ１４２中の位置を識別するコンテンツポインタを含むことができる。
【００２０】
コンテンツパス及びコンテンツポインタに加えて、コンテンツディレクトリ１４４中のコンテンツエントリは、コンテンツアイテムへのアクセスを有するユーザアカウントを識別するユーザアカウント識別子、及び／またはコンテンツアイテムへのアクセスを有するグループを識別するグループ識別子、及び／またはコンテンツエントリが属するネームスペースをも含むことができる。
【００２１】
コンテンツストレージサービス１１６は、コンテンツアイテム、またはコンテンツアイテムのバージョンを構成する、重複するコンテンツアイテム、または重複するブロックを識別することによってストレージスペースの所要量を減少させることができる。複数のコピーを格納する代替に、コンテンツストレージ１４２は、コンテンツアイテムの、またはコンテンツアイテムのブロックの、単一コピーを格納することができ、コンテンツディレクトリ１４４は、重複を単一コピーにリンクさせる、ポインタまたは他のメカニズムを含むことができる。
【００２２】
また、コンテンツストレージサービス１１６は、コンテンツアイテムの一意のＩＤと関連して、コンテンツアイテム、コンテンツアイテムタイプ、フォルダ、ファイルパス、及び／またはメタデータデータベース１４６中のさまざまなアカウント、コレクション、またはグループへのコンテンツアイテムの関係を記述するメタデータを格納することができる。
【００２３】
また、コンテンツストレージサービス１１６は、サーバファイルジャーナル１４８中の変更、アクセスなどについてのデータのログを格納することができる。サーバファイルジャーナル１４８は、タイムスタンプまたはバージョン番号及びいずれかの他の関連データに加えて、コンテンツアイテムの一意のＩＤ、及び変更またはアクセスアクションのディスクリプションを含むことができる。また、サーバファイルジャーナル１４８は、変更またはコンテンツアイテムアクセスによって影響されるブロックへのポインタを含むことができる。コンテンツストレージサービスは、コンテンツアイテムへの変更を追跡するコンテンツアイテムバージョン制御、コンテンツアイテムの異なるバージョン（分岐するバージョンツリーを含む）、及びサーバファイルジャーナル１４８から取得されることができる変更履歴を使用することによって、操作をアンドゥする機能を提供することができる。
コンテンツアイテム同期
コンテンツ管理システム１１０の別の特徴は、コンテンツアイテムの少なくとも１つのクライアントデバイス１５０との同期である。クライアントデバイス（複数可）は、異なる形を取り、異なる機能を有することができる。例えば、クライアントデバイス１５０１は、複数のアプリケーションによってアクセス可能な、それらの上に常駐するローカルファイルシステムを含むコンピューティングデバイスである。クライアントデバイス１５０２は、コンピューティングデバイスであり、そこでコンテンツアイテムは、特定のアプリケーションに、または特定のアプリケーションにより与えられるパーミッションによってのみアクセス可能であり、コンテンツアイテムは、典型的に、特定用途向けスペースか、クラウドかのいずれか一方に格納される。クライアントデバイス１５０３は、ウェブブラウザを介してコンテンツ管理システム１１０にアクセスし、またウェブインタフェースを介してコンテンツアイテムにアクセスする、いずれかのクライアントデバイスである。例示的なクライアントデバイス１５０１、１５０２、及び１５０３は、ラップトップ、モバイルデバイス、またはウェブブラウザなどのフォームファクタで描かれ、それらの記述がこれらの例示的なフォームファクタのデバイスに限定されないことを理解するであろう。例えば、クライアント１５０２などのモバイルデバイスは、複数のアプリケーションによってアクセス可能な、それらの上に常駐するローカルファイルシステムを含むことができる、またはクライアント１５０２は、ウェブブラウザを介してコンテンツ管理システム１１０にアクセスすることができる。このように、フォームファクタは、クライアント１５０の機能を考慮するときに制限するものとみなされるべきではない。クライアントデバイス１５０に関して本明細書に記述される１つ以上の機能は、デバイスの特定の機能（ファイルアクセスモデルがこのような機能の１つである）に依存するすべてのクライアントデバイス上で利用可能であってもよいし、利用可能でなくてもよい。
【００２４】
多くの実施形態において、クライアントデバイスは、コンテンツ管理システム１１０のアカウントと関連付けられるが、いくつかの実施形態において、クライアントデバイスは、共有されたリンクを使用してコンテンツにアクセスし得、アカウントを必要としないことがある。
【００２５】
上述されるように、いくつかのクライアントデバイスは、ウェブブラウザを使用してコンテンツ管理システム１１０にアクセスすることができる。しかしながら、クライアントデバイスは、クライアントデバイス１５０上で格納され、実行するクライアントアプリケーション１５２を使用して、コンテンツ管理システム１１０にもアクセスすることができる。クライアントアプリケーション１５２は、クライアント同期サービス１５６を含むことができる。
【００２６】
クライアント同期サービス１５６は、サーバ同期サービス１１２と通信し、クライアントデバイス１５０とコンテンツ管理システム１１０との間でコンテンツアイテムへの変更を同期させることができる。
【００２７】
クライアントデバイス１５０は、クライアント同期サービス１５６を介してコンテンツをコンテンツ管理システム１１０と同期させることができる。同期は、プラットフォームに依存しないことができる。すなわち、コンテンツは、さまざまなタイプ、機能、オペレーティングシステムなどの複数のクライアントデバイスにわたり同期することができる。クライアント同期サービス１５６は、クライアントデバイス１５０のファイルシステムの指定の位置におけるコンテンツアイテムへのいかなる変更（新規の、削除された、修正された、コピーされた、または移動されたコンテンツアイテム）をも同期させることができる。
【００２８】
コンテンツアイテムをクライアントデバイス１５０からコンテンツ管理システム１１０に同期させることができ、またその逆もできる。クライアントデバイス１５０からコンテンツ管理システム１１０への同期である実施形態において、ユーザは、クライアントデバイス１５０のファイルシステムから直接コンテンツアイテムを操作することができるが、クライアント同期サービス１５６は、監視されたフォルダ内のファイルへの変更についてディレクトリをクライアントデバイス１５０上で監視することができる。
【００２９】
クライアント同期サービス１５６が監視するディレクトリ中のコンテンツの書き込み、移動、コピー、または削除を検出するときに、クライアント同期サービス１５６は、コンテンツ管理システムサービス１１６への変更を同期させることができる。いくつかの実施形態において、クライアント同期サービス１５６は、コンテンツアイテムをブロックに分割すること、コンテンツアイテムをハッシュ化して一意の識別子を生成することなどのような上述される機能を有するコンテンツ管理システムサービス１１６のいくつかの機能を実行することができる。クライアント同期サービス１５６は、クライアントストレージインデックス１６４内でコンテンツをインデックス化し、結果をストレージインデックス１６４に保存することができる。インデックス化は、各コンテンツアイテムについての、パスと一意のサーバ識別子、及び一意のクライアント識別子を格納することを備えることができる。いくつかの実施形態において、クライアント同期サービス１５６は、一意のサーバ識別子をサーバ同期サービス１１２から学習し、一意のクライアント識別子をクライアントデバイス１５０のオペレーティングシステムから学習する。
【００３０】
クライアント同期サービス１５６は、ストレージインデックス１６４を使用して、コンテンツ管理システム１１０上のユーザアカウントと関連するコンテンツとの、クライアントストレージ内のコンテンツの少なくとも一部分の同期を容易にすることができる。例えば、クライアント同期サービス１５６は、ストレージインデックス１６４をコンテンツ管理システム１１０と比較し、クライアントストレージ上のコンテンツと、コンテンツ管理システム１１０上のユーザアカウントと関連するコンテンツとの間の差異を検出することができる。次いで、クライアント同期サービス１５６は、必要に応じてコンテンツをクライアントストレージ上で、アップロードし、ダウンロードし、修正し、そして削除することによって、差異のリコンサイルを試行することができる。コンテンツストレージサービス１１６は、必要に応じて、コンテンツアイテムについて変更されたブロック、または新規のブロックを格納し、サーバファイルジャーナル１４８、メタデータデータベース１４６、コンテンツディレクトリ１４４、コンテンツストレージ１４２、アカウントデータベース１４０などを更新することができる。
【００３１】
コンテンツ管理システム１１０からクライアントデバイス１５０に同期させるときに、サーバファイルジャーナル１４８に記録されるコンテンツアイテムのマウント、修正、追加、削除、移動は、通知サービス１１７を使用してクライアントデバイス１５０に送信される通知をトリガすることができる。クライアントデバイス１５０に変更を通知するときに、クライアントデバイスに知られている最後の同期ポイント以降に、サーバファイルジャーナル１４８に列挙されている要求を変更する。クライアントデバイス１５０がコンテンツ管理システム１１０と同期していないと判定するときに、クライアント同期サービス１５６は、変更を含むコンテンツアイテムブロックを要求し、変更されたコンテンツアイテムのそのローカルコピーを更新する。
【００３２】
いくつかの実施形態において、ストレージインデックス１６４は、ツリーデータ構造を格納し、そこで１つのツリーは、サーバ同期サービス１１２に従いディレクトリの最新の表現を反映し、もう１つのツリーは、クライアント同期サービス１５６に従いディレクトリの最新の表現を反映する。クライアント同期サービスは、データをサーバ同期サービス１１２から要求することによって、またはクライアントデバイス１５０上の変更をコンテンツ管理システム１１０にコミットすることによって、ツリー構造がマッチングすることを確保するように機能することができる。
【００３３】
ときとして、クライアントデバイス１５０は、利用可能なネットワーク接続を有さない場合がある。このシナリオにおいて、クライアント同期サービス１５６は、ネットワーク接続が利用可能であるときに、コンテンツアイテム変更についてリンクされたコレクションを監視し、後のコンテンツ管理システム１１０への同期のためにこれらの変更をキューイングすることができる。同様に、ユーザは、コンテンツ管理システム１１０との同期を手動で、開始する、停止する、一時停止する、または再開することができる。
【００３４】
クライアント同期サービス１５６は、特定のユーザアカウントと関連するすべてのコンテンツをコンテンツ管理システム１１０上で同期させることができる。代替的に、クライアント同期サービス１５６は、特定のユーザアカウントと関連する全コンテンツの一部のコンテンツをコンテンツ管理システム１１０上で選択的に同期させることができる。一部のコンテンツのみを選択的に同期させることにより、スペースをクライアントデバイス１５０上に保持し、帯域幅を節約することができる。
【００３５】
いくつかの実施形態において、クライアント同期サービス１５６は、コンテンツのリマインダ部分のためにクライアントストレージに、特定のユーザアカウントと関連するコンテンツの一部を選択的に格納し、プレースホルダコンテンツアイテムを格納する。例えば、クライアント同期サービス１５６は、プレースホルダコンテンツアイテムを格納することができ、このプレースホルダコンテンツアイテムは、コンテンツ管理システム１１０上の、そのそれぞれの完全なコンテンツアイテムの同じファイル名、パス、拡張子、メタデータを有するが、完全なコンテンツアイテムのデータを欠く。このプレースホルダコンテンツアイテムは、サイズが数バイト以下であることができるが、それぞれの完全なコンテンツアイテムは、著しくより大きくてもよい。クライアントデバイス１５０がコンテンツアイテムにアクセスすることを試行した後に、クライアント同期サービス１５６は、コンテンツアイテムのデータをコンテンツ管理システム１１０から取得し、完全なコンテンツアイテムを、アクセスするクライアントデバイス１５０に提供することができる。このアプローチは、有意なスペース、及び帯域幅節約を提供しながら、ユーザのコンテンツへのフルアクセスをコンテンツ管理システム１１０上に依然として提供することができる。
コラボレーション特徴
コンテンツ管理システム１１０の別の特徴は、ユーザ間のコラボレーションを容易にすることである。コラボレーション特徴は、コンテンツアイテムの共有、コンテンツアイテムについてのコメント、コンテンツアイテム上でのコワーキング、インスタントメッセージング、コンテンツアイテムについての存在及び表示状態情報を提供することなどを備える。
共有
コンテンツ管理システム１１０は、共有サービス１２８を介して共有コンテンツを管理することができる。コンテンツへのリンクを提供することによって共有するコンテンツは、コンテンツ管理システム１１０とネットワーク通信しているいずれかのコンピューティングデバイスからアクセス可能なコンテンツアイテムを作成することを含むことができる。しかしながら、いくつかの実施形態において、リンクは、コンテンツ管理システム１１０及びアクセス制御リスト１４５によって実施されるアクセス制限と関連付けられることができる。また、共有コンテンツは、共有サービス１２８を使用してコンテンツにリンクし、コンテンツ管理システム１１０内のコンテンツを少なくとも１つの追加のユーザアカウント（コンテンツアイテムと関連する元のユーザアカウントに加えて）と共有することを含むことができるので、各ユーザアカウントは、コンテンツアイテムへのアクセスを有する。追加のユーザアカウントは、コンテンツを許容することによってコンテンツへのアクセスを得ることができ、その後、ウェブインタフェースサービス１２４を介してか、直接にかのいずれか一方で、クライアントデバイス１５０上でそれらのアカウントと関連するディレクトリ構造内からアクセス可能である。プラットフォームに依存しない方式において、共有を実行することができる。すなわち、さまざまなタイプ、機能、オペレーティングシステムなどの複数のクライアントデバイス１５０にわたりコンテンツを共有することができる。また、ユーザアカウントのさまざまなタイプにわたりコンテンツを共有することができる。
【００３６】
コンテンツアイテムをコンテンツ管理システム１１０内で共有するために、共有サービス１２８は、１つのユーザアカウント識別子、または複数のユーザアカウント識別子を、コンテンツアイテムと関連するアクセス制御リストデータベース１４５中のコンテンツエントリに追加することができるので、コンテンツアイテムへの追加されたユーザアカウントアクセスを付与することができる。また、共有サービス１２８は、ユーザアカウント識別子をコンテンツエントリから除去し、コンテンツアイテムへのユーザアカウントのアクセスを制限することができる。共有サービス１２８は、コンテンツアイテム識別子、コンテンツアイテムへのアクセスを与えられるユーザアカウント識別子、及びアクセス制御リストデータベース１４５におけるアクセスレベルを記録することができる。例えば、いくつかの実施形態において、単一コンテンツエントリと関連するユーザアカウント識別子は、関連したコンテンツアイテムに関するそれぞれのユーザアカウント識別子に対して異なるパーミッションを指定することができる。
【００３７】
コンテンツ管理システム１１０の外部でコンテンツアイテムを共有するために、共有サービス１２８は、ユニフォームリソースロケータ（ＵＲＬ）などのカスタムネットワークアドレスを生成することができ、このカスタムネットワークアドレスにより、いかなる認証もなく、コンテンツ管理システム１１０においてコンテンツアイテムまたはコレクションにいかなるウェブブラウザもアクセスすることが可能である。これを達成するために、共有サービス１２８は、コンテンツ識別データを生成されたＵＲＬに含むことができ、このコンテンツ識別データを後に使用して、要求されたコンテンツアイテムを適切に識別し、返すことができる。例えば、共有サービス１２８は、アカウント識別子及びコンテンツパス、または生成されたＵＲＬ中でコードを識別するコンテンツアイテムを含むことができる。ＵＲＬの選択に際し、ＵＲＬに含まれるコンテンツ識別データをコンテンツ管理システム１１０に送信することができ、このコンテンツ管理システム１１０は、受信したコンテンツ識別データを使用して、適切なコンテンツアイテムを識別し、コンテンツアイテムを返すことができる。
【００３８】
ＵＲＬを生成することに加えて、共有サービス１２８は、コンテンツアイテムへのＵＲＬが作成されているアクセス制御リストデータベース１４５に記録されるように設定されることもできる。いくつかの実施形態において、コンテンツアイテムと関連するコンテンツエントリは、コンテンツアイテムへのＵＲＬが作成されているかどうかを示すＵＲＬフラグを含むことができる。例えば、ＵＲＬフラグは、コンテンツアイテムへのＵＲＬが作成されていないことを示す、０または偽に最初に設定されるブール値であり得る。共有サービス１２８は、コンテンツアイテムへのＵＲＬを生成した後に、フラグの値を１または真に変更することができる。
【００３９】
いくつかの実施形態において、共有サービス１２８は、１セットのパーミッションをコンテンツアイテムについてのＵＲＬに関連付けることができる。例えば、ユーザがＵＲＬを介してコンテンツアイテムにアクセスすることを試行する場合に、共有サービス１２８は、コンテンツアイテムに対して制限された１セットのパーミッションを提供することができる。制限されたパーミッションの実施例は、ユーザがコンテンツアイテムをダウンロードすることができない、コンテンツアイテムを保存することができない、コンテンツアイテムをコピーすることができない、コンテンツアイテムを修正することができないなどの制限を有する。いくつかの実施形態において、制限されたパーミッションは、特定のドメインから、すなわち、企業ネットワークドメイン内部から、または特定のドメインと関連するアカウント、例えば、企業アカウントと関連するアカウント（例えば、＠ａｃｍｅ．ｃｏｍ）によって、アクセスされるコンテンツアイテムだけにパーミッションを与える制限を含む。
【００４０】
いくつかの実施形態において、共有サービス１２８も、生成されたＵＲＬを非アクティブ化するように構成されることができる。例えば、各コンテンツエントリも、生成されたＵＲＬからの要求に応答してコンテンツを返すべきかどうかを示す、ＵＲＬアクティブフラグを含むことができる。例えば、ＵＲＬアクティブフラグが１または真に設定される場合に、共有サービス１２８は、生成されたリンクによって要求されるコンテンツアイテムのみを返すことができる。したがって、ＵＲＬが生成されているコンテンツアイテムへのアクセスは、ＵＲＬアクティブフラグの値を変更することによって容易に制限され得る。これにより、コンテンツアイテムを移動させる、または生成されたＵＲＬを削除することを必要とせずに、ユーザが共有されたコンテンツアイテムへのアクセスを制限することができる。同様に、共有サービス１２８は、ＵＲＬアクティブフラグの値を１または真に再度変更することによって、ＵＲＬを再アクティブ化することができる。したがって、ユーザは、新規のＵＲＬを生成する必要なく、コンテンツアイテムへのアクセスを容易に復元することができる。
【００４１】
いくつかの実施形態において、コンテンツ管理システム１１０は、コンテンツアイテムをアップロードするためにＵＲＬを指定することができる。例えば、ユーザアカウントを有する第一ユーザは、このようなＵＲＬを要求し、ＵＲＬを寄与するユーザに提供することができ、寄与するユーザは、このＵＲＬを使用して、コンテンツアイテムを第一ユーザのユーザアカウントにアップロードすることができる。
チームサービス
いくつかの実施形態において、コンテンツ管理システム１１０は、チームサービス１３０を含む。チームサービス１３０は、ユーザアカウントの定義されたチームを作成し、管理するための機能性を提供することができる。これらのチームは、サブチーム（例えば、ビジネスユニット、またはプロジェクトチームなど）とともに、企業用に作成されることができ、これらのチーム及びサブチームに、またはこれらのチームに割り当てられるユーザアカウントは、ユーザアカウントのいずれかの定義されたグループ用に作成され得る。これらのチームサービス１３０は、チーム用の共通の共有スペース、プライベートユーザアカウントフォルダ、及びアクセス制限された共有フォルダを提供することができる。また、チームサービスは、管理者用に管理インタフェースを提供し、コレクション及びコンテンツアイテムをチーム内で管理することができ、このチームと関連付けられるユーザアカウントを管理することができる。
認可サービス
いくつかの実施形態において、コンテンツ管理システム１１０は、認可サービス１３２を含む。認可サービス１３２は、ネームスペースにアクセスすることを試行するユーザアカウントがネームスペースにアクセスする適切な権限を有することを確保する。認可サービス１３２は、ネームスペースにアクセスする要求に従うトークンをクライアントアプリケーション１５２から受信することができ、ユーザアカウントにパーミッションを与えられている機能を返すことができる。複数のアクセスレベルを有するユーザアカウント（例えば、ユーザ権限及び管理者権限を有するユーザアカウント）について、認可サービス１３２は、管理者による意図しないアクションを回避するために、明示的な特権昇格をも要求することができる。
存在及び表示状態
いくつかの実施形態において、コンテンツ管理システムは、コンテンツアイテムを共有するユーザがどのようにコンテンツアイテムとインタラクトしている、またはインタラクトしていたかについての情報を提供することができる。いくつかの実施形態において、コンテンツ管理システム１１０は、コンテンツアイテムを共有するユーザがコンテンツアイテムを現在閲覧していることを報告することができる。例えば、クライアントデバイス１５０がコンテンツアイテムにアクセスしているときに、クライアントコラボレーションサービス１６０は、通知サービス１１７に通知することができる。次いで、通知サービス１１７は、このコンテンツアイテムに関してクライアントデバイス１５０のユーザの存在する同一コンテンツアイテムへのアクセスを有する他のユーザのすべてのクライアントデバイスに通知することができる。
【００４２】
いくつかの実施形態において、コンテンツ管理システム１１０は、共有されたコンテンツアイテムとのユーザインタラクションの履歴を報告することができる。コラボレーションサービス１２６は、メタデータデータベース１４６及びサーバファイルジャーナル１４８などのデータソースにクエリを行い、ユーザがコンテンツアイテムを保存していること、ユーザがまだコンテンツアイテムを閲覧していることなどを判定し、通知サービス１１７を使用して、この状態情報を他のユーザに広めることができるので、それらのユーザは、コンテンツアイテムを現在閲覧している、または現在修正している、または閲覧していた、または修正したユーザを知ることができる。
【００４３】
コラボレーションサービス１２６は、コンテンツアイテムがコメント機能をネイティブにサポートしない場合でも、コンテンツと関連するコメントを容易にすることができる。これらのようなコメントをメタデータデータベース１４６に格納することができる。
【００４４】
コラボレーションサービス１２６は、ユーザに対して通知を発信し、送信することができる。例えば、ユーザは、コメント中に別のユーザについて言及することができ、コラボレーションサービス１２６は、ユーザがコメント中で言及されている通知をそのユーザに送信することができる。さまざまな他のコンテンツアイテムイベントは、コンテンツアイテムを削除すること、コンテンツアイテムを共有することなどを含む、通知をトリガすることができる。
【００４５】
コラボレーションサービス１２６は、メッセージングプラットフォームを提供することができ、このメッセージングプラットフォームにより、ユーザは、インスタントメッセージ、音声通話、電子メールなどを送信し、受信することができる。
コラボレーションコンテンツアイテム
いくつかの実施形態において、コンテンツ管理サービスは、コラボレーションドキュメントサービス１３４をも含むことができ、このコラボレーションドキュメントサービス１３４は、インタラクティブコンテンツアイテムコラボレーションプラットフォームを提供することができ、このインタラクティブコンテンツアイテムコラボレーションプラットフォームにより、ユーザは、コラボレーションコンテンツアイテム、これらのコラボレーションコンテンツアイテム中のコメントを同時に作成し、タスクをコラボレーションコンテンツアイテム内で管理することができる。コラボレーションコンテンツアイテムは、ユーザが作成し、コラボレーションコンテンツアイテムエディタを使用して編集することができ、コラボレーションコンテンツアイテム要素を含むことができるファイルであり得る。コラボレーションコンテンツアイテム要素は、コラボレーションコンテンツアイテム識別子、１つ以上のオーサー識別子、コラボレーションコンテンツアイテムテキスト、コラボレーションコンテンツアイテム属性、インタラクション情報、コメント、共有するユーザなどを含むことができる。コラボレーションコンテンツアイテム要素は、コラボレーションコンテンツアイテムを検索し、取得することを可能にする、データベースエンティティとして格納されることができる。複数のユーザは、同時に、または異なる時間に、コラボレーションコンテンツアイテムにアクセスし、これらのコラボレーションコンテンツアイテムを閲覧し、編集し、そしてコラボレーションすることができる。いくつかの実施形態において、これは、２人のユーザがウェブインタフェースを介してコンテンツアイテムにアクセスすることを要求することによって管理されることができ、そしてそこでこれら２人のユーザは、同時にコンテンツアイテムの同じコピー上で操作することができる。
コラボレーションコンパニオンインタフェース
いくつかの実施形態において、クライアントコラボレーションサービス１６０は、クライアントデバイス１５０上に提示されるコンテンツアイテムに関連する情報を表示する目的のために、ネイティブアプリケーションコンパニオンインタフェースを提供することができる。クライアントデバイス１５０に格納され、このクライアントデバイス１５０上で実行されるネイティブアプリケーションがコンテンツアイテムにアクセスする、いくつかの実施形態において、そこでコンテンツアプリケーション１５２がコンテンツアイテムを管理するように、コンテンツアイテムは、クライアントデバイス１５０のファイルシステムの指定の位置にあり、ネイティブアプリケーションは、上記のアドレス指定されたコラボレーションデータを表示するいかなるネイティブな方式も提供しない場合がある。これらのような実施形態において、クライアントコラボレーションサービス１６０は、ユーザがコンテンツアイテムを開いていることを検出することができ、コラボレーションデータなどのコンテンツアイテムについての追加情報をオーバーレイに提供することができる。例えば、追加情報は、コンテンツアイテムに対するコメント、コンテンツアイテムの状態、コンテンツアイテムを以前に閲覧していた、または現在閲覧している他のユーザのアクティビティを含むことができる。このようなオーバーレイは、別のユーザがコンテンツアイテムを現在編集しているため、変更が失われる可能性があることをユーザに警告することができる。
【００４６】
いくつかの実施形態において、パブリックまたはプライベートアプリケーションプログラミングインタフェースを使用して、上記に考察される、サービスまたはストレージ／データベースのうちの１つ以上にアクセスすることができる。
【００４７】
ある特定のソフトウェアアプリケーションは、コンテンツストレージ１４２にＡＰＩを介してユーザの代わりにアクセスすることができる。例えば、クライアントデバイス１５０上で実行するアプリケーションなどのソフトウェアパッケージは、ユーザが認証クレデンシャルを提供するときにコンテンツ管理システム１１０に直接ＡＰＩ呼び出しをプログラムに従い行い、コンテンツを読み出す、書き込む、作成する、削除する、共有する、またはその他の方法により操作することができる。
【００４８】
ユーザは、ウェブインタフェースサービス１２４によって生成され、サーブされるウェブインタフェースを介してユーザアカウントに格納されるコンテンツを閲覧する、または操作することができる。例えば、ユーザは、ウェブブラウザにおいて、コンテンツ管理システム１１０によって提供されるウェブアドレスにナビゲートすることができる。コンテンツアイテムの新規のバージョンをアップロードするなど、ウェブインタフェースを介して行われるコンテンツストレージ１４２中のコンテンツへの変更または更新は、伝播され、ユーザのアカウントと関連する他のクライアントデバイスに返されることができる。例えば、複数のクライアントデバイスは、これらのクライアントデバイス自体のそれぞれのクライアントソフトウェアとともに、単一アカウントと関連付けられることができ、このアカウント中のコンテンツアイテムは、複数のクライアントデバイスのそれぞれの間で同期することができる。
【００４９】
クライアントデバイス１５０は、ユーザの代わりにコンテンツ管理システム１１０に接続することができる。ユーザは、例えば、クライアントデバイス１５０がデスクトップまたはラップトップコンピュータ、電話、テレビ、モノのインターネットデバイスなどであるときに、クライアントデバイス１５０と直接インタラクトすることができる。代替的に、または追加的に、クライアントデバイス１５０は、例えば、クライアントデバイス１５０がサーバであるときに、ユーザがクライアントデバイス１５０への物理的なアクセスを有することなく、ユーザの代理を務めることができる。
【００５０】
クライアントデバイス１５０のいくつかの特徴は、クライアントデバイス１５０上にインストールされるアプリケーションによって有効にされる。いくつかの実施形態において、このアプリケーションは、コンテンツ管理システム専用コンポーネントを含むことができる。例えば、コンテンツ管理システム専用コンポーネントは、スタンドアロンアプリケーション１５２、１つ以上のアプリケーションプラグイン、及び／またはブラウザ拡張であることができる。しかしながら、ユーザも、ウェブブラウザなどの第三者アプリケーションを介してコンテンツ管理システム１１０とインタラクトすることができ、この第三者アプリケーションは、クライアントデバイス１５０上にあり、コンテンツ管理システム１１０と通信するように構成される。さまざまな実装において、クライアント側アプリケーション１５２は、ユーザに対してユーザインタフェース（ＵＩ）を提示し、コンテンツ管理システム１１０とインタラクトすることができる。例えば、ユーザは、ファイルシステムと統合されるファイルシステムエクスプローラを介して、またはウェブブラウザアプリケーションを使用して表示されるウェブページを介して、コンテンツ管理システム１１０とインタラクトすることができる。
【００５１】
いくつかの実施形態において、クライアントアプリケーション１５２は、コンテンツ管理システム１１０の１つより多いアカウントに対してコンテンツを管理し、同期させるように構成されることができる。これらのような実施形態において、クライアントアプリケーション１５２は、複数のアカウントにログインしたままで、複数のアカウントに対して通常のサービスを提供することができる。いくつかの実施形態において、各アカウントは、ファイルシステム中のフォルダとして現れることができ、そのフォルダ内のすべてのコンテンツアイテムは、コンテンツ管理システム１１０と同期することができる。いくつかの実施形態において、クライアントアプリケーション１５２は、プライマリアカウントまたはデフォルトアカウントである複数のアカウントのうちの１つを選ぶセレクタを含むことができる。
【００５２】
コンテンツ管理システム１１０に専用コンポーネントを提示しながら、当業者は、システム１００のアーキテクチャコンフィグレーションが唯一可能なコンフィグレーションであり、より多い、またはより少ないコンポーネントに関する他のコンフィグレーションが可能であることを理解するであろう。さらに、サービスは、別のサービスとともにあると記述される機能性さえも含む、多い、または少ない機能性を有することができる。さらに、１つの実施形態に関して本明細書に記述される特徴を、別の実施形態に関して記述される特徴と組み合わせることができる。
【００５３】
システム１００に専用コンポーネントを提示するが、当業者は、システム１００のアーキテクチャコンフィグレーションが唯一可能なコンフィグレーションであり、より多い、またはより少ないコンポーネントに関する他のコンフィグレーションが可能であることを理解するであろう。
クライアント同期サービス
図１Ｂは、いくつかの実施形態による、クライアント同期サービス１５６の実施例を示す。いくつかの実施形態により、クライアント同期サービス１５６は、図１Ａに示されるクライアントデバイス１５０中に実装されることができる。しかしながら、他の実施形態において、クライアント同期サービス１５６は、別のコンピューティングデバイス上に実装されることができる。クライアント同期サービス１５６は、クライアント同期サービス１５６が実行する、コンテンツ管理システムとクライアントデバイスとの間のコンテンツアイテムへの変更を同期させるように構成される。
【００５４】
クライアント同期サービス１５６は、ファイルシステムインタフェース１７０、サーバインタフェース１７２、ツリーストレージ１７４、プランナ１７６、及びスケジューラ１７８を含むことができる。追加的な、または代替的なコンポーネントをも含むことができる。クライアント同期サービス１５６及びそのコンポーネントの高水準のディスクリプションを図１Ｂに関して下記に考察する。しかしながら、クライアント同期サービス１５６及びそのコンポーネントのさらなる詳細及び実施形態は、全体を通して考察される。
【００５５】
ファイルシステムインタフェース１７０は、クライアントデバイスのローカルファイルシステム上でコンテンツアイテムへの変更を処理し、ローカルツリーを更新するように構成される。例えば、ファイルシステムインタフェース１７０は、クライアント同期サービス１５６と通信して、クライアントデバイスのローカルファイルシステム上でコンテンツアイテムへの変更を検出することができる。また、図１Ａのクライアントアプリケーション１５２を介して、これらの変更を行い、検出することができる。ファイルシステムインタフェース１７０は、クライアントデバイス上のコンテンツアイテムへの変更（新規の、削除された、修正された、コピーされた、リネームされた、または移動されたコンテンツアイテム）に基づき行われることができる、ローカルツリーへの更新を行うことができる。
【００５６】
サーバインタフェース１７２は、コンテンツ管理システムのリモートストレージにおけるコンテンツアイテムへのリモート変更の処理、及びリモートツリーの更新の際に支援するように設定される。例えば、サーバインタフェース１７２は、図１Ａのサーバ同期サービス１１２と通信し、クライアントデバイス１５０とコンテンツ管理システム１１０との間でコンテンツアイテムへの変更を同期させることができる。コンテンツ管理システム１１０におけるコンテンツアイテムへの変更（新規の、削除された、修正された、コピーされた、リネームされた、または移動されたコンテンツアイテム）を検出することができ、これらの変更をコンテンツ管理システム１１０に反映するために更新をリモートツリーに行うことができる。
【００５７】
ツリーストレージ１７４は、クライアント同期サービス１５６によって使用されるツリーデータ構造を格納し、維持するように構成される。例えば、ツリーストレージ１７４は、ローカルツリー、同期ツリー、及びリモートツリーを格納することができる。いくつかの実施形態により、ツリーストレージ２００は、レイテンシ及び応答時間を減少させるために、永続メモリ（例えば、ハードディスクまたは他のセカンダリストレージデバイス）に、またメインメモリ（例えば、ＲＡＭまたは他のプライマリストレージデバイス）にツリーデータ構造を格納することができる。例えば、クライアントデバイスまたはクライアント同期サービス１５６の起動時に、ツリーデータ構造を永続メモリから取得し、メインメモリにロードすることができる。ツリーストレージ１７４は、メインメモリ上でツリーデータ構造にアクセスし、これらのツリーデータ構造を更新し、クライアントデバイスまたはクライアント同期サービス１５６を停止する前に、ツリーストレージ１７４は、更新されたツリーデータ構造を永続メモリ上に格納することができる。メインメモリはコストが高く、ほとんどのクライアントデバイス上でサイズが制限されることが多いため、メインメモリ上のツリーデータ構造のフットプリントを減少させる追加の技術的な改善を実施する。これらの技術的な解決策を以下にさらに説明する。
【００５８】
プランナ１７６は、コンテンツ管理システムと関連するサーバ状態と、クライアントデバイスと関連するファイルシステム状態との間の差異をツリーデータ構造の状態に基づき検出するように構成される。例えば、プランナ１７６は、リモートツリーと同期ツリーとの間に差異があるかどうかを判定し得る。リモートツリーと同期ツリーとの間の差異は、コンテンツ管理システムに格納される１つ以上のコンテンツアイテム上にリモートに実行されるアクションにより、サーバ状態及びファイルシステム状態を同期させなくしたことを示す。同様に、プランナ１７６は、ローカルツリーと同期ツリーとの間の差異があるかどうかも判定し得る。ローカルツリーと同期ツリーとの間の差異は、クライアントデバイス上に格納される１つ以上のコンテンツアイテム上にローカルに実行されるアクションにより、サーバ状態及びファイルシステム状態を同期させなくしたことを示す。差異を検出した場合、プランナ１７６は、ツリーデータ構造を同期させる操作シーケンスを生成する。
【００５９】
いくつかのシナリオにおいて、リモートツリーと同期ツリーとの間の差異に基づき生成される操作シーケンス、及びローカルツリーと同期ツリーとの間の差異に基づき生成される操作シーケンスは、競合する場合がある。また、プランナ１７６は、これら２つの操作シーケンスを単一のマージされた操作プランにマージするように構成されることができる。
【００６０】
スケジューラ１７８は、生成された操作シーケンスを行い、これらの操作の実行を管理するように構成される。いくつかの実施形態により、スケジューラ１７８は、操作シーケンス中の各操作を、操作を実行するために実行される必要がある一連の１つ以上のタスクに変換する。いくつかのシナリオにおいて、いくつかのタスクは、期限切れになる、またはもはや関連性がなくなる場合がある。スケジューラ１７８は、これらのタスクを識別し、それらをキャンセルするように構成される。
【００６１】
図２Ａは、システムコンフィグレーション１００において、コンテンツ管理システム１１０とクライアントデバイス１５０との間でコンテンツを同期させるための例示的なアーキテクチャの概略図を示す。この実施例において、クライアントデバイス１５０は、コンテンツストレージインタフェース２０６及びファイルジャーナルインタフェース２０２を介してそれぞれコンテンツストレージ１４２及びサーバファイルジャーナル１４８とインタラクトする。コンテンツストレージインタフェース２０６は、コンテンツストレージサービス１１６によって提供される、または管理されることができ、ファイルジャーナルインタフェース２０２は、サーバ同期サービス１１２によって提供される、または管理されることができる。例えば、コンテンツストレージインタフェース２０６は、コンテンツストレージサービス１１６のサブコンポーネントまたはサブサービスであり得、ファイルジャーナルインタフェース２０２は、サーバ同期サービス１１２のサブコンポーネントまたはサブサービスであり得る。
【００６２】
コンテンツストレージインタフェース２０６は、コンテンツ要求またはインタラクションなどの通信をクライアントデバイス１５０とコンテンツストレージ１４２との間で管理することができる。コンテンツストレージインタフェース２０６は、コンテンツストレージ１４２に、またコンテンツストレージ１４２からコンテンツをアップロードし、ダウンロードする、クライアントデバイス１５０からの要求を処理することができる。コンテンツストレージインタフェース２０６は、コンテンツ要求（例えば、ダウンロード、アップロードなど）をクライアントデバイス１５０から受信し、アクセス制御リスト１４５中のパーミッションを検証し、認可サービス１３２と通信してクライアントデバイス１５０（及び／またはクライアントデバイス１５０からの要求）がコンテンツストレージ１４２に、またはコンテンツストレージ１４２からコンテンツをアップロードする、またはダウンロードすることを認可されるかどうかを判定し、コンテンツストレージ１４２とインタラクトしてコンテンツストレージ１４２中のコンテンツをクライアントデバイス１５０にダウンロードする、またはアップロードすることができる。クライアントデバイス１５０からの要求がコンテンツアイテムをダウンロードする要求である場合に、コンテンツストレージインタフェース２０６は、コンテンツアイテムをコンテンツストレージ１４２から取得し、コンテンツアイテムをクライアントデバイス１５０に提供することができる。クライアントデバイス１５０からの要求がコンテンツアイテムをアップロードする要求である場合に、コンテンツストレージインタフェース２０６は、コンテンツアイテムをクライアントデバイス１５０から得て、コンテンツアイテムをストレージ用のコンテンツストレージ１４２にアップロードすることができる。
【００６３】
クライアントデバイス１５０からのコンテンツ要求を処理するときに、コンテンツストレージインタフェース２０６は、ストレージインデックス２１０と通信し、コンテンツストレージ１４２中の要求されたコンテンツの可用性及び／またはストレージ位置をチェックし、コンテンツストレージ１４２中でコンテンツアイテムを追跡することができる。ストレージインデックス２１０は、コンテンツストレージ１４２上でコンテンツアイテムを識別する、コンテンツストレージ１４２上のコンテンツアイテムのインデックスを維持することができ、そのうえコンテンツアイテムのそれぞれの位置をコンテンツストレージ１４２内で識別することができる。したがって、ストレージインデックス２１０は、コンテンツストレージ１４２上でコンテンツアイテムを、またコンテンツアイテムのストレージ位置を追跡することができる。ストレージインデックス２１０は、ファイルなどのすべてのコンテンツアイテム、及び／またはブロックまたはチャンクなどのコンテンツアイテムの部分を追跡することができる。いくつかの事例において、コンテンツアイテムは、コンテンツストレージ１４２に格納され、ストレージインデックス２１０において追跡されることができるブロックまたはチャンクに分割され得る。例えば、コンテンツストレージ１４２は、コンテンツアイテムのそれぞれのデータ部分を含むデータのブロックまたはチャンクとして、コンテンツアイテムを格納することができる。ストレージインデックス２１０は、コンテンツストレージ１４２に格納されるコンテンツアイテムのブロックまたはチャンクを追跡することができる。下記の図２Ｂは、コンテンツアイテムのブロックを格納して追跡するための例示的なコンフィグレーションを示す。
【００６４】
ファイルジャーナルインタフェース２０２は、メタデータ要求、ならびにコンテンツ同期及び操作などの通信を、クライアントデバイス１５０とサーバファイルジャーナル１４８との間で管理することができる。例えば、ファイルジャーナルインタフェース２０２は、操作、コンフィグレーション、及び状態情報を、クライアントデバイス１５０とサーバファイルジャーナル１４８との間で変換する、妥当性確認する、認証する、及び／または処理することができる。ファイルジャーナルインタフェース２０２は、カーソル内の、もしくは認可サービス１３２を介してＦＳＡｕｔｈトークンからのパーミッションを検証し、クライアントデバイス１５０によってサーバファイルジャーナル１４８へ送信される要求を認可する、またはこれらの要求の認可を検証することができる。クライアントデバイス１５０からの要求または操作を処理するときに、ファイルジャーナルインタフェース２０２は、ネームスペースメンバーシップストア２０８にアクセスして、クライアントデバイス１５０からの要求または操作と関連するいずれかのネームスペースについてネームスペース所有権情報を判定し、または検証し、パーミッション情報をアクセス制御リスト１４５から取得してクライアントデバイス１５０からの要求または操作と関連するコンテンツのパーミッションを検証することができる。
【００６５】
ファイルジャーナルインタフェース２０２中の変換サービス２０４は、通信のための線形化操作及び変換操作をクライアントデバイス１５０とサーバファイルジャーナル１４８との間で実行することができる。例えば、変換サービス２０４は、クライアントデバイス１５０からの通信を、サーバファイルジャーナル１４８中のデータの構造及びフォーマットと一貫性がある異なるフォーマットに、そしてその逆もまた同様に変換することができる。図示するように、いくつかの事例において、クライアントデバイス１５０は、コンテンツアイテム情報（例えば、状態、変更、バージョンなど）をクライアントデバイス１５０において操作として処理することができ、サーバファイルジャーナル１４８は、データベーステーブルなどのデータ構造中のロウによって反映されるコンテンツアイテムリビジョンと同一の情報を処理することができる。クライアントデバイス１５０とサーバファイルジャーナル１４８との間のコンテンツアイテム情報の同期を有効にするために、変換サービス２０４は、クライアントデバイス１５０からの操作を、サーバファイルジャーナル１４８に適しているリビジョンに変換することができ、サーバファイルジャーナル１４８上でデータのロウ中に反映されるリビジョンを、クライアントデバイス１５０に適している操作に変換することができる。
【００６６】
いくつかの事例において、認可サービス１３２は、クライアントデバイス１５０が要求されたコンテンツアイテムにアクセスする、このコンテンツアイテムを更新する、ダウンロードする、またはアップロードすることを認可されることを検証する、または指示するトークンを生成することができる。このトークンは、クライアントデバイス１５０と関連するデバイス識別子、クライアントデバイス１５０に認証される、または認可されるユーザアカウントと関連するアカウント識別子、クライアントデバイス１５０に認可されたセッションと関連するセッション識別子、ビューコンテキスト、及び識別されたコレクションへのアクセスパーミッションを含むことができる。トークンは、以下により詳細に記述される、カーソルと称される暗号によって署名されたデータオブジェクト中に含まれ得る。コンテンツ管理システム１１０及び／または認可サービス１３２は、トークン（複数可）をクライアントデバイス１５０に送信することができ、クライアントデバイス１５０は、以下にさらに記述されるようなサーバファイルジャーナル１４８へのコンテンツアイテムのリビジョン及び／または更新を要求するときに、トークンをコンテンツ管理システム１１０に提供することができる。また、クライアントデバイス１５０は、トークンをコンテンツストレージインタフェース２０６に提供し、いずれかのコンテンツ要求（例えば、ダウンロード、アップロードなど）を有効にすることができる。コンテンツストレージインタフェース２０６は、トークンを使用して、ストレージインデックス２１０へのクエリを認可し、コンテンツアイテムをコンテンツストレージ１４２に、またはコンテンツストレージ１４２からアップロードする、またはダウンロードすることができる。
【００６７】
例えば、クライアントデバイス１５０は、コンテンツストレージ１４２にコンテンツアイテムをアップロードする要求をコンテンツストレージインタフェース２０６に送信することができる。この要求は、トークン、及びアップロードされるコンテンツアイテムを含むことができる。コンテンツストレージインタフェース２０６は、トークンを使用して、コンテンツアイテムがコンテンツストレージ１４２に既に存在するかどうかをチェックするストレージインデックス２１０へのクエリを認可し、そしてコンテンツストレージ１４２へのコンテンツアイテムのアップロードを認可することができる。また、クライアントデバイス１５０は、トークンをファイルジャーナルインタフェース２０２に提供し、メタデータをサーバファイルジャーナル１４８上に格納してコンテンツアイテムのアップロード及びリビジョンを追跡する要求を認可することができる。
【００６８】
図２Ｂは、例示的なブロックストレージ及び同期コンフィグレーションを示す。この実施例において、コンテンツストレージ１４２は、特定のサイズ（例えば、４ＭＢ）までコンテンツアイテム（例えば、ファイル）の不透明チャンクであることができる、データブロックを格納することができる。コンテンツアイテムは、ブロック中に分割されることができ、これらのブロックは、アクセス用にコンテンツストレージ１４２に格納されることができる。ストレージインデックス２１０は、コンテンツストレージ１４２に格納されるブロックと、コンテンツストレージ１４２に格納されるブロックのそれぞれの位置とを追跡することができる。ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８とインタラクトし、コンテンツストレージ１４２に格納されるコンテンツアイテム及び／またはブロックへのリビジョンを追跡することができる。
【００６９】
例えば、コンテンツアイテム２２０（例えば、ＭｙＦｉｌｅ．ａｂｃ）をブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎ中に分割することができる。コンテンツストレージインタフェース２０６は、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎを受信して、コンテンツストレージ１４２におけるストレージのためにブロックデータ２２２Ｂをコンテンツストレージ１４２に送信することができる。ブロックデータ２２２Ｂは、コンテンツアイテム２２０と関連するブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎを含むことができる。
【００７０】
ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎは、コンテンツストレージ１４２において１つ以上のストレージデバイスまたはボリューム上に格納される、及び／または１つ以上の論理ストレージコンテナ（例えば、バケット）またはデータクラスタ内に集約されることができる。いくつかの事例において、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎは、同一位置（例えば、ストレージデバイス、ボリューム、コンテナ、及び／またはクラスタ）上に合わせて格納されることができる。他の事例において、いくつかの、またはすべてのブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎは、２つ以上の異なる位置（例えば、２つ以上の異なるストレージデバイス、ボリューム、コンテナ、及び／またはクラスタ）上に格納されることができる。
【００７１】
また、コンテンツストレージインタフェース２０６は、ブロックメタデータ２２２Ａをストレージインデックス２１０に格納することができる。ブロックメタデータ２２２Ａは、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎを識別することができ、ストレージインデックス２１０がブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎをコンテンツストレージ１４２において追跡することを可能にする。ブロックメタデータ２２２Ａは、各ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎについての識別子を含むことができる。ブロックについての識別子は、ブロックを識別する、ブロックのハッシュなどの名前またはキーであることができる。
【００７２】
また、ブロックメタデータ２２２Ａは、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎのそれぞれのストレージ位置を示す、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎについての位置情報を含むことができる。ブロックの位置情報は、ブロックが格納されているストレージデバイスまたはボリューム、及び／またはブロックが含まれている論理ストレージコンテナまたはデータクラスタを識別することができる。この位置情報を使用して、関連したブロックにアクセスする、またはこのブロックを取得することができる。
【００７３】
コンテンツストレージインタフェース２０６は、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎをコンテンツストレージ１４２に格納する前に、またはこれらを格納した後に、ブロックメタデータ２２２Ａをストレージインデックス２１０に格納することができる。例えば、コンテンツストレージインタフェース２０６は、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎをコンテンツストレージ１４２に格納した後に、ブロックメタデータ２２２Ａをストレージインデックス２１０に格納し、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎがコンテンツストレージ１４２に格納されていることを示すことができる。
【００７４】
いくつかの事例において、コンテンツストレージインタフェース２０６は、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎをコンテンツストレージ１４２に格納する前に、ストレージインデックス２１０にクエリを行い、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎがコンテンツストレージ１４２に格納されているかどうか（または格納されている位置）を判定することができる。例えば、コンテンツストレージインタフェース２０６は、ブロックメタデータ２２２Ａに基づきストレージインデックス２１０にクエリを行い、ブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎがコンテンツストレージ１４２に格納されているかどうかをチェックすることができる。ストレージインデックス２１０は、ブロックメタデータ２２２Ａ中のブロック識別子をストレージインデックス２１０におけるブロック識別子と比較して、任意のマッチをチェックすることができる。ブロック識別子間のマッチは、関連したブロックがコンテンツストレージ１４２に格納されていることを示す。
【００７５】
前述されるように、サーバファイルジャーナル１４８は、コンテンツアイテムの追加、編集、移動またはリネーム、削除などを有する、コンテンツアイテムリビジョンを追跡する。その結果、ファイルジャーナルインタフェース２０２は、リビジョン２２２Ｃをサーバファイルジャーナル１４８に格納し、コンテンツアイテム２２０及び／またはブロック２２０Ａ、２２０Ｂ、２２０Ｃ、２２０Ｎをコンテンツストレージ１４２に追加したことを示すことができる。リビジョン２２２Ｃは、サーバファイルジャーナル１４８においてコンテンツアイテムリビジョンのジャーナル内にコンテンツアイテム２２０のリビジョンを表すことができる。
【００７６】
リビジョン２２２Ｃは、コンテンツアイテム２２０、及びコンテンツアイテム２２０と関連する操作、例えば、追加操作（例えば、アップロード）、編集操作、移動またはリネーム操作、削除操作などを識別することができる。また、リビジョン２２２Ｃは、コンテンツアイテム２２０が格納されているコンテンツ管理システム１１０中のネームスペースと、リビジョン２２２Ｃを格納するためのサーバファイルジャーナル１４８におけるコンテンツアイテムリビジョンのジャーナル中のロウとを識別することができる。コンテンツアイテムリビジョンのジャーナル内のロウは、コンテンツアイテム２２０についてのリビジョン２２２Ｃと関連するリビジョン番号を表すことができる。
【００７７】
図３Ａは、ファイルジャーナルインタフェース２０２によってクライアントデバイス１５０とサーバファイルジャーナル１４８との間で処理される通信の図を示す。サーバファイルジャーナル１４８は、ロウ中の値、及びサーバファイルジャーナル１４８中のフィールドとして、コンテンツアイテム状態及び変更（例えば、リビジョン）を追跡する。例えば、サーバファイルジャーナル１４８は、コンテンツストレージ１４２中でコンテンツアイテムへのリビジョンの１つ以上のジャーナルを維持することができる。１つ以上のジャーナルは、各コンテンツアイテムのリビジョンを各ネームスペース上で追跡することができる。サーバファイルジャーナル１４８上のジャーナル中の値のロウは、コンテンツアイテムをネームスペース中で識別することができ、このコンテンツアイテムの状態をネームスペース中に反映する。ネームスペース中の同一のコンテンツアイテムに対応するジャーナル中の後のロウは、コンテンツアイテムへの後のリビジョンをネームスペース中に反映することができる。したがって、コンテンツアイテムと関連するサーバファイルジャーナル１４８中のロウは、コンテンツアイテムの現在の状態と、このコンテンツアイテムへのいずれかのリビジョンの作成から現在の状態までとを識別することができる。
【００７８】
コンテンツアイテム情報（例えば、状態、変更またはリビジョンなど）をクライアントデバイス１５０と同期させるために、サーバファイルジャーナル１４８は、サーバファイルジャーナル１４８中で追跡される、または格納される、１つ以上のコンテンツアイテムについてのリビジョンを表すリビジョンデータ３０４を、ファイルジャーナルインタフェース２０２へ、またはこのファイルジャーナルインタフェース２０２から送信する、または受信することができる。リビジョンデータ３０４は、例えば、サーバファイルジャーナル１４８中のロウに対応するコンテンツアイテムリビジョンのログを含むことができる。サーバファイルジャーナル１４８は、リビジョンデータ３０４をファイルジャーナルインタフェース２０４に送信することができ、このファイルジャーナルインタフェース２０４は、以下にさらに記述されるように、リビジョンデータ３０４をクライアントデバイス１５０についての操作データ３０２に変換することができる。
【００７９】
クライアントデバイス１５０は、クライアントデバイス１５０においてコンテンツアイテムを更新する、または修正するコンテンツ操作を実行することができる。コンテンツアイテム情報をサーバファイルジャーナル１４８と同期させるために、クライアントデバイス１５０は、操作データ３０２をファイルジャーナルインタフェース２０２へ、またはこのファイルジャーナルインタフェース２０２から送信する、または受信することができる。クライアントデバイス１５０は、操作データ３０２をファイルジャーナルインタフェース２０２に送信し、コンテンツアイテムへの変更をクライアントデバイス１５０に報告し、操作データ３０２をファイルジャーナルインタフェース２０２から受信してコンテンツアイテムの最新の状態（例えば、リビジョンデータ３０４）をサーバファイルジャーナル１４８から得ることができる。
【００８０】
例えば、クライアントデバイス１５０は、コンテンツアイテムＡをクライアントデバイス１５０において編集し、コンテンツアイテムＡへの編集を示す編集操作をファイルジャーナルインタフェース２０２に報告することができる。この編集操作は、ファイルジャーナルインタフェース２０２と通信して、コンテンツアイテムＡへのリビジョンを示す、操作データ３０２中に含まれ得る。ファイルジャーナルインタフェース２０２は、編集操作を含む操作データ３０２を受信して、サーバファイルジャーナル１４８におけるストレージのためのリビジョンを生成し、このコンテンツアイテムＡへの編集を追跡することができる。ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８を更新してコンテンツアイテムＡの編集された状態を表すリビジョンを格納するために、リビジョンデータ３０４中の編集操作と関連するリビジョンをサーバファイルジャーナル１４８に含むことができる。
【００８１】
以下にさらに記述されるように、操作データ３０２は、クライアントデバイス１５０によってクライアントデバイス１５０と関連する各ネームスペースについて取得される最新の状態またはリビジョンを識別するカーソルを含むことができる。例えば、カーソルは、クライアントデバイス１５０によって、このクライアントデバイス１５０と関連する各ネームスペースについて取得される最新のリビジョンをサーバファイルジャーナル１４８中で識別することができる。このカーソル中の情報により、クライアントデバイス１５０からの操作データ３０２中の操作がこの操作と関連するネームスペース（複数可）について最新の状態またはリビジョンをサーバファイルジャーナル１４８中で反映するかどうかをファイルジャーナルインタフェース２０２が判定することが可能である。これは、サーバファイルジャーナル１４８中の既存のリビジョンと、操作データ３０２から変換されるリビジョンとの間の競合を生じる可能性がある、より古いリビジョンに対応するクライアントデバイス１５０からの操作データ３０２中の操作がサーバファイルジャーナル１４８に書き込まれていないことをファイルジャーナルインタフェース２０２が確保することを援助することができる。
【００８２】
クライアントデバイス１５０とサーバファイルジャーナル１４８との間のコンテンツアイテム情報の同期を可能にするために、ファイルジャーナルインタフェース２０２は、操作データ３０２をリビジョンデータ３０４に、そしてその逆も同様に変換する（例えば、変換サービス２０４を介して）ことができる。操作データ３０２をクライアントデバイス１５０から受信するときに、ファイルジャーナルインタフェース２０２は、操作データ３０２を、この操作データ３０２中の操作から解釈されるコンテンツアイテムリビジョンを含むリビジョンデータ３０４に変換することができる。リビジョンデータ３０４をサーバファイルジャーナル１４８から受信するときに、ファイルジャーナルインタフェース２０２は、リビジョンデータ３０４を、リビジョンデータ３０４中のリビジョンをクライアントデバイス１５０に実装するための操作を含む操作データ３０２に変換することができる。リビジョンデータ３０４は、１つ以上のコンテンツアイテムに起こっていること（すなわち、１つ以上のコンテンツアイテムへのリビジョン）を記述する、データをサーバファイルジャーナル１４８中に含み、操作データ３０２は、クライアントデバイス１５０に実行されている、または実行されるであろう、１つ以上のコンテンツアイテムを修正する操作を含む。したがって、ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８からの１つ以上のコンテンツアイテムへのリビジョンを記述するデータ（例えば、操作データ３０４）を、クライアントデバイス１５０に実行されている、または実行されるであろう１つ以上のコンテンツアイテムをクライアントデバイス１５０において修正する操作に変換することができる。
【００８３】
前述されるように、クライアントデバイス１５０からの操作データ３０２をサーバファイルジャーナル１４８についてのリビジョンデータ３０４に変換することに加えて、ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８からのリビジョンデータ３０４をクライアントデバイス１５０についての操作データ３０２に変換することができる。ファイルジャーナルインタフェース２０２は、リビジョンデータ３０４をサーバファイルジャーナル１４８から取得し、リビジョンデータ３０４中のリビジョンを、これらのようなリビジョンに従いクライアントデバイス１５０において１つ以上コンテンツアイテムをリバイスする、クライアントデバイス１５０における実行のための操作に変換することができる。リビジョンデータ３０４中のリビジョンから生成されるこれらの操作は、ファイルジャーナルインタフェース２０２によってクライアントデバイス１５０に提供される操作データ３０２に含まれる。操作データ３０２とリビジョンデータ３０４との間のこの変換により、クライアントデバイス１５０及びサーバファイルジャーナル１４８は、コンテンツアイテム情報を必要に応じて互いに同期させることが可能である。
【００８４】
クライアントデバイス１５０によって提供される操作データ３０２から生成されるいずれかのリビジョンデータ３０４をサーバファイルジャーナル１４８に書き込む前に、ファイルジャーナルインタフェース２０２は、操作データ３０２中のカーソルをチェックし、及び／またはサーバファイルジャーナル１４８にクエリを行い、リビジョンデータ３０４中のいかなるリビジョンもサーバファイルジャーナル１４８中で競合を生じないことを確保することができる。例えば、ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８にクエリを行い、リビジョンデータ３０４中のリビジョンと関連するコンテンツアイテムのバージョンがサーバファイルジャーナル１４８におけるコンテンツアイテムのバージョンと同一であるかどうか、またはリビジョンデータ３０４中のリビジョンが関係するコンテンツアイテムとして、サーバファイルジャーナル１４８におけるコンテンツアイテムのバージョンが更新されたバージョンであるか、異なるバージョンであるかどうかをチェックすることができる。リビジョンデータ３０４が関係するバージョンと、コンテンツアイテムの最新のバージョンが異なるバージョンであることをサーバファイルジャーナル１４８が示す場合に、これら２つのバージョンは、競合している。
【００８５】
ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８を更新して、操作データ３０２から導出されるリビジョンデータ３０４に含まれる新規のリビジョンを格納することができる。サーバファイルジャーナル１４８中のリビジョンにクエリを行う、及び／またはこれらのリビジョンを更新するときに、ファイルジャーナルインタフェース２０２は、ネームスペースメンバーシップストア２０８にクエリを行い、リビジョンデータ３０４中のリビジョンが影響するいずれのネームスペースと関連するネームスペース所有権情報を取得することができる。このネームスペース所有権情報は、所有するユーザアカウント（複数可）、または特定のネームスペースのメンバーであるユーザアカウント（複数可）を示すことができるため、特定のネームスペースにアクセスすることができる。したがって、ファイルジャーナルインタフェース２０２は、ネームスペース所有権情報を分析し、サーバファイルジャーナル１４８がネームスペースのメンバーではないユーザアカウントからのネームスペースへのリビジョンを含むように更新されないことを確保することができる。
図３Ｂを参照して、サーバファイルジャーナル１４８は、記録３１０についてのデータを格納し、コンテンツアイテムのリビジョンを追跡し、識別することができる。この実施例において、記録３１０は、ネームスペース識別子（ＮＳ＿ＩＤ）、サーバジャーナル識別子（ＳＪ＿ＩＤ）、パス、ブロック、前のリビジョン（Ｐｒｅｖ＿Ｒｅｖ）、及びターゲットネームスペース（Ｔａｒｇｅｔ＿ＮＳ）を含む。ＮＳ＿ＩＤは、ネームスペースをサーバファイルジャーナル１４８中で一意に識別するために１つ以上の値を含むことができる。ＳＪ＿ＩＤは、所与のネームスペース中のロウにマッピングする、単調に増加する値を含み、そのネームスペース内で操作またはリビジョンの順序付けを提供する。パスは、関連したコンテンツアイテムを識別するネームスペース相対パスであることができる。Ｐｒｅｖ＿Ｒｅｖは、このパスと関連するコンテンツアイテムの前の状態に対応するロウのＳＪ＿ＩＤを識別する。Ｔａｒｇｅｔ＿ＮＳは、マウントされたネームスペースのマウントポイントについてのターゲットネームスペースのＮＳ＿ＩＤを識別する。Ｔａｒｇｅｔ＿ＮＳフィールドは、マウントポイントに対応していないロウ（例えば、リビジョン）に設定されない。
【００８６】
いくつかの事例において、テーブル３１０は、関連したコンテンツアイテムのサイズを表すサイズフィールド、コンテンツアイテムがディレクトリであるときを示すように設定されることができるディレクトリフィールド（例えば、Ｉｓ＿Ｄｉｒ）、関連したファイルを一意に識別するファイル識別子、クロックまたはタイムスタンプフィールドなどのような他のフィールドを含むことができる。
【００８７】
ファイルジャーナルインタフェース２０２は、前述されるように、操作データ３０２及びリビジョンデータ３０４に基づき変換３２０を実行することができる。変換３２０を実行するときに、変換サービス２０４は、サーバファイルジャーナル１４８におけるストレージのために線形化されたリビジョンを含むリビジョン３２２に、操作データ３０２を変換することができる。また、変換サービス２０４は、リビジョンデータ３０４を線形化された操作３２４Ａに変換することができ、これらの線形化された操作３２４Ａは、クライアントデバイス１５０に送信される操作データ３０２に含まれ、クライアントデバイス１５０によって適用され、クライアントデバイス１５０においてコンテンツアイテム情報（例えば、状態、変更など）を更新することができる。また、変換サービス２０４は、カーソル３２４Ｂを生成して、または更新して、操作データ３０２中のカーソル３２４Ｂをクライアントデバイス１５０に提供することができる。カーソル３２４Ｂは、線形化された操作３２４Ｂと関連する各ネームスペース及び／またはコンテンツアイテムに対応するそれぞれのリビジョンまたはロウをサーバファイルジャーナル１４８中で識別する。
【００８８】
例えば、カーソル３２４Ｂは、そのネームスペース（例えば、ＳＪ＿ＩＤ）についてサーバファイルジャーナル１４８中でネームスペース（例えば、ＮＳ＿ＩＤ）及びロウを識別することができ、そのネームスペースについてサーバファイルジャーナル１４８中で最新のリビジョンを示す。カーソル３２４Ｂ中のネームスペース及びロウは、線形化された操作３２４Ａ中の操作と関連付けられることができる。カーソル３２４Ｂは、線形化された操作３２４Ａがクライアントデバイス１５０に適用された後に、及び／または適用される前に、サーバファイルジャーナル１４８中のネームスペースのリビジョンまたは状態を示す、特定のネームスペースについてのサーバファイルジャーナル１４８中のリビジョンのログ上の特定の位置を識別することができる。したがって、カーソル３２４Ｂは、線形化された操作３２４Ａの前または後に、サーバファイルジャーナル１４８中のネームスペース及び／またはコンテンツアイテムの状態を示すことができ、リビジョン競合を回避すること、ならびに線形化された操作３２４Ａが適用される前に、及び適用された後に、リビジョンの順序を追跡することを援助することができる。
【００８９】
図４Ａは、サーバファイルジャーナルデータを線形化された操作に変換するための例示的な変換及び線形化プロセスの図を示す。サーバファイルジャーナル１４８は、リビジョン３２２を有するロウ４０２を含むジャーナル４００を格納する。この実施例において、ジャーナル４００は、複数のネームスペース、すなわち、ネームスペース１００及び１０１（すなわち、ＮＳ＿ＩＤ１００及び１０１）についてのリビジョン（３２２）を追跡する。しかしながら、いくつかの事例において、サーバファイルジャーナル１４８は、それぞれのネームスペースに固有なリビジョンを追跡するネームスペース固有ジャーナルを格納することができる。ネームスペース固有ジャーナル中のこれらのロウ（例えば、ロウ４０２）は、そのネームスペースに固有なデータを含み、各ロウは、そのネームスペースに固有なリビジョンを反映する。
【００９０】
ジャーナル４００中の各ロウ（４０２）は、そのロウと関連するネームスペースを一意に識別するネームスペース識別子フィールド（ＮＳ＿ＩＤ）、所与のネームスペース中のロウにマッピングする単調に増加する値を含み、そのネームスペース内で操作またはリビジョンの順序付けを提供するサーバジャーナル識別子フィールド（ＳＪ＿ＩＤ）を含む。また、ジャーナル４００は、コンテンツアイテムのネームスペース相対パスを識別するためのパスフィールド（Ｐａｔｈ）、コンテンツアイテムと関連するブロックまたはブロックリストを識別するためのブロックフィールド（Ｂｌｏｃｋ）、コンテンツアイテムの前の状態またはリビジョンを表すジャーナル４００中のロウ（すなわち、ＳＪ＿ＩＤ）を識別するための前のリビジョンフィールド（Ｐｒｅｖ＿Ｒｅｖ）、及びマウントされたネームスペースのマウントポイントについてのターゲットネームスペースを識別する（ロウがマウントに対応する場合）ためのターゲットネームスペースフィールド（Ｔａｒｇｅｔ＿ＮＳ）を含む。マウントポイントに対応しないロウ（例えば、リビジョン）に対してＴａｒｇｅｔ＿ＮＳフィールドについてのデータはない。
【００９１】
ジャーナル４００中の最初のロウ４０２は、ブロック「ｈ１」に対応し、前のリビジョン（Ｐｒｅｖ＿Ｒｅｖ）またはターゲットネームスペース（Ｔａｒｇｅｔ＿ＮＳ）を含まない、ネームスペース「１００」（ＮＳ＿ＩＤ１００）中の「Ｆｉｌｅ１」（パスフィールド値Ｆｉｌｅ１）について最初のリビジョン（ＳＪ＿ＩＤ１）を識別する。ロウが前のリビジョンまたはターゲットネームスペースを含まないことから、ロウによって表されるリビジョンは、ブロック「ｈ１」と関連する「Ｆｉｌｅ１」のネームスペース「１００」における追加に対応する。ＳＪ＿ＩＤ「４」を含むジャーナル４００中のロウは、このロウがネームスペース「１００」上の「Ｆｉｌｅ１」に対応するジャーナル４００中の最後のロウまたはＳＪ＿ＩＤであることから、ネームスペース「１００」上の「Ｆｉｌｅ１」についてジャーナル４００中の最後のリビジョンを表す。ＳＪ＿ＩＤ「４」を含むこのロウは、ネームスペース「１００」上の「Ｆｉｌｅ１」がＳＪ＿ＩＤ「１」に加えられた後に編集され、この編集がブロック「ｈ４」に対応することを示す。
【００９２】
修正４０４は、リビジョン３２２を表す修正の実施例を描く。この実施例において、修正４０４のそれぞれは、ジャーナル４００中の対応するロウ（４０２）からのコンテンツリビジョンを示す。各修正は、ジャーナル４００中のＳＪＩＤ及びＮＳＩＤに対応し、ジャーナル４００中のこれらの対応するＳＪＩＤ及びＮＳＩＤと関連するファイルに対応する。この実施例において、修正４０４と関連するコンテンツは、ジャーナル４００中のブロック（例えば、「ｈ１」、「ｈ２」、「ｈ３」、「ｈ４」）の例示的なコンテンツ値を表す。修正４０４におけるこれらのコンテンツ値を例示目的のために提供し、各リビジョンと関連するコンテンツへの例示的な修正を描く。
【００９３】
例えば、修正４０４における第一修正は、ジャーナル４００中のＳＪＩＤ「１」及びＮＳＩＤ「１００」を表し、加えられているネームスペース「１００」中の「Ｆｉｌｅ１」を描く。コンテンツ「ａａａ」は、ＮＳＩＤ「１００」のＳＪＩＤ「１」において「Ｆｉｌｅ１」についての「ｈ１」の値を表す。また、修正４０４は、「ａａ２」（例えば、「ｈ４」）に修正されているネームスペース「１００」中の「Ｆｉｌｅ１」と関連するコンテンツ「ａａａ」（例えば、「ｈ１」）を説明する、ジャーナル４００中のＳＪＩＤ「４」及びＮＳＩＤ「１００」を表す、ネームスペース「１００」中の「Ｆｉｌｅ１」の編集を描く。
【００９４】
変換３２０において、ジャーナル４００中のロウ４０２からのリビジョン３２２を、線形化された操作３２４Ａに変換する。線形化された操作３２４Ａは、ジャーナル４００中のリビジョン３２２から生成され、線形化後の修正４０４を表す。線形化された操作３２４Ａによって示されるように、線形化された操作３２４Ａ中の操作は、複数のリビジョン（３２２）及び／または修正（４０４）、または単一のリビジョン（３２２）及び／または修正（４０４）に基づくことができる。
【００９５】
例えば、修正４０４は、ジャーナル４００中のＳＪＩＤ「１」及びＮＳＩＤ「１００」に対応する、「Ｆｉｌｅ１」をネームスペース「１００」に加えるリビジョンと、ジャーナル４００中のＳＪＩＤ「４」及びＮＳＩＤ「１００」に対応する、ネームスペース「１００」中の「Ｆｉｌｅ１」を編集するリビジョンとを描く。追加リビジョンは、「Ｆｉｌｅ１」及びＮＳＩＤ「１００」と関連するコンテンツ値「ａａａ」（例えば、「ｈ１」）、ならびに「Ｆｉｌｅ１」及びＮＳＩＤ「１００」についてのいずれかの前のリビジョンの欠如から推測されることができる。換言すれば、コンテンツ「ａａａ」は、コンテンツ（例えば、「ｈ１」）が加えられたか、編集されたかのいずれかであったことを示し、「Ｆｉｌｅ１」及びＮＳＩＤ「１００」についての前のリビジョンの欠如は、コンテンツ「ａａａ」が編集されているコンテンツとは対照的に追加されているコンテンツ（例えば、「ｈ１」）を表すことを示唆する。編集リビジョンは、「Ｆｉｌｅ１」及びＮＳＩＤ「１００」と関連するコンテンツ値「ａａ２」（例えば、「ｈ４」）と、「Ｆｉｌｅ１」及びＮＳＩＤ「１００」と関連する前のリビジョン（ＳＪＩＤ「１」及びＮＳＩＤ「１００」）とから推測されることができる。換言すれば、「Ｆｉｌｅ１」及びＮＳＩＤ「１００」と関連する、コンテンツ「ａａａ」から「ａａ２」への変更は、コンテンツ「ａａ２」が編集を表すことを示唆する。
【００９６】
線形化された操作３２４Ａにおいて、ＮＳＩＤ「１００」についてのＳＪＩＤ「１」及びＳＪＩＤ「４」に対応する追加及び編集修正（４０４）を、「ａａａ」（例えば、「ｈ１」）から「ａａ２」（例えば、「ｈ４」）に「Ｆｉｌｅ１」と関連するコンテンツ値を編集する単一の線形化された操作（編集操作）に変換することができる。「Ｆｉｌｅ１」のコンテンツ（例えば、「ｈ１」）を「ａａ２」（例えば、「ｈ４」）に編集する、単一の線形化された操作は、コンテンツ「ａａａ」（例えば、「ｈ１」）と関連する「Ｆｉｌｅ１」をネームスペース「１００」に追加する修正と、ネームスペース「１００」中の「Ｆｉｌｅ１」と関連するコンテンツ「ａａａ」（例えば、「ｈ１」）を「ａａ２」（例えば、「ｈ４」）に編集する修正とを反映する。その結果、この線形化された操作は、２つの修正４０４、及びリビジョン３２２中の２つの対応するリビジョンに基づく。
【００９７】
ジャーナル４００中のＳＪＩＤ「２」及びＮＳＩＤ「１００」に対応する修正４０４における修正は、コンテンツ「ｂｂｂ」（例えば、「ｈ２」）と関連する「Ｆｉｌｅ２」をネームスペース「１００」に追加するリビジョンを表す。この修正は、ネームスペース「１００」上で「Ｆｉｌｅ２」に対応するジャーナル４００からのリビジョン３２２のみを表す。その結果、線形化された操作３２４Ａは、コンテンツ「ｂｂｂ」（例えば、「ｈ２」）と関連する「Ｆｉｌｅ２」をネームスペース「１００」に追加し、単一の修正４０４（ネームスペース「１００」上での「Ｆｉｌｅ２」の追加）、及びリビジョン３２２に基づく、ネームスペース「１００」上での「Ｆｉｌｅ２」についての単一の操作を含む。
【００９８】
また、この実施例において、修正４０４は、ジャーナル４００中のＳＪＩＤ「３」及びＮＳＩＤ「１００」に対応する、コンテンツ「ｃｃｃ」（例えば、「ｈ３」）と関連する「Ｆｉｌｅ３」をネームスペース「１００」に追加する修正と、ジャーナル４００中のＳＪＩＤ「５」及びＮＳＩＤ「１００」に対応する、ネームスペース「１００」からの「Ｆｉｌｅ３」の削除（「−１」として表される）とのために含む。したがって、リビジョン３２２は、ネームスペース「１００」上の「Ｆｉｌｅ３」と関連する２つの修正４０４を含む。「Ｆｉｌｅ３」及びネームスペース「１００」と関連するジャーナル４００中の最後のリビジョンがジャーナル４００中のＳＪＩＤ「５」及びＮＳＩＤ「１００」を表す削除修正に対応することから、リビジョン３２２からの「Ｆｉｌｅ３」及びネームスペース「１００」と関連する追加及び削除修正４０４は、ネームスペース「１００」から「Ｆｉｌｅ３」を削除する単一の操作に線形化されることができる。その結果、線形化された操作３２４Ａは、「Ｆｉｌｅ３」をネームスペース「１００」から削除する単一の操作である、「Ｆｉｌｅ３」及びネームスペース「１００」についての単一の操作を備える。
【００９９】
ジャーナル４００において、ＮＳＩＤ「１００」についてのＳＪＩＤ「６」及び「７」、ならびにＮＳＩＤ「１０１」についてのＳＪＩＤ「１」は、ネームスペース「１００」に加えられて、その後、ネームスペース「１００」からネームスペース「１０１」に移動する「Ｄｉｒ」を表す。例えば、ＳＪＩＤ「６」及びＮＳＩＤ「１００」は、「Ｄｉｒ」及びネームスペース「１００」を識別し、「Ｄｉｒ」がＳＪＩＤ「６」においてネームスペース「１００」に追加されたことを示す前のリビジョンを含まない。ＳＪＩＤ「７」は、ブロックフィールド（「−」）、前のリビジョンフィールド（ＳＪＩＤ「６」）、及びターゲットネームスペースフィールド（「１０１」）によって反映される場合、ネームスペース「１００」からネームスペース「１０１」に移動する「Ｄｉｒ」を識別する。次いで、ＮＳＩＤ「１０１」についてのＳＪＩＤ「１」は、「Ｄｉｒ」及びネームスペース「１０１」についての前のロウまたはリビジョンの欠如によって示される場合、ネームスペース「１０１」に追加される「Ｄｉｒ」を識別する。ＮＳＩＤ「１００」中のＳＪＩＤ「６」及び「７」、ならびにＮＳＩＤ「８」中のＳＪＩＤ「１」における追加及び移動リビジョンは、ＳＪＩＤ「６」及びＮＳＩＤ「１００」に対応するネームスペース「１００」への「Ｄｉｒ」の追加、ＳＪＩＤ「７」及びＮＳＩＤ「１００」に対応するネームスペース「１００」からの「Ｄｉｒ」の削除、ならびにＳＪＩＤ「１」及びＮＳＩＤ「１０１」に対応するネームスペース「１０１」への「Ｄｉｒ」の追加という、３つの修正４０４によって描かれる。
【０１００】
ジャーナル４００中のＮＳＩＤ「１００」のＳＪＩＤ「６」及び「７」にそれぞれ対応する、「Ｄｉｒ」及びネームスペース「１００」の追加及び削除修正４０４は、「Ｄｉｒ」及びネームスペース「１００」に対応するジャーナル４００中の最後のリビジョンがＳＪＩＤ「７」及びＮＳＩＤ「１００」におけるネームスペース「１００」からの「Ｄｉｒ」の削除であることから、「Ｄｉｒ」をネームスペース「１００」から削除する単一の操作に線形化される。ジャーナル４００中のＳＪＩＤ「１」及びＮＳＩＤ「１０１」に対応する、ネームスペース「１０１」への「Ｄｉｒ」の追加は、「Ｄｉｒ」及びネームスペース「１０１」に対応する修正４０４及びリビジョン３２２のみである。その結果、「Ｄｉｒ」及びネームスペース「１０１」についての単一のマウント操作として、線形化された操作３２４Ａに追加を提供する。したがって、ＮＳＩＤ「１００」中のＳＪＩＤ「６」及び「７」、ならびにＮＳＩＤ「１０１」中のＳＪＩＤ「１」に対応するリビジョン３２２からの３つの修正４０４（すなわち、ネームスペース「１００」上での「Ｄｉｒ」の追加及び削除、ならびにネームスペース「１０１」上での「Ｄｉｒ」の追加）は、ネームスペース「１００」中の「Ｄｉｒ」についての削除操作、及びネームスペース「１０１」中の「Ｄｉｒ」についてのマウント操作という、線形化された操作３２４Ａ中の２つの操作に線形化される。
【０１０１】
上記に示されるように、線形化された操作３２４Ａは、「Ｆｉｌｅ１」及びネームスペース「１００」についての編集操作、「Ｆｉｌｅ２」及びネームスペース「１００」についての追加操作、ネームスペース「１００」中の「Ｆｉｌｅ３」の削除操作、ネームスペース「１００」中の「Ｄｉｒ」についての削除操作、ならびに「Ｄｉｒ」をネームスペース「１０１」に追加するためのマウント操作を備える。線形化された操作３２４Ａ中のこれらの操作は、リビジョン３２２から生成され、ジャーナル４００中の各コンテンツアイテムの最新の状態を反映する。ファイルジャーナルインタフェース２０２は、線形化された操作３２４Ａを生成し、線形化された操作３２４Ａをクライアントデバイス１５０に送信して、クライアントデバイス１５０がリビジョン３２２からの最新の状態をジャーナル４００中に含むことを確保することができる。
【０１０２】
線形化された操作３２４Ａをクライアントデバイス１５０に提供するときに、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０への線形化された操作３２４Ａに加えてカーソル３２４Ｂを含むことができる。カーソル３２４Ｂは、ジャーナル４００中の各ネームスペース（ＮＳＩＤ）について最後のリビジョン（ＳＪＩＤ）を識別することができる。いくつかの実施形態において、カーソル３２４Ｂは、ユーザＩＤを有するＦＳＡｕｔｈトークン、及びカーソルに提供されるＮＳ＿ＩＤへの最後に観測されたアクセスパーミッションをも含むことができる。各ネームスペースについての最後のリビジョンは、各ネームスペースに対してクライアントデバイス１５０に送信された最新のリビジョンに対応するジャーナル４００中の位置を示すことができる。
【０１０３】
いくつかの事例において、カーソル３２４Ｂは、線形化された操作３２４Ａ中の各操作をジャーナル４００中のネームスペース（ＮＳＩＤ）及びロウ（ＳＪＩＤ）にマッピングすることができる。操作と関連するネームスペース及びロウは、この操作に対応するジャーナル４００中の位置を示すことができる。換言すれば、操作と関連するネームスペース及びロウは、ジャーナル４００中にその操作によって表されるリビジョン番号を示すことができる。カーソル３２４Ｂ中のネームスペース及びロウは、線形化された操作３２４Ａと関連する各ネームスペース及びコンテンツアイテムについてジャーナル４００中で最新の状態に対応する。クライアントデバイス１５０からの変更（例えば、操作データ３０２を介して）を１つ以上のネームスペース及び／またはコンテンツアイテムに適用することを試みるときに、カーソル３２４Ｂをクライアントデバイス１５０用のツールとしてクライアントデバイス１５０に提供し、１つ以上のネームスペース及び／またはコンテンツアイテムについてクライアントデバイス１５０によって取得される最新の状態またはリビジョンを、ファイルジャーナルインタフェース２０２に対して識別することができる。ファイルジャーナルインタフェース２０２がカーソル３２４Ｂをクライアントデバイス１５０から受信するときに、それは、カーソル３２４Ｂを使用して、ジャーナル４００においてクライアントデバイス１５０の位置（例えば、クライアントデバイス１５０によって取得されるジャーナル４００からの最新のリビジョン）を識別し、クライアントデバイス１５０からの操作によって引き起こされる競合を検出する、または回避することができる。
【０１０４】
例えば、ファイルジャーナルインタフェース２０２が「Ｆｉｌｅ１」をネームスペース「１００」中で修正する操作をクライアントデバイス１５０から受信する場合に、ファイルジャーナルインタフェース２０２は、それが操作に加えてクライアントデバイス１５０から受信する、カーソル３２４Ｂを使用して、ジャーナル４００がネームスペース「１００」中の「Ｆｉｌｅ１」に対して、クライアントデバイス１５０からカーソル３２４Ｂ中で識別されるリビジョンよりも、新しいいずれかのリビジョンを含むかどうかをチェックすることができる。カーソル３２４Ｂ中のリビジョンがジャーナル４００中で直近のリビジョンである場合に、ファイルジャーナルインタフェース２０２は、ネームスペース「１００」中の「Ｆｉｌｅ１」についてジャーナル４００中の新規のリビジョン（例えば、ＮＳＩＤ「１００」中のＳＪＩＤ「８」）として編集操作をコミットすることができる。
【０１０５】
代替に、カーソル３２４Ｂ中のリビジョンがネームスペース「１００」中の「Ｆｉｌｅ１」に対してジャーナル４００中の直近のリビジョンではない場合に、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からの編集操作がネームスペース「１００」中の「Ｆｉｌｅ１」に対して、ジャーナル４００中で直近のバージョンに基づいていないと判定することができる。例えば、カーソル３２４Ｂがジャーナル４００中でＳＪＩＤ「４」及びＮＳＩＤ「１００」を識別し、ジャーナル４００がネームスペース「１００」中の「Ｆｉｌｅ１」に対して、ＳＪＩＤ「１２」及びＮＳＩＤ「１００」におけるリビジョンを含むとファイルジャーナルインタフェース２０２が判定する場合に、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からの編集操作がネームスペース「１００」上の「Ｆｉｌｅ１」のより古いバージョン（例えば、ＳＪＩＤ「４」及びＮＳＩＤ「１００」）に関係があると判定することができ、この編集操作は、その後修正されたファイルを編集する場合に競合を生じる可能性がある。ファイルジャーナルインタフェース２０２は、この編集操作によって生じるこの競合を検出して編集操作を拒否し、この競合を調整することを試みる、または最新のリビジョンをクライアントデバイス１５０に提供してクライアントデバイス１５０が競合を調整することを可能にすることができる。
【０１０６】
ファイルジャーナルインタフェース２０２は、線形化された操作をクライアントデバイス１５０に送信するたびに、各ネームスペース及び／またはコンテンツアイテムについてのそれぞれの位置をジャーナル４００中で識別する、本明細書に記述されるようなカーソルを含むことができる。同様に、いつでもクライアントデバイス１５０は、操作をファイルジャーナルインタフェース２０２に送信し、ファイルジャーナルインタフェース２０２がクライアントデバイス１５０における状態をジャーナル４００における状態にマッピングするために使用することができる、その最新のカーソルを含むことができる。
【０１０７】
この実施例におけるジャーナル４００は、複数のネームスペースを備えるジャーナルを描く。前述されるように、いくつかの実施例において、サーバファイルジャーナル１４８は、ネームスペース固有のジャーナルを維持することができる。カーソル３２４Ｂは、各ネームスペースについてＳＪＩＤ及びＮＳＩＤを含み、各ネームスペースについての最新のリビジョンを示すことができる。カーソル３２４Ｂに基づき、ファイルジャーナルインタフェース２００は、複数のジャーナルが維持されている実施形態において、本明細書にさらに説明されるように、複数のジャーナルにクエリを行う、及び／またはリビジョンを複数のジャーナルから取得することができる。
【０１０８】
図４Ｂは、クライアントデバイス１５０からの操作データ３０２をサーバファイルジャーナル１４８においてジャーナル４００についてのリビジョン３２２に変換する、線形化４１０のための例示的なプロセスの図を示す。クライアントデバイス１５０は、操作データ３０２をファイルジャーナルインタフェース２０２に提供することができる。この実施例における操作データ３０２は、コンテンツアイテムの編集、追加、リネーム、移動、マウント、または削除操作などの、操作４１２をクライアントデバイス１５０に含む。いくつかの事例において、操作４１２は、同一のコンテンツアイテムに対して複数の操作を含むことができる。例えば、操作４１２は、ネームスペース「１００」上の「Ｆｉｌｅ４」を編集する操作、ネームスペース「１００」からの「Ｆｉｌｅ４」を削除する操作を備えることができる。
【０１０９】
また、操作データ３０２は、ファイルジャーナルインタフェース２０２からクライアントデバイス１５０によって以前に受信されたカーソル３２４Ｂを含む。カーソル３２４Ｂは、ジャーナル４００において１つ以上のネームスペース及び／またはコンテンツアイテムについての状態（例えば、ＮＳＩＤ及びＳＪＩＤ）または最新のリビジョンを識別することができる。クライアントデバイス１５０は、カーソル３２４Ｂを操作４１２についての基準ポイントとしてファイルジャーナルインタフェース２０２に提供することができる。この実施例において、カーソル３２４Ｂは、ＳＪＩＤ「９」によって表されている、ネームスペース「１００」についての最新の状態を提供する。
【０１１０】
いくつかの事例において、カーソルは、コンテンツ管理システム１１０によって暗号により署名され、カーソルが改ざんされていないことをファイルジャーナルインタフェース２０２が判定することを可能にする。さらに、クライアントデバイス１５０がネームスペースについて直近のリビジョンをサーバファイルジャーナル１４８から受信したときに、クライアントデバイス１５０がリビジョンをサーバファイルジャーナル１４８にコミットすることから、ファイルジャーナルインタフェース２０２は、ＮＳ＿ＩＤに対して最後に観測されたアクセスパーミッションがまだ有効であるため、クライアントデバイス１５０がネームスペースへのアクセスを有することを許容することができる。
【０１１１】
ファイルジャーナルインタフェース２０２は、操作４１２及びカーソル３２４Ｂを受信して線形化４１０を実行し、クライアントデバイス１５０からの操作４１２を線形化してジャーナル４００についてのリビジョン３２２に変換することができる。操作４１２に基づき、ファイルジャーナルインタフェース２０２は、操作のログ４１４を生成することができる。ログ４１４は、ジャーナル４００中のそれぞれのネームスペース（複数可）にマッピングされる操作４１２からの操作リストを含むことができる。いくつかの事例において、ログ４１４は、以前に説明されるような操作４１２から生成される線形化された操作（３２４Ａ）を備えることができる。
【０１１２】
ファイルジャーナルインタフェース２０２は、ジャーナル４００を更新してログ４１４に操作を反映する前に、カーソル３２４Ｂを使用して、その操作４１２がジャーナル４００に最新の状態またはリビジョンを反映することを検証することができる。カーソル３２４Ｂがジャーナル４００においてログ４１４と関連するネームスペース及び／またはコンテンツアイテムに対して最新の状態またはリビジョンを反映することをファイルジャーナルインタフェース２０２が確認する場合に、ファイルジャーナルインタフェース２０２は、ログ４１４に基づきリビジョン３２２をジャーナル４００に追加することができる。リビジョン３２２は、ログ４１４中の操作と関連する各コンテンツアイテム及び／またはネームスペースの最新の状態またはリビジョンを含むことができる。
【０１１３】
ログ４１４における操作は、「Ｆｉｌｅ５」についての追加及び編集操作を備える。その結果、リビジョン３２２は、ファイルジャーナルインタフェース２０２がジャーナル４００に「Ｆｉｌｅ５」の最新状態（すなわち、線形化方式において追加及び編集操作を「Ｆｉｌｅ５」に適用した後の状態）として書き込むことができる、「Ｆｉｌｅ５」の編集を備える。また、ログ４１４におけるこれらの操作は、「Ｄｉｒ２」についての追加操作、ならびにネームスペース「１００」上での「Ｆｉｌｅ４」についての編集及び削除操作を備える。したがって、リビジョン３２２は、「Ｄｉｒ２」をネームスペース「１００」に追加する操作、ならびに「Ｆｉｌｅ４」をネームスペース「１００」から削除する操作を、それぞれ「Ｄｉｒ２」及び「Ｆｉｌｅ４」の最新の状態として有することができる。
【０１１４】
図４Ｂにおいて、ジャーナル４００中に描かれるリビジョン（３２２）は、操作４１２と関連する各コンテンツアイテム（「Ｆｉｌｅ４」、「Ｆｉｌｅ５」、「Ｄｉｒ２」）の最新の状態を反映する。しかしながら、いくつかの事例において、ファイルジャーナルインタフェース２０２がログ４１４に起因する各ネームスペース及び／またはコンテンツアイテムの最新の状態のリビジョンだけではなく、最新の状態またはリビジョンまでに導出するいずれかの前の状態またはリビジョンをも反映するため、ログ４１４によって表されるあらゆるリビジョンをジャーナル４００に書き込むことができることに留意するべきである。例えば、ファイルジャーナルインタフェース２０２は、操作４１２からの最新の状態を反映する「Ｆｉｌｅ４」の編集のみを書き込むこととは対照的に、ジャーナル４００に「Ｆｉｌｅ４」の編集についてのリビジョン、及び「Ｆｉｌｅ４」の削除についての後のリビジョンを書き込み、ジャーナル４００に操作４１２からの「Ｆｉｌｅ４」のリビジョンのフルシーケンスを示すことができる。
【０１１５】
ファイルジャーナルインタフェース２０２は、ログ４１４中の操作をリビジョン３２２に変換し、ジャーナル４００を更新してリビジョン３２２を含むことができる。ファイルジャーナルインタフェース２０２は、ジャーナル４００中のそれぞれのロウにおいて、リビジョン３２２をジャーナル４００に書き込むことができる。ファイルジャーナルインタフェース２０２は、リビジョン３２２をジャーナル４００中の次の利用可能なロウ（例えば、ＳＪＩＤ）に追加することができる。いくつかの事例において、ファイルジャーナルインタフェース２０２は、線形化４１０及び／またはそれぞれのタイムスタンプまたはクロックに基づき決定されることができる相対的な順序に基づきリビジョン３２２を追加することができる。
【０１１６】
図４Ｂに示されるように、ネームスペース「１００」中の「Ｆｉｌｅ４」の削除操作は、ネームスペース「１００」についてのロウ「１１」またはＳＪＩＤ「１１」に含まれる。ジャーナル４００のＳＪＩＤ「１１」中のリビジョンは、ブロックフィールド中のマイナス記号によって反映される場合、ネームスペース「１００」中の「Ｆｉｌｅ４」が削除されていることを示し、ネームスペース「１００」中の「Ｆｉｌｅ４」についてのジャーナル４００において、ＳＪＩＤ「９」を前のリビジョンとして識別する。「Ｄｉｒ２」の追加、及び「Ｆｉｌｅ５」の編集は、ロウまたはＳＪＩＤ１２及び１４にそれぞれ含まれる。
【０１１７】
図４Ｂ中のジャーナル４００は、ログ４１４及びカーソル３２４Ｂに基づくリビジョン３２２を含み、ログ４１４中で修正される各コンテンツアイテムの状態を反映するように更新されている。ジャーナル４００中の各ロウにおけるパスフィールドは、関連したネームスペース（例えば、ネームスペース「１００」）内でコンテンツアイテムを識別する。ロウのパスフィールドは、ログ４１４中の対応する操作からのファイル及びネームスペースに基づく。ジャーナル４００中のブロックフィールドは、コンテンツアイテムを表す。いくつかの事例において、ブロックフィールドは、それぞれのコンテンツアイテムまたはデータブロックのハッシュを含むことができる。コンテンツアイテムが削除されている、及び／またはディレクトリ、フォルダ、マウントなどである場合に、ブロックフィールドは、空であり得る。
【０１１８】
ジャーナル４００がログ４１４に基づくリビジョン３２２、及びカーソル３２４Ｂを含むように更新するときに、変換サービス２０４は、ジャーナル４００のパスフィールド中に含む、各コンテンツアイテムのパスを識別することができる。いくつかの事例において、変換サービス２０４は、コンテンツアイテムの識別子（例えば、ファイルＩＤ）をコンテンツアイテムのパス（例えば、／ｄｉｒｅｃｔｏｒｙ／ｆｉｌｅｎａｍｅ）に変換することができる。例えば、クライアントデバイス１５０は、コンテンツアイテムについてのそれぞれのパスを追跡する、または計算することなく、識別子を使用して、コンテンツアイテム（例えば、操作データ３０２中のコンテンツアイテム）を識別することができる。ジャーナル４００は、コンテンツアイテムのパスを代替に使用して、コンテンツアイテムを識別することができる。変換サービス２０４は、クライアントデバイス１５０からのコンテンツアイテムの識別子を使用してジャーナル４００についてのコンテンツアイテムのパスを計算し、コンテンツアイテムについて計算されるパスを使用してジャーナル４００を更新することができる。また、変換サービス２０４は、逆変換を実行してコンテンツアイテムのパスに基づきコンテンツアイテムの識別子を取得し、クライアントデバイス１５０と通信するコンテンツアイテムを参照するときにコンテンツアイテムの識別子を使用することができる。
【０１１９】
例えば、変換サービス２０４は、ジャーナル４００中のパス、ジャーナル４００中のＮＳＩＤ、及び／またはジャーナル４００中のディレクトリフィールド（またはサーバファイルジャーナル１４８中の他の箇所）を使用して、コンテンツアイテムを識別し、そのコンテンツアイテムの識別子（例えば、ファイルＩＤ）を取得することができる。ファイルジャーナルインタフェース２０２がそのコンテンツアイテムに関係がある更新または情報をクライアントデバイス１５０に送信する場合に、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０がコンテンツアイテムのパスを含む、または含まないコンテンツアイテムを識別するために使用することができる、コンテンツアイテムの識別子をクライアントデバイス１５０に提供することができる。
【０１２０】
前述されるように、操作４１２からのリビジョン３２２をジャーナル４００に書き込む前に、ファイルジャーナルインタフェース２０２は、カーソル３２４Ｂが操作４１２と関連する各ネームスペース及び／またはコンテンツアイテムについてジャーナル４００中の最新の状態またはリビジョンを反映するかどうかをチェックすることができる。いくつかの事例において、カーソル３２４Ｂがジャーナル４００中の最新の状態またはリビジョンを反映することを確認した後に、ファイルジャーナルインタフェース２０２は、操作４１２から生成されるリビジョンがジャーナル４００中の既存のリビジョンと競合しないことを確保する第二チェックも実行することができる。例えば、ジャーナル４００においてネームスペース「１００」中のＳＪＩＤ「５」が「Ｆｉｌｅ５」の削除操作を表す場合に、クライアントデバイス１５０からのファイルジャーナルインタフェース２０２によって受信される操作４１２から発行されるＳＪＩＤ「１４」中に描かれる「Ｆｉｌｅ５」の編集リビジョン３２２は、「Ｆｉｌｅ５」がＳＪＩＤ「５」において削除された場合でも、「Ｆｉｌｅ５」を編集することを試みることによって競合を生じる。したがって、ファイルジャーナルインタフェース２０２は、この実施例において編集操作及びリビジョンを拒否し、編集操作が無効であることをクライアントデバイス１５０に通信することができる。ファイルジャーナルインタフェース２０２は、カーソル３２４Ｂを更新し、更新されたカーソルをクライアントデバイス１５０に提供し、必要に応じて「Ｆｉｌｅ５」（及びいずれかの他のコンテンツアイテム）についてジャーナル４００中の最新の状態またはリビジョンのクライアントデバイス１５０に通知することができる。
【０１２１】
図５Ａは、ネームスペース間操作の例示的な線形化の図を示す。ネームスペース間線形化、及びシャード間またはネームスペース間のリスト化は、クロック順序付けを介して実行されることができる。テーブル５０２Ａ、５０２Ｂ（合わせて「５０２」）は、線形化のためのネームスペース間操作のバッチを示す。テーブル５０２Ａ、５０２Ｂは、テーブル５０２Ａ、５０２Ｂ中の記録用のネームスペースを識別するためのネームスペース（ＮＳＩＤ）フィールドであるカラム５０６Ａ、５０８Ａと、カラム５０６Ａ、５０８Ａ中のそれぞれのネームスペース用のテーブル５０２Ａ、５０２Ｂ中のロウまたはＳＪＩＤを識別するためのＳＪＩＤフィールドであるカラム５０６Ｂ、５０８Ｂと、各ＳＪＩＤと関連する操作を識別するための操作フィールドであるカラム５０６Ｃ、５０８Ｃと、カラム５０６Ｃ、５０８Ｃ中の操作と関連するタイムスタンプを識別するためのクロックフィールドであるカラム５０６Ｄ、５０８Ｄとをそれぞれ含む。
【０１２２】
この実施例において、テーブル５０２Ａは、ＮＳＩＤ「１」についてのＳＪＩＤ「１００」及び「１０１」を描く。ＳＪＩＤ「１００」は、タイムスタンプ「１０００」において「ｆｏｏ．ｔｘｔ」をネームスペース「１」に追加する操作と関連付けられ、そしてＳＪＩＤ「１０１」は、タイムスタンプ「１００１」においてネームスペース「２」をマウントする操作と関連付けられる。テーブル５０２Ｂは、ＮＳＩＤ「２」についてのＳＪＩＤ「１」及び「２」を描く。ＳＪＩＤ「１」は、タイムスタンプ「５００」において「ｂａｒ．ｔｘｔ」をネームスペース「２」に追加する操作と関連付けられ、そしてＳＪＩＤ「２」は、タイムスタンプ「１００２」において「ｂａｒ．ｔｘｔ」を編集する操作と関連付けられる。
【０１２３】
リニアライザ（例えば、変換サービス２０４）は、テーブル５０２中の操作のバッチを取得し、カーソル（５１４）によって操作（５１２）の単一のストリームを発行することができる。リニアライザは、テーブル５０２中に少なくとも１つの操作を含むすべてのネームスペースを識別し、それぞれタイムスタンプ、ＮＳＩＤ、ＳＪＩＤに基づきすべてのネームスペースについての操作を線形化することができる。この実施例において、テーブル５０２中の操作のバッチは、テーブル５０４に示される操作のストリームに線形化する。
【０１２４】
テーブル５０４は、各操作のネームスペースを識別するためのＮＳＩＤフィールドを含むＮＳＩＤカラム５１０、テーブル５０４中の操作を識別するための操作フィールドを含む操作カラム５１２、及び各操作についてのカーソル状態を識別するためのカーソルフィールドを含むカーソルカラム５１４を含む。テーブル５０４中のロウ５０４Ａは、テーブル５０２Ａ中のネームスペース「１」のＳＪＩＤ「１００」からの追加操作を備える。ロウ５０４Ａについてのカーソルカラム５１４中のカーソル状態は、追加操作がテーブル５０２Ａに示されるネームスペース「１」中のＳＪＩＤ「１００」に対応することを示す、ネームスペース「１」及びＳＪＩＤ「１００」である。テーブル５０４中のロウ５０４Ｂは、ＮＳＩＤカラム５１０または操作カラム５１２中に値を含まないが、この実施例において、ネームスペース「２」についてＳＪＩＤ「０」を追加する、ネームスペース間のカーソル状態を含む、カーソルカラム５１４中のカーソル状態を更新する。
【０１２５】
テーブル５０４中のロウ５０４Ｃは、テーブル５０２Ａに示されるネームスペース「２」中のＳＪＩＤ「１」からの追加操作を含む。ロウ５０４Ｃについてのカーソルカラム５１４中のカーソル状態は、ロウ５０４Ｃ中の追加操作と関連するネームスペース「１」及び「２」についてそれぞれＳＪＩＤ「１００」及び「１」を含む。示されるように、カーソル状態は、カーソルがネームスペース「１」中のＳＪＩＤ「１００」、及びネームスペース「２」中のＳＪＩＤ「１」にあることを示す。換言すれば、ネームスペース「１」中のロウまたはＳＪＩＤは、追加操作がネームスペース「１」の状態に影響しない場合に増加しないが、ネームスペース「２」中のロウまたはＳＪＩＤは、追加操作がネームスペース「２」中のリビジョンを表し、ネームスペース「２」の状態に影響する場合に１つ増加した。したがって、ロウ５０４Ｃ中のカーソル状態は、ネームスペース「２」中のＳＪＩＤ「１」における追加操作後に、ネームスペース「１」及びネームスペース「２」についてそれぞれのＳＪＩＤを追跡する。
【０１２６】
テーブル５０４中のロウ５０４Ｄは、ＳＪＩＤ「１０１」におけるマウント操作、及びテーブル５０２Ａにおけるネームスペース「１」を含む。マウント操作は、ネームスペース「２」をネームスペース「１」にマウントする。マウント操作は、ネームスペース「１」中のＳＪＩＤを「１００」から「１０１」に増加させるが、ネームスペース「２」中のＳＪＩＤを増加させない。その結果、ロウ５０４Ｄについてのカーソルカラム５１４中のカーソル状態は、ネームスペース「１」についてＳＪＩＤ「１０１」を含み、ネームスペース「２」についてＳＪＩＤ「１」を維持する。このカーソル状態は、ネームスペース「１」及び「２」における状態及び／または順序を反映する。
【０１２７】
テーブル５０４中のロウ５０４Ｅは、マウント及び編集操作のそれぞれのタイムスタンプに従い、ネームスペース「１」中のＳＪＩＤ「１０１」におけるマウント操作後である、テーブル５０２Ａ中のＳＪＩＤ「２」及びネームスペース「２」における編集操作を含む。ロウ５０４Ｅのカーソルカラム５１４中のカーソル状態は、ＳＪＩＤ「１０１」におけるネームスペース「１」についてのカーソル状態を維持するが、ＳＪＩＤ「２」へのネームスペース「２」についてのカーソル状態を増加させる。
【０１２８】
テーブル５０４中に示されるように、操作５１２は、ネームスペース「１」及び「２」にわたる因果関係及びタイムスタンプに基づき線形化される操作のストリームとしてリスト化される。操作５１２をテーブル５０４中で線形化してネームスペース間の因果関係及び連鎖を反映すると、操作５１２をサーバファイルジャーナル１４８中のリビジョン（例えば、ジャーナル４００中のリビジョン３２２）に変換し、サーバファイルジャーナル１４８に書き込むことができる。
【０１２９】
例えば、サーバファイルジャーナル１４８中のネームスペース「１」についてのジャーナルは、「ｆｏｏ．ｔｘｔ」をネームスペース「１」に追加する追加操作を表すＳＪＩＤ「１００」におけるリビジョン、及びネームスペース「２」をネームスペース「１」上にマウントするマウント操作を表すＳＪＩＤ「１０１」におけるリビジョンを含むように更新されることができる。さらに、サーバファイルジャーナル１４８中のネームスペース「２」についてのジャーナルは、「ｂａｒ．ｔｘｔ」をネームスペース「２」に追加する追加操作を表すＳＪＩＤ「１」におけるリビジョン、及びネームスペース「２」上の「ｂａｒ．ｔｘｔ」を編集する編集操作を表すＳＪＩＤ「２」におけるリビジョンを含むように更新されることができる。
【０１３０】
図５Ｂは、これらのイベントについて計算されるランポートクロックに従い順序付けされるネームスペースにわたるイベントのダイアグラムを示す。この実施例において、さまざまな操作は、ネームスペースＮＳＩＤ１、ＮＳＩＤ２、及びＮＳＩＤ３にわたり実行された。各ネームスペースは、ネームスペース内の操作の順序付けを決定するために、そのネームスペースにおけるどの操作についてもＳＪＩＤを維持する。しかしながら、ネームスペースのＳＪＩＤは、ネームスペースにわたる操作の順序付け及び因果関係を識別しない。その結果、ランポートクロックをネームスペースＮＳＩＤ１、２、３における操作について計算し、因果関係を決定して、操作のネームスペース間順序付けを得る。
【０１３１】
ＮＳＩＤ１において、操作５１０は、ＳＪＩＤ１及びクロック１を含む。ＮＳＩＤ２において、操作５１６は、ＳＪＩＤ１及びクロック１を含む。ＮＳＩＤにおいて、操作５２０は、ＳＪＩＤ１及びクロック１を含む。操作５１０、５１６、５２０は、複数のネームスペースに及び、因果関係を有さない。その結果、操作５１０、５１６、５２０は、互いのクロックに影響しない。
【０１３２】
ネームスペース内の操作の順序付けは、ネームスペースにおけるＳＪＩＤに基づき決定されることができる。同一のネームスペース内の操作についてのクロックは、単純に１によってインクリメントされることができる。したがって、ＮＳＩＤ１中のＳＪＩＤ２において、操作５１２についてのクロックは、２にインクリメントされる。
【０１３３】
ＮＳＩＤ１における操作５１２は、ＮＳＩＤ２へのファイル１の移動である。その結果、操作５１２は、ＮＳＩＤ２におけるファイル１の追加である、操作５１８をＮＳＩＤ２にトリガする。ＮＳＩＤ２における操作５１８が異なるネームスペースからの別の操作、すなわち、ＮＳＩＤ１からの操作５１２に因果関係によって依存していることから、操作５１８についてのクロックは、ＮＳＩＤ１におけるクロック、及びＮＳＩＤ２におけるクロックに基づき計算される。このアルゴリズムは、ＴａｒｇｅｔＮＳ＿ｃｌｏｃｋｔ１＝ｍａｘ（Ｓｏｕｒｃｅ＿ＮＳｃｌｏｃｋ，ＴａｒｇｅｔＮＳ＿ｃｌｏｃｋｔ０）  ＋１として表されることができる。したがって、この実施例において、ＮＳＩＤ２における操作５１８についてのクロックは、３（例えば、ｍａｘ（２，１）＋１）である。その結果、ＮＳＩＤ２における操作５１８は、ＳＪＩＤ２及びクロック３を含む。
【０１３４】
同様に、ＮＳＩＤにおける操作５１６は、ＮＳＩＤ２からＮＳＩＤ１へのファイル２の移動である。したがって、操作５１６は、ファイル２をＮＳＩＤ１に追加するために、操作５２２をＮＳＩＤ１にトリガする。操作５２２についてのクロックは、クロックアルゴリズムに基づき計算され、３に等しい。したがって、操作５２２は、ＮＳＩＤ１におけるＳＪＩＤ３、及びクロック３を含む。
【０１３５】
ＮＳＩＤ３における操作５２２は、同一のネームスペースにおける操作、すなわち、ＮＳＩＤ３における操作５２０に因果関係によって依存している。したがって、操作５２２についてのクロックは、ＮＳＩＤ３において操作５２０のクロックをインクリメントすることによって計算されることができる。したがって、この実施例において、操作５２２についてのクロックは、２である。ＮＳＩＤ３における操作５２２は、ＳＪＩＤ２及びクロック２を含む。操作５２２がＤｉｒをＮＳＩＤ１に移動させるための移動操作であることから、操作５２２は、ＤｉｒをＮＳＩＤ１に追加する、操作５２４をＮＳＩＤ１にトリガする。
【０１３６】
操作５２４が異なるネームスペース（ＮＳＩＤ３）における操作５２２によってトリガされることから、操作５２４についてのクロックは、ＮＳＩＤ１におけるクロック、及び操作５２２についてのクロックに基づき計算される。その結果、操作５２４についてのクロックは、４（例えば、ｍａｘ（２，３）＋１）に設定される。したがって、操作５２４は、ＮＳＩＤ１におけるＳＪＩＤ４、及びクロック４を含む。
【０１３７】
ＮＳＩＤ１における操作５２６は、ファイル３をＮＳＩＤ１に追加し、ネームスペース間操作ではない。その結果、操作５２６についてのクロックは、ＮＳＩＤ１におけるクロックをインクリメントすることによって計算される。したがって、操作５２６についてのクロックは、５に設定される。
【０１３８】
操作５２８は、ＮＳＩＤ１内の操作５２６にも因果関係によって依存している。したがって、操作５２８についてのクロックは、ＮＳＩＤ１における操作５２６のクロックをインクリメントすることによって、６に設定される。操作５２８は、ＮＳＩＤ１におけるＳＪＩＤ６、及びクロック６を含む。
【０１３９】
操作５２８は、ファイル３をＮＳＩＤ３に移動させる移動操作である。したがって、操作５２８は、ＮＳＩＤ３に操作５３０をトリガする。操作５３０が異なるネームスペースからの操作に基づくことから、そのクロックは、ＮＳＩＤ３におけるクロック、及び操作５２８のクロックに基づくクロックアルゴリズムを使用して計算される。この事例において、操作５３０についてのクロックは、７に設定される。したがって、操作５３０は、ＮＳＩＤ３におけるＳＪＩＤ３、及びクロック７を含む。
【０１４０】
操作５３２、５３４は、ネームスペース間操作ではなく、ＮＳＩＤ３における操作５３０に因果関係によって関連している。したがって、操作５３２、５３４についてのクロックは、操作５３０のクロックをインクリメントすることによって計算されることができる。この実施例において、操作５３２、５３４についてのクロックは、それぞれ８及び９に設定される。
【０１４１】
図６Ａは、さまざまな実施形態による、ツリーデータ構造の実施例を示す。ツリーデータ構造は、クライアントデバイスに格納され、クライアント同期サービス１５６などのクライアント同期サービスによって管理されることができる。図６Ａにおいて、リモートツリー６１０、同期ツリー６２０、及びローカルツリー６３０を含む、ツリーデータ構造を示す。
【０１４２】
リモートツリー６１０は、クライアントデバイスから遠隔に格納される（例えば、コンテンツ管理システムのサーバ上の）サーバ状態またはコンテンツアイテムの状態を表す。ローカルツリー６３０は、クライアントデバイス上でローカルに格納される、ファイルシステム状態、または対応するコンテンツアイテムの状態を表す。同期ツリー６２０は、ローカルツリー及びリモートツリーについてのマージベースを表す。マージベースは、ローカルツリー及びリモートツリーの共通祖先、またはローカルツリーとリモートツリーとの間で最後に既知の同期した状態であると考えられることができる。
【０１４３】
各ツリーデータ構造（例えば、リモートツリー６１０、同期ツリー６２０、またはローカルツリー６３０）は、１つ以上のノードを含むことができる。各ノードは、１つ以上の子ノードを含むことができ、親子関係は、エッジによって表される。例えば、リモートツリー６１０は、ノード６０２及び６０４を含む。ノード６０２は、ノード６０４の親であり、ノード６０４は、ノード６０２の子である。この親子関係は、エッジ６０６によって表される。ルートノード６０２などのルートノードは、親ノードを含まない。ノード６０４などの葉ノードは、子ノードを含まない。
【０１４４】
ツリーデータ構造中の各ノードは、コンテンツアイテム（例えば、ファイル、ドキュメント、フォルダなど）を表すことができる。例えば、ルートノード６０２は、コンテンツ管理システムと関連するルートフォルダを表すことができ、ノード６０４は、そのルートフォルダに位置しているファイル（例えば、「Ｆｏｏ．ｔｘｔ」と称されるテキストファイル）を表すことができる。ツリーデータ構造中の各ノードは、例えば、コンテンツアイテムの親ノードのファイル識別子を指定するディレクトリファイル識別子（「ＤｉｒＦｉｌｅＩＤ」）、コンテンツアイテムについてのファイル名、コンテンツアイテムについてのファイル識別子、及びコンテンツアイテムについてのメタデータなどのデータを含むことができる。
【０１４５】
上述されるように、クライアント同期サービスは、３つのツリー（例えば、リモートツリー６１０、同期ツリー６２０、及びローカルツリー６３０）がすべて同一であるときに、クライアントデバイスのサーバ状態及びファイルシステム状態が同期していると判定することができる。換言すれば、ツリーは、それらのツリー構造、及びそれらが表現する関係が同一であり、またそれらのノードに含まれるデータが同様に同一であるときに同期している。一方、３つのツリーが同一ではない場合に、これらのツリーは、同期していない。図３に示される例示的なシナリオにおいて、リモートツリー６１０、同期ツリー６２０、及びローカルツリー６３０は、同一であり、同期している場合が示されているため、結果として、サーバ状態及びファイルシステム状態は、同期している。
【０１４６】
図６Ｂは、さまざまな実施形態による、ツリーデータ構造の実施例を示す。この実施例は、図６Ａに示されるシナリオなど、前に同期した状態の後のシナリオを示し、ツリーがもはや同期していないようにコンテンツアイテムを修正する、追加のアクションをツリーに表されるコンテンツアイテム上で実行する。同期ツリー６２０は、前の既知の同期した状態の表現を維持し、クライアント同期サービスによって、サーバ状態とファイルシステム状態との間の差異を識別するだけではなく、コンテンツ管理システム及び／またはクライアントデバイスについての操作を生成して実行し、サーバ状態及びファイルシステム状態が同期するように収束させるために使用されることができる。
【０１４７】
例えば、ユーザ（クライアントデバイスと関連するユーザと同一のユーザ、またはコンテンツアイテムへのアクセスを有する異なるユーザ）は、コンテンツ管理システムによって格納される「ｆｏｏ．ｔｘｔ」コンテンツアイテムへの修正をすることができる。このコンテンツアイテムは、リモートツリー６１０中のノード６０４によって表される。リモートツリー６１０に示される修正は、ｆｏｏ．ｔｘｔコンテンツアイテムの除去（例えば、コンテンツ管理システムによって管理されるスペースからのコンテンツアイテムの除去）または削除である。これらの修正は、例えば、別のクライアントデバイス上で実行されることができ、これらの修正は、コンテンツ管理システムによって格納されるコンテンツアイテム、またはウェブブラウザを介してコンテンツ管理システムによって格納されるコンテンツアイテムに同期した。
【０１４８】
コンテンツ管理システム上で変更を行うときに、コンテンツ管理システムは、行われる変更を指定する修正データを生成し、この修正データをクライアントデバイス上のクライアント同期サービスに送信する。クライアント同期サービスは、修正データに基づきコンテンツ管理システムによって格納されるコンテンツアイテムについてのサーバ状態を表すリモートツリーを更新する。例えば、リモートツリー６１０において、ｆｏｏ．ｔｘｔコンテンツアイテムを表すノード６０４が削除された場合を示す。
【０１４９】
クライアント同期サービスは、リモートツリー６１０と同期ツリー６２０との間の差異を識別することができ、結果として、コンテンツ管理システムにおけるコンテンツアイテムの修正により、サーバ状態及びファイルシステム状態がもはや同期していないと判定することができる。クライアント同期サービスは、サーバ状態及びファイルシステム状態が同期しているようにそれらサーバ状態及びファイルシステム状態を収束させるように構成される、クライアントデバイス上に格納されるコンテンツアイテムについての操作シーケンスをさらに生成して、実行することができる。
【０１５０】
追加的に、または代替的に、ユーザ（コンテンツ管理システムにおける修正と関連するユーザと同一のユーザ、またはコンテンツアイテムへのアクセスを有する異なるユーザ）は、コンテンツ管理システムと関連付けられるクライアントデバイス上にローカルに格納されるコンテンツアイテムへの修正を行うことができる。例えば、ユーザは、フォルダ「／ｂａｒ」を「／ｒｏｏｔ」フォルダに追加し、「Ｈｉ．ｄｏｃ」ドキュメントを「／ｂａｒ」フォルダに追加することができる。
【０１５１】
変更をクライアントデバイス上で行うときに、クライアントデバイス（例えば、クライアント同期サービス１５６またはクライアントアプリケーション１５２）は、行われる変更を指定する修正データを生成し、修正データをクライアントデバイス上のクライアント同期サービスに渡す。クライアント同期サービスは、修正データに基づきクライアントデバイス上に格納されるコンテンツアイテムについてのファイルシステム状態を表すローカルツリーを更新する。例えば、ローカルツリー６３０において、ノード６１２及びノード６１４が追加される場合を示す。ノード６１２及びノード６１４は、それぞれ「／ｂａｒ」フォルダ及び「Ｈｉ．ｄｏｃ」ドキュメントを表す。
【０１５２】
クライアント同期サービスは、ローカルツリー６３０と同期ツリー６２０との間の差異を識別し、結果として、クライアントデバイスにおけるコンテンツアイテムの修正により、サーバ状態及びファイルシステム状態がもはや同期していないと判定することができる。クライアント同期サービスは、サーバ状態及びファイルシステム状態が同期しているようにそれらサーバ状態及びファイルシステム状態を収束させるように構成されるコンテンツ管理システムによって格納されるコンテンツアイテムについての操作シーケンスをさらに生成することができる。この操作シーケンスを実行のためにコンテンツ管理システムに送信することができる。
【０１５３】
図６Ｂに示されるように、クライアントデバイス上に格納されるコンテンツアイテム、及びコンテンツ管理システムによって格納されるコンテンツアイテムへの修正は、実質的に同時に、または特定の期間内に起こる可能性がある。これらの修正をツリーデータ構造に反映し、クライアント同期サービスによって使用して、クライアントデバイスについての、またコンテンツ管理システムについての操作シーケンスを並列して生成することができる。他のシナリオにおいて、しかしながら、修正は、同じ期間内に必ずしも起こらない場合があり、操作シーケンスは、必要に応じた方式において生成されることができる。さらに、図６Ｂがコンテンツアイテムを追加するための、またコンテンツアイテムを削除するためのシナリオを示すが、コンテンツアイテムを編集する、リネームする、コピーする、または移動させるなどの他のタイプの修正をもサポートする。
【０１５４】
さまざまな実施形態に従い、２つのツリーデータ構造間の差異を識別すること、そして操作を生成することは、両方のツリーデータ構造中の各ノードをチェックすること、そしてアクションがこのノード上で実行されているかどうかを判定することを伴うことがある。これらのアクションは、例えば、ノードの追加、ノードの削除、ノードの編集、またはノードの移動を含むことができる。次いで、これらのアクションを使用して、サーバ状態及びファイルシステム状態を収束させるように構成される操作シーケンスを生成することができる。
【０１５５】
例えば、２つのツリーデータ構造が同期ツリー及びリモートツリーである場合に、クライアント同期サービスは、例えば、同期ツリー中のすべてのノードのファイル識別子を要求することによって、同期ツリー中の各ノードを識別することができる。同期ツリー中の各ノード、またはこのノードについてのファイル識別子のために、クライアント同期サービスは、ノードまたはファイル識別子もリモートツリー中にあるかどうかを判定することができる。リモートツリー中に見つからない同期ツリー中のノードまたはファイル識別子は、ノードがリモートツリーによって表されるサーバ状態から削除されていることを示すことができる。その結果、クライアント同期サービスは、削除アクションがリモートツリー上に発生したと判定することができる。ノード、またはこのノードについてのファイル識別子がリモートツリー中に見つかる場合に、クライアント同期サービスは、リモートツリー中のノードが編集されているか、移動しているかをチェックすることができる。
【０１５６】
リモートツリー中のノードが同期ツリー中のノードに関して編集されているかどうかを判定するために、クライアント同期サービスは、同期ツリー中のノードについてのメタデータを、リモートツリー中の対応するノード（例えば、同一のファイル識別子を有するノード）についてのメタデータと比較することができる。メタデータは、ノードによって表されるコンテンツアイテムが編集されているかどうかを判定するために使用され得る情報を含むことができる。例えば、メタデータは、コンテンツアイテム中のデータに基づき生成される１つ以上のハッシュ値、またはそれらの一部を含むことができる。メタデータは、追加的に、または代替的に、コンテンツアイテムについての、サイズ値、最後に修正された値、または他の値を含むことができる。クライアント同期サービス中のノードについてのメタデータを、リモートツリー中のノードについてのメタデータと比較することができる。メタデータがマッチングしない場合、コンテンツアイテムの編集は、リモートツリーによって表されるサーバ状態において編集されている。その結果、クライアント同期サービスは、編集アクションがリモートツリー上のノードに発生していると判定することができる。メタデータがマッチングする場合に、編集は発生しなかった可能性がある。
【０１５７】
リモートツリー中のノードが移動しているかどうかを判定するために、クライアント同期サービスは、同期ツリー中のノードについての位置を、リモートツリー中の対応するノード（例えば、同一のファイル識別子を含むノード）についての位置と比較することができる。この位置は、例えば、ノードが位置しているパス、ファイル名、及び／またはノードの親のファイル識別子を指定するディレクトリファイル識別子（「ＤｉｒＦｉｌｅＩＤ」）を含むことができる。これらの位置がマッチングする場合に、移動は、起こらなかった可能性がある。一方、これらの位置がマッチングしない場合に、コンテンツアイテムの移動は、リモートツリーによって表されるサーバ状態に起こった可能性がある。その結果、クライアント同期サービスは、移動アクションがリモートツリー上のノードに対して発生したと判定することができる。
【０１５８】
ノードをリモートツリーに追加したかどうかを判定するために、クライアント同期サービスは、同期ツリー中に見つからない、リモートツリー中のいずれかのノードまたはファイル識別子を識別することができる。ノードまたはファイル識別子がリモートツリー中に見つかり、同期ツリー中に見つからない場合に、クライアント同期サービスは、このノードの追加アクションがサーバ状態を表すリモートツリー上に発生したと判定することができる。
【０１５９】
上記の実施例が同期ツリー及びリモートツリーに関して記述されているが、他の実施形態において、同様のプロセスは、同期ツリーとローカルツリーとの間の差異を識別し、ファイルシステム状態を表すローカルツリー上に発生したアクションを判定するために、同期ツリー及びローカルツリーに関して発生することができる。
【０１６０】
図７Ａは、本発明の技術のさまざまな実施形態による、ツリーデータ構造を使用してサーバ状態及びファイルシステム状態を同期させるための例示的な方法を示す。本明細書に記述される、これらの方法及びプロセスが特定の順序における、ある特定のステップ及び操作によって示されることができるが、同様な順序もしくは代替の順序において、または並列して実行される追加の、より少数の、または代替のステップ及び操作は、特に明示されない限りさまざまな実施形態の範囲内にある。この方法は、例えば、クライアントデバイス１５０上のクライアント同期サービス１５６のような、システムによって実装されることができる。
【０１６１】
このシステムは、コンテンツ管理システムによって格納されるコンテンツアイテムについてのサーバ状態を表すリモートツリーと、クライアントデバイス上に格納される対応するコンテンツアイテムについてのファイルシステム状態を表すローカルツリーと、サーバ状態及びファイルシステム状態の間の既知の同期した状態を表す同期ツリーとの間の差異を識別するように設定される。これらの差異に基づき、生成されることができる操作シーケンスは、実行される場合に、３つのツリーデータ構造が同一である同期した状態に向けてサーバ状態及びファイルシステム状態を収束させるように構成される。
【０１６２】
例えば、操作７０２において、システムは、コンテンツ管理システムによって、またはクライアントデバイス上に、格納されるコンテンツアイテムについての修正データを受信することができる。操作７０４において、この修正データを使用して、リモートツリーまたはローカルツリーを更新することができる。
【０１６３】
修正データは、コンテンツ管理サービスと関連する１つ以上のコンテンツアイテムに行われる変更を指定する。その結果、修正データをコンテンツ管理システムから、またはクライアントデバイスから（例えば、クライアントアプリケーション１５２から）受信することができる。コンテンツ管理システムから受信する修正データは、サーバ修正データと称されることができる。サーバ修正データは、コンテンツ管理システムによって１つ以上のコンテンツアイテムに行われる変更を指定し、操作７０４において、リモートツリーを更新するために使用され得る。クライアントデバイスから受信する修正データは、クライアント修正データと称されることができる。クライアント修正データは、クライアントデバイス上で１つ以上のコンテンツアイテムに行われる変更を指定し、操作７０４においてローカルツリーを更新するために使用されることができる。
【０１６４】
操作７０６において、システムは、コンテンツ管理システムによって格納されるコンテンツアイテムについてのサーバ状態、及びクライアントデバイス上に格納されるコンテンツアイテムについてのファイルシステム状態が同期しているかどうかを判定することができる。ローカルツリー及びリモートツリーがファイルシステム状態及びサーバ状態を表し、コンテンツ管理システム及びクライアントデバイスに発生する変更を追跡して、継続的に更新されているため、サーバ状態及びファイルシステム状態が同期しているかどうかを判定することは、ローカルツリー及び／またはリモートツリーを同期ツリーと比較して、ツリー間の差異を見つけることによって行われ得る。ツリー間の差異を見つける、このプロセスは、ときとしてツリーの「差分を取る」と称される。
【０１６５】
いくつかの実施形態及びシナリオによる、サーバ状態及びファイルシステム状態が同期しているかどうかを判定することは、リモートツリーと同期ツリーとの間の差異を識別すること、及び／またはローカルツリーと同期ツリーとの間の差異を識別することのうちの１つ以上を含むことができる。リモートツリーと同期ツリーとの間の差異は、クライアントデバイスに反映されていない可能性がある、コンテンツ管理システムによって格納されるコンテンツアイテムへの変更の発生を示すことができる。同様に、ローカルツリーと同期ツリーとの間の差異は、コンテンツ管理システムに反映されていない可能性がある、クライアントデバイスに格納されるコンテンツアイテムへの変更の発生を示すことができる。
【０１６６】
ツリー間に差異がない場合に、サーバ状態及びファイルシステム状態は、同期し、同期アクションは、必要とされない。その結果、この方法は、操作７０２に戻り、新規の修正データを待機することができる。一方で、これらの差異が検出される場合に、システムは、操作７０８においてサーバ状態及びファイルシステム状態を収束させるように構成される操作シーケンスを生成することができる。
【０１６７】
生成される操作シーケンスは、検出される１つ以上の差異に依存する。例えば、２つのツリー間の差異が追加されたコンテンツアイテムである場合に、生成された操作シーケンスは、追加されたコンテンツアイテムを取得して、それを追加することを含むことができる。２つのツリー間の差異がコンテンツアイテムの削除である場合に、生成された操作シーケンスは、コンテンツアイテムを削除することを含むことができる。また、操作シーケンスは、ツリー制約が維持されていることを確保する複数のチェックを含むことができる。以下にさらに記述されるように、操作シーケンスは、サーバ状態、ファイルシステム状態、または実行を保留している他の操作の現在の状態によって競合する場合がある。その結果、システムは、続行する前にこれらの競合をも解消することができる。
【０１６８】
上述されるように、リモートツリーと同期ツリーとの間に差異がある場合に、クライアントデバイスに反映されていない可能性がある、コンテンツ管理システムによって格納されるコンテンツアイテムへの変更を発生している場合がある。その結果、このシナリオにおいて、システムは、クライアントデバイス上に格納されるコンテンツアイテム上で動作して、サーバ状態及びファイルシステム状態を収束させるように構成されるクライアント操作シーケンスを生成することができ、このクライアント操作シーケンスは、操作７１０において、実行のためにクライアントデバイスに提供され得る。
【０１６９】
一方、ローカルツリーと同期ツリーとの間の差異がある場合に、コンテンツ管理システムに反映されていない可能性がある、クライアントデバイスに格納されるコンテンツアイテムへの変更が発生している可能性がある。その結果、このシナリオにおいて、システムは、コンテンツ管理システムによって格納されるコンテンツアイテム上で動作して、サーバ状態及びファイルシステム状態を収束させるように構成されるサーバ操作シーケンスを生成することができ、このサーバ操作シーケンスは、操作７１０において、実行のためにコンテンツ管理システムに提供されることができる。いくつかの事例において、両方の事例は、真であることができ、クライアント操作シーケンス及びサーバ操作シーケンスは、操作７１０において生成され、それらの意図された受取人に提供され得る。
【０１７０】
操作シーケンス（複数可）が意図された受取人（複数可）に提供されると、方法は、操作７０２に戻り、新規の修正データを待機することができる。これらの操作シーケンス（複数可）は、サーバ状態及びファイルシステム状態の収束に向けて１つ以上のステップを提供する、またはサーバ状態及びファイルシステム状態を同期させるために必要とされるすべてのステップを提供することができる。例えば、コンテンツ管理システムは、サーバ操作シーケンスを受信し、このサーバ操作シーケンスをコンテンツ管理システムによって格納されるコンテンツアイテム上で実行することができる。サーバ操作シーケンスのこの実行は、変更をコンテンツ管理システムによって格納されるコンテンツアイテムに引き起こし、これらの変更をサーバ修正データ中で検出し、指定し、システムに返送する。次いで、このシステムは、リモートツリーを更新し、サーバ状態及びファイルシステム状態が同期しているかどうかを判定することができる。
【０１７１】
クライアントデバイスは、クライアント操作シーケンスを受信し、このクライアント操作シーケンスをクライアントデバイス上に格納されるコンテンツアイテム上で実行することができる。クライアント操作シーケンスのこの実行は、変更をクライアントデバイス上に格納されるコンテンツアイテムに引き起こし、これらの変更をクライアント修正データ中で検出し、指定し、システムに渡す。次いで、このシステムは、ローカルツリーを更新し、サーバ状態及びファイルシステム状態が同期しているかどうかを判定することができる。方法７００のこれらの操作は、サーバ状態及びファイルシステム状態が同期するまで継続することができる。
【０１７２】
方法７００の操作は、クライアント側及びサーバ側（例えば、ローカルツリー及びリモートツリー、ファイルシステム状態及びサーバ状態、クライアント操作シーケンス及びサーバ操作シーケンス、クライアント修正データ及びサーバ修正データ）に関して記述されている。さまざまな実施形態において、これら２つの側と関連する操作は、並列して、順次に、他の側から切り離されて、または組み合わせて、発生し得る。
【０１７３】
図７Ａに関して上述されるように、同期ツリーとリモートツリーとの間の差異を識別し、使用してサーバ状態及びファイルシステム状態を収束させるように構成されるクライアント操作シーケンスを生成する。しかしながら、いくつかの事例において、クライアント操作シーケンスは、ローカルツリーの現在の状態と競合する場合がある。同様に、同期ツリーとローカルツリーとの間の差異を識別し、使用してサーバ状態及びファイルシステム状態を収束させるように構成されるサーバ操作シーケンスを生成する。しかしながら、サーバ操作シーケンスは、リモートツリーの現在の状態と競合する。追加的に、または代替的に、クライアント操作シーケンス及びサーバ操作シーケンスは、互いに競合する場合がある。その結果、本発明の技術のさまざまな実施形態は、これらの競合を解消することによってさらなる技術的な改善を提供する。
【０１７４】
例えば、クライアント同期サービスは、ルールと競合する操作シーケンス（例えば、クライアント操作シーケンスまたはサーバ操作シーケンス）中の操作を識別することができる。競合を識別するために使用される各ルールは、競合の解消とも関連付けられることができる。クライアント同期サービスは、実行のための操作シーケンスを提供する前に、競合についての解消に基づき操作シーケンスを更新する、または競合についての解消と関連する操作を実行することによって競合の解消を実行することができる。
【０１７５】
図７Ｂは、本発明の技術のさまざまな実施形態による、ツリーデータ構造を使用して、サーバ状態及びファイルシステム状態を同期させるときに競合を解消するための例示的な方法を示す。ある特定のステップ及び操作を有する、本明細書に記述されるこれらの方法及びプロセスは、特定の順序で示されることができるが、同様の順序もしくは代替の順序で、または並列して、実行される追加の、より少数の、または代替のステップ及び操作は、特に明示されない限り、さまざまな実施形態の範囲内にある。この方法６００は、例えばクライアント同期サービス１５６などのシステムによって実装され、クライアントデバイス上で実行される。
【０１７６】
システムは、操作７２０において、サーバ状態及びファイルシステム状態を収束させるように設定される操作シーケンスを受信することができる。操作シーケンスは、例えば、図７Ａの方法７００に関して生成され、記述されるクライアント操作シーケンスまたはサーバ操作シーケンスであることができる。
【０１７７】
操作７２０において、システムは、１セットのルールに基づき操作シーケンス中で１つ以上の違反を識別する。この１セットのルールは、クライアント同期サービス１５６によって格納され、解消される必要がある複数の制約、不変式、または競合を指定することができる。この１セットのルールは、ツリーデータ構造に適用され、同期ビヘイビアの制御を援助する。また、この１セットのルールの中の各ルールは、そのルールの違反への解消に関連付けられる、またはその他の方法によりリンクされることができる。例えば、この解消は、操作シーケンス中の１つ以上の操作の変更、１つ以上の操作の除去、１つ以上の操作の追加、サーバ状態もしくはファイル状態への１つ以上の追加アクション、またはアクションの組み合わせを備えることができる。
【０１７８】
操作シーケンス中の各操作について、システムは、１セットのルールのうちのいずれかのルールに違反しているかどうかを判定することができる。ルールに違反している場合に、システムは、違反の解消を識別し、操作７２２において、解消を実行する。この解消は、操作シーケンス中の１つ以上の操作を修正するようなアクション、１つ以上の操作を除去する、もしくは追加するアクション、またはサーバ状態もしくはファイル状態上の追加アクションを備えることができる。
【０１７９】
解消アクションが実行されると、システムは、操作７２４において解消及び操作シーケンスに基づき、解消された、またはリベースされた操作シーケンスを生成し、操作７２８において解消された操作シーケンスを実行のために適切なエンティティに提供することができる。例えば、操作シーケンスがクライアント操作シーケンスである場合に、解消された操作シーケンスは、クライアントデバイスに提供されることができる。操作シーケンスがサーバ操作シーケンスである場合に、解消された操作シーケンスは、コンテンツ管理サービスに提供されることができる。加えて、方法は、並列して、またはさまざまな異なる順序で、シーケンス中のクライアント操作シーケンス及びサーバ操作シーケンス上で実行されることができる。
【０１８０】
いくつかの実施形態に従い、各操作タイプは、同一の、または異なる１セットのルールと関連付けられることができる。例えば、操作タイプは、例えば、コンテンツアイテムを追加すること、コンテンツアイテムを削除すること、コンテンツアイテムを編集すること、コンテンツアイテムを移動させること、コンテンツアイテムをリネームすることなどを含むことができる。操作シーケンスは、上記の操作タイプのうちの１つに各属する操作からなることができる。各操作タイプは、特定の１セットのルールと関連付けられることができる。
【０１８１】
例示的な目的のために、「Ａｄｄ」操作タイプについての１セットのルールは、コンテンツアイテムについてのファイル識別子がツリー中で一意でなければならない（例えば、１つのツリー中の２つのノードが同一のファイル識別子を含むことができない）ようなルールを有することができ、コンテンツアイテムの親ノードのファイル識別子を指定するディレクトリファイル識別子（「ＤｉｒＦｉｌｅＩＤ」）は、対向するツリーデータ構造中に存在しなければならず、コンテンツアイテムについてのＤｉｒＦｉｌｅＩＤ及びファイル名の組み合わせは、対向するツリー中に使用されない。
【０１８２】
対向するツリーは、本明細書に使用される場合、対向するエンティティの状態を表すツリーデータ構造を指す。例えば、クライアントデバイス上で動作するように構成されるクライアント操作シーケンス、及びクライアントデバイス上でのファイルシステムへの結果として生じる変更をローカルツリーに反映する。その結果、クライアント操作シーケンスについて対向するツリーは、リモートツリーである。同様に、サーバ操作シーケンスは、コンテンツ管理システムに送信され、実行されるように構成され、サーバ状態への結果として生じる変更は、リモートツリーに反映される。その結果、サーバ操作シーケンスについて対向するツリーは、ローカルツリーである。
【０１８３】
図８は、クライアントデバイス１５０に操作を反映するツリーデータ構造６１０、６２０、６３０の例示的な状態を示す。インテント情報８０６は、クライアントデバイス１５０における操作の意図された結果を表す。この実施例において、インテント情報８０６は、クライアントデバイス１５０に「Ｆｏｏ．ｔｘｔ」を追加するための追加操作を示す。ローカルツリー６３０は、インテント情報８０６に基づきノード８０４を追加するように修正されている。ノード８０４は、ルートノード８０２内の「Ｆｏｏ．ｔｘｔ」の追加を示すようにローカルツリー６３０を修正する。前に説明されるように、インテント情報８０６をコンテンツ管理システム１１０と同期させるときに、クライアントデバイス１５０は、ノード８０４を含むようにリモートツリー６１０及び同期ツリー６２０を更新するため、クライアントデバイス１５０においてツリーデータ構造６１０、６２０、６３０を同期させることができる。同期するときに、ツリーデータ構造６１０、６２０、６３０は、クライアントデバイス１５０に同期した状態を反映する。
【０１８４】
インテント情報８０６をコンテンツ管理システム１１０と同期させるために、クライアントデバイス１５０は、インテント情報８０６をコンテンツ管理システム１１０にコミットすることができる。この実施例において、クライアントデバイス１５０は、インテント情報８０６をコンテンツ管理システム１１０と同期させるために、「Ｆｏｏ．ｔｘｔ」の追加をコンテンツ管理システム１１０にコミットする。
【０１８５】
図９Ａは、インテント情報８０６をコンテンツ管理システム１１０にコミットするための例示的な方法を示す。ステップ９０２において、クライアントデバイス１５０上のクライアント同期サービス１５６は、操作（例えば、インテント情報８０６からの操作）をクライアントデバイス１５０にコミットするインテント情報を記録する。クライアント同期サービス１５６は、永続的にディスクまたはメモリ上の操作をクライアントデバイス１５０にコミットするインテント情報を記録し、保留中のコミットを追跡することができる。クライアントデバイス１５０は、イベントが失敗または成功などの保留中のコミット（複数可）の除去をトリガするまで、ダーティコミット記録を格納し、修正を追跡することができる。
【０１８６】
ステップ９０４において、クライアント同期サービス１５６は、操作をコンテンツ管理システム１１０（例えば、ファイルジャーナルインタフェース２０２）にコミットする。クライアント同期サービス１５６は、この操作をコミットすることを要求するコンテンツ管理システム１１０にメッセージを送信することができる。このメッセージは、前に説明されるように、コンテンツ管理システム１１０がクライアントデバイス１５０におけるコンテンツアイテムの状態と、サーバファイルジャーナル１４８におけるクライアントデバイス１５０の位置とを決定するために使用することができる、カーソルを含むことができる。このカーソルは、例えば、クライアントデバイス１５０と関連する各ネームスペースについてサーバジャーナルＩＤ（ＳＪＩＤ）を含むことができる。ＳＪＩＤは、各ネームスペースについてサーバファイルジャーナル１４８におけるクライアントデバイス１５０の位置を示すため、クライアントデバイス１５０における各ネームスペースの状態を提供する。
【０１８７】
ステップ９０６において、クライアント同期サービス１５６は、ステップ９０４からのコンテンツ管理システム１１０へのコミットが成功したかどうかを判定する。いくつかの事例において、コンテンツ管理システム１１０は、このコミットに応答して、コミットが成功した、または失敗したかどうかを示す、エラーまたは肯定応答をクライアント同期サービス１５６に自動的に送信することができる。いくつかの事例において、クライアント同期サービス１５６は、肯定応答またはエラー通知を要求するコンテンツ管理システム１１０に連絡することができる。例えば、クライアント同期サービス１５６は、コミットが成功した肯定応答を要求するコンテンツ管理システム１１０にメッセージを送信することができる。
【０１８８】
コミットが成功した場合に、コンテンツ管理システム１１０は、クライアント同期サービス１５６に応答し、クライアントデバイス１５０にコミットが成功したことを通知することができる。コミットが成功しなかった場合に、コンテンツ管理システム１１０は、失敗応答によって応答することができる、またはクライアント同期サービス１５６からの要求に応答しないことができる。コミットが失敗したとクライアント同期サービス１５６が判定する場合に、ステップ９１０において、クライアント同期サービス１５６は、クライアントデバイス１５０からの操作をコミットするインテント情報をクリアにする。クライアントデバイス１５０における状態がサーバファイルジャーナル１４８における状態と比較して古い場合に、クライアント同期サービス１５６は、クライアントデバイス１５０における状態をサーバファイルジャーナル１４８における状態と同期させる、いずれかの必要な更新を受信する、または要求することができる。
【０１８９】
コミットが成功したとクライアント同期サービス１５６が判定する場合に、ステップ９０８において、クライアント同期サービス１５６は、図８に示されるようなノード８０４を含むようにリモートツリー６１０及び同期ツリー６２０を更新する。次いで、ステップ９１０において、クライアント同期サービス１５６は、クライアントデバイス１５０から操作をコミットするインテント情報をクリアする。
【０１９０】
ステップ９０６においてコンテンツ管理システム１１０へのコミットが成功したかどうかを判定することによって、クライアント同期サービス１５６は、クライアント同期サービス１５６が操作をコミットし、そのコンテンツ及びツリーデータ構造（６１０、６２０、６３０）を更新するが、このコミットがコンテンツ管理システム１１０において成功しないシナリオに起因する競合を防ぐことができる。これは、クライアントデバイス１５０とコンテンツ管理システム１１０との間の状態の中に競合を生じる。
【０１９１】
例えば、クライアント同期サービス１５６がステップ９０４において操作をコミットした後に、クライアントデバイス１５０またはコンテンツ管理システム１１０におけるクラッシュ、ネットワーク条件（例えば、レイテンシまたは輻輳、ネットワーク障害など）、処理条件（例えば、コンテンツ管理システム１１０における長いキュー、コンテンツ管理システム１１０におけるメモリエラーなど）などのような、さまざまなシナリオは、コミットが実際に正常に処理され、コンテンツ管理システム１１０に適用されるのを妨げる場合がある。ステップ９０６において、したがって、クライアント同期サービス１５６は、この操作を適用するか、クライアントデバイス１５０にコミットする、格納された、またはキャッシュされたインテント情報をクリアするかどうかを決定する前に、コミットが成功したか、失敗したかどうかを検証することができる。
【０１９２】
また、コミットが成功した場合にチェックすること、及びコミットが失敗した場合にコミットするインテント情報をクリアすることにより、クライアントデバイス１５０がセルフオーサリングされた操作を区別し、それ自体がセルフオーサリングされた操作を通じて競合することを回避することが可能である。例えば、クライアントデバイス１５０は、クライアントデバイス１５０によってオーサリングされるいずれかの操作に対してコミットするインテント情報と、これらの操作がセルフオーサリングされている指標を記録することができる。次いで、クライアントデバイス１５０は、この操作を適用する（例えば、ツリーデータ構造を更新する）前に、コンテンツ管理システム１１０によって、コミットが成功したかどうかを検証することをチェックする。図９Ｂに関してさらに以下に記述されるように、コンテンツ管理システム１１０は、コミットするインテント情報が失敗した、または受信されなかったことをクライアントデバイス１５０に報告する場合に、コミットするこのようなインテント情報がコンテンツ管理システム１１０によって後に受信されても、その後成功しないであろうことを保証することができる。したがって、クライアントデバイス１５０は、コミットするインテント情報が失敗したことをクライアントデバイス１５０が示した後にコミットが成功しないであろうことを同様に保証することができ、コンテンツ管理システム１１０から失敗または成功の肯定応答を受信した後にコミットするインテント情報をクリアする。
【０１９３】
これは、例えば、クライアントデバイス１５０が失敗した操作をコミットする試みを信じ、コンテンツ管理システム１１０によって後に承認される操作に基づくリビジョンの更新または指標をコンテンツ管理システム１１０から後に受信するシナリオを妨げることができる。例えば、クライアントデバイス１５０は、コミットをコンテンツ管理システム１１０に送信することができる。このコミットが一時的に失われる、または遅延する場合に、コンテンツ管理システム１１０及びクライアントデバイス１５０は、コミットが失敗したと信じる可能性がある。コミットが後に再浮上し、クライアントデバイス１５０がコミットするインテント情報をクリアした、またはその他の方法によりコミットするインテント情報を失敗したとマーク付けした後に、コンテンツ管理システム１１０がこのコミットを処理して承認する場合に、この操作が決して承認されるべきではなかったとしても、失敗したコミットと関連する操作は、クライアントデバイス１５０へ意図せずに伝播されることができる。クライアントデバイス１５０は、この操作を受信し、この操作が前の失敗したコミットからのそれ自体の操作であることを認識せず、この操作が別のデバイスから生成され、同期したと信じて、この操作を適用する場合がある。この操作を前の失敗したコミットと関連するセルフオーサリングされた操作として区別することができず、クライアントデバイス１５０は、この操作を適用し、関連したコンテンツアイテム（複数可）またはネットワーク（複数可）の状態に競合を生じさせる可能性がある。したがって、クライアントデバイス自体の操作は、クライアントデバイスがそれ自体の操作を失敗した後に、この操作が別のデバイスによって生成され、クライアントデバイスに伝播される新規のリビジョンであるという信念の下で、同一の操作を適用することが原因となる競合をこのクライアントデバイスに生じさせる可能性がある。
【０１９４】
図９Ｂは、コンテンツ管理システム１１０においてコミットを処理する例示的な方法を示す。ステップ９２０において、ファイルジャーナルインタフェース２０２は、クライアントデバイス（例えば、クライアントデバイス１５０）からのコミット要求を監視する。ステップ９２２において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からの操作（例えば、クライアント同期サービス１５６）をコミットする要求を受信する。この要求は、コミットと関連する操作と、クライアントデバイス１５０と関連するカーソルとを識別することができる。例えば、この要求は、図９Ａに示されるようなインテント情報８０６をコミットする、クライアント同期サービス１５６からの要求であることができる。したがって、この要求は、図８に示されるインテント情報８０６に対応する追加操作（例えば、Ａｄｄ「Ｆｏｏ．ｔｘｔ」）と、クライアントデバイス１５０におけるカーソルとを識別することができる。クライアントデバイス１５０におけるカーソルは、ファイルジャーナルインタフェース２０２からクライアントデバイス１５０によって受信される最後の、または直近のカーソルであることができる。
【０１９５】
前に説明されるように、カーソルは、ネームスペースのそれぞれについてのサーバファイルジャーナル１４８におけるリビジョンまたは状態と比較して、クライアントデバイス１５０における各ネームスペースの最新のリビジョンまたは状態を反映する、クライアントデバイス１５０の位置をサーバファイルジャーナル１４８において識別することができる。例えば、カーソルは、クライアントデバイス１５０において各ネームスペースについてサーバファイルジャーナル識別子（ＳＪＩＤ）を識別することができる。ネームスペースのＳＪＩＤは、クライアントデバイス１５０によって取得されるそのネームスペースについて最新のＳＪＩＤ（例えば、ロウ、リビジョン、または状態）を示す。したがって、このカーソルは、クライアントデバイス１５０がクライアントデバイス１５０における各ネームスペースについてサーバファイルジャーナル１４８中の最新のリビジョンを受信したかどうかを示すことができる。
【０１９６】
この操作をコミットする要求に応答して、ステップ９２４において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からのコミットと関連するカーソルをチェックする。ステップ９２６において、ファイルジャーナルインタフェース２０２は、カーソルが先頭にあるかどうかを判定する。ここで、ファイルジャーナルインタフェース２０２は、カーソル中の各ネームスペースについてカーソルによって識別されるリビジョン（ＳＪＩＤ）がサーバファイルジャーナル１４８上のそのネームスペースについて最新のリビジョンであるかどうかを判定する。
【０１９７】
例えば、カーソルがネームスペース２についてのＳＪＩＤ５０を識別する場合に、ファイルジャーナルインタフェース２０２は、ＳＪＩＤ５０がサーバファイルジャーナル１４８（例えば、ジャーナル４００）中のネームスペース２について最新のＳＪＩＤ（例えば、最新のロウまたはリビジョン）であるかどうかを判定する。そうである場合に、つぎに、クライアントデバイス１５０からのカーソルは、それがクライアントデバイス１５０における各ネームスペースについてのサーバファイルジャーナル１４８の最後にあることを意味する、先頭にあり、クライアントデバイス１５０がクライアントデバイス１５０における各ネームスペースについてサーバファイルジャーナル１４８中の最新のリビジョンまたは状態を取得したことを示す。そうでない場合に、クライアントデバイス１５０からのカーソルは、それがクライアントデバイス１５０における各ネームスペースについてサーバファイルジャーナル１４８の最後にはないことを意味する、先頭にはなく、クライアントデバイス１５０がクライアントデバイス１５０における各ネームスペースについてサーバファイルジャーナル１４８中の最新のリビジョンまたは状態を取得していないことを示す。換言すれば、１つ以上のネームスペースと関連するクライアントデバイス１５０におけるコンテンツアイテムは、古い。
【０１９８】
カーソルが先頭にはない場合に、ステップ９２８において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からのコミットを拒否する。例えば、先頭にはないカーソルに基づき、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からのコミットと関連する操作が古い（例えば、サーバファイルジャーナル１４８において最新のリビジョンを反映していない）コンテンツアイテム（複数可）及び／またはネームスペース（複数可）を修正すると判定することができ、そのコンテンツアイテム（複数可）及び／またはネームスペース（複数可）についてサーバファイルジャーナル１４８におけるリビジョンに関して競合を生じる可能性がある。したがって、ファイルジャーナルインタフェース２０２は、コミットを拒否し、コミットと関連する操作によって生じる競合を防ぐことができる。ファイルジャーナルインタフェース２０２は、コミットが拒否されていることを示す応答をクライアントデバイス１５０に送信することができる。また、ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８中の最新のリビジョンまたは状態をクライアントデバイス１５０に送信する、またはクライアントデバイス１５０が更新を実行するように促すことができる。
【０１９９】
カーソルが先頭にある場合に、ステップ９３０において、ファイルジャーナルインタフェース２０２は、このコミットを許容することができる。いくつかの事例において、ファイルジャーナルインタフェース２０２は、操作がコミットを許容する前に競合を生じないことを検証する別のチェックを実行することができる。例えば、カーソルが先頭にあると判定することに加えて、ファイルジャーナルインタフェース２０２は、コミット（例えば、インテント情報８０６）と関連する操作によって反映されるリビジョンをサーバファイルジャーナル１４８におけるリビジョンと比較し、カーソルが先頭にある場合でも操作が競合を生じないことを検証することができる。図示するように、操作がファイルについての削除操作であり、カーソルが先頭にあるとファイルジャーナルインタフェース２０２が判定すると仮定する。コミットを許容する前に、ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８がファイルを特定のネームスペースに追加する前のリビジョンを含むことを検証することができる。サーバファイルジャーナル１４８がファイルをネームスペースに追加するリビジョンを含まないとファイルジャーナルインタフェース２０２が判定する場合に、ファイルジャーナルインタフェース２０２は、削除操作と、追加リビジョンの欠如との間に競合を識別することができる。次いで、ファイルジャーナルインタフェース２０２は、コミットを拒否する、競合を調整する、及び／またはクライアントデバイス１５０に競合を調整するように求めることができる。
【０２００】
コミットを許容した後に、ステップ９３２において、ファイルジャーナルインタフェース２０２は、このコミットに基づきサーバファイルジャーナル１４８を更新する。例えば、ファイルジャーナルインタフェース２０２は、コミットと関連する操作を反映るリビジョンをサーバファイルジャーナル１４８に書き込むことができる。ファイルジャーナルインタフェース２０２は、前述されるように、この操作をリビジョンに変換し、この操作と関連するネームスペースについてのリビジョンを書き込むことができる。
【０２０１】
ステップ９３４において、ファイルジャーナルインタフェース２０２は、それがクライアントデバイス１５０から肯定応答要求を受信したかどうかを判定することができる。例えば、クライアントデバイス１５０は、コミットが失敗したか、成功したかどうかを判定するために、コミットの肯定応答についての要求をファイルジャーナルインタフェース２０２に送信することができる。ステップ９３６において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０からの肯定応答要求に応答することができる。ファイルジャーナルインタフェース２０２は、コミットが成功したか、失敗したかどうかを含む、コミットのステータスのクライアントデバイス１５０に通知することができる。
【０２０２】
ステップ９３８において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０と関連するカーソルを移すことができる。例えば、クライアントデバイス１５０からのカーソルがクライアントデバイス１５０におけるネームスペース１についての最新のリビジョンとしてネームスペース１についてのＳＪＩＤ６を識別し、コミットと関連する操作がネームスペース１に対応すると仮定する。ファイルジャーナルインタフェース２０２は、ネームスペース１と関連するカーソルをＳＪＩＤ６からＳＪＩＤ７に移すことができる。ファイルジャーナルインタフェース２０２は、更新されたカーソルをクライアントデバイス１５０に提供することができ、クライアントデバイス１５０は、将来のコミットのために更新されたカーソルを使用することができる。
【０２０３】
ファイルジャーナルインタフェース２０２は、サーバファイルジャーナル１４８を更新した後に、またはクライアントデバイス１５０から肯定応答要求を受信した後に、カーソルを移すことができる。いくつかの事例において、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０から肯定応答要求を受信した後に、肯定応答要求と関連するコミットがファイルジャーナルインタフェース２０２によって許容されなかった場合でも、カーソルを移すことができる。例えば、ファイルジャーナルインタフェース２０２がクライアントデバイス１５０から肯定応答要求を受信する場合に、それは、ファイルジャーナルインタフェース２０２がコミットに関連した要求を決して受信しなかった、または承認しなかった場合でも、肯定応答要求に基づきカーソルを移すことができる。カーソルを移すことによって、ファイルジャーナルインタフェース２０２は、コミットが許容されていない、または記録されていないことをクライアントデバイス１５０に示すと、このコミットが後に許容されない、または記録されないことを保証することができる。
【０２０４】
例えば、クライアントデバイス１５０がファイルジャーナルインタフェース２０２にコミットする要求を送信するときに、いくつかの事例において、この要求は、ネットワークまたはコンピューティング問題（例えば、レイテンシ、輻輳、クラッシュ、クライアント側タスクキャンセルなど）のような、さまざまな理由のために、一時的に失われる、または遅延する可能性がある。結果として、ファイルジャーナルインタフェース２０２は、予想より遅くまでコミットする要求を受信しないことができる。例えば、ファイルジャーナルインタフェース２０２は、クライアントデバイス１５０から肯定応答要求を受信し、この肯定応答要求に応答し、後でのみクライアントデバイス１５０からコミットする元の要求を受信することができる。この実施例において、コミットが記録されていなかった、受信されていなかった、または承認されていなかった指標によって、ファイルジャーナルインタフェース２０２がクライアントデバイス１５０に応答した後に、このコミットを受信し、承認する／記録する場合に、このようなコミットは、コンテンツ管理システム１１０における状態と、クライアントデバイス１５０における状態との間の競合を生じる可能性がある。
【０２０５】
したがって、ファイルジャーナルインタフェース２０２がクライアントデバイス１５０に、コミットが記録されていなかった、または承認されていなかったということを伝えるときに、このようなコミットがファイルジャーナルインタフェース２０２によって後に受信された場合でも、後でコミットされないことを保証するために、ファイルジャーナルインタフェース２０２は、カーソルを移し、失われた、または遅延したコミットが再浮上する場合に拒否されることを確保することができる。例えば、ファイルジャーナルインタフェース２０２はコミットが記録されなかった、または承認されなかったとクライアントデバイス１５０に応答した後に、コミットする要求を受信するときに、ファイルジャーナルインタフェース２０２は、ステップ９２６に説明されるように、カーソルが先頭にあるかどうかをチェックする。コミットする要求がクライアントデバイス１５０によって最初に送信されたので、ファイルジャーナルインタフェース２０２がカーソルを移したことから、ファイルジャーナルインタフェース２０２は、コミットする要求と関連するカーソルが先頭にはないと判定し、その後、ステップ９２８に説明されるようにコミットするこの要求を拒否する。その結果、ファイルジャーナルインタフェース２０２は、処理または伝送中に遅延した、または失われたコミットに起因する競合またはエラーを防ぐことができる。換言すれば、カーソルが移されるときに、コミットが承認されていなかった、または受信されていなかった場合に、カーソルを移すことにより、このようなコミットが決して承認されない、または記録されないことを確保する。
【０２０６】
また、これは、前に説明されるように、セルフオーサリングされた操作からのクライアントデバイス１５０における競合を防ぐ。例えば、クライアントデバイス１５０がクライアントデバイス１５０にコミットするインテント情報に失敗する場合に、カーソルを移すことにより、失敗したコミットがファイルジャーナルインタフェース２０２によって後に記録されないこと、及びクライアントデバイス１５０に後に伝播されないことを確保する。
【０２０７】
また、カーソルを移すことにより、クライアントデバイス１５０及び／またはファイルジャーナルインタフェース２０２が失敗したコミットを再試行することができる「再度のコミット」のアプローチのような、他のアプローチによって潜在的に生じる可能性がある、さまざまな修正またはコミットの競合を防ぐことができる。下記は、カーソルを移すことによって防止されている、このような競合または条件の非限定的な実施例である。
【０２０８】
クライアントデバイス１５０は、「Ｆｏｏ．ｔｘｔ」をブロックリストＡに追加するインテント情報８０６を記録する。クライアントデバイス１５０からのコミット要求は、ファイルジャーナルインタフェース２０２にディスパッチされるが、ネットワークにおいて遅延する。加えて、クライアントデバイス１５０は、コミットを送信した後にクラッシュする。次いで、クライアントデバイス１５０は、オンラインに戻り、リカバリモードにおいて、この追加を再コミットしようとする。ファイルジャーナルインタフェース２０２は、「Ｆｏｏ．ｔｘｔ」が既に他の箇所で最新であるため、このコミットを拒否する。クライアントデバイス１５０は、フライト中である、それ自体のコミットが失敗した証拠として拒否されたコミットを解釈し、その結果、クライアントデバイス１５０においてキャッシュ／ログをコミットするインテント情報をクリアする。次いで、クライアントデバイス１５０は、クライアントデバイス１５０上の「Ｆｏｏ．ｔｘｔ」をブロックリストＢに編集する。「Ｆｏｏ．ｔｘｔ」は、別のユーザまたはデバイスによってリモートに削除される。次いで、クライアントデバイス１５０からのインテント情報８０６についての元のコミット要求は、ファイルジャーナルインタフェース２０２に到達し、ファイルジャーナルインタフェース２０２によって許容される。次いで、クライアントデバイス１５０は、ブロックリストＡへの「Ｆｏｏ．ｔｘｔ」の追加を、ブロックリストＢに関して編集された「Ｆｏｏ．ｔｘｔ」と同一のパスにおいてファイルジャーナルインタフェース２０２から取り出す。ここで、クライアントデバイス１５０は、ブロックリストＢに関して編集された「Ｆｏｏ．ｔｘｔ」と、ブロックリストＡに関する「Ｆｏｏ．ｔｘｔ」のそれ自体の以前の追加との間に競合を有する。その結果、クライアントデバイス１５０は、それ自体が意図せずに競合した。
【０２０９】
この例示的なシナリオは、カーソルを移すことによって防止される。例えば、ファイルジャーナルインタフェース２０２がブロックリストＡに関する「Ｆｏｏ．ｔｘｔ」についての追加コミットを後に受信するときに、コミットがクライアントデバイス１５０によって送信されたことからカーソルが移されている場合、ファイルジャーナルインタフェース２０２は、カーソルをチェックし、カーソルが先頭にはないと判定する（例えば、ステップ９２６）。次いで、ファイルジャーナルインタフェース２０２は、コミットを拒否し、クライアントデバイス１５０がブロックリストＡに関する「Ｆｏｏ．ｔｘｔ」の追加をファイルジャーナルインタフェース２０２から取り出すのを防ぐ。したがって、コミットが失敗したとクライアントデバイス１５０が判定し、キャッシュ／ログをコミットするインテント情報をクリアすると、このコミットは、決して成功しないことが保証される。その結果、ファイルジャーナルインタフェース２０２及びクライアントデバイス１５０は、前の実施例における「Ｆｏｏ．ｔｘｔ」の編集後に、クライアントデバイス１５０がブロックリストＡに関する「Ｆｏｏ．ｔｘｔ」の追加を取り出さず、同一のパスにおいて、ブロックリストＡに関する「Ｆｏｏ．ｔｘｔ」と、ブロックリストＢに関する「Ｆｏｏ．ｔｘｔ」との間に競合を生じないことを保証することができる。
【０２１０】
図１０は、例えば、クライアントデバイス１５０、コンテンツ管理システム１１０またはそれらのいずれかのコンポーネントなどのいずれかのコンピューティングデバイスであることができる、例示的なコンピューティングシステム１０００を示す。コンピューティングシステム１０００のこれらのコンポーネントは、接続１００５を使用して互いに通信する。接続１００５は、バスを介する物理的な接続、またはチップセットアーキテクチャなどの、プロセッサ１０１０中に直接接続であることができる。また、接続１００５は、仮想接続、ネットワーク化された接続、または論理接続であることができる。
【０２１１】
いくつかの実施形態において、コンピューティングシステム１０００は、本開示に記述される機能が１つのデータセンター、複数のデータセンター、ピアネットワークなどの内に分散されることができる分散システムである。いくつかの実施形態において、記述されたシステムのコンポーネントのうちの１つ以上は、コンポーネントが記述されている機能のうちのいくつか、またはすべてを各実行する、多くのこれらのようなコンポーネントを表す。いくつかの実施形態において、これらのコンポーネントは、物理デバイスまたは仮想デバイスであることができる。
【０２１２】
例示的なシステム１０００は、少なくとも１つの処理ユニット（ＣＰＵまたはプロセッサ）１０１０、ならびに読み出し専用メモリ（ＲＯＭ）１０２０及びランダムアクセスメモリ（ＲＡＭ）１０２５などのシステムメモリ１０１５を含むさまざまなシステムコンポーネントをプロセッサ１０１０に結合する接続１００５を備える。コンピューティングシステム１０００は、プロセッサ１０１０の部分と、直接に、近接して、または統合されて、接続される高速メモリ１０１２のキャッシュを含むことができる。
【０２１３】
プロセッサ１０１０は、いずれかの汎用プロセッサ、ならびにストレージデバイス１０３０に格納され、プロセッサ１０１０を制御するように構成されるサービス１０３２、１０３４、及び１０３６などのハードウェアサービスまたはソフトウェアサービスだけではなく、ソフトウェア命令が実際のプロセッサ設計中に組み込まれる専用プロセッサをも含むことができる。プロセッサ１０１０は、本質的に、複数のコアまたはプロセッサ、１つのバス、メモリコントローラ、キャッシュなどを含む、完全に自己完結型コンピューティングシステムであることができる。マルチコアプロセッサは、対称または非対称であることができる。
【０２１４】
ユーザインタラクションを可能にするために、コンピューティングシステム１０００は、入力デバイス１０４５を含み、この入力デバイスは、音声用のマイクロフォン、ジェスチャまたはグラフィカル入力用のタッチパネル、キーボード、マウス、モーション入力、音声などのような、いずれかの数の入力メカニズムを表すことができる。また、コンピューティングシステム１０００は、出力デバイス１０３５を含むことができ、この出力デバイスは、当業者に知られている複数の出力メカニズムのうちの１つ以上であることができる。いくつかの例において、マルチモーダルシステムは、コンピューティングシステム１０００と通信する複数のタイプの入力／出力をユーザが提供することを可能にする。コンピューティングシステム１０００は、通信インタフェース１０４０を含むことができ、この通信インタフェースは、ユーザ入力及びシステム出力を一般的に規制し、管理することができる。いずれかの特定のハードウェア配置上の操作に制約がないため、本明細書における基本機能は、それらが開発されているような改善されたハードウェアまたはファームウェア配置の代わりに容易に使用されることができる。
【０２１５】
ストレージデバイス１０３０は、不揮発性メモリデバイスであることができ、ハードディスク、またはコンピュータによってアクセス可能であるデータを格納することができる、磁気カセット、フラッシュメモリカード、ソリッドステートメモリデバイス、デジタルバーサタイルディスク、カートリッジ、ランダムアクセスメモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、及び／またはこれらのデバイスのいくつかの組み合わせのような、他のタイプのコンピュータ可読媒体であることができる。
【０２１６】
ストレージデバイス１０３０は、ソフトウェアサービス、サーバ、サービスなどを含むことができ、このようなソフトウェアを定義するコードがプロセッサ１０１０によって実行されるときに、そのコードがシステムに機能を実行させる。いくつかの実施形態において、特定の機能を実行するハードウェアサービスは、この機能を実行する、プロセッサ１０１０、接続１００５、出力デバイス１０３５などのような、必要なハードウェアコンポーネントと関連するコンピュータ可読媒体に格納されるソフトウェアコンポーネントを含むことができる。
【０２１７】
説明の明確さのために、いくつかの例において、本技術は、ソフトウェア、またはハードウェア及びソフトウェアの組み合わせに具体化される方法において、デバイス、デバイスコンポーネント、ステップまたはルーチンを有する機能ブロックを含む個々の機能ブロックを備えるように提示されることができる。
【０２１８】
本明細書に記述されるステップ、操作、機能、またはプロセスのいずれかは、ハードウェア及びソフトウェアサービスの組み合わせ、もしくはサービス単独で、または他のデバイスと組み合わせて実行される、または実装されることができる。いくつかの実施形態において、サービスは、クライアントデバイスのメモリ、及び／またはコンテンツ管理システムの１つ以上のサーバに存在するソフトウェアであり、プロセッサがサービスと関連するソフトウェアを実行するときに１つ以上の機能を実行することができる。いくつかの実施形態において、サービスは、特定の機能を実行するプログラムまたはプログラムコレクションである。いくつかの実施形態において、サービスは、サーバとみなされることができる。メモリは、非一時的なコンピュータ可読媒体であることができる。
【０２１９】
いくつかの実施形態において、コンピュータ可読ストレージデバイス、媒体、及びメモリは、ビットストリーム及び同様のものを有するケーブルまたは無線信号を含むことができる。しかしながら、言及されるときに、非一時的なコンピュータ可読記憶媒体は、エネルギー、搬送信号、電磁波、及び信号自体を明確に除外する。
【０２２０】
上述される実施例による方法は、格納される、またはその他の方法によりコンピュータ可読媒体から利用可能である、コンピュータ実行可能命令を使用して、実装されることができる。これらのような命令は、例えば、汎用コンピュータ、専用コンピュータ、もしくは専用処理デバイスに、ある特定の機能、もしくは機能群を実行させる、またはその他の方法により汎用コンピュータ、専用コンピュータ、もしくは専用処理デバイスがある特定の機能、もしくは機能群を実行するように設定する、命令及びデータを含むことができる。使用されているコンピュータリソースの部分は、ネットワーク経由でアクセス可能である。コンピュータ実行可能命令は、例えば、バイナリ、アセンブリ言語などの中間形式命令、ファームウェア、またはソースコードであり得る。命令、使用される情報、及び／または記述された実施例に従う方法中に作成される情報を格納するために使用されることができるコンピュータ可読媒体の実施例は、磁気または光ディスク、ソリッドステートメモリデバイス、フラッシュメモリ、不揮発性メモリによって提供されるＵＳＢデバイス、ネットワーク化されたストレージデバイスなどを含む。
【０２２１】
これらの開示に従う方法を実装するデバイスは、ハードウェア、ファームウェア及び／またはソフトウェアを含むことができ、さまざまなフォームファクタのいずれかを取ることができる。これらのようなフォームファクタの典型的な実施例は、サーバ、ラップトップ、スマートフォン、スモールフォームファクタパーソナルコンピュータ、パーソナルデジタルアシスタントなどを含む。また、本明細書に記述される機能性は、周辺機器またはアドインカードに具体化されることができる。また、このような機能性は、さらなる実施例として、異なるチップ間回路基板、または単一のデバイス中で実行する異なるプロセスに実装されることができる。
【０２２２】
これらの命令、これらのような命令を伝えるための媒体、それらを実行するためのコンピューティングリソース、及びこれらのようなコンピューティングリソースをサポートするための他の構造は、これらの開示に記述される機能を提供するための手段である。
【０２２３】
さまざまな実施例及び他の情報を使用して、添付の特許請求の範囲内で態様を説明したが、特許請求の範囲の制限は、当業者がこれらの実施例を使用して多種多様な実施態様を導出することができる場合に、これらのような実施例における特定の特徴または配置に基づき黙示的に伝えられるべきではない。さらに、ある発明の主題が構造的特徴及び／または方法ステップの実施例に特有の言語で記述されている場合があるが、添付の特許請求の範囲に定義されている本発明の主題がこれらの記述された特徴また行為に必ずしも限定されないことを理解するであろう。例えば、このような機能性は、本明細書において特定されている構成要素以外の構成要素に、異なるように分散される、または実行されることができる。むしろ、記述された特徴及びステップは、添付の特許請求の範囲内でシステム及び方法の構成要素の実施例として開示されている。
【図１Ａ】
2021509508.tif 000003
【図１Ｂ】
2021509508.tif 000004
【図２Ａ】
2021509508.tif 000005
【図２Ｂ】
2021509508.tif 000006
【図３Ａ】
2021509508.tif 000007
【図３Ｂ】
2021509508.tif 000008
【図４Ａ】
2021509508.tif 000009
【図４Ｂ】
2021509508.tif 000010
【図５Ａ】
2021509508.tif 000011
【図５Ｂ】
2021509508.tif 000012
【図６Ａ】
2021509508.tif 000013
【図６Ｂ】
2021509508.tif 000014
【図７Ａ】
2021509508.tif 000015
【図７Ｂ】
2021509508.tif 000016
【図８】
2021509508.tif 000017
【図９Ａ】
2021509508.tif 000018
【図９Ｂ】
2021509508.tif 000019
【図１０】
2021509508.tif 000020
【手続補正書】
【提出日】令和2年8月14日(2020.8.14)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
方法であって、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作をクライアントデバイスにおいて生成することと、
前記コンテンツ管理システム上のリビジョンのジャーナルに前記操作をコミットするインテント情報を前記クライアントデバイスにおいて記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記クライアントデバイスによって、前記操作を前記リビジョンのジャーナルにコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナルにおける前記クライアントデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記クライアントデバイスによって、前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記クライアントデバイスによって、前記第二要求への応答を前記コンテンツ管理システムから受信することと、
前記クライアントデバイスによって、前記リビジョンのジャーナルへの前記操作の前記コミットが成功した指標を前記応答が含むかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含むかどうかに基づき、１つ以上のツリーデータ構造を前記クライアントデバイス上で更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することと
を含み、
前記１つ以上のツリーデータ構造が前記コンテンツアイテムを含む該コンテンツアイテムと関連するローカル状態とリモート状態との間の比較を表す同期ツリーを含む、方法。
【請求項２】
前記１つ以上のツリーデータ構造は、さらに、ローカルツリー、及びリモートツリーを含み、前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムの前記ローカル状態を表し、前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおける前記リモート状態を表す、請求項１に記載の方法。
【請求項３】
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含むときに、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記クライアントデバイスにコミットする前記インテント情報をクリアすることと、
をさらに含む、請求項２に記載の方法。
【請求項４】
前記ローカルツリーを更新して前記コンテンツアイテムの前記ローカルコピーに前記修正を反映することをさらに含み、
コミットする前記インテント情報を記録することは前記操作が前記クライアントデバイスによって生成されるセルフオーサリングされた操作を含む、請求項３に記載の方法。
【請求項５】
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した前記指標を前記応答が含まないときに、前記リモートツリーまたは前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することなく、前記クライアントデバイスにコミットする前記インテント情報をクリアすること、
をさらに含む、請求項２に記載の方法。
【請求項６】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中の前記現在の位置を識別する、請求項１に記載の方法。
【請求項７】
前記クライアントデバイスによって前記コンテンツ管理システムから、前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを取得することをさらに含み、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、請求項６に記載の方法。
【請求項８】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子について前記クライアントデバイスによって前に受信したそれぞれのリビジョン番号を含み、
前記方法は、前記それぞれのリビジョン番号が前記それぞれのネームスペース識別子に対応する前記リビジョンのジャーナルに最新のリビジョンを含むときに、前記クライアントデバイスによって前記コンテンツ管理システムから、前記コミットが成功した前記指標を受信することをさらに含む、請求項１に記載の方法。
【請求項９】
命令を含むコンピュータプログラムであって、
前記命令は、コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作を生成することと、
前記コンテンツ管理システム上でリビジョンのジャーナルに前記操作をコミットするインテント情報を記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記リビジョンのジャーナルに前記操作をコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナル中の前記コンピューティングデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記第二要求に基づき、前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかに基づき、前記コンピューティングデバイス上で１つ以上のツリーデータ構造を更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することと
を含み、
前記１つ以上のツリーデータ構造が前記コンテンツアイテムを含む該コンテンツアイテムと関連するローカル状態とリモート状態との間の比較を表す同期ツリーを含む、コンピュータプログラム。
【請求項１０】
前記１つ以上のツリーデータ構造は、ローカルツリー、及びリモートツリーをさらに含み、
前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムの前記ローカル状態を表し、
前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおける前記リモート状態を表す、請求項９に記載のコンピュータプログラム。
【請求項１１】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した判定に基づき、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記コンピューティングデバイスにコミットする前記インテント情報をクリアすることと、
を行わせる命令を格納する、請求項１０に記載のコンピュータプログラム。
【請求項１２】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記ローカルツリーを更新して前記コンテンツアイテムの前記ローカルコピーに前記修正を反映することであって、コミットする前記インテント情報を記録することは、前記操作がクライアントデバイスによって生成されるセルフオーサリングされた操作を含むことを示すことを含む、前記反映すること、
を行わせる命令を格納する、請求項１１に記載のコンピュータプログラム。
【請求項１３】
前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功しなかった判定に基づき、前記リモートツリーまたは前記同期ツリーを前記操作に基づき更新することなく、クライアントデバイスにコミットする前記インテント情報をクリアすること、
を行わせる命令を格納する、請求項１０に記載のコンピュータプログラム。
【請求項１４】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中で前記現在の位置を識別し、
前記コンピュータプログラムは、前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを前記コンテンツ管理システムから取得することであって、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、前記取得すること、
を行わせる命令を含む、請求項９に記載のコンピュータプログラム。
【請求項１５】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子についてクライアントデバイスによって前に受信したそれぞれのリビジョン番号を含み、
前記コンピュータプログラムは、前記コンピューティングデバイスによって実行されるときに、前記コンピューティングデバイスに、
前記コンテンツ管理システムから、前記第二要求への応答を受信することであって、前記それぞれのリビジョン番号が前記それぞれのネームスペース識別子に対応する前記リビジョンのジャーナルに最新のリビジョンを含むときに前記コミットが成功したことを前記応答が示す、前記受信すること、
を行わせる、命令を含む、請求項９に記載のコンピュータプログラム。
【請求項１６】
１つ以上のプロセッサと、
少なくとも１つの非一時的コンピュータ可読媒体であって、その中に命令を格納し、前記命令が前記１つ以上のプロセッサによって実行されるときに、コンピューティングデバイスに、
コンテンツ管理システムにおいてユーザアカウントに関連付けられたコンテンツアイテムのローカルコピーを修正する操作を生成することと、
前記コンテンツ管理システムにおいてリビジョンのジャーナルに前記操作をコミットするインテント情報を記録することであって、前記リビジョンのジャーナルが前記ユーザアカウントと関連する１つ以上のネームスペースと関連するコンテンツアイテムへのリビジョンを追跡する、前記記録することと、
前記操作に基づき、前記リビジョンのジャーナルに前記操作をコミットする第一要求を前記コンテンツ管理システムに送信することであって、前記第一要求が前記リビジョンのジャーナル中の前記コンピューティングデバイスの現在の位置を識別するカーソルを含む、前記送信することと、
前記コンテンツ管理システムにおける前記コミットのステータスについての第二要求を前記コンテンツ管理システムに送信することと、
前記第二要求に基づき、前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかを判定することと、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功したかどうかに基づき、前記コンピューティングデバイス上で１つ以上のツリーデータ構造を更新して、かつコミットする前記インテント情報をクリアするべきかどうかを判定することと、
を行わせる、前記少なくとも１つの非一時的コンピュータ可読媒体と、
を備え、
前記１つ以上のツリーデータ構造が前記コンテンツアイテムを含む該コンテンツアイテムと関連するローカル状態とリモート状態との間の比較を表す同期ツリーを含む、コンピューティングデバイス。
【請求項１７】
前記１つ以上のツリーデータ構造は、ローカルツリー、及びリモートツリーを含み、
前記ローカルツリーが前記ユーザアカウントと関連するコンテンツアイテムの前記ローカル状態を表し、
前記リモートツリーが前記ユーザアカウントと関連する前記コンテンツアイテムの前記コンテンツ管理システムにおける前記リモート状態を表す、請求項１６に記載のコンピューティングデバイス。
【請求項１８】
前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功した判定に基づき、
前記リモートツリー及び前記同期ツリーを更新して前記操作に基づき前記コンテンツアイテムに修正を反映することと、
前記コンピューティングデバイスにコミットする前記インテント情報をクリアすることと、
を行わせる、命令を格納する、請求項１７に記載のコンピューティングデバイス。
【請求項１９】
前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記リビジョンのジャーナルへの前記操作の前記コミットが成功しなかった判定に基づき、前記リモートツリーまたは前記同期ツリーを前記操作に基づき更新することなく、クライアントデバイスにコミットする前記インテント情報をクリアすること、
を行わせる、命令を格納する、請求項１７に記載のコンピューティングデバイス。
【請求項２０】
前記カーソルは、前記コンテンツアイテムと関連する１つ以上のネームスペースのそれぞれのネームスペース識別子、及び前記それぞれのネームスペース識別子と関連するそれぞれのリビジョン番号に基づき前記ジャーナル中の前記現在の位置を識別し、
前記非一時的コンピュータ可読媒体は、前記１つ以上のプロセッサによって実行されるときに、前記コンピューティングデバイスに、
前記コンテンツ管理システムから、前記それぞれのネームスペース識別子と関連する前記それぞれのリビジョン番号をインクリメントする更新されたカーソルを取得することであって、前記更新されたカーソルが前記第一要求または前記第二要求のうちの少なくとも１つに基づく、前記取得すること、
を行わせる、命令を格納する、請求項１６に記載のコンピューティングデバイス。
【国際調査報告】
2021509508.tif 000021
2021509508.tif 000022