(57)【特許請求の範囲】
【請求項１】
複数のノード装置を含む分散処理システムにおける前記ノード装置に、
前記複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新する更新ステップと、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定ステップと、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信するステップと、
を実行させるための確定クロック判定プログラム。
【請求項２】
前記分散処理システム全体で整合が取れているデータ値を取得するための取得コマンドを受け付けるステップと、
前記特定ステップにおいて特定された前記第２の確定クロック値が、前記取得コマンドを受け付けた時点の前記論理クロック値又は前記取得コマンドで指定された前記論理クロック値以上になったか判断するステップと、
前記第２の確定クロック値が、前記取得コマンドを受け付けた時点の前記論理クロック値又は前記取得コマンドで指定された前記論理クロック値以上になったと判断された場合、前記取得コマンドで指定されたデータの値を前記取得コマンドの要求元に出力するステップと、
をさらに実行させるための請求項１記載の確定クロック判定プログラム。
【請求項３】
複数の前記クロックリストが回覧される場合、前記受信ステップにおいて前記クロックリストを受信する毎に、前記更新ステップ以降のステップを実行する
ことを特徴とする請求項１又は２記載の確定クロック判定プログラム。
【請求項４】
複数のノード装置を含む分散処理システムにおける前記ノード装置により実行される確定クロック判定方法であって、
前記複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新する更新ステップと、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定ステップと、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信するステップと、
を含む確定クロック判定方法。
【請求項５】
分散処理システム用のノード装置であって、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部と、
前記分散処理システムにおける複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信部と、
前記コマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新するクロックリスト更新部と、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定部と、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信する送信部と、
を有するノード装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散処理システムにおけるデータの整合性判定技術に関する。
【背景技術】
【０００２】
近年、分散処理システムとして、例えば結果整合性（Eventual Consistency）を実装したシステムが知られている。この結果整合性とは、ある時点ではデータの整合が取れていないかもしれないが、最終的に整合が取れていれば良いという考え方である。
【０００３】
図１に、結果整合性を実装した分散処理システムの一例を示す。図１の例では、分散処理システムは、処理を受け持つノードＡ乃至Ｄを含み、各ノードには、結果整合性を実現するための分散処理フレームワーク（以下、単に「フレームワーク」と呼ぶ）が実装されている。なお、図１の例では、ノードＡ乃至Ｃにおいてデータのレプリカを保持するようになっているものとする。例えば、ノードＡがデータ値「ａ」を設定するためのコマンド（setコマンド）を受け付けると、分散ハッシュテーブル（ＤＨＴ：Distributed Hash Table）などを用いて、このデータの保管場所となるノードを決定する。例えばノードＡ乃至Ｃが保管場所として決定された場合には、ノードＡは、データ値「ａ」を自身のデータベースに格納するとともにノードＢ及びＣに転送する。そうすると、データ値「ａ」は、フレームワークの連携によってノードＢ及びＣに伝わっていき、データ値「ａ」はノードＢ及びＣのデータベースにも格納される。図１における実線の矢印は、setコマンドに伴うデータの流れを示している。なお、コマンドを受け付けたノードのことを、レセプタと呼ぶ場合もある。また、あるデータについて当該データを保管する役目があるノードのことを、コンテナと呼ぶ場合もある。
【０００４】
その後、例えば、ノードＤがデータを取得するためのコマンド（getコマンド）を受け付けた場合には、フレームワークが連携して、データを保持しているノード（ノードＡ乃至Ｃ）のいずれかのデータベースからデータ値「ａ」を取得し、getコマンドの要求元に出力する。なお、図１では、ノードＣのデータベースからデータを取得する例を示している。また、図１における二点鎖線の矢印は、getコマンドに伴うデータの流れを示している。
【０００５】
例えば、ノードＡ乃至Ｃにデータ値「ａ」が格納されている状態において、さらにノードＡがsetコマンド（データ値「ｂ」）を受け付けた場合には、図２に示すように、まずノードＡ自身のデータベースに格納されているデータ値「ａ」を「ｂ」に書き換える。さらに、データ値「ｂ」は、フレームワークの連携によってノードＢ及びＣに伝わっていく。ここで、例えば、データ値「ｂ」がノードＣに伝わる前に、ノードＤがgetコマンドを受け付けた場合において、ノードＣからデータを取得するとなると、データ値「ｂ」に書き換わる前であるため、データ値「ａ」が取得される。なお、一定期間経過後、データの再取得を行うことで、更新後のデータ値「ｂ」を取得することができる。
【０００６】
このように、結果整合性を実装した分散処理システムでは、ある時点においては、更新後のデータ値を取得できない場合もあるが、一定期間経過後、他にデータ更新がなされていなければ、更新後のデータ値を取得できる。なお、結果整合性を実装した分散処理システムでは、データ更新時にデータベースをロックするようなことはしないので、例えばシステムのスケーラビリティを高めることができる。
【０００７】
一方、分散処理システムにおいて、論理時計（論理クロックとも呼ぶ）によってノード間の処理の順序関係を表す手法（例えば、Ｌａｍｐｏｒｔのアルゴリズム等）が従来から知られている。例えば、図３に示すように、送信側のノードが、送信時点の論理クロック値をタイムスタンプとしてメッセージに設定した上で当該メッセージを送信し、受信側のノードでは、メッセージに設定されたタイムスタンプに所定数（図３では１）を加算した値を新たな論理クロック値として算出する。従って、論理クロックでは、時間が進んでいく一方で、時間が戻されるようなことはない（すなわち、論理クロック値は増えていく一方で、論理クロック値が減らされるようなことはない）。なお、図３において、矢印の始点側の数値は、送信側ノードの論理クロック値を示し、矢印の終点側の数値は、受信側ノードの論理クロック値を示している。また、矢印の上部に付された数値は、送信側ノードによって設定されたタイムスタンプ（すなわち、送信時点の論理クロック値）を示している。
【０００８】
例えば図３では、ノードＡにおいてイベントが発生し、ノードＡの論理クロック値が１の時に、ノードＡからノードＢへメッセージ（タイムスタンプ：１）が送信されている。そして、そのメッセージを受信したノードＢでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが１であるため、論理クロック値は１まで進んでいると判断し、タイムスタンプに１加算した値（＝２）を新たな論理クロック値としている。その後、さらにノードＡにおいてイベントが発生し、ノードＡの論理クロック値が２の時に、ノードＡからノードＣへメッセージ（タイムスタンプ：２）が送信されている。そして、そのメッセージを受信したノードＣでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが２であるため、論理クロック値は２まで進んでいると判断し、タイムスタンプに１加算した値（＝３）を新たな論理クロック値としている。その後、ノードＣにおいてイベントが発生し、ノードＣの論理クロック値が４の時に、ノードＣからノードＤへメッセージ（タイムスタンプ：４）が送信されている。そして、そのメッセージを受信したノードＤでは、メッセージ受信前の論理クロック値は０であるが、受信メッセージに含まれるタイムスタンプが４であるため、論理クロック値４は４まで進んでいると判断し、タイムスタンプに１加算した値（＝５）を新たな論理クロック値としている。また、ノードＢにおいてイベントが発生し、ノードＢの論理クロック値が３の時に、ノードＢからノードＣへメッセージ（タイムスタンプ：３）が送信されている。そして、そのメッセージを受信したノードＣでは、受信メッセージに含まれるタイムスタンプは３であるが、自身の論理クロック値は４まで進んでいるため、自身の論理クロック値に１加算した値（＝５）を新たな論理クロック値としている。その後、ノードＤにおいてイベントが発生し、ノードＤの論理クロック値が６の時に、ノードＤからノードＡへメッセージ（タイムスタンプ：６）が送信されている。そして、そのメッセージを受信したノードＡでは、メッセージ受信前の論理クロック値は２であるが、受信メッセージに含まれるタイムスタンプが６であるため、論理クロック値は６まで進んでいると判断し、タイムスタンプに１加算した値（＝７）を新たな論理クロック値としている。その後、ノードＡにおいてイベントが発生し、ノードＡの論理クロック値が８の時に、ノードＡからノードＣへメッセージ（タイムスタンプ：８）が送信されている。そして、そのメッセージを受信したノードＣでは、メッセージ受信前の論理クロック値は５であるが、受信メッセージに含まれるタイムスタンプが８であるため、論理クロック値は８まで進んでいると判断し、タイムスタンプに１加算した値（＝９）を新たな論理クロック値としている。また、ノードＤにおいてイベントが発生し、ノードＤの論理クロック値が７の時に、ノードＤからノードＣへメッセージ（タイムスタンプ：７）が送信されている。そして、そのメッセージを受信したノードＣでは、受信メッセージに含まれるタイムスタンプは７であるが、自身の論理クロック値は９まで進んでいるため、自身の論理クロック値に１加算した値（＝１０）を新たな論理クロック値としている。このように、各ノードが論理クロック値を交換しながら処理を進めていく。しかし、ある論理クロック値に係る処理が自ノードにおいて完了しているからといって、他のノードにおいても、同じ論理クロック値に係る処理が必ず完了しているとは限らない。
【０００９】
例えば、結果整合性を実装した分散処理システムでは、ある論理クロック値の時にデータ更新が行われた場合に、その直後に、更新後のデータを必ず取得できるという保証はない。例えばある論理クロック値の時にsetコマンドを受け付けた場合の一例を図４（ａ）に示す。なお、図４（ａ）では、ノードＣがクライアントＹからのsetコマンド（データ値「３」）を受け取った際の論理クロック値は４であったものとする。なお、図４（ａ）におけるｔの値は、論理クロック値を示す（以下、同様）。さらに、ノードＡ乃至Ｃにおいてデータのレプリカを保持するようになっているものとする。従って、図４（ａ）では、ノードＣがクライアントＹからのsetコマンド（データ値「３」）を受け付けた後、データ値「３」が、上で述べたようなフレームワークの連携によってノードＡ及びＢに伝わっていくことになる。なお、図４（ａ）の例では、ｔ＝１の時に、ノードＡ乃至Ｃのいずれかのノードが、データ値「２」を受け取っており、ｔ＝３の時に、ノードＡ乃至Ｃのいずれかのノードが、データ値「４」を受け取っていたものとする。
【００１０】
しかし、結果整合性の考え方は、最終的にデータの整合が取れていれば良いというものであるため、いずれの時点でデータの整合が取れたか（すなわち、いつ「確定」したか）という観点は存在しなかった。そのため、結果整合性を実装した分散処理システムでは、ある論理クロック値に対応する整合データを取得することはできない。なお、ここでは、特定の論理クロック値に対応する整合データを取得するためのコマンドをsc_getとする。例えば図４（ｂ）に示すように、ｔ＝４の時に受け取ったデータ値「３」がノードＣからノードＡに伝わる前に、ノードＡが、クライアントＸからのsc_getコマンドを受け付けたものとする。なお、図４（ｂ）では、ノードＡがクライアントＸからのsc_setコマンドを受け取った際の論理クロック値は５であったものとする。この場合、ノードＡは、ｔ＝５に対応する整合データを取得し、クライアントＸに出力すべきであるが、ｔ＝５におけるデータが、どのタイミングで確定したか判断することはできない。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】ＷＯ２００７／０３２０４６公報
【特許文献２】特開２０００−２５９４７３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
以上のように、結果整合性を実装した分散処理システムには、どの時点でデータが確定したかという観点が存在しなかった。そのため、結果整合性を実装した分散処理システムでは、論理クロックが進行していく中で、システム全体として現在どこまでデータが確定しているのかを把握することはできなかった。なお、以下では、データが確定している時点を示す論理クロック値のことを、確定クロック値と呼ぶ。
【００１３】
従って、本発明の目的は、分散処理システムにおいて、システム全体における確定クロック値を把握できるようにするための技術を提供することである。
【課題を解決するための手段】
【００１４】
本確定クロック判定方法は、複数のノード装置を含む分散処理システムにおけるノード装置により実行される方法である。そして、本方法は、（Ａ）複数のノード装置の各々についての第１の確定クロック値を含み且つ複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、（Ｂ）自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の論理クロック値から、現時点における自ノード装置の第１の確定クロック値を算出し、算出した第１の確定クロック値でクロックリストに含まれる自ノード装置の第１の確定クロック値を更新する更新ステップと、（Ｃ）更新後のクロックリストに含まれる最小の第１の確定クロック値を、分散処理システム全体における第２の確定クロック値として特定する特定ステップと、（Ｄ）更新後のクロックリストを上記複数のノード装置に含まれる他のノード装置に送信するステップとを含む。
【発明の効果】
【００１５】
分散処理システム全体における確定クロック値を把握できるようになる。
【図面の簡単な説明】
【００１６】
【図１】図１は、結果整合性を実装した従来の分散処理システムの第１の動作例を示す図である。
【図２】図２は、結果整合性を実装した従来の分散処理システムの第２の動作例を示す図である。
【図３】図３は、従来の論理クロックを説明するための図である。
【図４】図４（ａ）及び（ｂ）は、従来技術の問題点を説明するための図である。
【図５】図５は、第１の実施の形態のノード装置の機能ブロック図である。
【図６】図６は、第１の実施の形態の処理フローを示す図である。
【図７】図７は、第２の実施の形態に係るシステムの構成図である。
【図８】図８は、第２の実施の形態のノード装置の機能ブロック図である。
【図９】図９（ａ）乃至（ｃ）は、第２の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図１０】図１０（ａ）及び（ｂ）は、第２の実施の形態に係る分散処理システム全体の処理を説明するための図である。
【図１１】図１１は、ノード装置Ａ及びＢの動作を示すシーケンス図である。
【図１２】図１２は、系全体の確定クロック値を把握するための他の手法の一例を示す図である。
【図１３】図１３は、コマンド受信時のノード装置の処理フローを示す図である。
【図１４】図１４は、コマンドの処理完了時のノード装置の処理フローを示す図である。
【図１５】図１５は、クロックリスト受信時のノード装置の処理フローを示す図である。
【図１６】図１６は、sc_getコマンド受信時のノード装置の処理フローを示す図である。
【図１７】図１７は、クロックリストの回し方の第１の例を示す図である。
【図１８】図１８は、クロックリストの回し方の第２の例を示す図である。
【図１９】図１９は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１７】
［第１の実施の形態］
第１の実施の形態に係るノード装置の機能ブロック図を図５に示す。第１の実施の形態に係るノード装置は、受信部１５０１と、クロックリスト更新部１５０３と、特定部１５０５と、送信部１５０７と、コマンドリスト格納部１５０９とを有する。なお、図５に示したノード装置を複数用いて分散処理システムが構築される。受信部１５０１は、分散処理システム内の他のノード装置等からデータを受信する。クロックリスト更新部１５０３は、受信部１５０１が受信したデータとコマンドリスト格納部１５０９に格納されているデータとを用いて処理を行う。なお、コマンドリスト格納部１５０９には、自ノード装置が受け付けたコマンドのうちの処理中のコマンドについて、当該コマンドを受け付けた時点の論理クロック値が格納される。特定部１５０５は、クロックリスト更新部１５０３の処理結果を用いて処理を行う。送信部１５０７は、クロックリスト更新部１５０３の処理結果を、分散処理システム内の他のノード装置へ送信する。
【００１８】
次に、図５に示したノード装置の処理内容を図６を用いて説明する。まず、受信部１５０１が、分散処理システムに含まれる複数のノード装置の間で回覧されるクロックリストを受信する（図６：ステップＳ１００１）。クロックリストには、分散処理システムに含まれる複数のノード装置の各々についての確定クロック値（以下、第１の確定クロック値とも呼ぶ）が含まれる。なお、受信部１５０１が受信したクロックリストは、クロックリスト更新部１５０３に出力される。
【００１９】
そして、クロックリスト更新部１５０３は、コマンドリスト格納部１５０９に格納されている最小の論理クロック値から、現時点における自ノード装置の第１の確定クロック値を算出し、算出した第１の確定クロック値でクロックリストに含まれる自ノード装置の第１の確定クロック値を更新する（ステップＳ１００３）。このように、クロックリストが自ノード装置に回ってきた際には、現時点における自ノード装置の第１の確定クロック値を、クロックリストに反映する。なお、更新後のクロックリストは、特定部１５０５及び送信部１５０７に出力される。
【００２０】
そして、特定部１５０５は、更新後のクロックリストに含まれる最小の第１の確定クロック値を、分散処理システム全体における確定クロック値（以下、第２の確定クロック値又は系全体の確定クロック値とも呼ぶ）として特定する（ステップＳ１００５）。また、送信部１５０７は、更新後のクロックリストを分散処理システムに含まれる他のノード装置に送信する（ステップＳ１００７）。
【００２１】
以上のような処理を実施することにより、分散処理システムにおける系全体の確定クロック値を特定することができる。従って、分散処理システム全体として、どこまでデータが確定しているのかを把握できるようになる。
【００２２】
［第２の実施の形態］
次に、第２の実施の形態について説明する。図７に、第２の実施の形態に係るシステムの構成図を示す。例えばインターネットであるネットワーク１には、複数のノード装置（図７では、ノード装置Ａ乃至Ｃ）を含む分散処理システム１００と、複数のクライアント端末（図７では、クライアント端末Ａ及びＢ）とが接続されている。分散処理システム１００に含まれる各ノード装置には、結果整合性を実現するためのフレームワーク（図示せず）が実装されている。なお、各ノード装置には、クライアント端末からのデータを保管するためのデータベース（図示せず）が含まれているものとする。図７では、ノード装置が３台、クライアント端末が２台の例を示しているが、ノード装置及びクライアント端末の台数は、これに限定されない。
【００２３】
図８に、第２の実施の形態に係るノード装置の機能ブロック図を示す。第２の実施の形態に係るノード装置は、メッセージ受信部１１と、メッセージ処理部１２と、メッセージ送信部１３と、コマンドリスト管理部１４と、コマンドリスト格納部１５と、クロックリスト受信部１６と、確定クロック管理部１７と、確定クロック値格納部１８と、クロックリスト送信部１９とを有する。
【００２４】
メッセージ受信部１１は、クライアント端末からのコマンドや、分散処理システム１００内の他のノード装置からのメッセージを受信する。なお、メッセージ受信部１１は、新たなコマンドを受け付けた場合には、コマンドの情報を、メッセージ処理部１２、コマンドリスト管理部１４又は確定クロック管理部１７に通知する。メッセージ処理部１２は、メッセージ受信部１１が受信したコマンドやメッセージに応じた処理を実施する。メッセージ送信部１３は、メッセージ処理部１２の処理結果をコマンド要求元に送信したり、分散処理システム１００内の他のノード装置にメッセージを送信したりする。なお、メッセージ送信部１３は、処理結果を送信し、処理完了と判断した場合には、その旨をコマンドリスト管理部１４に通知する。コマンドリスト管理部１４は、コマンドリスト格納部１５を管理しており、メッセージ受信部１１及びメッセージ送信部１３からの通知に応じて、データの登録及び削除を行う。さらに、コマンドリスト管理部１４は、コマンドリスト格納部１５に格納されているデータを用いて、第１の確定クロック値を計算するといった処理も行う。
【００２５】
なお、コマンドリスト格納部１５には、自ノード装置が受け付けたコマンドの情報と、当該コマンドを受け付けた時点の論理クロック値との対を含むコマンドリストが格納される。なお、コマンドとして、例えばsetコマンド、getコマンドなどが含まれる。例えば、論理クロック値が１０の時にgetコマンドを受け付け、論理クロック値が１４の時にsetコマンドを受け付け、論理クロック値が１６の時にgetコマンドを受け付けていた時に、これらのコマンドの処理が未だ完了していない場合には、コマンドリスト＝｛１０：get，１４：set，１６：get｝といったようなデータがコマンドリスト格納部１５に格納される。
【００２６】
なお、コマンドリストに含まれる最小の論理クロック値から１減じた値が第１の確定クロック値となる。例えば上記のようなコマンドリストがコマンドリスト格納部１５に格納されていた場合、コマンドリストに含まれる最小の論理クロック値は１０であり、第１の確定クロック値は９（＝１０−１）となる。なお、コマンドリストが空の場合には、現時点における自ノード装置の論理クロック値が第１の確定クロック値となる。
【００２７】
また、クロックリスト受信部１６は、分散処理システム１００内の他のノード装置からクロックリストを受信する。クロックリストは、分散処理システム１００内のノード装置の間で回覧されるデータである。なお、クロックリストには、ノード装置の識別情報と、当該ノード装置の第１の確定クロック値との対が含まれる。例えば、ノード装置Ａの第１の確定クロック値が１０であり、ノード装置Ｂの第１の確定クロック値が５であり、ノード装置Ｃの第１の確定クロック値が７であった場合のクロックリストは、クロックリスト＝｛ノードＡ：１０，ノードＢ：５，ノードＣ：７｝となる。
【００２８】
さらに、確定クロック管理部１７は、コマンドリスト管理部１４の処理結果を用いて、クロックリスト受信部１６が受信したクロックリストを更新し、更新後のクロックリストから分散処理システム１００における系全体の確定クロック値を特定する。なお、確定クロック管理部１７によって特定された系全体の確定クロック値は、確定クロック値格納部１８に格納される。さらに、確定クロック管理部１７は、系全体の確定クロック値が特定の論理クロック値以上になったか判断し、系全体の確定クロック値が特定の論理クロック値以上になった場合には、その旨をメッセージ受信部１１に通知するといった処理も行う。また、クロックリスト送信部１９は、確定クロック管理部１７が更新したクロックリストを、分散処理システム１００内の他のノード装置に送信する。
【００２９】
次に、図９及び図１０を用いて、分散処理システム１００全体の処理について説明する。なお、例えば図９（ａ）に示すように、分散処理システム１００において、ノード装置Ａの第１の確定クロック値が１０であり、ノード装置Ｂの第１の確定クロック値が８であり、ノード装置Ｃの第１の確定クロック値が１２であった場面を例として説明する。例えば、分散処理システム１００の起動時にクロックリストを生成するノード装置が予め決められており、システムが正常に起動した後、そのノード装置が、分散処理システム１００内のノード装置の情報（例えば、ノード装置の総数やノード装置の識別情報など）を取得し、クロックリストを生成すると、クロックリストの回覧が開始される。なお、ここでは、「ノード装置Ａ−＞ノード装置Ｂ−＞ノード装置Ｃ」の順でクロックリストが回覧されるものとし、ノード装置Ｃの後、再びノード装置Ａに戻るものとする。そして、例えば、クロックリスト＝｛ノードＡ：５，ノードＢ：４，ノードＣ：７｝がノード装置Ａに回ってきたとすると、ノード装置Ａは、自ノード装置の第１の確定クロック値（＝１０）に従って、クロックリストを更新する。なお、図９（ａ）における太枠の丸印は、クロックリストを所持しているノード装置を示している（以下、同じ）。そうすると、図９（ｂ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：４，ノードＣ：７｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝４）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝４）は、ノード装置Ａの確定クロック値格納部１８に格納される。その後、クロックリストは、ノード装置Ｂへ送信される。
【００３０】
そして、ノード装置Ｂは、クロックリストを受信すると、自ノード装置の第１の確定クロック値（＝８）に従って、クロックリストを更新する。そうすると、図９（ｃ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：８，ノードＣ：７｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝７）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝７）は、ノード装置Ｂの確定クロック値格納部１８に格納される。その後、クロックリストは、ノード装置Ｃへ送信される。
【００３１】
そして、ノード装置Ｃは、クロックリストを受信すると、自ノード装置の第１の確定クロック値（＝１２）に従って、クロックリストを更新する。そうすると、図１０（ａ）に示すように、クロックリストは、｛ノードＡ：１０，ノードＢ：８，ノードＣ：１２｝といった内容に更新される。そして、更新後のクロックリストに含まれる最小の第１の確定クロック値（＝８）を、系全体の確定クロックとして特定する。なお、特定された系全体の確定クロック値（＝８）は、ノード装置Ｃの確定クロック値格納部１８に格納される。その後、クロックリストは、ノード装置Ａへ送信される。
【００３２】
そして、ノード装置Ａは、再びクロックリストを受信すると、自ノード装置の第１の確定クロック値に従って、クロックリストを更新する。なお、ここでは、ノード装置Ａの第１の確定クロック値は１０のままであったものとする。従って、クロックリストの内容は、更新前と変わらない。例えば、このような場合には、クロックリストの更新処理を省略してもよい。その後、クロックリストに含まれる最小の第１の確定クロック値（＝８）を、系全体の確定クロック値として特定する。なお、特定された系全体の確定クロック値（＝８）は、ノード装置Ａの確定クロック値格納部１８に格納される。
【００３３】
このように、分散処理システム１００内の各ノード装置は、クロックリストが自ノード装置に回ってきた時に、クロックリストを最新の状態に更新し、分散処理システム１００における系全体の確定クロック値を特定する。そして、クロックリストを次のノード装置に渡す。
【００３４】
なお、図９及び図１０では、ノード装置Ａ乃至Ｃにおいて、第１の確定クロック値が変化しない例を示したが、分散処理システム１００では、並行してコマンドの処理も行われているので、第１の確定クロック値も徐々に変化することになる。例えば図１１を用いて、第１の確定クロック値が変化する場合について説明する。なお、図１１の例では説明を簡単にするために、ノード装置Ａ及びＢのみが存在するものとする。
【００３５】
まず、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：１，ノードＢ：１｝を受信する（図１１のＴ１）。このとき、ノード装置Ａの第１の確定クロック値は３であり、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：３，ノードＢ：１｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝１）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ１の段階では「１」が系全体の確定クロック値として特定される。なお、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００３６】
その後、ノード装置Ｂが、ノード装置Ａからクロックリスト＝｛ノードＡ：３，ノードＢ：１｝を受信する（図１１のＴ２）。このとき、ノード装置Ｂの第１の確定クロック値は４であり、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：３，ノードＢ：４｝となる。そうすると、ノード装置Ａの第１の確定クロック値（＝３）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ２の段階では「３」が系全体の確定クロック値として特定される。なお、クロックリストは、ノード装置Ｂからノード装置Ａへ送信される。
【００３７】
その後、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：３，ノードＢ：４｝を受信する（図１１のＴ３）。このとき、ノード装置Ａの第１の確定クロック値は６まで進んでいるので、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：４｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝４）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ３の段階では「４」が系全体の確定クロック値として特定される。なお、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００３８】
その後、ノード装置Ｂが、ノード装置Ａからクロックリスト＝｛ノードＡ：６，ノードＢ：４｝を受信する（図１１のＴ４）。このとき、ノード装置Ｂの第１の確定クロック値は８まで進んでいるので、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：８｝となる。そうすると、ノード装置Ａの第１の確定クロック値（＝６）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ４の段階では「６」が系全体の確定クロック値として特定される。なお、クロックリストは、ノード装置Ｂからノード装置Ａへ送信される。
【００３９】
その後、ノード装置Ａが、ノード装置Ｂからクロックリスト＝｛ノードＡ：６，ノードＢ：８｝を受信する（図１１のＴ５）。このとき、ノード装置Ａの第１の確定クロック値は６のままであるので、クロックリストの内容は変わらない。但し、Ｔ３の段階では最小の第１の確定クロック値は４であったが、Ｔ４の段階でノード装置Ｂによってクロックリストが更新されたことにより、Ｔ５の段階では最小の第１の確定クロック値が６に変わっている。よって、Ｔ５の段階では「６」が系全体の確定クロック値として特定される。なお、クロックリストは、ノード装置Ａからノード装置Ｂへ送信される。
【００４０】
その後、ノード装置Ｂは、ノード装置Ａからクロックリスト＝｛ノードＡ：６，ノードＢ：８｝を受信する（図１１のＴ６）。このとき、ノード装置Ｂの第１の確定クロック値は１２まで進んでいるので、ノード装置Ｂがクロックリストを更新すると、クロックリスト＝｛ノードＡ：６，ノードＢ：１２｝となる。なお、Ｔ６の段階では、最小の第１の確定クロック値（＝６）がＴ４の時と変わっていないため、系全体の確定クロック値は「６」のままである。そして、クロックリストは、ノード装置Ｂからノード装置Ａへが送信される。
【００４１】
その後、ノード装置Ａは、ノード装置Ｂからクロックリスト＝｛ノードＡ：６，ノードＢ：１２｝を受信する（図１１のＴ７）。このとき、ノード装置Ａの第１の確定クロック値は１３まで進んでいるので、ノード装置Ａがクロックリストを更新すると、クロックリスト＝｛ノードＡ：１３，ノードＢ：１２｝となる。そうすると、ノード装置Ｂの第１の確定クロック値（＝１２）が、クロックリスト内の第１の確定クロック値の中で最小のものとなる。よって、Ｔ７の段階では「１２」が系全体の確定クロック値として特定される。
【００４２】
このように第１の確定クロック値の変化に応じて、系全体の確定クロック値も変化していく。なお、図１１では、ノード装置Ａ及びＢの２台のみが存在する例を示したが、ノード装置が３台以上存在する場合も、各ノード装置の処理は同じである。
【００４３】
以上のような処理を実施することにより、分散処理システム１００における系全体の確定クロック値を特定することができる。従って、分散処理システム１００全体として、どこまでデータが確定しているのかを把握できるようになる。
【００４４】
なお、系全体の確定クロック値を把握する手法として、図１２に示すような手法も考えられる。具体的には、分散処理システム１００内の全てのノード装置が書き込むことができるデータベースを設け、各ノード装置は、自ノード装置の論理クロック値が更新される毎に当該データベースに書き込みにいく。しかしながら、この手法では、論理クロック値が更新される毎にデータベースへのアクセスが発生し、本来行うべき処理以外の負荷が大きくなる。また、複数のノード装置が１つのデータベースにアクセスするとなると、排他制御が必要となり、待ち時間などが生じてくる。これに対し、本実施の形態に係る手法であれば、本来行うべき処理への負担を抑えつつ、系全体の確定クロック値を把握することができる。
【００４５】
次に、第２の実施の形態に係るノード装置の処理フローについて説明する。まず、図１３を用いて、コマンド受信時の処理フローを説明する。例えば、メッセージ受信部１１が、クライアント端末から新たなコマンドを受信する（図１３：ステップＳ１）。この際、コマンド受信時の論理クロック値を特定する。そして、メッセージ受信部１１は、コマンドの種別やコマンド受信時の論理クロック値などを含むコマンド情報を、メッセージ処理部１２及びコマンドリスト管理部１４に通知する。
【００４６】
そして、コマンドリスト管理部１４は、メッセージ受信部１１からコマンド情報を受信すると、コマンドとコマンド受信時の論理クロック値との対をコマンドリストに登録する（ステップＳ３）。すなわち、コマンドを受信する毎に、コマンドとコマンド受信時の論理クロック値との対がコマンドリストに登録されていく。
【００４７】
また、メッセージ処理部１２は、メッセージ受信部１１からコマンド情報を受信すると、受信コマンドに応じた処理を実施する。メッセージ処理部１２については、従来と変わらないため、これ以上説明しない。そして、処理を終了する。
【００４８】
次に、図１４を用いて、コマンドの処理完了時の処理フローを説明する。例えば、コマンドリスト管理部１４は、コマンドリスト格納部１５に格納されているコマンドリストを検索し、処理中のコマンドがあるか判断する（図１４：ステップＳ１１）。例えば、コマンドリストが空の場合には処理中のコマンドはないと判断し、コマンドリストに、コマンドとコマンド受信時の論理クロック値との対が１つでも登録されている場合には処理中のコマンドがあると判断する。なお、コマンドリストが空の場合、すなわち処理中のコマンドがないと判断された場合には（ステップＳ１１：Ｎｏルート）、処理を終了する。
【００４９】
一方、処理中のコマンドがあると判断された場合（ステップＳ１１：Ｙｅｓルート）、コマンドリスト管理部１４は、いずれかのコマンドの処理が完了したか判断する（ステップＳ１３）。例えば、図１４の処理フローと並行して、メッセージ処理部１２がコマンドに応じた処理を実施しており、その処理が完了した場合には、その旨がコマンドリスト管理部１４に通知される。従って、コマンドリスト管理部１４は、処理完了通知を受信した場合、処理が完了したと判断する。なお、処理完了通知を受信していなければ（ステップＳ１３：Ｎｏルート）、処理完了通知を受信するまで待つ。
【００５０】
そして、いずれかのコマンドの処理が完了したと判断された場合（ステップＳ１３：Ｙｅｓルート）、コマンドリスト管理部１４は、処理が完了したコマンドと当該コマンド受信時の論理クロック値との対のデータをコマンドリスト格納部１５内のコマンドリストから削除する（ステップＳ１５）。
【００５１】
また、メッセージ処理部１２による処理が完了した場合には、メッセージ送信部１３が、処理結果をコマンド要求元へ送信する（ステップＳ１７）。その後、ステップＳ１１の処理に戻り、コマンドリストが空になるまで処理を繰り返す。なお、図１４の処理フローにおいて、ステップＳ１５及びＳ１７については順番の入れ替えが可能であり、また並列に実施するようにしてもよい。
【００５２】
以上、図１３及び図１４に示したような処理を実施することにより、処理中のコマンドの情報を適切に管理することができる。
【００５３】
次に、図１５を用いて、クロックリスト受信時の処理フローを説明する。まず、クロックリスト受信部１６が、分散処理システム１００内の他のノード装置からクロックリストを受信する（図１５：ステップＳ２１）。クロックリスト受信部１６は、受信したクロックリストを、確定クロック管理部１７に出力する。
【００５４】
そして、確定クロック管理部１７は、クロックリスト受信部１６からクロックリストを受信すると、コマンドリスト管理部１４に、現時点における自ノード装置の第１の確定クロック値を算出するよう指示する。コマンドリスト管理部１４は、確定クロック管理部１７からの指示に応じて、コマンドリスト格納部１５に格納されているコマンドリストを基に、現時点における第１の確定クロック値を算出する（ステップＳ２３）。例えば、コマンドリストに含まれる最小の論理クロック値から１減じた値を、現時点における第１の確定クロック値として算出する。論理クロック値は、増えていく一方であるという性質があるため、コマンドリストに含まれる最小の論理クロック値の１つ前のところまでは、確定しているものとみなすことができる。例えば、コマンドリストに含まれる最小の論理クロック値が１０であった場合には、第１の確定クロック値として９（＝１０−１）が算出される。なお、全ての処理が完了し、コマンドリストが空の場合もある。コマンドリストが空の場合には、現時点における論理クロック値を第１の確定クロック値として算出する。例えば背景技術の欄で述べたように、各ノード装置は論理クロック値を交換しながら処理を行う。すなわち、コマンドリストが空の状態でも、他のノード装置からメッセージを受信することで、論理クロック値は進んでいくことになる。そのため、コマンドリストが空の場合には、現時点における論理クロック値を第１の確定クロック値とする。
【００５５】
その後、コマンドリスト管理部１４は、算出した第１の確定クロック値を確定クロック管理部１７に出力する。そして、確定クロック管理部１７は、コマンドリスト管理部１４から第１の確定クロック値を受信すると、その第１の確定クロック値を用いてクロックリストを更新する（ステップＳ２５）。すなわち、ステップＳ２３において算出された第１の確定クロック値で、クロックリストに含まれる自ノード装置の第１の確定クロック値を書き換える。
【００５６】
その後、確定クロック管理部１７は、更新後のクロックリストから系全体の確定クロック値を特定し、確定クロック値格納部１８に格納する（ステップＳ２７）。具体的には、更新後のクロックリストに含まれる第１の確定クロック値のうち、最小のものを系全体の確定クロック値として特定する。
【００５７】
そして、確定クロック管理部１７は、更新後のクロックリストを送信するようクロックリスト送信部１９に指示する。クロックリスト送信部１９は、確定クロック管理部１７からの指示に応じて、更新後のクロックリストを、分散処理システム１００内の次のノード装置へ送信する（ステップＳ２９）。なお、クロックリストの回し方としては、例えば、予め回す順番が決定されているような場合（例えばノード識別番号の昇順又は降順など）もあれば、ランダムに回すような場合もある。また、例えば、分散処理システム１００内の他のノード装置のうち、第１の確定クロック値が最も小さいノード装置を特定し、特定したノード装置へ送信するような場合もある。系全体の確定クロック値は、クロックリストに含まれる最小の第１の確定クロック値であるから、第１の確定クロック値が最小であるノード装置へ優先的に回すようにすれば、当該ノード装置の第１の確定クロック値が更新された場合には直ぐに系全体の確定クロック値に反映されるようになる。そして、処理を終了する。
【００５８】
以上のような処理を実施することにより、分散処理システム１００における系全体の確定クロック値を特定することができる。
【００５９】
次に、図１６を用いて、sc_getコマンド受信時の処理フローを説明する。なお、図１６に示す処理は、図１５に示した処理と並行して行われるものとする。まず、メッセージ受信部１１は、クライアント端末からsc_getコマンドを受信する（図１６：ステップＳ３１）。この際、sc_getコマンド受信時の論理クロック値を特定する。そして、メッセージ受信部１１は、sc_getコマンド受信時の論理クロック値を、確定クロック管理部１７に通知する。なお、sc_getコマンドは、コマンドリストには登録されないものとする。
【００６０】
確定クロック管理部１７は、メッセージ受信部１１からsc_getコマンド受信時の論理クロック値を受信すると、確定クロック値格納部１８から系全体の確定クロック値を取得する（ステップＳ３３）。そして、確定クロック管理部１７は、系全体の確定クロック値がsc_get受信時の論理クロック値より小さいか判断する（ステップＳ３５）。系全体の確定クロック値がsc_get受信時の論理クロック値より小さい場合（ステップＳ３５：Ｙｅｓルート）、図１５に示した処理により系全体の確定クロック値が更新されるまで処理を一旦保留する。そして、系全体の確定クロック値が更新された場合には、ステップＳ３３に戻って処理を再開する。なお、系全体の確定クロック値がsc_getコマンド受信時の論理クロック値以上になるまで、ステップＳ３３及びＳ３５の処理が繰り返される。
【００６１】
そして、系全体の確定クロック値がsc_getコマンド受信時の論理クロック値以上であると判断された場合（ステップＳ３５：Ｎｏルート）、確定クロック管理部１７は、その旨をメッセージ受信部１１に通知する。メッセージ受信部１１は、確定クロック管理部１７からの通知を受信すると、sc_getコマンドの処理を実行するようメッセージ処理部１２に指示する。そして、メッセージ処理部１２は、sc_getコマンドで指定されたデータを自ノード装置内のデータベースから取得し、取得したデータをメッセージ送信部１３に送信させる（ステップＳ３７）。なお、メッセージ送信部１３は、sc_getコマンドの要求元へデータを送信する。その後、処理を終了する。
【００６２】
例えば、sc_getコマンド受信時の論理クロック値が５で且つそのときの系全体の確定クロック値が４であったとすると、論理クロック値が５の時に受信したコマンドによって、データが書き換えられる可能性がある。そこで、本実施の形態では、上で説明したように、系全体の確定クロック値がsc_getコマンド受信時の論理クロック値以上になった時点で、データを取得するようになっている。これにより、sc_getコマンド受信時の論理クロック値に対応する整合データを取得できる。例えばデータベースのスナップショットを生成するような場合に、本技術を適用することもできる。
【００６３】
なお、上では、sc_getコマンド受信時の論理クロック値を基準として、整合データを取得する例を説明したが、sc_getコマンドで、どの時点の整合データを取得するかを指定するような構成であってもよい。この場合、sc_getコマンド受信時の論理クロック値ではなく、sc_getコマンドで指定された論理クロック値を用いて、上で述べたような処理を実施するようにすればよい。
【００６４】
また、クロックリストの数は、１個である必要はなく、複数のクロックリストを回覧するようにしてもよい。例えばクロックリストの数を増やせば、クロックリストの受信間隔が短くなるので、図１５に示した処理の実行間隔も短くなる。従って、系全体の確定クロック値をより細かく把握できるようになる。さらに、複数のクロックリストを回覧する際には、クロックリストの回し方は自由である。図１７及び図１８に、複数のクロックリストを回覧する際のクロックリストの回し方の例を示す。
【００６５】
図１７の例では、１つ目のクロックリスト１７０１が、ノードＡとノードＢとノードＣとを巡回するようになっており、２つ目のクロックリスト１７０２が、ノードＣとノードＤとノードＥとノードＦとを巡回するようになっている。なお、クロックリスト１７０１及び１７０２の各々には、全てのノード（すなわち、ノードＡ乃至Ｆ）についての第１の確定クロック値が含まれる。但し、この例では、ノードＡ及びＢには、クロックリスト１７０２が渡されず、ノードＤ乃至Ｆには、クロックリスト１７０１が渡されないようになっている。そこで、両方のクロックリストを受信するノードＣが、以下のような処理を実施する。具体的には、ノードＣは、最後に受信したクロックリスト１７０１及び１７０２を記憶しておく。そして、新たにクロックリスト１７０１を受信した場合には、自身の第１の確定クロック値をクロックリスト１７０１に反映するとともに、記憶しておいたクロックリスト１７０２からノードＤ乃至Ｆの第１の確定クロック値を抽出し、クロックリスト１７０１に反映する。また、新たにクロックリスト１７０２を受信した場合には、自身の第１の確定クロック値をクロックリスト１７０２に反映するとともに、記憶しておいたクロックリスト１７０１からノードＡ及びＢの第１の確定クロック値を抽出し、クロックリスト１７０２に反映する。これにより、例えばノードＤ乃至Ｆにはクロックリスト１７０１は渡されないが、クロックリスト１７０１に含まれるノードＤ乃至Ｆの第１の確定クロック値を適切に更新することができる。同様に、ノードＡ及びＢにはクロックリスト１７０２は渡されないが、クロックリスト１７０２に含まれるノードＡ及びＢの第１の確定クロック値を適切に更新することができる。
【００６６】
また、図１８の例では、１つ目のクロックリスト１８０１が、全てのノード（すなわち、ノードＡ乃至Ｆ）を巡回するようになっており、２つ目のクロックリスト１８０２が、ノードＡとノードＤとを巡回するようになっている。なお、クロックリスト１８０１及び１８０２の各々には、全てのノード（すなわち、ノードＡ乃至Ｆ）についての第１の確定クロック値が含まれる。例えば、頻繁にコマンドを受信しないようなノードには、少なくとも１つのクロックリストが回るようにしておき、一方で、頻繁にコマンドを受信するようなノードには、複数のクロックリストが回ってくるようにする。
【００６７】
なお、複数のクロックリストを回覧する際には、クロックリストの間に差異が生じてくる場合もある。その場合には、周期的に又は所定のタイミングで、あるノードが最新の内容でクロックリストの同期を取るようにし、その後、それぞれのクロックリストの回覧を再開させるにしてもよい。
【００６８】
以上本発明の本実施の形態について説明したが、本発明はこれに限定されるものではない。例えば図５又は図８に示したノード装置の機能ブロック図は一例であって必ずしも実際のプログラムモジュール構成と一致しない場合もある。データ格納部の構成も同様に一例にすぎない。
【００６９】
また、処理フローにおいても、処理結果が変わらなければ処理の順番を入れ替えることも可能である。さらに、並列に実行させるようにしてもよい。
【００７０】
なお、上で述べたノード装置は、コンピュータ装置によって実現することもできる。例えば、図１９に示すように、メモリ２５０１とプロセッサ（ＣＰＵ２５０３）とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とを備え、これらがバス２５１９を介して接続されたコンピュータを用いてもよい。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５等の記憶部に格納しておき、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出して利用することもできる。必要に応じてＣＰＵ２５０３は、表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、必要な動作を行ってもよい。また、処理途中のデータについては、メモリ２５０１に格納され、必要があればＨＤＤ２５０５に格納してもよい。実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされてもよい。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。なお、図５のコマンドリスト格納部１５０９は、図１９におけるメモリ２５０１やＨＤＤ２５０５等として実現してもよい。図８のコマンドリスト格納部１５及び確定クロック値格納部１８についても同様である。図５の受信部１５０１、クロックリスト更新部１５０３、特定部１５０５及び送信部１５０７は、プロセッサ２５０３及びプログラムの組み合わせ、すなわち、プロセッサ２５０３がプログラムを実行することにより実現してもよい。より具体的には、プロセッサ２５０３は、ＨＤＤ２５０５又はメモリ２５０１に記憶されたプログラムに従った動作を行うことで、上で述べたような処理部として機能してもよい。図８のメッセージ受信部１１、メッセージ処理部１２、メッセージ送信部１３、コマンドリスト管理部１４、クロックリスト受信部１６、確定クロック管理部１７及びクロックリスト送信部１９についても同様である。
【００７１】
以上述べた本実施の形態をまとめると、以下のようになる。
【００７２】
第１の態様に係る確定クロック判定方法は、複数のノード装置を含む分散処理システムにおけるノード装置により実行される方法である。そして、本方法は、（Ａ）複数のノード装置の各々についての第１の確定クロック値を含み且つ複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、（Ｂ）自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の論理クロック値から、現時点における自ノード装置の第１の確定クロック値を算出し、算出した第１の確定クロック値でクロックリストに含まれる自ノード装置の第１の確定クロック値を更新する更新ステップと、（Ｃ）更新後のクロックリストに含まれる最小の第１の確定クロック値を、分散処理システム全体における第２の確定クロック値として特定する特定ステップと、（Ｄ）更新後のクロックリストを上記複数のノード装置に含まれる他のノード装置に送信するステップとを含む。
【００７３】
このように、クロックリストを最新の状態に更新しながら分散処理システムに含まれるノード装置で回すことで、分散処理システムにおける系全体の確定クロック値（すなわち、第２の確定クロック値）を把握できるようになる。
【００７４】
また、第１の態様において、分散処理システム全体で整合が取れているデータ値を取得するための取得コマンドを受け付けるステップと、特定ステップにおいて特定された第２の確定クロック値が、取得コマンドを受け付けた時点の論理クロック値又は取得コマンドで指定された論理クロック値以上になったか判断するステップと、第２の確定クロック値が、取得コマンドを受け付けた時点の論理クロック値又は取得コマンドで指定された論理クロック値以上になったと判断された場合、取得コマンドで指定されたデータの値を取得コマンドの要求元に出力するステップとをさらに含むようにしてもよい。このようにすれば、分散処理システム全体における確定クロック値（すなわち、第２の確定クロック値）が、取得コマンドを受け付けた時点の論理クロック値又は取得コマンドで指定された論理クロック値以上になってから、取得コマンドで指定されたデータの値を出力する。従って、特定の論理クロック値に対応する整合データを取得することができるようになる。
【００７５】
さらに、複数のクロックリストが回覧される場合、受信ステップにおいてクロックリストを受信する毎に、更新ステップ以降のステップを実行する場合もある。例えばクロックリストの数が多くなれば、短い間隔で自ノードにおける確定クロック値をチェックし、クロックリストを更新できるようになるので、分散処理システムにおける系全体の確定クロック値をより細かく把握できるようになる。
【００７６】
上で述べた更新ステップにおいて、コマンドリスト格納部に格納されている最小の論理クロック値から１減じた値を、現時点における自ノード装置の第１の確定クロック値として算出する場合もある。例えば、自ノードにおいて、処理が完了していない最小の論理クロック値から１減じたところまでは、確定したものとみなすことができるためである。
【００７７】
第２の態様に係る、分散処理システム用のノード装置は、（ｚ）自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部と、（ａ）分散処理システムにおける複数のノード装置の各々についての第１の確定クロック値を含み且つ複数のノード装置の間で回覧されるクロックリストを受信する受信部と、（ｂ）コマンドリスト格納部に格納されている最小の論理クロック値から、現時点における自ノード装置の第１の確定クロック値を算出し、算出した第１の確定クロック値でクロックリストに含まれる自ノード装置の第１の確定クロック値を更新するクロックリスト更新部と、（ｃ）更新後のクロックリストに含まれる最小の第１の確定クロック値を、分散処理システム全体における第２の確定クロック値として特定する特定部と、（ｄ）更新後のクロックリストを複数のノード装置に含まれる他のノード装置に送信する送信部とを有する。
【００７８】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【００７９】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００８０】
（付記１）
複数のノード装置を含む分散処理システムにおける前記ノード装置に、
前記複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新する更新ステップと、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定ステップと、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信するステップと、
を実行させるための確定クロック判定プログラム。
【００８１】
（付記２）
前記分散処理システム全体で整合が取れているデータ値を取得するための取得コマンドを受け付けるステップと、
前記特定ステップにおいて特定された前記第２の確定クロック値が、前記取得コマンドを受け付けた時点の前記論理クロック値又は前記取得コマンドで指定された前記論理クロック値以上になったか判断するステップと、
前記第２の確定クロック値が、前記取得コマンドを受け付けた時点の前記論理クロック値又は前記取得コマンドで指定された前記論理クロック値以上になったと判断された場合、前記取得コマンドで指定されたデータの値を前記取得コマンドの要求元に出力するステップと、
をさらに実行させるための付記１記載の確定クロック判定プログラム。
【００８２】
（付記３）
複数の前記クロックリストが回覧される場合、前記受信ステップにおいて前記クロックリストを受信する毎に、前記更新ステップ以降のステップを実行する
ことを特徴とする付記１又は２記載の確定クロック判定プログラム。
【００８３】
（付記４）
前記更新ステップにおいて、
前記コマンドリスト格納部に格納されている最小の前記論理クロック値から１減じた値を、現時点における自ノード装置の前記第１の確定クロック値として算出する
ことを特徴とする付記１乃至３のいずれか１つ記載の確定クロック判定プログラム。
【００８４】
（付記５）
複数のノード装置を含む分散処理システムにおける前記ノード装置により実行される確定クロック判定方法であって、
前記複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信ステップと、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新する更新ステップと、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定ステップと、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信するステップと、
を含む確定クロック判定方法。
【００８５】
（付記６）
分散処理システム用のノード装置であって、
自ノード装置が受け付けたコマンドのうち処理が完了していないコマンド毎に当該コマンドを受け付けた時点の論理クロック値を格納するコマンドリスト格納部と、
前記分散処理システムにおける複数のノード装置の各々についての第１の確定クロック値を含み且つ前記複数のノード装置の間で回覧されるクロックリストを受信する受信部と、
前記コマンドリスト格納部に格納されている最小の前記論理クロック値から、現時点における自ノード装置の前記第１の確定クロック値を算出し、算出した前記第１の確定クロック値で前記クロックリストに含まれる自ノード装置の前記第１の確定クロック値を更新するクロックリスト更新部と、
更新後のクロックリストに含まれる最小の前記第１の確定クロック値を、前記分散処理システム全体における第２の確定クロック値として特定する特定部と、
更新後のクロックリストを前記複数のノード装置に含まれる他のノード装置に送信する送信部と、
を有するノード装置。
【符号の説明】
【００８６】
１  ネットワーク
１１  メッセージ受信部    １２  メッセージ処理部
１３  メッセージ送信部    １４  コマンドリスト管理部
１５  コマンドリスト格納部    １６  クロックリスト受信部
１７  確定クロック管理部    １８  確定クロック値格納部
１９  クロックリスト送信部
１００  分散処理システム
【図１】
0005445177.tif 000002
【図２】
0005445177.tif 000003
【図３】
0005445177.tif 000004
【図４】
0005445177.tif 000005
【図５】
0005445177.tif 000006
【図６】
0005445177.tif 000007
【図７】
0005445177.tif 000008
【図８】
0005445177.tif 000009
【図９】
0005445177.tif 000010
【図１０】
0005445177.tif 000011
【図１１】
0005445177.tif 000012
【図１２】
0005445177.tif 000013
【図１３】
0005445177.tif 000014
【図１４】
0005445177.tif 000015
【図１５】
0005445177.tif 000016
【図１６】
0005445177.tif 000017
【図１７】
0005445177.tif 000018
【図１８】
0005445177.tif 000019
【図１９】
0005445177.tif 000020